如何让gcc使用march = native作为默认值?

时间:2012-01-02 22:01:09

标签: gcc gcc4

有没有办法更改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

3 个答案:

答案 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的初始化文件中定义CFLAGSCXXFLAGS来达到非常相似的效果。 99%的Makefile足够标准,可以获取环境值并将标志传递给gcc

答案 2 :(得分:1)

*cc1_cpu:
+ %{!march*:-march=native}