Rpm

我應該通過 RPM SPEC 文件建構我的 Haskell 應用程序還是嘗試使用 CI 管道中的(可重現的)二進製文件

  • September 15, 2021

我已經有 20 年沒有從頭開始建構 RPM 了。所以我們可以有效地說“從不”。

$$ edit $$RPM 的要求是提供回滾、版本控制等。這是不可協商的。 我需要安裝一個二進製文件和一個配置文件。有一些使用者帳戶和目錄設置需要進行,我認為應該是直截了當的。

如果我想在 RPM 建構過程中進行測試的可重現建構,我必須複製我們的 CI 管道步驟。不平凡。理想情況下,我可以從其他位置提取所需的文件:

%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:

這可能嗎?還是我錯過了一些明顯的解決方案。

謝謝。

從我的角度來看,這在一定程度上取決於您的目標是什麼:

像 Fedora 這樣的 Linux 發行版實際上希望他們的發行版建構該軟體是使用規範文件從原始碼建構的(在一個密封的建構系統中,它還記錄了用於建構的包/組件)並認為這是一個好的實踐,也可以獲得盡可能多的可重複性盡可能。

但是,您確實可以只提取預建構的二進製文件並在規範文件中使用它們來建構 RPM 包,這是您場景的縮短範例:

# […]
Source0: <binary file>
Source1: <config file>

# […]

%prep
%setup -q -c -T

%build

%install
install -D -p -m 0755 %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}
install -D -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}.conf

# […]

雖然這可能有效,但您應該明確檢查生成的 RPM 包的依賴項是否合適 ( rpm -qp --requires <…>.rpm) 或者是否缺少執行時依賴項。通常有編譯時選項或參數(例如CFLAGS,或LDFLAGS用 C 編寫的軟體)以及後處理腳本(例如/usr/lib/rpm/(redhat/)brp-*) 同時建構 RPM 包,為您添加特定於分發的內容和/或提取執行時依賴項。這可能與您相關,也可能不相關(並且一些後處理腳本也可能適用於預建構的二進製文件,但由於缺少編譯器選項而其他不適用)。雖然我打包了很多軟體,但我對 Haskell 沒有經驗,但是在查看一些 Fedora 包時,有些 RPM 包具有執行時依賴項(如果存在執行時依賴項,則必須滿足RPM 包,因為這就是 RPM 的工作方式;並且在文件系統的某個位置擁有匹配的庫是不夠的,因為 RPM 不會知道它,除非它是由 RPM 包提供的)。因此,

關於上面的例子:雖然SourceX:可以給定一個 URL,但在建構 RPM 包時rpmbuild仍然希望這些文件在SOURCES目錄中的磁碟上(因此它們如何進入SOURCES目錄取決於您)。

鑑於您沒有提及您的目標是哪個 Linux 發行版,我在此處連結 Fedora 的Haskell 打包指南,它可能會或可能不會提供進一步的啟發。是的,RPM 包可以是交叉分發的,這實際上通常會導致 RPM 包中的靜態二進製文件,因為不同的 Linux 發行版上通常有不同的庫/包版本。

引用自:https://serverfault.com/questions/1077113