2009-09-09 2 views
16

Wie erhält man den Namen des Makefiles im Makefile?Abrufen des Namens des Makefiles aus dem Makefile

Danke.

Hinweis:

würde ich brauche, weil ich meine Make-Datei selbst gerne nennen würde, aber die Make-Datei wird nicht genannt Makefile, so mag ich, so etwas schreiben:

target: 
    ($MAKE) -f ($MAKEFILENAME) other_target 
+0

Darf ich fragen, warum Sie das brauchen? – erelender

Antwort

10
location = $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 
WHERE_ART_THOU := $(location) 
$(warning $(WHERE_ART_THOU)) 

Ich glaube auch, das ist GNU make-spezifische, aber ich bin mir nicht sicher.

+1

Diese Lösung funktioniert nicht, wenn Sie den Makefile-Namen überprüfen, nachdem Sie ein anderes Makefile hinzugefügt haben! (Kopieren-Einfügen-Kommentar) –

+0

Es funktioniert, wenn Sie die erste Zeile korrigieren: es ist "$ (Wörter" statt "($ Wörter", und es gibt ein ")" fehlt am Ende der Zeile. Wenn Sie diese korrigieren Ich akzeptiere die Antwort. – hcs42

+0

"Diese Lösung funktioniert nicht, wenn Sie den Makefile-Namen überprüfen, nachdem Sie ein anderes Makefile hinzugefügt haben!" Das ist kein großes Problem. Ich kann die ersten beiden Zeilen dieses Codes am Anfang schreiben mein Makefile, das die WHERE_ART_THOU-Variable korrekt setzt, dann kann ich diese Variable irgendwo im Makefile verwenden, sie enthält den Namen meines Makefiles korrekt – hcs42

3

Ein kurzer Ausflug zu Google schlägt vor, this Website hat die Antwort.

+0

Nur für GNU Make - nicht mit nicht-GNU machen, im Allgemeinen zu arbeiten. –

+1

Diese Lösung funktioniert nicht, wenn Sie den Makefile-Namen überprüfen, nachdem Sie ein anderes Makefile hinzugefügt haben! –

7

(Sollten Sie Fragen haben, wenden Sie sich an erstaunlich geschrieben GNU make manual. Aber denken Sie daran, dass, genau wie Makefile, dieses Handbuch vollständig gelesen werden sollte, bevor Sie die Konzepte in die Praxis umsetzen).

Ich konnte nicht herausfinden, wie es leicht gemacht wird. Soweit ich weiß, müssen Sie einige manuelle Arbeit machen.

Später werde ich beschreiben, wie es gemacht werden könnte und zeigen Skripte, die current_makefile Variable einzuführen. Ich möchte jedoch ein wichtiges Konzept an erster Stelle betonen.

Sie sollten verstehen, dass, wenn wir eine Art von Variable current_makefile hatten, die zu dem aktuellen Makefile-Namen erweitert wird, dann muss es während des Lesens von Makefiles geändert werden. Das bedeutet, dass innerhalb des "sofortigen" Erweiterungskontexts verwendet werden sollte - d. H. Innerhalb von Befehlen, die ausgeführt werden während Lesen des Makefiles. Die meisten Befehle werden jedoch ausgeführt, nachdem Makefiles gelesen wurden. Daher wird bei einigen Befehlen der korrekte Wert problemlos ausgegeben, während an bestimmten Stellen, an denen die Erweiterung "defered" verwendet wird, immer der Name des Stammmakefile angezeigt wird.

Wenn Sie diese Variable beispielsweise im Regeltext verwenden möchten, müssen Sie Tricks ausführen, da der Regeltext immer eine verzögerte Erweiterung hat. Also, wenn Sie die Regel

rule: 
     echo In makefile $(current_makefile): 
     echo Making target [email protected] 

haben, wird es immer den Namen des Root-Makefile drucken. Stattdessen sofortige Expansion zu erzwingen, müssen Sie eine andere Variable mit Make-Datei spezifischen Namen erstellen (das heißt Namen dieser Variablen sollten in jedem Make-Datei unterschiedlich sein):

this_makefile_unique_name := $(current_makefile) 
rule: 
     echo In makefile $(current_makefile): 
     echo Making target [email protected] 

oder verwenden eval :.

define make_rule 
rule: 
     echo In makefile $(1): 
     echo Making target [email protected] 

$(eval $(call make_rule,$(current_makefile))) 

Wenn Sie nur den Namen der aktuellen Make-Datei für Debug-Zwecke zu nutzen, sollten Sie spezielle Debugging-Funktionen, wie Warnung oder Info :.

$(warning We're in makefile $(current_makefile)) 

Diese Funktionen verwenden die "sofortige" Erweiterung und geben den korrekten Wert aus.


Wie ein solches $ (current_makefile) definieren?

Sie müssen Makefile-Einschlüsse manuell bearbeiten. Wenn Sie ein Makefile einschließen, wird sein Name an den Anfang des Stapels platziert. Wenn Sie vom eingeschlossenen Makefile zum äußeren zurückkehren, wird der oberste Name aus dem Stapel herausgenommen. Dies wird durch Einfügen von Sonder Anrufe an den Anfang und das Ende der Make-Datei erreicht:

# Beginning of makefile 
$(eval $(makefile_names_push)) 
#... makefile text 
$(warning $(current_makefile)) 
#... 
$(eval $(makefile_names_pop)) 
#End of file 

definieren Sie nun die Funktionen am Anfang Ihrer Wurzel Make-Datei.

lastword=$(word $(words $(1)),$(1)) 

define makefile_names_push 
current_makefile := $$(CURDIR)/$$(call lastword,$$(MAKEFILE_LIST)) 
makefile_stack :=$$(makefile_stack) $$(current_makefile) 
endef 

define makefile_names_pop 
makefile_stack := $$(filter-out $$(current_makefile),$$(makefile_stack)) 
current_makefile := $$(call lastword,$$(makefile_stack)) 
endef 

Wenn Sie sicher sind, dass Ihr Make ist neu genug (Version 3.81+), ersetzen lastword Anruf mit eingebauter Funktion :.

#inctead of $$(call lastword,$$(MAKEFILE_LIST)) 
$$(lastword $$(MAKEFILE_LIST)) 

Ist es sinnvoll?

Total nutzlos. Eine einzige Verwendung, die hier nützlich sein könnte, besteht darin, 100 Makefiles zu erstellen, die symbolische Links zu einem Makefile sind, wobei die Regeln in diesen Makefiles von ihren Namen abhängen. Dies kann jedoch innerhalb einer im Handbuch beschriebenen Makefile- und Foreach-Eval-Technik erreicht werden. Also meine Post war eine komplette Zeitverschwendung, obwohl ich ein bisschen Spaß hatte :-)

2

Ich wollte etwas ähnliches (für den Inhalt des Makefile echo) für wenn ich Make für die Verwaltung von einfachen sich wiederholenden Aufgaben verwenden. Ich stieß auf diese Seite und fand heraus, dass es genau das war, was ich suchte und wirklich nützlich für mein begrenztes Verständnis von Make.

Mein Ergebnis nach dem Lesen dieser Seite:

 
    # Makefile - 'make' and 'make help' now echo the makefile. 
    help: 
     cat $(lastword $(MAKEFILE_LIST)) 
    start: 
     sudo -u www /path/to/webapp/myhttpd restart 
    stop: 
     sudo kill cat /path/to/webapp/data/httpd.pid 

Vielen Dank allen auf dieser Seite.

1

G'day,

Wenn Sie eine Kopie Ihrer ursprünglichen Make-Datei zu machen, sagen makefile_test, und dann den Befehl eingeben:

make -np -f makefile_test 2>&1 | tee output 

, dass die Make-Datei und Ihre Make-Umgebung evaluieren, aber nicht ausführen irgendwelche der Befehle. Wenn Sie in der Ausgabedatei nach Verweisen auf makefile_test suchen, sehen Sie, was in der Umgebung von make eingestellt ist und wo dieser Wert festgelegt wird.

N.B. Dies kann viele Informationen generieren! Und fügen Sie nicht den Schalter -d (debug) hinzu, der Tonnen von zusätzlicher Ausgabe über den Entscheidungsprozess von make erzeugt, sondern nur minimale zusätzliche Informationen über make's env.

HTH

1

Dies liefert den Namen des ersten Makefiles genannt, dh die eine an der Unterseite des Aufrufliste:

MAKEFILE_JUSTNAME := $(firstword $(MAKEFILE_LIST)) 
MAKEFILE_COMPLETE := $(CURDIR)/$(MAKEFILE_JUSTNAME) 

Wenn in nicht-quer rekursiven Situationen (zB für makedepend verwendet), ist es nur der Name des aktuellen Makefiles.