如何正确覆盖
%optflags
直接在spec文件中?
$ rpm --eval %optflags # Fedora 29
-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
我需要直接在我的
spec 文件中将
-O2
宏中的 -O
替换为 %optflags
吗?我只找到了这一个解决方案:
%global optflags %(echo %{optflags} | sed 's/-O[0-3]/-O/')
正确吗?
注意
rpmbuild -ba --define "optflags -O bla bla" my.spec
这不是我的情况的解决方案。
您似乎已经找到了部分解决方案。要检查是否正确,您可以暂时放置
echo %optflags
在规范文件中打印该值或
%dump
转储所有宏(不确定 optflags 是否会以这种方式打印)
您实际上不必替换 optflags 中的
-O2
即可有效使用 -O
。您只需将 -O
附加到 optflags,因为 gcc 只考虑最后一次出现的 -O
选项:
如果您使用多个 -O 选项,无论带或不带级别编号,最后一个 这样的选择才是有效的。
因此,您不需要 shell-out,只需像这样附加
-O
即可:
%global optflags %{optflags} -O
您可以通过使用
rpmspec
解析所有宏来验证此方法,例如:
$ rpmspec -P example.spec
%{optflags}
宏与许多其他宏一起用作包装器。 -O2
是一个单独的编译器标志,通常可以在 CFLAGS
中定义。
运行
rpm --showrc|grep '\-O2'
时,我们可以看到它是宏_general_options
的一部分。
所以你可以在spec文件中将其调整为:
%define _general_options -O
%{optflags}
将继承此宏,因此-O2
将变成-O
您也可以使用:
%define _general_option -O %{?_lto_cflags} -fexceptions -g -grecord-gcc-switches -pipe
这样,您将保留所有内容,但只需更改
-O2
标志
一个很好的参考是 buildflags 文档