Warum überschreiben Umgebungsvariablen nicht standardmäßig Variablen, die in Makefiles festgelegt sind?

7

Ich kompiliere Pakete und ich sehe, dass oft Makefile Autoren schreiben CFLAGS im Makefile, mit solchen und solchen Optionen. Ich würde andererseits gerne einige Compiler-Optimierungen ausprobieren und möchte die Compiler-Switches mit so wenig Aufwand wie möglich propagieren. Das ist jedoch nicht immer machbar. Zum Beispiel, wenn ein Makefile CFLAGS spezifiziert und ich möchte, dass alle C-Compiler-Aufrufe den -fomit-frame-pointer verwenden, ohne etwas wie CFLAGS=-fomit-frame-pointer make explizit schreiben zu müssen, was sind meine Optionen, die nicht hackish sind. Von dem, was ich dort sehen kann, ist das oben, dann gibt es das gleiche aber unterschiedliche make "CFLAGS=-fomit-frame-pointer" und ich kann auch tun, was ich für die beste Lösung und den Grund für diese Frage halte:

%Vor%

Ich halte das für das beste, denn ehrlich gesagt dachte ich sogar potentiell gefährliche Flagge, ich debugge Software nicht so viel, und wenn ich muss, kann ich ein bestimmtes Stück auf Nachfrage mit Debugging-Informationen und allem neu kompilieren. Ansonsten arbeite ich gerne mit der Release-Software, ohne überhaupt etwas zu tun, vor allem, wenn das Paket nicht von mir geschrieben wurde. Also ich denke, was ich hier speziell frage ist: Warum macht make nicht automatisch Umgebungsvariablen zu Makefile eigenen? Nachdem alle Umwelt weiß am besten was ist was, und wenn Autor wirklich etwas auf ihrem Weg haben muss, gibt es die "override" -Syntax, richtig?

    
amn 02.07.2010, 21:08
quelle

2 Antworten

5

Das ist vertretbar: "Nach allem weiß Umgebung am besten was ist was"

Es ist so, als würde man einem erwachsenen Kind sagen: "Mutter weiß es am besten" und sie davon abhalten, ein Jura zu studieren, weil man sehen wollte, um was für einen Klempner es sich handelt. Es ist ihr Leben. Lass los und lass sie ihre Wahl treffen.

Oh, warte, du hast nach der Umgebung gefragt und gemacht. Richtig.

Nun, make ist ein neuer Prozess, der beginnt, nachdem Sie Ihre Umgebung geändert haben. Im Allgemeinen weiß die Umgebung nicht, was die make-Ziele sind und wie sie funktionieren. Also, was immer make explizit macht, sollte übertrumpfen, was auch immer in der Umgebung passieren mag.

Update: Es gibt ein Argument, das ich ursprünglich in meiner Antwort übersehen habe - Vorhersagbarkeit. Die einzige Voraussetzung sollte das Vorhandensein eines standardisierten Satzes von Werkzeugen (dieselbe Version von GCC, gleiche Bibliotheken) sein, und vorausgesetzt, dass eine korrekt geschriebene Makefile immer das gleiche Ergebnis liefern sollte, egal welche Umgebung oder welche anderen Werkzeuge vorhanden sind .

    
Franci Penov 02.07.2010, 21:14
quelle
16

Machen Sie wird die Variablen überschreiben, wenn Sie sie auf die make-Befehlszeile setzen.

Versuchen Sie Folgendes: make CFLAGS=-fomit-frame-pointer

Ein Wort der Warnung. Die meisten Makefiles erwarten nicht, dass ihre Variablen überschrieben werden. Das bedeutet, wenn das Makefile CFLAGS verwendet, um -I für Include-Dateien, -O2 für die Optimierung oder andere Flags anzugeben, müssen Sie sie zu Ihrer CFLAGS-Überschreibung hinzufügen, sonst wird die make möglicherweise fehlschlagen.

    
Zan Lynx 02.07.2010 21:14
quelle

Tags und Links