Re: CFLAGS in /etc/make.conf / Optimierungen

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Mon, 24 Dec 2007 14:17:19 +0100 (CET)

Alvar Freude wrote:
> Oliver Fromme wrote:
>
> > > CFLAGS= -O -g -pipe
> >
> > Auweia. Diese Optionen waren mit keiner FreeBSD-Version
> > der letzten 10 Jahre sinnvoll. Streiche die Zeile bitte
> > ersatzlos.
>
> Warum das? Sollten Kernel, World und Ports normalerweise mit -O0
> (Buchstabe O, Zahl Null, also ohne Optimierungen) kompiliert werden?
>
> Oder werden die CFLAGS standardmäßig auf einen sinnvollen Wert gesetzt?

Ja, werden sie. Die oben angegebene CFLAGS-Zeile ist
gleich in mehrfacher Hinsicht problematisch:

 - Man sollte bei den CFLAGS grundsätzlich "?=" statt "="
   verwenden, damit einzelne Makefiles die Einstellung
   überschreiben können, wenn es notwendig ist. Einige
   Sourcen sind sehr empfindlich, was die Compilerflags
   betrifft. Um nur ein Beispiel zu nennen: Eine an sich
   »harmlose« Änderung kann dazu führen, dass der platz-
   kritische Code von /boot/boot2 ein paar Bytes zu lang
   wird und nicht mehr in die 8 KB passt, die am Anfang
   einer Partition für den Bootcode reserviert sind.

 - Es gibt keinen Grund, -O zu verwenden und damit den
   Code unnötig langsamer zu machen.

 - Wenn man grundsätzlich alles mit -g compilieren will,
   Sollte man eher »CFLAGS+= -g« schreiben.

 - Davon abgesehen sind die Default-Compilerflags bereits
   so eingestellt, dass man das Maximum an Performance
   erhält, das möglich ist, ohne dass bekannte sich Bugs
   oder bekannte Probleme manifestieren. Wenn man von
   diesen Defaults abweichen will (wofür es durchaus gute
   Gründe geben mag), sollte man schon genau wissen, was
   man tut. Aus obiger Zeile ist klar ersichtlich, dass
   der Betreffende es nicht wusste.

 - Außerdem kann es durchaus mal passieren, dass sich der
   Default ändert, beispielsweise wenn eine neue Version
   des Compilers andere Flags erfordert. Wer seine CFLAGS
   überschreibt und die entsprechenden Mailinglisten nicht
   regelmäßig verfolgt, bekommt so eine Änderung nicht mit
   und läuft möglicherweise ins offene Messer.

Übrigens, momentan ist der Default sowohl unter RELENG_6
als auch RELENG_7 »-O2 -pipe -fno-strict-aliasing«. Wie
gesagt, einzelne Makefiles verwenden andere CFLAGS (aus
verschiedenen Gründen), sofern man das nicht mit einem
fehlerhaften Eintrag in /etc/make.conf verbaut hat.

> Beim Kernel macht u.U. ja alles ab -O2 Probleme,

Nö. Die Einstellungen für den Kernel sind aktuell diesel-
ben wie für den Rest, jedenfalls unter FreeBSD/i386 und
ohne DEBUG (bei amd64 sieht es etwas anders aus), und von
einigen speziellen Sourcen abgesehen.

Kann man übrigens in /sys/conf/kern.pre.mk nachlesen.

> aber dafür ist da ja,
> wenn ich das richtig verstanden habe, COPTFLAGS da.

Ja. Wird leider auch häufig missbraucht bzw. ohne Kennt-
nis der Folgen in /etc/make.conf überschrieben.

> Gibt es eine empfohlene Möglichkeit, das für die Ports extra zu setzen,
> diese also beispielsweise generell mit -O2 zu kompilieren?

Das ist bereits der Default. :-)

> Was ist zu CPUTYPE zu sagen?

Das ist eigentlich in der make.conf(5)-Manpage hinreichend
beschrieben. Wenn Du eine konkrete Frage dazu hast, heraus
damit. Ich setze CPUTYPE auf den meisten Maschinen ent-
sprechend (wobei man natürlich aufpassen muss, wenn man
Builds für andere Maschinen macht), und habe bisher noch
nie Probleme damit bemerkt.

> Anhand der Dokumentation in /usr/share/examples/etc/make.conf würde ich
> schon davon ausgehen, dass das Setzen dieser Optionen sinnvoll und
> gewünscht ist. Ebenso anhand make.conf(5).

Ja, wobei es aber auch kein großer Schaden ist, wenn man es
nicht tut. Ich glaube, in den meisten Fällen kann man den
Unterschied höchstens messen, aber nicht fühlen.

Ausnahmen sind natürlich Programme, die spezielle Optimie-
rungen für bestimmte Prozessorfeatures haben (beispiels-
weise Crypto-Algorithmen, Mediaplayer usw.), aber die haben
dann meistens noch eigene Optionen, mit denen man das
Compilieren beeinflussen kann; ich denke da z.B. an den
mplayer-Port.

> Daher meine Frage: Warum ist das "Auweia" und seit 10 Jahren
> nicht sinnvoll,

Das habe ich ja schon oben detailliert erläutert.

In den letzten 10 Jahren (und schon länger) waren die
Default-Optimierungen entweder -O oder -O2, daher ergibt
es keinen Sinn, das in /etc/make.conf so reinzuschreiben.
Bestenfalls ist es wirkungslos, schlimmstenfalls handelt
man sich Probleme mit Sourcen ein, die gerne mit anderen
Flags compiliert werden möchten. Der Boot-Code z.B. hat
eine Zeitlang _nicht_ mit -O funktioniert, sondern brauchte
-Os (aktuell geht wieder beides, glaube ich).

> warum ist das nicht dokumentiert?

Das ist eine sehr gute Frage. Ich würde mir wünschen,
dass die ganze Sache besser in share/examples/etc/make.conf
und in make.conf(5) beschrieben wird, inkl. entsprechenden
Warnungen. Ich hatte das vor kurzem mal in der -current-
Liste angesprochen, und jemand hat dann den Wortlaut auch
ein wenig klarifiziert, aber ich glaube, nach RELENG_6 hat
die Änderung ihren Weg leider nicht gefunden.

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
"C++ is the only current language making COBOL look good."
        -- Bertrand Meyer
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 24 Dec 2007 - 14:17:29 CET

search this site