faire des génériques sous-répertoire cibles
J'ai un "lib" dans mes applications répertoire principal, qui contient un nombre arbitraire de sous-répertoires, chacun ayant son propre Makefile.
Je voudrais avoir un seul fichier Makefile dans le répertoire principal, qui appelle chaque sous-répertoire du Makefile. Je sais que c'est possible si j'manuellement la liste des sous-répertoires, mais je voudrais l'avoir fait automatiquement.
Je pensais à quelque chose comme ce qui suit, mais il n'est évidemment pas le travail. Notez que j'ai aussi nettoyer, tester, etc. des cibles, afin % est probablement pas une bonne idée.
LIBS=lib/*
all: $(LIBS)
%:
(cd $@; $(MAKE))
Toute aide est très appréciée!
OriginalL'auteur Zed | 2009-12-19
Vous devez vous connecter pour publier un commentaire.
Ce qui suit fonctionnera avec GNU
make
:Si il pourrait y avoir autre chose que des répertoires dans
lib
, vous pouvez également utiliser:Pour traiter les multiples objectifs de problème, vous pouvez construire des objectifs spécifiques pour chaque répertoire, puis enlever le préfixe pour la sous-construction:
Pourquoi vous n'avez pas défini de
$(clean_LIBS)
comme faux? E. g..PHONY: $(LIBS) $(clean_LIBS)
, alors je pense que vous n'avez pas besoinforce
.Vous faites un excellent point. Je n'ai pas testé votre suggestion, mais votre raisonnement sonne bien pour moi. En fait, il ressemble beaucoup à ce que le GNU Make manuel suggère ici (voir le peu sur sous-dossiers): gnu.org/software/make/manual/make.html#Phony-Targets
OriginalL'auteur mrkj
Il est aussi un moyen de lister les sous-répertoires avec gmake uniquement les commandes, sans l'aide des commandes du shell:
Ce sera la liste de tous les sous-répertoires avec des
'/'
. Pour le supprimer, vous pouvez utiliser la substitution de motif:Ensuite pour créer des règles d'exécution des makefiles dans chaque sous-répertoire, vous pouvez utiliser une petite astuce - un faux cible dans un répertoire inexistant. Je pense que dans ce cas, un exemple nous en dire plus que n'importe quelle explication:
Fondamentalement, cible
'all'
les listes de tous les sous-répertoires comme des préalables. Par exemple, siLIB_DIRS
contenueslib/folder1 lib/folder2
alors l'expansion devrait ressembler à ceci:Puis "faire", pour l'exécution de la règle
'all'
, essaie de faire correspondre chaque condition préalable à une cible existante. Dans ce cas, la cible est'make-rule/%:'
, qui utilise'$*'
pour extraire la chaîne après'make-rule/'
et l'utilise comme argument dans la recette. Par exemple, la première condition serait adapté et élargi comme ceci:all: DIRS_CMD
devrait plutôt êtreall: $DIRS_CMD
que la version actuelle n'est pas correctement développez le. J'ai été faire quelque chose le long des lignes demake: *** No rule to make target 'DIRS_CMD', needed by 'all'. Stop.
Il est possible de faire. Je pense que pour moi, il a travaillé sans $ mais je n'ai pas les sources et ne peut pas vérifier.
OriginalL'auteur Amiramix
Que si vous voulez l'appeler différentes cibles que dans un nombre inconnu de sous-répertoires?
Le Makefile suivant utilise des macros afin de créer une redirection de mannequin-cible pour un certain nombre de sous-répertoires pour appliquer la cible à partir de la ligne de commande pour chacun d'eux:
Espère que cette aide. Vraiment utile lorsque vous traitez avec paralelism: faire -j12 nettoyer le tout dans un arbre, avec les makefiles ayant ces objectifs... Comme toujours: jouer avec faire est dangereux, les différentes méta-niveaux de programmation sont trop proches ,-)
OriginalL'auteur klsdjfhsalkjfhl