2012-01-02 48 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

相關問題