Comment créer un répertoire dans un fichier makefile quand mkdir -p n'est pas disponible?
J'ai un makefile qui n'a l'habitude de création de répertoire:
$(Release_target_OBJDIR)/%.o: %.cpp
mkdir -p $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@
Malheureusement lorsque je l'exécute, en vertu de scratchbox2 la mkdir -p de la commande échoue toujours en silence.
J'ai tenté la suite de quelque chose qui ne fonctionne pas:
$(Release_target_OBJDIR)/%.o: %.cpp
mkdir $(dir $(dir $(dir $@)))
mkdir $(dir $(dir $@))
mkdir $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@
Ce sorties:
mkdir -p /home/foo/projects/htc/arm/obj/cbar/release/
mkdir -p /home/foo/projects/htc/arm/obj/cbar/release/
mkdir -p /home/foo/projects/htc/arm/obj/cbar/release/
... le slash empêche la fonction dir de décapage le dernier répertoire dans le chemin que je voulais.
Court de l'écriture d'un script ou un petit C application à reproduire le "-p" fonctionnalité, quelqu'un a une idée pour la création de sous-répertoires dans le makefile?
Sans l'option-p mkdir donnera une erreur lorsque le makefile essaie de créer un répertoire qui existe déjà. Je peux faire mkdir bla 2> /dev/null mais alors je risque de perdre d'autres messages d'erreur.
Quelqu'un a des idées pour lesquelles mkdir -p ne fonctionne pas sous scratchbox2?
MODIFIER
Sur la base de propositions par bobbogo j'ai mis cela ensemble. Il a l'air assez compliqué, mais semble fonctionner, même sous scratchbox2.
# Generic variables for use in functions
comma:= ,
empty:=
space:= $(empty) $(empty)
# Make directory function
forlooprange = $(wordlist 1,$(words $1),1 2 3 4 5 6 7 8 9 10)
forloop = $(foreach n,$(call forlooprange,$1),$(call $2,$n,$3))
mkdirfunc0 = test -d $1 || mkdir $1;
mkdirfunc1 = $(call mkdirfunc0,/$(subst $(space),/,$(foreach n,$(wordlist 1,$1,$2),$n)))
mkdirfunc2 = $(call forloop,$1,mkdirfunc1,$1)
mkdirmain = $(call mkdirfunc2,$(subst /, ,$1))
.PRECIOUS: %/.sentinel
%/.sentinel:
$(call mkdirmain,$*)
touch $@
OriginalL'auteur Simon Elliott | 2011-03-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez remplacer votre forêt de
mkdir
s avec cette:Cela va créer une ligne de commande à quelque chose comme ceci:
Cela fonctionne pour tous les compiler. Pas très élégant. Vous pourriez optimiser en utilisant une sorte de sentinelle de fichier. Par exemple:
.sentinel
sera créé une fois avant que tous les objets, et estmake -j
sympathique. En fait, vous devriez le faire de cette manière, même simkdir -p
fonctionne pour vous (auquel cas, vous devrez utilisermkdir -p
plutôt que de la$(foreach)
hacksolution).Ah oui, j'ai ajouté les
touch
de sorte que je ne regarde pas trop stupide. TVM.Vous pourriez avoir besoin d'une combinaison de
.PRECIOUS
et.SECONDARY
. Vous pourriez également faire pivoter le motif de sentinelle règle dans un Modèle Statique de la Règle (yay!).bobbogo: Merci .PRÉCIEUX de l'entreprise, et en prime, qui m'a conduit à la partie droite de la gnu make docs pour tout savoir sur les cibles intermédiaires.
Pouvez-vous développer sur le "faire-j'-amitié? Je suis actuellement avec mkdir -p dans chaque compilation, mais j'ai eu ceci: gist.github.com/zeux/8906196. J'ai plutôt aimé l'ancienne meilleure approche de la simplicité point.
OriginalL'auteur bobbogo
Vous pouvez dire
make
à ignorer le non-code de retour d'une commande à l'aide de-
:(Notez que ce n'est pas l'adresse de la barre oblique problème.)
OriginalL'auteur Greg Hewgill
Il y a un moyen plus simple. Vous pouvez appeler mkdir à l'intérieur d'une coquille de la fonction comme ceci:
La
shell
fonction de gnu make exécute les commandes après le motshell
que la commande du shell.mkdir -p
est pas disponible, alors pourquoi serait-GNU make est$(shell ...)
être disponible?Je ne sais pas ce que vous demandez. De toute façon le "shell" est une discrète gnu make et vous obtenez beaucoup de commandes shell dans le ventre. Pas seulement mkdir.
Chaque ligne d'un fichier Makefile de la recette est exécuté dans un autre shell. Ce que votre suggérant des pistes de
mkdir
dans un shell, à l'intérieur d'une deuxième coque. Ceci est inutile.eh bien, je viens de suggérer une possibilité, et je n'ai pas exécuter la commande. Je devrais probablement avoir.
OriginalL'auteur yoshi