linux - 管理从源代码编译的软件包的最佳方法

标签 linux installation uninstallation rpm

我正在尝试寻找一种简单的方法来管理从源代码编译的软件包,以便在进行升级时,尝试卸载/安装新软件包时不会感到一团糟。

我找到了一个名为CheckInstall的实用程序,但是它似乎已经很老了,我想知道这在我开始使用之前是否是可靠的解决方案?
http://www.asic-linux.com.mx/~izto/checkinstall/

还可能只是从源头上知道您用于处理这些安装的任何其他方法/实用程序?

最佳答案

无论您做什么,都要确保最终使用发行版的软件包管理系统(例如,Fedora/Mandriva/RH/SuSE的rpm,Debian/Ubuntu的dpkg等)。否则,您的软件包管理器将不了解您手工安装的软件包,并且充其量只能满足您的要求,或者最糟糕的情况是您会遇到麻烦。

如果您没有包裹经理,那就请一个包裹经理坚持下去!

我建议您学习制作自己的包装。您可以先查看发行版的源软件包。实际上,如果您要做的只是升级到MyPackage的1.2.3版本,则通常可以通过简单的版本更改来适应发行版1.2.2的源程序包(除非有补丁程序,但这是另一回事了……) 。

除非您想要具有分发质量的软件包(例如拆分库/应用程序/调试软件包,多体系结构支持等),否则通常可以轻松地将典型的configure & make & make install方案转换为适当的源软件包。如果您可以说服您的软件包将其安装到目录而不是/中,则通常可以完成。

至于checkinstall,我过去曾使用过它,它可用于几个简单的程序包,但我不喜欢这样的事实,即它实际上允许程序包在创建rpm/deb程序包之前自行安装到我的系统上。它只是跟踪安装了哪些文件,以便对其进行打包,而这并不能防止不受欢迎的更改。哦,它需要根除草剂才能起作用,这是我的另一个主要症结。而且不要讨论静态链接的核心实用程序会发生什么...

大多数此类工具似乎都可以这样工作,因此我只是学会了构建自己的软件包“正确的方法(TM)”,并让checkinstall和 friend 在其他地方乱七八糟。但是,如果您仍然感兴趣,这里有类似程序的列表:

http://www.dwheeler.com/essays/automating-destdir.html

PS:BTW checkinstall在2009年底进行了更新,这可能意味着它仍然足够最新。

编辑:

我认为,如果在存储库中不容易获得包的最新版本,则执行升级的最简单方法是更改​​发行版中最新版本的源包。例如。对于Centos,最新版本的源代码包在这里:

http://mirror.centos.org/centos/5.5/os/SRPMS/

http://mirror.centos.org/centos/5.5/updates/SRPMS/

...

如果您想升级例如php,您将获得最新的SRPM,例如php-5.1.6-27.el5.src.rpm。然后,您执行:

rpm -hiv php-5.1.6-27.el5.src.rpm

它将安装源程序包(仅源程序-它不编译任何内容)。然后转到rpm构建目录(在我的mandriva系统上,其目录为/usr/src/rpm),将最新的php源tarball复制到SOURCES子目录,并确保其压缩方式与刚刚安装的tarball相同那里。之后,您可以在SPECS目录中编辑php.spec文件,以更改软件包版本,并使用以下方式构建二进制软件包:
rpmbuild -ba php.spec

在许多情况下,这就是新软件包所需要的。在其他情况下,事情可能会变得更加复杂-如果有补丁程序或软件包中有一些重大更改,则您可能必须做更多的事情。

我建议您阅读rpm和rpmbuild命令(它们的手册页相当不错,内容广泛),并查阅有关编写规格文件的文档。即使您决定依赖官方的backport存储库,了解如何构建自己的软件包也很有用。也可以看看:

http://www.rpm.org/wiki/Docs

编辑2:

如果您已经从源代码安装了软件包,那么除了保持系统的完整性之外,使用rpm实际上可以长期简化构建过程。原因是您不必自己记住每个软件包的怪癖(“哦,对了,现在我记得,foo需要我将-lbar添加到其CFLAGS中”),因为构建过程将是在.spec文件中,您可以将其想象为某种结构化的构建脚本。

就升级而言,如果您已经拥有该程序包先前版本的.spec文件,则可能会遇到两个主要问题,但是无论是否使用rpm来构建程序包,这两个问题都存在:
  • 由发行版应用于先前版本的补丁不再适用。在许多情况下,补丁已应用于上游软件包,因此您只需删除它即可。在其他情况下,您可能需要对其进行编辑-或者我想,如果您认为它不重要,也可以将其删除。
  • 软件包在一些主要方面发生了变化,例如它安装的文件的布局。您确实阅读了每个新版本的发行说明,不是吗?

  • 除了这两个问题,升级通常归结为只是更改spec文件中的版本号并运行rpmbuild-甚至比从tarball安装更容易。

    我建议您看看一些简单的软件的教程或源包,例如:

    http://mirror.centos.org/centos/5.5/os/SRPMS/ipv6calc-0.61-1.src.rpm

    http://mirror.centos.org/centos/5.5/os/SRPMS/libevent-1.4.13-1.src.rpm

    如果您有从tarball构建软件包的经验,那么使用rpm来构建软件并不是一个真正的飞跃。但是,它永远不会像安装预制二进制软件包那样简单。

    关于linux - 管理从源代码编译的软件包的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287471/

    相关文章:

    android - 在 SD 卡上安装自签名 apk 时出现 "Application not installed"

    installation - 我如何要求用户使用 NSIS 卸载以前的版本

    Android - 保留或删除应用程序在卸载时创建的文件

    linux - Rqaspberry 在启动时运行 java 脚本并查看 cmd?

    linux - Unix shell 脚本如何测试所有数组值是否等于特定值?

    linux - 将文件名添加到制表符分隔文件中每一行开头的循环(从而生成一个新列))

    python - 卸载/升级 tensorflow 失败 : __init__. cpython-35.pyc not found

    linux - bitrock 安装程序 - Linux 入门

    c - 在接受连接之前或之后 fork ?

    android - 卸载应用程序的隐含 Intent ?