我希望做到以下幾點:
從開源專案進行編譯/連結到庫等。我想將它打包成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 原始碼套件(如果您已經在使用 Debian 風格(其中包括 Ubuntu 等),這可能會更容易)(如果沒有這樣的來源套件)並按照說明從該來源建置Debian 套件。如果您確實需要 a.rpm
而不是 a,.deb
您可以將 轉換.deb
為 a .rpm
,或者您可以.rpm
從建置 過程中留下的目錄結構建構 a .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.
想法非常相似,只是細節略有不同。