Ruft das Verzeichnis der obersten Ebene aus der Makefile-Variablen ab


8

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/barwird geben /tmpoder dirname foo/bar/bazgebenfoo
Abhishek A

1
@ greenmang0: Hat deine Antwort markiert. Erstens ist es einfach falsch (haben Sie diese Befehle überhaupt ausgeführt?) Und zweitens für ein Makefile , nicht für Bash.
10b0

@ l0b0 Es ist ein Kommentar, und "es ist falsch" ist kein guter Grund, etwas zu kennzeichnen. Hinterlassen Sie einfach einen Kommentar, in dem das Problem angegeben ist
Michael Mrozek

@MichaelMrozek: Ich habe es als "nicht konstruktiv / nicht thematisch" gekennzeichnet, was beides gilt.
10b0

Ich verstehe Ihre Frage nicht: Was meinen Sie mit "dem Verzeichnisteil der obersten Ebene"? Meinst du den Teil vor dem ersten /? Garantieren Sie, dass das Argument ein relativer Pfad ist? Nehmen Sie an, GNU machen?
Gilles 'SO - hör auf böse zu sein'

Antworten:


5

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.

override BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf $(firstword $(subst /, ,$(BUILD_DIR)))

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.


BUILD_DIRsollte 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 :)
l0b0

1
@ l0b0 Da wir davon ausgehen, dass GNU machen:override BUILD_DIR = …
Gilles 'SO- hör auf böse zu sein'

0

Wenn Sie sicher sind, dass BUILD_DIR niemals mit einem '/' beginnt:

rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )

Andernfalls müssen Sie möglicherweise Pfade berücksichtigen, die mit '/' beginnen:

if [[ $BUILD_DIR =~ "^/" ]]; then
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1,2 )
else
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )
fi

echo $rootdir

Oder vielleicht ist es am besten, jeden Pfad zu ignorieren, der mit '/' beginnt.


1
Dies ist für ein Makefile, nicht für Bash. Dies ist ein triviales Problem in Bash, aber ich bin an einer einfachen Makefile- Lösung interessiert .
10b0

Eine Sache, die Sie in einem Makefile tun können, ist das Ausführen von Befehlen. Sie erstellen also in Ihrem Pfad ein Shell-Skript namens rootdir und führen in Ihrem Makefile "rm -rf $ (rootdir $ BUILD_DIR)" oder ähnliches aus. Oder Sie müssen so etwas wie das Build-Root vordefinieren, damit Sie rm -rfes später können. Ich würde auf jeden Fall die Antwort überprüfen, die das rootdirSkript zurückgeben kann, damit Sie nicht mit einem Syntaxfehler enden, der Ihr Skript angibt rm -rf /.
Tim Kennedy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.