GNU Make: Wie $ (Wildcard) innerhalb von $ (eval) aufgerufen wird

8

Ich versuche eine generische Build-Vorlage für meine Makefiles zu erstellen, so wie sie in Eval-Dokumentation .

Ich kann nicht scheinen, dass die Wildcard-Funktion in einem eval funktioniert. Der grundlegende Code, mit dem ich Probleme habe, sieht so aus.

%Vor%

Wenn ich make damit starte, ist die Ausgabe

%Vor%

Grundsätzlich wird der Platzhalteraufruf in PROGRAM_template nicht so ausgewertet, wie ich es erwarte. Der Aufruf führt zu einer leeren Liste.
Der Join-Aufruf wird jedoch korrekt ausgewertet.

Also, was mache ich falsch? Meine Vermutung ist das

%Vor%

ist nicht korrekt, aber ich kann den richtigen Weg nicht finden.

BEARBEITEN Sobald dies gelöst war, dauerte es nicht lange, bis ich ein weiteres Problem mit Eval bekam. Ich habe es als neue Frage bei Abhilfe für GNU Make 3.80 eval bug

    
bengineerd 10.03.2010, 23:39
quelle

1 Antwort

10

Sie müssen praktisch alle Funktionen und Variablen doppelt verwenden, wenn Sie eval verwenden. In den meisten Fällen sind die einzigen Dinge, die nicht doppelt maskiert werden müssen, Funktionsargumente (weil die Funktion call diese vollständig erweitert). In diesem Fall müssen Sie theoretisch auch nicht join oder SRC_DIR doppelklicken, aber es wird Ihr Leben vereinfachen, wenn Sie immer nur alle Variablen und Funktionen doppelt deklarieren, wenn Sie eval verwenden.

Der Grund, warum Sie doppelte Escapes benötigen, ist, dass die Expansion zweimal erfolgt, wenn eval verwendet wird. Die eval -Funktion selbst führt eine Erweiterung durch, und dann wird die Erweiterung wieder durchgeführt, wenn der Block schließlich als Makefilesyntax analysiert wird (d. H. Wenn er tatsächlich ausgewertet wird).

Wie Sie es geschrieben haben, wildcard wird im String-Literal $( test_SRC_DIR)*.c aufgerufen. Wenn Sie möchten, können Sie dies selbst sehen, indem Sie wildcard durch info in Ihrer Version ersetzen und sehen, was passiert.

Sie müssen den Aufruf von wildcard bis zur zweiten Erweiterung anhalten, damit das Argument das Ergebnis der Erweiterung von $(test_SRC_DIR) ist.

Versuchen Sie Folgendes:

%Vor%

BEARBEITEN : Nachdem ich das gepostet habe, dachte ich, ich sollte es besser testen, um sicherzustellen, dass es tatsächlich funktioniert. Dabei habe ich ein anderes Problem entdeckt. Sie sollten vermeiden, Leerzeichen zwischen Komma und Argument beim Aufruf von Funktionen zu setzen. Dadurch wird dem Argument ein Literal-Leerzeichen vorangestellt, das an die Funktion übergeben wird und zu unbeabsichtigten Ergebnissen führt. Ich habe die Leerzeichen nach den Kommas in den Funktionsaufrufen in meiner Version entfernt (während dies kein Problem für den Aufruf von join ist, habe ich auch dort den Platz entfernt, nur weil es eine gute Angewohnheit ist, sich daran zu gewöhnen).

    
Dan Moulding 11.03.2010, 01:45
quelle

Tags und Links