2012-01-02 11 views
5

C'è un modo per cambiare il file specs in modo che passerà -march=native se nulla è specificato nella riga di comando?Come fare gcc usa march = nativo come predefinito?

cose relative al file specs predefinito è:

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

Non sono sicuro di come funziona spec. Semplicemente specificando -march=native prima o dopo %(cc1_cpu) non funziona. Tuttavia, questa riga ha effetto perché GCC segnalerà un errore se inserisco -something_wierd anziché -march=native.

Un'altra cosa che ho notato è che se metto %{march=i386:-something_wierd} prima %(cc1_cpu), gcc errore rapporti in modo assomiglia -march=i386 è sempre passato in se nulla è specificato, quindi c'è un modo per distinguere tra il nulla specificato e -march=i386 nel file di specifiche?

BTW, cosa %> fare? Sembra che non sia specificato in the documentation.

Sto usando MinGW di gcc-4.6.2.

risposta

4

Facendo riferimento alla sua ultima domanda: Il gcc 4.6.1 fonti (gcc/gcc.c) contengono il seguente commento sulla %>:

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

Per ragioni di completezza dopo il commento per %< forma lo stesso file:

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

Per rispondere ° e prima domanda in breve: sì, ma ....

... l'unica soluzione generica che ho trovato ha lo svantaggio significativo che l'opzione -march verrà ignorata, in modo che ogni generazione è fatto come se -march=native era stato specificato . Comunque c'è una soluzione.

1 La soluzione (senza soluzione)

Creare uno spec-file chiamato diciamo specs.nativealways contenente:

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

Quando si utilizza la spec-file (ad esempio invocando gcc con l'opzione -specs=specs.nativealways) la compilazione verrà eseguita come se fosse stato specificato -march=native (con lo svantaggio menzionato che qualsiasi occorrenza dell'opzione -march=<arch> sarebbe stata semplicemente ignorata).

2 La soluzione

Per ancora da poter ignorare il comportamento predefinito appena configurato si può usare una versione modificata del spec-file di cui sopra descritto, l'introduzione di una nuova opzione chiamata -myarch utilizzando la stessa sintassi -march (eccetto per -myarch=native, che non funzionerà, che non funziona come native ora è l'impostazione predefinita).

Lo spec-file di modfied assomiglia a questo:

*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: Questo è stato testato con con gcc 4.6.2 su Linux, ma dovrebbe funzionare su MinGW.

+0

In realtà sono uscito con una soluzione simile al tuo primo approccio. In realtà mi sono reso conto che il problema principale è -march = i386 viene sempre passato di default e non c'è modo di sapere se è passato per impostazione predefinita o tramite riga di comando. Immagino che cambiare il codice sorgente GCC sia quasi l'unico modo. –

+0

@icando: lo chiami! – alk

1

Sebbene non sia una risposta diretta alla tua domanda, puoi ottenere un effetto molto simile definendo CFLAGS e CXXFLAGS nel file di inizializzazione della shell. Il 99% dei Makefile è sufficientemente standard per raccogliere i valori dell'ambiente e passare i flag a gcc.

+0

Sono d'accordo, forse questo lavoro è sufficiente nella maggior parte dei casi. –

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

questo non funzionerà, se ricordo male (la domanda era troppo vecchia). Il motivo è che cc1 non accetta il parametro nativo come -march. In realtà chiama local_cpu_detect per avere un valore corretto su -march. –

+0

@icando La parte importante è '% {! March *:'. Questo corrisponderà solo se '-march =' non è nella riga di comando, il che significa che si ottiene un "valore predefinito" se non viene specificato nient'altro. Non so nulla dei parametri del parametro -march. – baruch

+0

@icando E so che questa domanda è vecchia. Stavo solo cercando di fare qualcosa di simile (imposta il predefinito per g ++ per essere C++ 11 se non è stato definito nient'altro) e ho trovato la mia strada qui tramite Google. Una volta che ho trovato una soluzione al mio problema, ho pensato di metterlo qui a beneficio di chiunque altro cercasse qualcosa di simile in futuro. – baruch