我希望做到以下几点:
从开源项目制作以编译/链接到库等。但是,我实际上并不想在本地运行它。我想将其打包成 rpm,以便可以将其安装到其他机器上的正确目录中(这些机器当然具有类似的架构)。我希望它编译和链接并创建符号链接,就好像它要安装在 /usr/local 下一样,但我实际上不希望它转到 /usr/local/ 下的目录,而是转到某个临时目录,可以将其清除而无需删除其他软件包放置在那里的文件。
是否有一些参数可以使安装发生这种情况 - 即构建为好像它要安装在 下/usr/local
但实际上将“安装”放在 下~/tmp/usr/local
,例如。
我研究过简单地不运行 make install 而是在 make 处停止,但这会使源目录中的可执行文件、目标代码和库混合在一起。
答案1
这个问题的答案取决于你试图以这种方式安装哪个开源项目。一般答案是,一些开源项目有 Makefile,它们为此目的提供了可选变量。一个具体的例子是 gdb,它的顶层 Makefile 使用(但似乎没有分配)一个DESTDIR
变量,如果我在 gdb 构建目录中运行此命令,
make DESTDIR=/tmp install
它会/tmp
在复制文件之前将其添加到每个目标路径的前面。
另一种更困难的方法是在 chroot 环境中完成整个构建、安装等操作。使用类似覆盖文件系统可以使这变得更容易,但这通常不是阻力最小的路径。
另一种可能性是,如果您已经在使用 Debian 版本(包括 Ubuntu 等),那么这种方法可能更容易,即获取与开源项目相对应的 Debian 源包(如果没有这样的源包,这种方法可能不太容易),然后按照说明从该源构建 Debian 包。如果您确实需要一个.rpm
而不是 ,.deb
您可以将 转换为.deb
,或者您可以从构建 过程中留下的目录结构中.rpm
构建。.rpm
.deb
这个答案是有关从源代码构建 Debian 软件包的信息来源之一。
对于最新的openssl
(在评论中提到但问题中尚未提及)安装文件内容如下:
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.
不同版本的openssl
; 对于 1.0.2安装说:
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.
其想法大致相同,只是细节略有不同。