如何直接覆盖rpm规范文件中的optflags?

问题描述 投票:0回答:3

如何正确覆盖

%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
这不是我的情况的解决方案。

rpm rpmbuild rpm-spec
3个回答
0
投票

您似乎已经找到了部分解决方案。要检查是否正确,您可以暂时放置

echo %optflags

在规范文件中打印该值或

%dump

转储所有宏(不确定 optflags 是否会以这种方式打印)


0
投票

您实际上不必替换 optflags 中的

-O2
即可有效使用
-O
。您只需将
-O
附加到 optflags,因为 gcc 只考虑最后一次出现的
-O
选项:

如果您使用多个 -O 选项,无论带或不带级别编号,最后一个 这样的选择才是有效的。

海湾合作委员会(1)

因此,您不需要 shell-out,只需像这样附加

-O
即可:

%global optflags %{optflags} -O

您可以通过使用

rpmspec
解析所有宏来验证此方法,例如:

$ rpmspec -P example.spec

0
投票

%{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 文档

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.