2012-01-02 17 views
5

Czy istnieje sposób zmiany pliku specs, aby minął -march=native, jeśli nic nie jest określone w wierszu poleceń?Jak uczynić gcc używa march = natywny jako domyślny?

Powiązane rzeczy w pliku domyślne specyfikacją jest:

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

Nie jestem pewien, jak specyfikacje działa. Po prostu podanie -march=native przed lub po %(cc1_cpu) nie działa. Jednak linia ta działa, ponieważ GCC zgłosi błąd, jeśli wstawię -something_wierd zamiast -march=native.

Inną rzeczą, jaką zauważyłem jest, jeśli kładę %{march=i386:-something_wierd} przed %(cc1_cpu), gcc błąd raporty tak wygląda -march=i386 jest zawsze przekazywana w razie nic nie jest określona, ​​więc czy jest jakiś sposób aby odróżnić nic określone i -march=i386 w pliku specyfikacji?

BTW, co robi %>? Wygląda na to, że nie jest określony in the documentation.

Używam MinGW's gcc-4.6.2.

Odpowiedz

4

Odnosząc się do ostatniego pytania: GCC 4.6.1 źródeł (gcc/gcc.c) zawierają następujący komentarz na %>:

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

Dla kompletności wywodu następujący komentarz do %< postaci tego samego pliku:

%<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. 

Aby odpowiedzieć na th e pierwsze pytanie w skrócie: tak, ale ....

... jedynym rozwiązaniem rodzajowy znalazłem ma znaczącą wadę, że opcja -march będą ignorowane, więc każdy build odbywa się jakby -march=native została określona . W każdym razie istnieje obejście tego problemu.

1 Rozwiązanie (bez obejścia)

Utwórz specyfikację plik o nazwie powiedzmy specs.nativealways zawierające:

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

Podczas korzystania widowisko-pliku (na przykład powołując gcc z opcją -specs=specs.nativealways) kompilacja zostanie wykonana tak, jakby podano -march=native (z tą wadą, że jakiekolwiek wystąpienie opcji -march=<arch> zostało po prostu zignorowane).

2 Obejście

Aby jeszcze przez stanie zastąpić nowo skonfigurowanego domyślne zachowanie można wykorzystać zmodyfikowaną wersję specyfikacji akt opisanej powyżej, wprowadzając nową opcję o nazwie -myarch stosując tę ​​samą składnię jak -march (z wyjątkiem -myarch=native, który nie zadziała, a teraz nie będzie liczył się jako native).

modfied specyfikacje plik wygląda tak:

*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: Ten został przetestowany z pomocą gcc 4.6.2 na Linuksa, ale powinien działać na MinGW.

+0

Właściwie znalazłem rozwiązanie podobne do twojego pierwszego podejścia. Faktycznie zdałem sobie sprawę, że głównym problemem jest -march = i386 jest zawsze domyślnie przekazywana i nie ma sposobu, aby stwierdzić, czy przekazano ją domyślnie, czy przez linię poleceń. Domyślam się, że zmiana kodu źródłowego GCC to prawie jedyny sposób. –

+0

@icando: Ty to nazwij! – alk

1

Nie będąc bezpośrednią odpowiedzią na pytanie, można osiągnąć bardzo podobny efekt poprzez zdefiniowanie CFLAGS i CXXFLAGS w pliku inicjującym powłoki. 99% plików Makefile jest wystarczająco standardowych, aby podnieść wartości środowiskowe i przekazać flagi do gcc.

+0

Zgadzam się, może ta praca jest wystarczająca w większości przypadków. –

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

to nie zadziała, jeśli dobrze pamiętam (pytanie było za stare). Powodem jest, że cc1 nie akceptuje natywnego jako parametru do -marcha. W rzeczywistości wywołuje on local_cpu_detect, aby mieć poprawną wartość do -march. –

+0

@icando Ważną częścią jest '% {! March *:'. To będzie pasować tylko wtedy, gdy '-march =' nie znajduje się w linii poleceń, co oznacza, że ​​otrzymasz "domyślny", jeśli nic innego nie zostanie określone. Nie wiem nic o faktycznych parametrach -march. – baruch

+0

@icando I wiem, że to pytanie jest stare. Właśnie szukałem czegoś podobnego (ustaw domyślne dla g ++ na C++ 11, jeśli nic innego nie jest zdefiniowane) i znalazłem drogę tutaj przez Google. Kiedy wymyśliłem rozwiązanie mojego problemu, pomyślałem, że umieściłbym go tutaj z korzyścią dla każdego, kto szuka czegoś podobnego w przyszłości. – baruch