テストのために、複数のrpmファイルのビルド構成を変更する必要があります。ここでは C/C++ コードについてだけ話しています。必ずしも自動化したくはありませんが、手で行うこともできます。
今回は、問題をより明確にするために具体的な例を使用します。 Perl互換の正規表現ライブラリrpmがあり、仕様書持っている:
%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ツールを使用することをお勧めします。
答え1
ほとんどのソフトウェアパッケージに適用される最も一般的な方法はカスタムoptflags
マクロです。
$HOME/.rpmrc
カスタム値を作成して配置できます。
オペレーティングシステムの現在の値を取得するには、まず次のように実行できます。
rpm --eval %{optflags}
たとえば、RHEL 8では、次のように生成されます。
-O2 -g -pipe -Wall -Werror=安全なフォーマット -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fExceptionions -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
。
上記のコマンドを再実行して変更された値を取得し、すべての操作が正しく行われたことを確認してください。