如何可靠地修改构建配置并在 C/C++ RPM 文件中添加编译器标志?

如何可靠地修改构建配置并在 C/C++ RPM 文件中添加编译器标志?

我需要更改大量 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.

再次运行上述命令以获取修改后的值,验证您是否正确执行了所有操作。

相关内容