当我安装一个简单的程序时,它经常使用make && make install
,甚至不经常有卸载目标。
如果我想升级一个程序,假设它只是无缝地重写旧程序,这是标准协议吗?
我如何跟踪这些程序?大多数人只是“一劳永逸”吗?如果不是卸载给定目标我是否必须手动删除所有内容?
答案1
将每个程序安装在专用的目录树中,并使用斯托或者X斯托使所有程序出现在一个共同的层次结构中。 Stow 创建从程序特定目录到公共树的符号链接。
更详细地说,选择一个顶级目录,例如/usr/local/stow
.安装 下的每个程序/usr/local/stow/PROGRAM_NAME
。例如,安排将其可执行文件安装在 中/usr/local/stow/PROGRAM_NAME/bin
,将其手册页安装在 中,/usr/local/stow/man/man1
等等。如果程序使用 autoconf,则运行./configure --prefix /usr/local/stow/PROGRAM_NAME
.运行后make install
,运行stow
:
./configure --prefix /usr/local/stow/PROGRAM_NAME
make
sudo make install
cd /usr/local/stow
sudo stow PROGRAM_NAME
现在您将拥有如下符号链接:
/usr/local/bin/foo -> ../stow/PROGRAM_NAME/bin/foo
/usr/local/man/man1/foo.1 -> ../../stow/PROGRAM_NAME/man/man1/foo.1
/usr/local/lib/foo -> ../stow/PROGRAM_NAME/lib/foo
您可以通过列出目录的内容轻松跟踪已安装的程序stow
,并且您始终知道文件属于哪个程序,因为它是指向该程序目录下某个位置的符号链接。通过运行stow -D PROGRAM_NAME
然后删除程序目录来卸载程序。您可以通过运行使程序暂时不可用stow -D PROGRAM_NAME
(运行stow PROGRAM_NAME
以使其再次可用)。
如果您希望能够在同一程序的不同版本之间快速切换,请使用/usr/local/stow/PROGRAM_NAME-VERSION
作为程序目录。要从版本 3 升级到版本 4,请安装版本 4,然后运行stow -D PROGRAM_NAME-3; stow PROGRAM_NAME-4
.
旧版本的 Stow 并没有超出我在这个答案中描述的基础知识。较新的版本以及 XStow(最近没有维护)具有更高级的功能,例如忽略某些文件的能力,更好地处理 stow 目录之外的现有符号链接(例如man -> share/man
),自动处理一些冲突(当两个程序提供相同的文件)等。
如果您没有或不想使用 root 访问权限,您可以在主目录下选择一个目录,例如~/software/stow
.在这种情况下,添加~/software/bin
到您的PATH
.如果man
没有自动找到手册页,请将其添加~/software/man
到您的MANPATH
.添加~/software/info
到您的INFOPATH
、~/software/lib/python
添加到您的PYTHONPATH
、等等(如果适用)。
答案2
您可以使用检查安装创建一个包(RPM、Deb 或 Slackware 兼容包)这样,你就可以使用发行版包管理器来添加/删除应用程序(但不能更新)
您可以使用以下命令checkinstall
来代替make install
命令(对 Deb 使用 -D 参数;-R 是 RPM,-S 是 Slackware):
root@nowhere# ./configure
root@nowhere# make
root@nowhere# checkinstall -D
checkinstall 将默认构建并安装该软件包,或者您也可以让它仅构建该软件包而不进行安装。
checkinstall 在大多数发行版存储库中都可用。
答案3
在很大程度上,这是包、端口和其他类型的管理器背后防止此类事情发生的原因。
我想说手动删除是手动安装的唯一方法,除非其他人对此有更好的答案,我可能不知道。
答案4
- 您可以制作一个空的 RPM 作为提醒。
- 您可以考虑将软件正确打包到 RPM 中。
tar
您可以保留安装文件的副本/usr/src/non-rpms
以提醒您(这就是我通常所做的)。