2010-12-29 14 views
4

Was ist die richtige Methode, um das Verzeichnis zu erhalten, in dem das aktuell ausgeführte Makefile befindet?Beziehen Verzeichnis Makefile befindet sich in

Ich benutze derzeit export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))) und bin in einige Probleme, wo beim Ausführen mit den exakt gleichen Optionen in verschiedenen Werten für ROOT führen. Ungefähr 90% der Zeit hat es den korrekten Wert, aber in den restlichen 10% gibt es eine Anzahl von ungültigen Pfaden.

+0

hängt wirklich von OS und 'make' Sie verwenden (Linux GNU machen?) – reinierpost

Antwort

4

$ (shell pwd) ist nicht korrekt, da das Makefile möglicherweise in einem anderen Verzeichnis als pwd existiert (wie von make -f erlaubt).

Die OP vorgeschlagene

export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))) 

in Ordnung ist, mit der Ausnahme, s/er will wahrscheinlich firstword stattdessen verwenden, vor allem, wenn die Top-Level-Make-Datei (potentiell) include s andere Make-Datei (en) vor der ROOT assiging .

Die OPs 10% Problem erklärt werden könnte, wenn es eine bedingte umfassen 10% der Zeit vor der Aufgabe war es, aber, hey, dass eine Vermutung ist ...

10

realpath, abspath, lastword und ein paar Weitere Funktionen wurden nur in GNU Make 3.81 eingeführt [Siehe Referenz]. Nun können Sie den aktuellen Dateinamen in älteren Versionen erhalten mit words und word:

THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 

Aber ich bin nicht sicher, ob eine Abhilfe für realpath ohne an die Shell zu gehen. z.B. Dies funktioniert mit Make v3.80: http://cvs.savannah.gnu.org/viewvc/make/NEWS?revision=2.93&root=make&view=markup

1

Für Ihre Bequemlichkeit, wenn GNU beginnt machen (nachdem er alle -C Optionen verarbeitet hat) :

THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) 
THIS_MAKEFILE:=$(notdir $(THIS_MAKEFILE_PATH)) 

all: 
     @echo "This makefile is $(THIS_MAKEFILE) in the $(THIS_DIR) directory" 

Welche

$ make -f ../M 
This makefile is M in the /home/sandipb directory 

Ref gibt Es setzt die Variable CURDIR auf den Pfadnamen des aktuellen Arbeitsverzeichnisses. Dieser Wert wird nie wieder von make berührt: Beachten Sie insbesondere, dass der Wert von CURDIR sich nicht ändert, wenn Sie Dateien aus anderen Verzeichnissen einschließen. Der Wert hat dieselbe Priorität, die er hätte, wenn er im Makefile festgelegt wäre (standardmäßig wird eine Umgebungsvariable CURDIR diesen Wert nicht überschreiben). Beachten Sie, dass das Setzen dieser Variablen keinen Einfluss auf die Operation make hat (make veranlasst z. B. nicht, dass das Arbeitsverzeichnis geändert wird).

alle: echo $ (CURDIR)

Verwandte Themen