Récupère le répertoire de niveau supérieur à partir de la variable makefile


8

Quel est le code le plus simple pour obtenir la partie répertoire de niveau supérieur d'une variable makefile? Exemple:

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

PS: Je ne veux pas dire $(dir $(dir $(BUILD_DIR))), mais quelque chose qui obtient la première partie du répertoire de toute valeur variable.


dirname /tmp/foo/bardonnera /tmpou dirname foo/bar/bazdonnerafoo
Abhishek A

1
@ greenmang0: a signalé votre réponse. Premièrement, c'est tout simplement faux (avez-vous même exécuté ces commandes?), Et deuxièmement, c'est pour un makefile , pas Bash.
l0b0

@ l0b0 C'est un commentaire, et "c'est faux" n'est pas une bonne raison de signaler quoi que ce soit, laissez simplement un commentaire disant quel est le problème
Michael Mrozek

@MichaelMrozek: Je l'ai signalé "pas constructif / hors sujet", ce qui s'applique tous les deux.
l0b0

Je ne comprends pas votre question: que voulez-vous dire par «la partie du répertoire de niveau supérieur»? Voulez-vous dire la partie avant le premier /? Garantissez-vous que l'argument est un chemin relatif? Supposez-vous que GNU fasse?
Gilles 'SO- arrête d'être méchant'

Réponses:


5

Voulez-vous dire le premier composant du répertoire? Si tel est le cas, transformez le chemin en une liste de composants, puis extrayez le premier composant. Je suppose que vous utilisez GNU make et que vous ne faites pas quelque chose de fou, comme attendre des noms de fichiers avec des espaces pour passer indemne. N'essayez pas ceci avec un chemin absolu.

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

Je fais BUILD_DIRpasser outre ce que l'utilisateur a pu passer sur la ligne de commande, pour éviter que quelqu'un ne le passe accidentellement et fasse supprimer quelque chose d'inattendu.


BUILD_DIRétait censé être une variable interne, mais vous avez raison, il y a toujours la possibilité que quelqu'un la définisse sur quelque chose de dangereux. Donc, accepter cette réponse, avec la mise en garde que la solution ne doit pas être utilisée :)
l0b0

1
@ l0b0 Puisque nous supposons que GNU fait:override BUILD_DIR = …
Gilles 'SO- arrête d'être méchant'

0

Si vous êtes certain que BUILD_DIR ne commencera jamais par un «/»:

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

Sinon, vous devrez peut-être prendre en compte les chemins commençant par '/':

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

echo $rootdir

Ou peut-être vaut-il mieux ignorer tout chemin commençant par «/».


1
C'est pour un makefile, pas Bash. C'est un problème trivial dans Bash, mais je suis intéressé par une solution simple de makefile .
l0b0

Une chose que vous pouvez faire dans un Makefile est d'exécuter des commandes. Vous créez donc un script shell, dans votre chemin, appelé rootdir, et dans votre makefile, exécutez "rm -rf $ (rootdir $ BUILD_DIR)", ou quelque chose comme ça. Ou vous devrez faire quelque chose comme prédéfinir la racine de build, afin de pouvoir le rm -rffaire plus tard. Je reverrais certainement la réponse que le rootdirscript peut renvoyer, donc vous ne vous retrouvez pas avec une erreur de syntaxe en donnant votre script rm -rf /.
Tim Kennedy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.