5

有没有办法更改规范文件,以便-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.

我注意到的另一件事是,如果我放%{march=i386:-something_wierd}之前%(cc1_cpu),gcc 报告错误所以看起来-march=i386总是在没有指定的情况下传入,那么有没有办法区分没有指定和-march=i386在 specs 文件中?

顺便说一句,有什么作用%>?似乎文档中没有指定。

我正在使用 MinGW 的gcc-4.6.2.

4

3 回答 3

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包含:

*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使用 option调用-specs=specs.nativealways),构建将按照-march=native指定的方式完成(具有提到的缺点,即任何出现的 option-march=<arch>都将被简单地忽略)。

2 解决方法

为了仍然能够覆盖新配置的默认行为,可以使用上述规范文件的修改版本,引入一个新选项,使用与(except for )-myarch相同的语法调用,它不起作用,不符合现在是默认值)。-march-myarch=nativenative

修改后的规格文件如下所示:

*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。

于 2012-01-04T16:00:18.680 回答
1

虽然不是您问题的直接答案,但您可以通过在 shell 的初始化文件中定义CFLAGS和来达到非常相似的效果。CXXFLAGS99% 的 Makefile 足够标准,可以获取环境值并将标志传递给gcc.

于 2012-01-04T17:10:21.953 回答
1
*cc1_cpu:
+ %{!march*:-march=native}
于 2012-05-31T10:19:08.303 回答