有没有办法更改specs文件,以便在命令行中没有指定任何内容时它会传递-march=native
?
默认规范文件中的相关内容是:
*cc1:
%(cc1_cpu)
*cc1_cpu:
%{march=native:%>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}
我不确定规格如何运作。只需在-march=native
之前或之后指定%(cc1_cpu)
即可。但是,此行确实生效,因为如果我将-something_wierd
代替-march=native
,GCC将报告错误。
我注意到的另一件事是,如果我将%{march=i386:-something_wierd}
放在%(cc1_cpu)
之前,gcc报告错误,如果没有指定任何内容,总是会传入-march=i386
,那么有没有办法区分什么都没有指定和规范文件中的-march=i386
?
BTW,%>
做了什么?好像没有指定in the documentation。
我正在使用MinGW的gcc-4.6.2
。
答案 0 :(得分:4)
参考您的上一个问题: gcc 4.6.1来源(gcc/gcc.c
)在%>
上包含以下评论:
%>S Similar to "%<S", but keep it in the GCC command line.
为了完整性,%<
的评论形成了相同的文件:
%<S remove all occurrences of -S from the command line.
Note - this command is position dependent. % commands in the
spec string before this one will see -S, % commands in the
spec string after this one will not.
简单回答第一个问题:是的,但是......
...我发现的唯一通用解决方案有一个明显的缺点,即-march
选项将被忽略,因此每次构建都完成,就像指定了-march=native
一样。无论如何,有一个解决方法。
1解决方案(无解决方法)
创建一个名为specs.nativealways
的specs文件,其中包含:
*cc1_cpu:
%<march=* -march=native %>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}
使用specs文件时(例如通过使用选项gcc
调用-specs=specs.nativealways
),构建将完成,就像指定-march=native
一样(具有所提到的任何出现的缺点)选项-march=<arch>
只会被忽略。)
2解决方法
为了能够覆盖新配置的默认行为,可以使用上述specs文件的修改版本,使用与-myarch
相同的语法引入名为-march
的新选项(除了-myarch=native
对于native
,这将无法正常工作,因为*cc1_cpu:
%<march=* %{myarch=*:%<myarch* -march=%* ; :-march=native %>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}
现在是默认设置。
修改后的specs文件如下所示:
{{1}}
PS:这已经在Linux上使用gcc 4.6.2进行了测试,但是应该适用于MinGW。
答案 1 :(得分:1)
虽然不能直接回答您的问题,但您可以通过在shell的初始化文件中定义CFLAGS
和CXXFLAGS
来达到非常相似的效果。 99%的Makefile足够标准,可以获取环境值并将标志传递给gcc
。
答案 2 :(得分:1)
*cc1_cpu:
+ %{!march*:-march=native}