如何更新从源代码构建的程序

How to update programs built from source

你能告诉我如何更新用 "sudo make install" 安装的程序吗? 我在问我是否必须卸载程序然后重做“./autogen.sh”"make" "sudo make install"。有人说我需要删除程序然后在 git 拉,其他人说我可以简单地使用更新的源重新安装它。

这取决于。如果只是小更新,就去重新编译然后 make install.

如果对提供的库 and/or 头文件进行了任何更改(例如,它们被重命名),您最好先卸载软件以删除文件系统上不需要的文件。

(通常)没有 make uninstall

这就是为什么我总是将此类软件安装到单独的目录中,以软件及其版本号命名。例如,当从源代码安装 GNU Make 4.1 时,我会将其安装到目录 make-4.1.

然后我将所有相关文件符号链接到我在 $PATH$MANPATH 等中使用的公共目录树中。我使用自己的脚本来执行此操作,但这只是因为我在编写它时不知道 stow

这允许我并排安装多个版本,并通过删除和添加我的脚本中有问题的符号链接来选择 "current" 一个。我可以简单地通过删除它的目录树来卸载软件。

这也适用于需要以这种方式安装的依赖项的软件。最难的部分是决定是否使依赖版本特定。

卸载您自己安装在默认位置的程序确实困难。如果你很幸运,make 会有一个 uninstalldeinstall 目标,但大多数时候没有。这可能是手动查找文件并删除它们的问题,除非您再次重新安装相同版本的代码并以某种方式留意事情实际结束的地方(这只会使 "hunting down" 稍微容易一些)

以后,您可能会选择不同的方式做事: 大多数使用 GNU configure 脚本的源代码分发允许您为使用 --prefix=path 的安装指定 prefix。这允许您在单独的子目录中进行安装,然后很容易删除。

例如,假设我正在安装名为 ThePackage 的虚构软件,版本 14.4:

$ ./configure --prefix=/usr/local/stow/thepackage-14.4
$ make && sudo make install

(我一般用$HOME/local/stow下的路径)

注意到那里的 stow 了吗?并非巧合的是,有一个名为 available from the GNU people.

的简洁实用程序

如上安装软件后,在.../stow/thepackage-14.4下,只需

$ cd /usr/local/stow
$ sudo stow -v thepackage-14.4

这会用符号链接填充 /usr/local,因此,例如,/usr/local/stow/thepackage-14.4/bin 中的任何可执行文件都可以在 /usr/local/bin(等)

中使用

要卸载:

$ cd /usr/local/stow
$ sudo stow -D -v thepackage-14.4
$ sudo rm -rf thepackage-14.4

这甚至允许您在 /usr/local/stow 下安装某些软件的多个版本。对于 "activate" 一个特定版本,只需 stow -D 您使用的任何版本和 stow 您想要测试的版本。如果新版本不符合您的要求,请撤消操作。

其他构建系统也可以安装在单独的前缀下。例如,要像上面那样安装 CMake,请使用

$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/stow/thepackage-14.4
$ make && sudo make install

您还可以将 stow 与 Perl 包以及安装在自定义路径中的任何其他包一起使用。