2012-01-02 17 views
5

Teknik özellikler, komut satırında hiçbir şey belirtilmediyse -march=native'u geçecek şekilde dosya özelliklerini değiştirmenin bir yolu var mı? Varsayılan gözlük dosyasındagcc march = native varsayılan olarak nasıl kullanılır?

İlgili şeyler:

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

Ben gözlük işler böyle eminim. 'dan önce veya sonra -march=native belirtiliyor. Ancak, bu satıryerine -something_wierd koyarsanız GCC hata bildirir, çünkü etkili olur. Ben %(cc1_cpu) önce %{march=i386:-something_wierd} koyarsanız

Fark başka şey çok gözlük dosyasındaki bir şey ayırt yolu belirtilen ve -march=i386 yoktur, gcc raporlar hata nedenle her zaman bir şey belirtilmemişse, içinde geçirilir -march=i386 benzemesidir?

BTW, %> ne yapar? in the documentation belirtilmemiş gibi görünüyor.

MinGW gcc-4.6.2 kullanıyorum.

cevap

4

son soruya değinen: 4.6.1 kaynakları (gcc/gcc.c) Aşağıdaki %> üzerine yorumu içerir gcc: %< formu aynı dosya için açıklama aşağıdaki Bütünlük adına

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

th cevaplamak için e ilk kısacası soru: evet, ama ....

... Bulduğum tek jenerik çözüm -march seçenek yüzden her yapı belirtilen olmuştu -march=native sanki yapılır, yoksayılmasıdır önemli bir dezavantajı var . Neyse, bunun bir çözümü var.

adlı bir gözlük dosyası oluşturun (geçici çözüm olmadan)

1 çözüm en içeren specs.nativealways diyelim:

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

seçeneğiyle gcc çağırarak örneğin gözlük-dosya (kullanarak -specs=specs.nativealways) Yapı -march=native belirtilmiş gibi (-march=<arch> seçeneklerinin görülme olasılığının basitçe yok sayılacağı belirtildi) yapılacaktır.

2 geçici çözüm

için hala bir yeni bir seçenek tanıtan, yukarıda açıklanan özellikleri dosya değiştirilmiş bir sürümünü kullanabilirsiniz yeni yapılandırılan varsayılan davranışı geçersiz kılmak mümkün -march aynı sözdizimi kullanılarak -myarch denilen tarafından (Çalışmayacak olan -myarch=native hariç, native olarak artık geçerli değil) varsayılan değerdir.

modfied gözlük dosya şuna benzer:

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

Not: Bu Linux üzerinde gcc 4.6.2 ile birlikte test edilmiştir, ancak MinGW üzerinde çalışması gerekir.

+0

Aslında ilk yaklaşımınıza benzer bir çözümle çıktım. Aslında asıl sorunun -march = i386'nın her zaman varsayılan olarak geçtiğini ve varsayılan olarak veya komut satırından geçip geçmediğini anlamanın bir yolu olmadığını fark ettim. Bence GCC kaynak kodunu değiştirmek neredeyse tek yoldur. –

+0

@icando: Bunu siz adlandırın! – alk

1

Sorunuza doğrudan bir yanıt olmasa da, kabuğun başlatma dosyasında CFLAGS ve CXXFLAGS tanımlayarak çok benzer bir etki elde edebilirsiniz. Makefile'lerin% 99'u çevre değerlerini almak ve bayrakları gcc'a iletmek için yeterince standarttır.

+0

Katılıyorum, belki bu iş çoğu durumda yeterlidir. –

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

, bu doğru çalışmıyorsa (soru çok eskiydi) işe yaramaz. Nedeni cc1, -march parametresi olarak native'i kabul etmiyor. Aslında, yerel_cpu_detect'i -march için doğru bir değere sahip olmak için çağırır. –

+0

@icando Önemli olan '% {! March *:' dır. Bu, yalnızca -march = 'komut satırında değilse, başka hiçbir şey belirtilmediyse bir" varsayılan "aldığınız anlamına gelir. Asıl parametreler hakkında hiçbir şey bilmiyorum. – baruch

+0

@icando Ve bu sorunun eski olduğunu biliyorum. Sadece benzer bir şey yapmak istiyordum (g ++ için varsayılan değeri başka hiçbir şey tanımlanmamışsa C++ 11 olarak ayarla) ve Google aracılığıyla buradaki yolumu buldum. Problemime bir çözüm bulduktan sonra, gelecekte benzer bir şey arayan başkalarının yararına buraya koyacağımı düşündüm. Cevabınızı paylaştığınız için – baruch