2011-11-10 92 views
20

在構建RPM包的過程中,我必須指定BuildRoot,稍後將用於調用$ RPM_BUILD_ROOT的%install。我總是認爲$ RPM_BUILD_ROOT是RPM執行打包的假安裝。然後,在安裝時使用RPM軟件包,它將安裝到實際位置。例如:

$RPM_BUILD_ROOT/usr/bin 

我以爲$ RPM_BUILD_ROOT僅用於包裝過程中,而且在某些方面RPM可以區分$ RPM_BUILD_ROOT,當用戶執行「轉-ivh package.rpm」將實際的安裝位置是/ usr/bin。

但最近在閱讀一些文檔時,建議$ RPM_BUILD_ROOT是將要安裝的實際位置,並且$ RPM_BUILD_ROOT由用戶通過設置環境變量$ RPM_BUILD_ROOT來指定,以便讓用戶安裝打包在他們的願望地點。否則,$ RPM_BUILD_ROOT將爲空,它將安裝到默認位置。在上述情況下,它是/ usr/bin。因此,$ RPM_BUILD_ROOT不僅適用於打包或「假安裝」過程,而且是用戶定義安裝位置的一種方式,類似於Windows中的選擇文件夾位置。

我不知道我的想法是否正確。有人可以驗證嗎?提前致謝。

回答

27

$RPM_BUILD_ROOT(或等效%{buildroot} SPEC文件宏)總是包含RPM將查找任何要打包的文件的目錄。 RPM腳本(例如,壓縮手冊頁的腳本)也將使用該值來知道在哪裏查找剛安裝的文件。通常情況下,此值不會爲空,並且包含遠離系統目錄的位置 - 通常在/tmp/var/tmp之下。

的SPEC文件的作者有望確保make install(或任何安裝有問題的軟件使用)將放置任何文件$RPM_BUILD_ROOT下,與當最後安裝的軟件應該使用相同的層次結構。例如。要RPM安裝ls/bin/ls,%install SPEC文件部分應確保ls位於$RPM_BUILD_ROOT/bin/ls

SPEC文件的作者也預計使用BuildRoot:標記指定一個合適的位置。或者,構建系統可能會有一個rpmrc RPM配置文件,其中包含正確的條目。在any case應該設置生成根目錄,以便:

  • 普通用戶將能夠構建源包。

  • 如果超級用戶構建源代碼包,構建過程不會破壞任何系統文件,除非超級用戶安裝了所產生的二進制包。是的,可能有充分的理由將一些包打包爲root - 例如,對某些測試運行完整的glibc測試套件需要root權限。

也就是說,RPM可以並且會構建一個包含一個空的構建根變量的包。在這種情況下,構建安裝和最終目標位置將重合。可能要求例如make install將使用默認位置,從而在例如下打斷系統文件。如果以足夠的權限運行,則爲/usr/lib。此外,%files部分中的/usr/bin/*將愉快地將構建主機/usr/bin/目錄的全部內容拉入您的二進制包。

底線:

  • 決不使用空構建根。

  • 除非完全沒有其他方法,否則不要將軟件包編譯爲root

+0

所以,在最後,$ RPM_BUILD_ROOT只是一個用於構建過程的值,並且RPM假冒將文件安裝到構建根目錄,因此它可以獲取最終安裝位置的目錄結構。我認爲我對構建根的最初理解是正確的。 – Amumu

+0

我們如何將自定義根目錄傳遞給'make install'? – Jeroen

+0

推薦獨特的$ RPM_BUILD_ROOT來支持在同一個主機上的並行構建: 'BuildRoot:%{_ tmppath} /%{name} -buildroot - %{version} - %{release} – MarkHu

7

文件〜/ .rpmmacros定義每個用戶的路徑:

%_topdir %(echo $HOME)/rpmbuild 
%_tmppath %{_topdir}/tmp 

和一個也可以用的rpmbuild命令行參數定義它們:

rpmbuild --define '_topdir /home/username/rpmbuild'