【问题标题】:How to make gcc uses march=native as default?如何使 gcc 默认使用 March=native?
【发布时间】:2012-01-02 22:01:09
【问题描述】:

如果在命令行中没有指定任何内容,有没有办法更改规范文件以便通过-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 会报错。

我注意到的另一件事是,如果我将%{march=i386:-something_wierd} 放在%(cc1_cpu) 之前,gcc 会报告错误,所以看起来-march=i386 总是在未指定时传入,所以有没有办法区分未指定和@987654331 @ 在规范文件中?

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

我正在使用 MinGW 的 gcc-4.6.2

【问题讨论】:

    标签: gcc gcc4


    【解决方案1】:

    参考您的最后一个问题: gcc 4.6.1 来源 (gcc/gcc.c) 包含对 %> 的以下评论:

     %>S    Similar to "%<S", but keep it in the GCC command line.
    

    为了完整起见,%&lt; 的评论形成同一文件:

     %<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 文件时(例如通过使用选项 -specs=specs.nativealways 调用 gcc),构建将像指定 -march=native 一样完成(上述缺点是任何出现选项 -march=&lt;arch&gt; 都会只是被忽略了)。

    2 解决方法

    为了仍然能够覆盖新配置的默认行为,可以使用上述规范文件的修改版本,引入一个名为 -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)}
    

    PS:这已经在 Linux 上使用 gcc 4.6.2 进行了测试,但应该可以在 MinGW 上运行。

    【讨论】:

    • 我实际上提出了与您的第一种方法类似的解决方案。我实际上意识到主要问题是 -march=i386 始终默认传入,无法判断它是默认传入还是通过命令行传入。我想更改 GCC 源代码几乎是唯一的方法。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      *cc1_cpu:
      + %{!march*:-march=native}
      

      【讨论】:

      • 这行不通,如果我没记错的话(问题太老了)。原因是 cc1 不接受 native 作为 -march 的参数。它实际上调用 local_cpu_detect 来为 -march 提供正确的值。
      • @icando 重要的部分是%{!march*:。仅当-march= 不在命令行中时才会匹配,这意味着如果未指定其他任何内容,您将获得“默认”。我对实际的 -march 参数一无所知。
      • @icando 我知道这个问题很老了。我只是想做类似的事情(如果没有定义其他内容,则将 g++ 的默认设置为 c++11)并通过 Google 找到我的方式。一旦我找到了解决问题的方法,我想我会把它放在这里,以帮助其他人在未来寻找类似的东西。
      • 感谢您分享您的答案。我认为它可能适用于 -std=c++11 标志,但您可以从我的问题中看到,如果在命令行中未指定 -march,则会传入 -march=i386。所以你的东西不会匹配任何东西,因此没有效果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多