如何可靠地修改建構配置並在 C/C++ RPM 文件中添加編譯器標誌?
出於測試目的,我需要更改大量 rpm 文件的建構配置。我在這裡只說 C/C++ 程式碼。我不一定要進行自動化,但我什至可以手動操作。
這次我將使用一個具體的例子來使問題更清楚。假設我有 Perl Compatible Regular Expressions 庫的 rpm,並且specfile有:
%configure \ %ifarch s390 s390x sparc64 sparcv9 riscv64 --disable-jit \ %else --enable-jit \ %endif --enable-pcretest-libreadline \ --enable-utf \ --enable-unicode-properties \ --enable-pcre8 \ --enable-pcre16 \ --enable-pcre32 \ --disable-silent-rules %{make_build}
我想為 AddressSanitizer 添加編譯器標誌,所以我在後面添加
--disable-silent-rules
:CFLAGS="$CFLAGS -fsanitize=address -g3" CXXFLAGS="$CXXFLAGS -fsanitize=address -g3" \ LDFLAGS="$LDFLAGS -fsanitize=address -g3" \ LSAN_OPTIONS="verbosity=1:log_threads=1:log_pointers=1" ASAN_OPTIONS="detect_leaks=0"
這是最好的方法嗎?我發現有時,這不起作用。在這種情況下,我檢查了輸出 .sos 並且它們沒有 asan 部分或
-g3
調試資訊…在這種情況下,我正在尋找一種可靠的方法來添加 asan 和調試資訊,但這可能適用於任何此類編譯器標誌。我也可以嘗試手動執行此操作,但我更喜歡使用 RPM 工具,以便能夠可靠地重現 RPM 規範文件中指定的確切建構。
適用於大多數包的最通用方法是自定義
optflags
宏。您可以為它創造
$HOME/.rpmrc
並賦予您定制的價值。要獲取我們作業系統的目前值,您可以首先執行:
rpm --eval %{optflags}
這將產生,例如在 RHEL 8 上:
-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/ redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection
複製粘貼您的結果,同時根據需要修改參數,例如更改
-g
為-g3
並將其保存在~/.rpmrc
.通過再次執行上述命令來驗證您是否正確執行了所有操作,以獲取修改後的值。