我希望执行以下操作:
从一个开源项目编译/链接到库等。但是,我不想在本地实际运行它。我想将它打包到一个 rpm 中,以便它可以安装到其他机器上的正确目录中(当然这些机器会有类似的架构)。我希望它编译、链接和创建符号链接,就好像它要安装在 /usr/local 下一样,但我实际上并不希望它转到 /usr/local/ 下的目录,而是转到一些可以在不删除其他包放置在那里的文件的情况下被清除。
是否有一些参数可以让安装发生这种情况 - 例如,它被构建为好像它要安装在下面/usr/local但实际上将“安装”放在下面~/tmp/usr/local。
我已经研究过简单地不运行 make install 而是在 make 处停止,但这会混合源目录中的可执行文件、目标代码和库。
小智 6
这个问题的答案取决于您尝试以这种方式安装的开源项目。一般的答案是,一些开源项目有 Makefiles,它为此目的提供可选变量。一个具体的例子是 gdb,它的顶级 Makefile 使用(但似乎没有分配)一个DESTDIR变量,如果我在 gdb 构建目录中运行这个命令,
make DESTDIR=/tmp install
Run Code Online (Sandbox Code Playgroud)
它/tmp在复制文件之前预先添加到每个目标路径。
另一种更困难的方法是在 chroot 环境中完成整个构建、安装等工作。使用OverlayFS 之类的东西可以使这更容易,但这通常不是阻力最小的路径。
如果您已经在使用 Debian 风格(其中包括 Ubuntu 等),另一种可能性可能会更容易,那就是获取与开源项目相对应的 Debian 源包(如果没有,这种方法不太容易)这样的源包)并按照说明从该源构建 Debian 包。如果您确实需要 a.rpm而不是 a.deb您可以将 the 转换.deb为 a .rpm,或者您可以.rpm从构建.deb. 此答案是有关从源代码构建 Debian 软件包的信息来源之一。
对于最新的openssl(在评论中提到但在问题中尚未提到),INSTALL文件是这样说的:
Package builders who want to configure the library for standard
locations, but have the package installed somewhere else so that
it can easily be packaged, can use
$ make DESTDIR=/tmp/package-root install # Unix
$ mms/macro="DESTDIR=TMP:[PACKAGE-ROOT]" install ! OpenVMS
The specified destination directory will be prepended to all
installation target paths.
Run Code Online (Sandbox Code Playgroud)
这在不同版本的openssl; 对于 1.0.2 INSTALL说:
Package builders who want to configure the library for standard
locations, but have the package installed somewhere else so that
it can easily be packaged, can use
$ make INSTALL_PREFIX=/tmp/package-root install
(or specify "--install_prefix=/tmp/package-root" as a configure
option). The specified prefix will be prepended to all
installation target filenames.
Run Code Online (Sandbox Code Playgroud)
这个想法非常相似,只是细节略有不同。