2012-01-02 180 views
5

如果没有在命令行中指定任何内容,是否有方法来更改规格文件,以便它通过-march=native如何让gcc使用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)} 

我不知道规格是如何工作的。在%(cc1_cpu)之前或之后仅指定-march=native不起作用。但是,这条线确实生效,因为如果我将-something_wierd而不是-march=native,GCC将报告错误。

另一件事我注意到的是,如果我%(cc1_cpu)之前把%{march=i386:-something_wierd},GCC会报告错误,以便看起来像-march=i386始终如果没有指定传入,那么有没有在规范文件中指定的方式没有什么区别和-march=i386

顺便说一句,%>是做什么用的?似乎没有指定in the documentation

我正在使用MinGW的gcc-4.6.2

回答

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. 

要回答日E在短的第一个问题:是的,但....

...唯一的通用的解决方案,我发现有显著缺点,即-march选项将被忽略,所以每次构建时就好像-march=native指定做了。无论如何,有一个解决方法。

1的溶液(无解决方法)

中创建一个规范文件让我们说specs.nativealways包含:

*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)} 

当使用规范文件(例如,通过与选项调用gcc-specs=specs.nativealways)构建将按照指定-march=native的方式完成(提及的缺点是任何发生的选项-march=<arch>都将被忽略)。

2解决方法

为了仍然能够覆盖新配置的默认行为的一个可以使用上面所描述的,引入一个新的选项的规格文件的修改版本使用相同的语法-march称为-myarch-myarch=native除外,这将不起作用,因为native现在是默认值)。

的modfied规范文件看起来是这样的:

*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)} 

PS:这已经与Linux上的GCC 4.6.2测试,但应该在MinGW的工作。

+0

我真的出来了一些类似的解决方案,你的第一种方法。我实际上意识到主要问题是-march = i386总是默认传入,并且无法确定它是通过默认方式还是通过命令行传入。我猜想改变GCC源代码几乎是唯一的方法。 – 2012-01-05 08:02:06

+0

@icando:你的名字! – alk 2012-01-05 08:05:04

1

虽然不直接回答您的问题,但可以通过在shell的初始化文件中定义CFLAGSCXXFLAGS来达到非常相似的效果。 99%的Makefiles足够标准地提取环境值并将标志传递给gcc

+0

我同意,也许这种工作在大多数情况下是足够的。 – 2012-01-05 08:05:06

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

如果我没有记错的话,这是行不通的(问题太旧了)。原因是cc1不接受原生参数为-march。它实际上调用local_cpu_detect以具有正确的值。 – 2012-05-31 17:16:58

+0

@icando重要的部分是'%{!march *:'。只有当'-march ='不在命令行时才会匹配,这意味着如果没有指定其他内容,就会得到“默认”。我不知道有关实际的参数。 – baruch 2012-05-31 20:53:28

+0

@icando我知道这个问题很旧。我只是想做类似的事情(如果没有其他定义,将g ++的默认设置为C++ 11),并通过Google找到我的方式。一旦我找到了解决我的问题的办法,我想我会把它放在这里,以便其他人在未来寻找类似的东西。 – baruch 2012-05-31 20:55:23

相关问题