Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[solved]Makefile: CFLAGS in Abhängigkeit von Version des gcc
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Tue Feb 24, 2009 9:39 am    Post subject: [solved]Makefile: CFLAGS in Abhängigkeit von Version des gcc Reply with quote

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
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6780

PostPosted: Tue Feb 24, 2009 1:35 pm    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Tue Feb 24, 2009 1:45 pm    Post subject: Reply with quote

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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Tue Feb 24, 2009 2:04 pm    Post subject: Reply with quote

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
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6780

PostPosted: Tue Feb 24, 2009 2:04 pm    Post subject: Reply with quote

Sorry, ich hatte nicht richtig gelesen: Da stand ja "makefile" und nicht "make.conf" :oops:
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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Tue Feb 24, 2009 2:14 pm    Post subject: Reply with quote

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
View user's profile Send private message
69719
l33t
l33t


Joined: 20 Sep 2004
Posts: 865

PostPosted: Tue Feb 24, 2009 2:38 pm    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Tue Feb 24, 2009 3:03 pm    Post subject: Reply with quote

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
View user's profile Send private message
69719
l33t
l33t


Joined: 20 Sep 2004
Posts: 865

PostPosted: Tue Feb 24, 2009 3:26 pm    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Tue Feb 24, 2009 3:33 pm    Post subject: Reply with quote

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
View user's profile Send private message
69719
l33t
l33t


Joined: 20 Sep 2004
Posts: 865

PostPosted: Tue Feb 24, 2009 3:35 pm    Post subject: Reply with quote

EDV, da steckt man nicht drin...
Back to top
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Tue Feb 24, 2009 8:56 pm    Post subject: Reply with quote

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
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6780

PostPosted: Tue Feb 24, 2009 9:26 pm    Post subject: :evil: Reply with quote

Make benutzt per Default vermutlich /bin/sh, und auf ordentlichen :wink: 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 :evil: ).
Back to top
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Wed Feb 25, 2009 6:44 am    Post subject: Reply with quote

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
View user's profile Send private message
Mr. Anderson
l33t
l33t


Joined: 22 Apr 2004
Posts: 762

PostPosted: Wed Feb 25, 2009 9:24 am    Post subject: Re: :evil: Reply with quote

mv wrote:
Make benutzt per Default vermutlich /bin/sh, und auf ordentlichen :wink: Systemen ist das eben eine POSIX-shell und nicht bash.


Das hat sich mit bash 4.0 deutlich gebessert. Hat sogar den Segen von Jörg Schilling bekommen:

http://www.heise.de/ix/news/foren/S-Nicht-zu-glauben/forum-152943/msg-16343264/read/
Back to top
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6780

PostPosted: Wed Feb 25, 2009 3:21 pm    Post subject: Re: :evil: Reply with quote

Mr. Anderson wrote:
Das hat sich mit bash 4.0 deutlich gebessert. Hat sogar den Segen von Jörg Schilling bekommen:

http://www.heise.de/ix/news/foren/S-Nicht-zu-glauben/forum-152943/msg-16343264/read/

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
View user's profile Send private message
Mr. Anderson
l33t
l33t


Joined: 22 Apr 2004
Posts: 762

PostPosted: Wed Feb 25, 2009 3:32 pm    Post subject: Re: :evil: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum