2016-07-11 22 views
0

Ich möchte eine oder mehrere Zeilen innerhalb einer define-Direktive in einem Makefile kommentieren, so dass die Zeile ignoriert wird, wenn die Direktive erweitert wird. Das Ziel besteht darin, die kommentierte Zeile als Hinweis für die Benutzer meines Makefiles zu platzieren, um ein Beispiel zu zeigen, was in der define-Direktive sein könnte. Die Richtlinie wird zu einem Ziel erweitert.Wie man eine Zeile innerhalb einer Makefile define Direktive kommentiert?

Mit anderen Worten, ich möchte, dass Makefile

define ECHO_FOO = 
# @echo foo 
endef 

all: 
    @echo Before call 
    $(ECHO_FOO) 
    @echo After call 

.PHONY: all 

als diese das gleiche Verhalten haben:

define ECHO_FOO = 
endef 

all: 
    @echo Before call 
    $(ECHO_FOO) 
    @echo After call 

.PHONY: all 

Das Problem ist, dass die erste Makefile mir folgende Fehler gibt:

process_begin: CreateProcess (NULL, # @ echo foo, ...) fehlgeschlagen. make (e = 2): Das System kann die angegebene Datei nicht finden. Makefile: 6: Rezept für das Ziel 'all' ist fehlgeschlagen make: *** [all] Fehler 2

Die GNU make:Makefile contents Seite lautet:

Innerhalb einer Richtlinie definieren, Kommentare werden nicht ignoriert während der Definition der Variablen, sondern im Wert der Variablen intakt gehalten. Wenn die Variable erweitert wird, werden sie entweder als Kommentare oder als Rezepttext behandelt, abhängig vom Kontext, in dem die Variable ausgewertet wird.

Aber das erklärt nicht, in der konkreten Fall des # Symbol als Make Kommentar behandelt wird oder als Rezepttext (das das Problem, das ich treffe zu sein scheint).

Kann mir jemand sagen, wie man das #-Symbol als Kommentarzeichen in einer Define-Funktion behandelt?

Ich habe bereits versucht, alle folgenden Zeilen mit der Idee, das Symbol # Flucht oder die Vertiefung aber keiner von ihnen gab mir eine korrekte Ausgabe zu ändern:

#@echo foo 
    #@echo foo 
##@echo foo 
    ##@echo foo 
\#@echo foo 
    \#@echo foo 
/#@echo foo 
    /#@echo foo 

Ich bin mit MinGW 3.82 machen auf Windows aber ich habe bereits andere Implementierungen von make v3.82.90 und 4.1 ausprobiert.

Antwort

1

Es gibt keine Möglichkeit zu tun, was Sie direkt fragen. Der Inhalt der Variablen wird in einem Rezeptkontext erweitert. Unabhängig davon, was die Variable erweitert, wird sie als Teil des Rezepts betrachtet und alle vorhandenen Zeichen werden an die Shell übergeben.

Hinweis Sie können : in UNIX-Shells sowie Windows command.com verwenden, da : der Shell-NO-OP-Operator ist. Sie müssen ein Leerzeichen danach hinzufügen, ansonsten versucht es, den Befehl :echo auszuführen, der kein gültiger Befehl ist. Beachten Sie jedoch, dass die Shell die Linie noch erweitern wird! Dies bedeutet, dass wenn Sie Backquotes usw. verwenden, diese immer noch erweitert werden. Beachten Sie auch, dass das Semikolon es stoppt, da es sich um eine Anweisung handelt.So zum Beispiel:

define ECHO_FOO 
: echo hi `echo there 1>&2` ; echo bye 
endef 

all: ; @$(ECHO_FOO) 

Hier wird die hi nicht gedruckt werden, da der Echo-Befehl nicht ausgeführt wird, aber die Backticks sind noch erweitert, so wird there gedruckt werden (stderr) und das Semikolon endet die „no -op "Befehl so bye wird auch gedruckt werden.

Wenn Ihre Befehle einfach genug sind, um dann : funktionieren wird, aber wenn sie es so einfach fragt man sich, warum Sie define verwenden ...

Eine weitere Option ist nur die Variable außer Kraft zu setzen, anstatt sie zu kommentieren out:

define ECHO_FOO = 
    @echo foo 
endef 

ECHO_FOO = 

ETA: In den Kommentaren bestätigen Sie, dass der Befehl einfach ist. Ich weiß nicht genau, was Sie unter könnte durch den Endbenutzer erweitert werden oder warum das einen Unterschied macht.

Aber was ich zu anspielte, ist, dass, wenn Sie einen einfachen Befehl haben, können Sie einfach schreiben:

ECHO_FOO = echo hi 

und nicht define verwenden. wird nur für komplizierte Befehle benötigt: wirklich ist es nur für Befehle erforderlich, die un-maskierte Zeilenumbrüche enthalten.

Und, wenn Sie schreiben:

ECHO_FOO =# echo hi 

dann kommentieren Sie den Inhalt der Variablen out Kommentare mit machen, Kommentare nicht schälen, so wird es überall funktionieren.

+0

Danke, es funktioniert gut und ich bin froh zu wissen, dass es auf beiden Systemen funktioniert. Eigentlich ist der Befehl einfach, aber er könnte vom Endbenutzer erweitert werden, und ich war auf der Suche nach etwas Einfachem, weil der Endbenutzer kein großes Makefile-Wissen haben sollte, um meins zu verwenden. Zumindest war das mein Ziel. – Tim

+0

Antwort aktualisiert. – MadScientist

+0

Es ist nicht wirklich komplex, es ist eine Direktive, die alle Aufrufe von Post-Build-Skripten enthält, d. H. Von 0 (Standard mit kommentiertem Beispiel) bis zu vielen. Die Definitionsrichtlinie schien die beste Lösung zu sein, aber vielleicht war das eine schlechte Wahl. – Tim

1

Unter Windows können Sie : als Kommentarzeichen verwenden. Das traditionelle Kommentarschlüsselwort in MS-DOS ist REM (wie in "Bemerkung").

+0

Danke, mit '@ rem' funktioniert, aber ich würde eine OS-agnostic Lösung bevorzugen. Ich werde warten und sehen, ob eine andere Lösung kommt, und wenn keine Lösung kommt, werde ich Ihre akzeptieren. – Tim

Verwandte Themen