Was ist der einfachste Code, um den Verzeichnisteil der obersten Ebene einer Makefile-Variablen abzurufen? Beispiel:
BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
rm -rf <some code which evaluates to "dir" from $(BUILD_DIR)>
PS: Ich meine nicht $(dir $(dir $(BUILD_DIR)))
, sondern etwas , das das erste Verzeichnis Teil bekommt jeder Variablenwert.
dirname /tmp/foo/bar
wird geben/tmp
oderdirname foo/bar/baz
gebenfoo
/
? Garantieren Sie, dass das Argument ein relativer Pfad ist? Nehmen Sie an, GNU machen?Antworten:
Meinen Sie die erste Komponente des Verzeichnisses? Wenn ja, verwandeln Sie den Pfad in eine Liste von Komponenten und extrahieren Sie die erste Komponente. Ich gehe davon aus, dass Sie GNU make verwenden und nicht etwas Wahnsinniges tun, wie zu erwarten, dass Dateinamen mit Leerzeichen unversehrt bleiben. Versuchen Sie dies nicht mit einem absoluten Pfad.
Ich
BUILD_DIR
überschreibe alles , was der Benutzer möglicherweise über die Befehlszeile übergeben hat, um zu vermeiden, dass jemand es versehentlich übergibt und etwas unbeabsichtigt löscht.quelle
BUILD_DIR
sollte eigentlich eine interne Variable sein, aber Sie haben Recht, es besteht immer noch die Möglichkeit, dass jemand sie auf etwas Gefährliches setzt. Also akzeptiere diese Antwort mit der Einschränkung, dass die Lösung nicht verwendet werden sollte :)override BUILD_DIR = …
Wenn Sie sicher sind, dass BUILD_DIR niemals mit einem '/' beginnt:
Andernfalls müssen Sie möglicherweise Pfade berücksichtigen, die mit '/' beginnen:
Oder vielleicht ist es am besten, jeden Pfad zu ignorieren, der mit '/' beginnt.
quelle
rm -rf
es später können. Ich würde auf jeden Fall die Antwort überprüfen, die dasrootdir
Skript zurückgeben kann, damit Sie nicht mit einem Syntaxfehler enden, der Ihr Skript angibtrm -rf /
.