Ich habe mehrere Makefiles in app-spezifischen Verzeichnissen wie diesem:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Jedes Makefile enthält eine .inc-Datei in diesem Pfad eine Ebene höher:
/project1/apps/app_rules.inc
In app_rules.inc lege ich das Ziel fest, an dem die Binärdateien beim Erstellen platziert werden sollen. Ich möchte, dass sich alle Binärdateien auf ihrem jeweiligen app_type
Pfad befinden:
/project1/bin/app_typeA/
Ich habe versucht$(CURDIR)
, wie folgt zu verwenden:
OUTPUT_PATH = /project1/bin/$(CURDIR)
Stattdessen habe ich die Binärdateien wie folgt im gesamten Pfadnamen vergraben: (Beachten Sie die Redundanz)
/project1/bin/projects/users/bob/project1/apps/app_typeA
Was kann ich tun, um das "aktuelle Verzeichnis" der Ausführung abzurufen, damit ich nur das wissen kann, app_typeX
um die Binärdateien in ihrem jeweiligen Typordner abzulegen?
quelle
$(lastword "$(MAKEFILE_LIST)")
von einem Makefile am Pfad erhalten"Sub Directory/Makefile"
Sie"Directory/Makefile"
. Ich glaube nicht, dass es einen Ausweg gibt, da Sie$(MAKEFILE_LIST)
mit zwei Makefiles eine einzige Zeichenfolge erhalten"Makefile One Makefile Two
, die keine Leerzeichen verarbeiten kanncurrent_dir
funktioniert bei mir nicht.$(PWD)
tut und es ist viel einfacher."solution only works when you are running make from the Makefile's current directory"
ist eine milde Art zu sagen "nicht wirklich funktioniert". Ich würde das neueste Stück ganz oben auf die Antwort setzen.Wie von hier genommen ;
Erscheint als;
Hoffe das hilft
quelle
dir
statt ,shell dirname
obwohl es Pfadname bekommt mit Hinter/
Charakter.DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
vor alleninclude
Vorgängen ( Dokumenten ) stehen.dirname
-, falls der Pfad Leerzeichen enthält.Wenn Sie GNU make verwenden, ist $ (CURDIR) tatsächlich eine integrierte Variable. Dies ist der
Speicherort, an dem sich das Makefileim aktuellen Arbeitsverzeichnis befindet. Dort befindet sich wahrscheinlich das Makefile, aber nicht immer .Siehe Anhang A Kurzreferenz unter http://www.gnu.org/software/make/manual/make.html
quelle
/
. Ich habe versucht, mitgmake
v3.81 gebunden . Aber Sie haben Recht, wennmake
es heißtmake -f xxx/Makefile
.CURDIR
arbeitet für mich woPWD
nicht. Ich hattemkdir -p a/s/d
dann in jedem Ordner ein Makefile, das gedruckt wurdePWD
undCURDIR
vorher+$(MAKE) <subdir>
.quelle
Ich habe viele dieser Antworten ausprobiert, aber auf meinem AIX-System mit gnu make 3.80 musste ich einige Dinge der alten Schule erledigen.
Stellt sich heraus , dass
lastword
,abspath
undrealpath
wurden bis 3,81 hinzugefügt. :((Wie andere gesagt haben, nicht das eleganteste, da es eine Shell zweimal aufruft, und es hat immer noch die Platzprobleme.
Da ich jedoch keine Leerzeichen auf meinen Pfaden habe, funktioniert dies für mich unabhängig davon, wie ich angefangen habe
make
:Alle geben mir
wherever
fürcurrent_dir
und den absoluten Weg zuwherever
fürmkfile_dir
.quelle
Ich mag die gewählte Antwort, aber ich denke, es wäre hilfreicher, sie tatsächlich als funktionierend zu zeigen, als sie zu erklären.
/tmp/makefile_path_test.sh
Ausgabe:
HINWEIS: Mit dieser Funktion
$(patsubst %/,%,[path/goes/here/])
wird der nachgestellte Schrägstrich entfernt.quelle
Hier ist ein Einzeiler, um
Makefile
mithilfe der Shell-Syntax den absoluten Pfad zu Ihrer Datei zu erhalten :Und hier ist eine Version ohne Shell basierend auf @ 0xff Antwort :
Testen Sie es, indem Sie es ausdrucken, wie:
quelle
Hier gefundene Lösung: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
Die Lösung ist : $ (CURDIR)
Sie können es so verwenden:
quelle
$(CURDIR)
bereits erfolglos versucht wurde.make
es gestartet wurde). Es ist in der Tat das, was OP wirklich wollte, aber der Titel der Frage ist falsch, so dass die Frage selbst inkonsistent ist. Dies ist also eine richtige Antwort auf eine falsche Frage. ;)Soweit mir bekannt ist, ist dies hier die einzige Antwort, die mit Leerzeichen richtig funktioniert:
Es funktioniert im Wesentlichen durch Leerzeichen entweicht durch Substitution
' '
für'\ '
welche Marke ermöglicht es richtig zu analysieren, und dann entfernt er die Dateinamen der Make - Datei inMAKEFILE_LIST
einem anderen Substitution zu tun , so dass Sie mit dem Verzeichnis links sind , dass Make - Datei ist in . Nicht gerade die kompakteste Sache in der Welt, aber es funktioniert.Sie werden mit so etwas enden, wo alle Leerzeichen maskiert werden:
quelle
Beispiel für Ihre Referenz wie folgt:
Die Ordnerstruktur könnte wie folgt sein:
Wo es zwei Makefiles gibt, jeweils wie unten;
Lassen Sie uns nun den Inhalt der Makefiles sehen.
Führen Sie nun das Beispiel / Makefile aus als;
Erläuterung: Das übergeordnete / Home-Verzeichnis kann im Umgebungsflag gespeichert und exportiert werden, sodass es in allen Makefiles des Unterverzeichnisses verwendet werden kann.
quelle
update 2018/03/05 finnaly Ich benutze dies:
Es kann korrekt im relativen oder absoluten Pfad ausgeführt werden. Wird korrekt ausgeführt und von crontab aufgerufen. In einer anderen Shell korrekt ausgeführt.
Beispiel zeigen, a.sh Selbstpfad drucken.
alt: Ich benutze das:
Es kann korrekt angezeigt werden, wenn es in einer anderen Shell und einem anderen Verzeichnis ausgeführt wird.
quelle
Eine Zeile im Makefile sollte ausreichen:
DIR := $(notdir $(CURDIR))
quelle