![如何可靠地修改构建配置并在 C/C++ RPM 文件中添加编译器标志?](https://linux22.com/image/176607/%E5%A6%82%E4%BD%95%E5%8F%AF%E9%9D%A0%E5%9C%B0%E4%BF%AE%E6%94%B9%E6%9E%84%E5%BB%BA%E9%85%8D%E7%BD%AE%E5%B9%B6%E5%9C%A8%20C%2FC%2B%2B%20RPM%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%B7%BB%E5%8A%A0%E7%BC%96%E8%AF%91%E5%99%A8%E6%A0%87%E5%BF%97%EF%BC%9F.png)
我需要更改大量 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 -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
.
再次运行上述命令以获取修改后的值,验证您是否正确执行了所有操作。