我可以直接从源代码更新安装的软件吗?

虽然我开始使用Ubuntu已经快一年了,但我从未尝试过从源代码安装软件。实际上,我并没有发现有这个需要。但现在我正在开发一个软件,它在软件仓库中处于发布候选阶段,但最新稳定版本的源代码可以在软件主页上找到。
我了解到,如果软件有很多依赖关系,从源代码安装可能会比较困难。然而,如果我能解决这个问题,我就可以使用最新版本了。但我一直在想,这样的软件是否可以自动更新,还是我需要运行一些脚本来更新软件包。或者更糟糕的是,我每次更新都需要重新安装?
另外,我也很想知道除了上述原因之外,从源代码安装是否有其他特定优势。

相关链接:http://askubuntu.com/questions/22510/uninstalling-application-built-from-source - Mechanical snail
4个回答

请注意,软件的依赖关系很少改变。如果您成功编译过一次软件,任何后续版本都应该很容易编译 - 所有依赖关系应该已经满足。
如果您是从源代码编译的,除非您等待发行版将该软件包含在其软件库中,或者等待开发人员的PPA更新,否则您将无法使用.deb或类似的软件包进行更新。
简而言之,必须有人首先编译它才能制作成deb。编译旧版本不会使您能够自动更新,您仍然需要完成整个“下载-配置-编译-安装”的过程。
然而,如果您想在多台计算机上安装相同的版本,将您编译的版本打包为.deb(或类似格式)并分发给这些计算机是有意义的。如果操作正确,依赖关系将自动解决。
至于从源代码安装的优势,我只能想到两个:
  • 你可以获取到最新版本的代码,并且可以选择稳定版本或者最新版本(通常被称为夜间构建、最新修订版等)。
  • Ubuntu/其他发行版可能不希望将该软件包含在其软件库中。在这种情况下,你只能使用开发者或社区提供的源代码或软件包。也就是说,你别无选择,只能使用源代码。

4即使你自己编译了一些东西用于一个电脑,自己制作一个.deb软件包也总是很有用的,因为它可以帮助你在一个地方保持对已安装软件的概览,并且使得卸载或升级更加容易。 - JanC

根据这篇文章,在编译源代码之后,你可以生成一个.deb软件包。然后,你就可以使用.deb软件包来安装,而不是使用"make install"命令。这样做会更容易更新(如果软件包在某个软件库中),因为软件包将由软件包管理器管理,并跟踪更新。
如果你从源代码构建"some-package"软件包,并且它有依赖关系,你可以尝试使用"apt-get build-dep some-package"来自动安装编译所需的所有依赖项,而无需手动跟踪每个依赖项。这样,依赖项也将由软件包管理器管理,并应自动更新。

还有一个值得一提的选择,适用于使用git的用户:
您可以在之前使用git clone后,使用git pull来更新您的源代码,如果需要的话,重新编译您的程序。(您还可以使用git来进一步跟踪文件:请参阅这里的回答。)
如果您最初使用git clone来获取源代码,例如,
git clone git://github.com/person/programname.git

如果您在编译和安装后保留了文件夹,您可以进入文件夹并运行git pull以获取最新的提交。然后,删除可能已创建的任何构建目录和/或运行make clean(如果适用),然后再次编译软件并使用checkinstall进行安装,它还为您创建一个软件包(虽然不适合分发)。
然而,如果您正在帮助开发一个程序,并且每天需要重新编译git pull,那么您可能会安装到主文件夹,因为不必每次都安装到/usr/local/层级。
以一个例子来说,如果我正在测试并且经常重新编译一个程序,我会在使用git pull获取最新提交后进入我的构建文件夹,并运行(针对这个特定的程序):
cmake .. -DCMAKE_BUILD_TYPE=Debug -DLAYOUT=home -DPREFIX=home

然后编译调试版本进行测试。
然而,如果你只是想每个月左右编译一次你的git克隆程序的新版本(而不是进行测试或调试),通常会使用checkinstall安装到/usr/local/目录结构中。