View previous topic :: View next topic |
Author |
Message |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Tue Feb 24, 2009 9:39 am Post subject: [solved]Makefile: CFLAGS in Abhängigkeit von Version des gcc |
|
|
Gibt es eine (portable) Möglichkeit, in einem Makefile die CFLAGS in Abhängigkeit von der Version des gcc zu setzen? Hintergrund: Bei gcc-Versionen ab 4.2 möchte ich -march=native zu den CFLAGS hinzufügen, andernfalls -march=i586.
EDIT: solved. _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern.
Last edited by schachti on Wed Feb 25, 2009 10:57 am; edited 1 time in total |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
mv Watchman
![Watchman Watchman](/images/ranks/rank-G-2-watchman.gif)
![](images/avatars/169262237648b51b40d0ec0.png)
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Tue Feb 24, 2009 1:35 pm Post subject: |
|
|
Nein, make.conf kennt keine Conditionals. Du könntest höchstens mit /etc/portage/bashrc tricksen oder einen wrapper benutzen, der geeignete C*FLAGS exportiert (beides ist aber nicht "sauber" gegenüber emerge --info, d.h. Du solltest das nicht nutzen, wenn Du bei Problemen einen Bug melden willst).
Aber wie oft wechselt man schon den gcc, dass das wichtig wird? Es lässt sich doch inzwischen praktisch der gesamte Portage-Baum mit gcc-4.2 compilieren, und für die 1-2 Pakete, bei denen man ohnehin manuell gcc-conig aufrufen muss, kann man genausogut auch das make.conf editieren. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Tue Feb 24, 2009 1:45 pm Post subject: |
|
|
Sorry, ich habe mich vermutlich nicht klar ausgedrückt:
Es geht um ein Programmierprojekt, von dem einige Teile in C und C++ programmiert sind und das unter unterschiedlichen Distributionen eingesetzt werden soll. Einige davon haben einen aktuellen gcc an Bord, der -march=native kennt, andere haben einen alten gcc, der es nicht kennt. _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Finswimmer Bodhisattva
![Bodhisattva Bodhisattva](/images/ranks/rank-bodhisattva.gif)
![](images/avatars/1672586922424daf205ec26.jpg)
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Tue Feb 24, 2009 2:04 pm Post subject: |
|
|
schachti wrote: | Sorry, ich habe mich vermutlich nicht klar ausgedrückt:
Es geht um ein Programmierprojekt, von dem einige Teile in C und C++ programmiert sind und das unter unterschiedlichen Distributionen eingesetzt werden soll. Einige davon haben einen aktuellen gcc an Bord, der -march=native kennt, andere haben einen alten gcc, der es nicht kennt. |
Für sowas kann man doch gut das ./configure Skript gebrauchen?
Tobi _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
mv Watchman
![Watchman Watchman](/images/ranks/rank-G-2-watchman.gif)
![](images/avatars/169262237648b51b40d0ec0.png)
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Tue Feb 24, 2009 2:04 pm Post subject: |
|
|
Sorry, ich hatte nicht richtig gelesen: Da stand ja "makefile" und nicht "make.conf"
Solche Sachen würde ich nicht im Makefile machen, sondern in configure.ac (ich nehme mal an, Du benutzt autotools): Schließlich kann man dort testen, ob der Compiler das entsprechende Flag versteht. Wobei der bessere Weg aber vermutlich ohnehin wäre, die CFLAGS/CXXFLAGS dem Paketbauer zu überlassen (wenn du nicht spezielle Flags unbedingt erzwingen musst). In jedem Fall würde ich mindestens noch eine Option für ./configure dazu bauen, dass man dieses automatische Hinzufügen auch abstellen kann: Spätestens wenn jemand das Projekt cross-compilieren möchte, gibt es sonst Ärger. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Tue Feb 24, 2009 2:14 pm Post subject: |
|
|
Bisher nutzen wir noch ein manuell erstelltes Makefile anstatt der autotools - da es eine wissenschaftliche Software ist, die sehr rechenintensiv ist, macht eine Anpassung der CFLAGS bzw. CXXFLAGS da auch richtig Sinn, und -march=native ist eigentlich ein schönes Mittel, um das ganze relativ plattformunabhängig zu bewältigen (solange der verwendete gcc neu genug ist).
Auf jeden Fall vielen Dank für Eure Hilfe, ich will bei Gelegenheit mal sehen, wie man unsere manuell generierten Makefiles mit den autotools unter einen Hut bekommt... _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
69719 l33t
![l33t l33t](/images/ranks/rank_rect_4.gif)
Joined: 20 Sep 2004 Posts: 865
|
Posted: Tue Feb 24, 2009 2:38 pm Post subject: |
|
|
Code: |
CFLAGS_GENERAL = -Wall -O2
CFLAGS_NATIVE = $(CFLAGS_GENERAL) -march=native
CFLAGS_i586 = $(CFLAGS_GENERAL) -march=i586
CFLAGS = $(shell echo 'void main(){}' | gcc $(CFLAGS_NATIVE) -E - &>/dev/null && echo $(CFLAGS_NATIVE) || echo $(CFLAGS_i586))
LDFLAGS = -s
all:
...
|
|
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Tue Feb 24, 2009 3:03 pm Post subject: |
|
|
Danke - unter openSUSE 11.1 funktioniert das, unter Ubuntu 8.04.2 leider nicht:
Makefile:
Code: |
CFLAGS_GENERAL = -Wall -O2
CFLAGS_NATIVE = $(CFLAGS_GENERAL) -march=faselbla
CFLAGS_i586 = $(CFLAGS_GENERAL) -march=i586
CFLAGS = $(shell echo 'void main(){}' | gcc $(CFLAGS_NATIVE) -E - &>/dev/null && echo $(CFLAGS_NATIVE) || echo $(CFLAGS_i586))
all:
echo $(CFLAGS)
|
openSUSE:
Code: |
michael@suse:~/test> make all
echo -Wall -O2 -march=i586
-Wall -O2 -march=i586
|
Ubuntu:
Code: |
michael@ubuntu:~$ make all
:0: Fehler: Falscher Wert (faselbla) für Schalter -march=
:0: Fehler: Falscher Wert (faselbla) für Schalter -mtune=
echo -Wall -O2 -march=faselbla # 1 "<stdin>"
-Wall -O2 -march=faselbla
|
EDIT: Auf beiden Rechnern ist GNU Make 3.81 installiert, der gcc unterscheidet sich aber:
openSUSE: gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291]
Ubuntu: gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3) _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
69719 l33t
![l33t l33t](/images/ranks/rank_rect_4.gif)
Joined: 20 Sep 2004 Posts: 865
|
Posted: Tue Feb 24, 2009 3:26 pm Post subject: |
|
|
Dann probier es mal damit.
Code: |
...
CFLAGS = $(shell echo 'void main(){}' | gcc $(CFLAGS_NATIVE) -E - >&2 2>/dev/null && echo $(CFLAGS_NATIVE) || echo $(CFLAGS_i586))
...
|
Das liegt wohl eher an den verschiedenen Shell's. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Tue Feb 24, 2009 3:33 pm Post subject: |
|
|
Das funktioniert, vielen Dank!
Seltsam ist aber, dass auf beiden Rechnern die Bash installiert und als meine Standard-Shell festgelegt ist:
Ubuntu: GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
openSUSE: GNU bash, version 3.2.39(1)-release (i586-suse-linux-gnu) _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
69719 l33t
![l33t l33t](/images/ranks/rank_rect_4.gif)
Joined: 20 Sep 2004 Posts: 865
|
Posted: Tue Feb 24, 2009 3:35 pm Post subject: |
|
|
EDV, da steckt man nicht drin... |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Tue Feb 24, 2009 8:56 pm Post subject: |
|
|
Auf meinem gentoo-System gab's eine unschöne Ausgabe - ich habe hier noch >&2 ersetzt durch 1>/dev/null, jetzt scheint es zu passen... _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
mv Watchman
![Watchman Watchman](/images/ranks/rank-G-2-watchman.gif)
![](images/avatars/169262237648b51b40d0ec0.png)
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Tue Feb 24, 2009 9:26 pm Post subject: :evil: |
|
|
Make benutzt per Default vermutlich /bin/sh, und auf ordentlichen Systemen ist das eben eine POSIX-shell und nicht bash.
Ich vermute übrigens, dass die Umleitung so gemeint war: Code: | ... >/dev/null 2>&1 | (die Reihenfolge ist wichtig). Das ist genau die "Standard"-Phrase, für die bash zwei extra-Syntaxe eingeführt hat (>&/dev/null und &>/dev/null, wobei das zweite empfohlen wird - vermutlich, um Benutzer von POSIX-Shells anstelle einer Shell-Fehlermeldung mit unabsehbaren Seiteneffekten auflaufen zu lassen ). |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
schachti Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/17240378884464519a52d60.jpg)
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Wed Feb 25, 2009 6:44 am Post subject: |
|
|
Ah, ok - ich bin davon ausgegangen, dass make "meine" Standard-Shell nutzt. _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Mr. Anderson l33t
![l33t l33t](/images/ranks/rank_rect_4.gif)
![](images/avatars/2070781095424ebf0894d33.png)
Joined: 22 Apr 2004 Posts: 762
|
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
mv Watchman
![Watchman Watchman](/images/ranks/rank-G-2-watchman.gif)
![](images/avatars/169262237648b51b40d0ec0.png)
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Wed Feb 25, 2009 3:21 pm Post subject: Re: :evil: |
|
|
Dort steht doch nur, dass eine spezielle Option jetzt POSIX-mäßig behandelt wird - von genereller POSIX-Kompatibilität ist dort nicht die Rede. Bash wird vermutlich nach wie vor auch praktisch alle Bashismen anstandslos schlucken, selbst wenn sie als /bin/sh aufgerufen wurde, so dass Probleme wie das in diesem Thread von Leuten unentdeckt bleiben, die bash als /bin/sh benutzen. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Mr. Anderson l33t
![l33t l33t](/images/ranks/rank_rect_4.gif)
![](images/avatars/2070781095424ebf0894d33.png)
Joined: 22 Apr 2004 Posts: 762
|
Posted: Wed Feb 25, 2009 3:32 pm Post subject: Re: :evil: |
|
|
mv wrote: | Dort steht doch nur, dass eine spezielle Option jetzt POSIX-mäßig behandelt wird - von genereller POSIX-Kompatibilität ist dort nicht die Rede. |
Um diese eine Option ging es auch. Habe ich behauptet, dass es in dem Beitrag um vollständige POSIX-Kompatibilität geht?
Ob sie es nun ist, weiß ich nicht. Aber in diese Richtung hat sie sich jedenfalls bewegt:
Quote: | Kleinere Änderungen gab es für ulimit, das nun POSIX-kompatibel ist. Eine Option während des Übersetzens stellt den Default-Mode für die bash auf POSIX, die Kommandozeilenoption --posix leistet dasselbe. |
|
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
|