Ottieni directory di livello superiore dalla variabile makefile


8

Qual è il codice più semplice per ottenere la parte di directory di livello superiore di una variabile makefile? Esempio:

BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf <some code which evaluates to "dir" from $(BUILD_DIR)>

PS: Non intendo $(dir $(dir $(BUILD_DIR))), ma qualcosa che ottiene la prima parte della directory di qualsiasi valore variabile.


dirname /tmp/foo/bardarà /tmpo dirname foo/bar/bazdaràfoo
Abhishek A

1
@ greenmang0: segnalato la tua risposta. Innanzitutto, è assolutamente sbagliato (hai anche eseguito quei comandi?), E in secondo luogo è per un makefile , non per Bash.
l0b0

@ l0b0 È un commento e "è sbagliato" non è un buon motivo per segnalare qualcosa, lascia un commento dicendo che il problema è
Michael Mrozek

@MichaelMrozek: l'ho contrassegnato "non costruttivo / off topic", entrambi i quali si applicano ad esso.
l0b0

Non capisco la tua domanda: cosa intendi con "la parte di directory di primo livello"? Intendi la parte prima della prima /? Garantisci che l'argomento è un percorso relativo? Stai assumendo GNU make?
Gilles 'SO- smetti di essere malvagio' il

Risposte:


5

Intendi il primo componente della directory? In tal caso, trasforma il percorso in un elenco di componenti, quindi estrai il primo componente. Presumo che tu stia usando GNU make e non stai facendo qualcosa di folle come aspettarti che i nomi dei file con spazi bianchi passino incolumi. Non provarlo con un percorso assoluto.

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

Faccio eseguire l' BUILD_DIRoverride di qualsiasi cosa l'utente abbia passato dalla riga di comando, per evitare che qualcuno lo passi accidentalmente e che venga eliminato qualcosa di indesiderato.


BUILD_DIRdoveva essere una variabile interna, ma hai ragione, c'è ancora la possibilità che qualcuno la imposti su qualcosa di pericoloso. Quindi accettando questa risposta, con l'avvertenza che la soluzione non dovrebbe essere utilizzata :)
l0b0

1
@ l0b0 Dato che supponiamo che GNU faccia:override BUILD_DIR = …
smetti di essere malvagio

0

Se sei sicuro che BUILD_DIR non inizierà mai con un '/':

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

Altrimenti, potresti dover tenere conto dei percorsi che iniziano con '/':

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

echo $rootdir

O forse è meglio ignorare qualsiasi percorso che inizia con '/'.


1
Questo è per un makefile, non per Bash. Questo è un problema banale in Bash, ma sono interessato a una semplice soluzione makefile .
l0b0

Una cosa che puoi fare in un Makefile è eseguire i comandi. Quindi crei uno script di shell, nel tuo percorso, chiamato rootdir, e nel tuo makefile, esegui "rm -rf $ (rootdir $ BUILD_DIR)" o qualcosa del genere. Oppure dovrai fare qualcosa come pre-definire la radice della build, in modo da poterlo rm -rffare in seguito. Dobbiamo sicuramente ricontrollare la risposta che lo rootdirscript può restituire, quindi non si finisce con un errore di sintassi che fornisce lo script rm -rf /.
Tim Kennedy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.