À l'aide de Makefile pour nettoyer les sous-répertoires
Est-il possible de faire un make clean à partir du répertoire parent qui a également de manière récursive nettoie tous les sous-répertoires sans avoir à inclure un fichier makefile dans chaque sous-répertoire?
Par exemple, actuellement dans mon Makefile, j'ai quelque chose comme:
SUBDIRS = src, src1
.PHONY: clean subdirs $(SUBDIRS)
clean: $(SUBDIRS)
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
$(SUBDIRS):
$(MAKE) -C $(SUBDIRS) clean
Cependant, cela m'oblige à avoir un Makefile à la fois de la src et de src1. Sinon, j'obtiens l'erreur
No rule to make target clean
Car je ne veux exécuter la commande "rm-rf *.o ~ core .dépendent ..cmd *.ko *.mod.c" dans chaque sous-répertoire de toute façon, il semble superflu d'inclure un fichier Makefile dans chaque sous-répertoire avec exactement la même ligne pour les nettoyer. N'est-il pas simplement avoir le même propre commande exécuter dans chacun des sous-répertoires?
Ou boucle d'assainissement de plus de
$(SUBDIRS)
et exécuter rm
à chaque fois manuellement.En fait, si vous écrivez votre toplevel makefile soigneusement (ou écrire un distinct
clean.mk
makefile que vous incluez), alors vous pouvez $(MAKE) -C $@ -f clean.mk clean
dans cette recette, je pense. (Avis $@
au lieu de $(SUBDIRS)
. -C
prend un seul argument et non une liste.)Vous obtiendrez une copie de sous-dossiers variable sur submakes la rupture de la partie récursive de la procédure. Seulement dans le cas où vous avez le même sous-répertoires (avec le même nom) que le plan de travail.
OriginalL'auteur Tony | 2014-09-24
Vous devez vous connecter pour publier un commentaire.
Je suis d'accord que peut-être vous avez de la commande rm fonctionner sur des sous-dossiers. Mais quelque chose comme ce qui suit permet version récursive en utilisant un seul fichier makefile:
SUBDIRS
?L'exemple est terminée. L'exécution de
make --debug
va montrer ce qui se passe. Quelque chose commefind
pourrait probablement détecter les sous-répertoires si une liste codée en dur de ne pas le faire.OriginalL'auteur robert
Au lieu d'utiliser la récursivité, vous pourriez débourser pour
find
pour obtenir une liste de répertoires et de faire une seule itération pour générer les caractères génériques:OriginalL'auteur Christoph
Vous ne pouvez pas, sans l'aide d'un programme externe. Le mieux est un script shell qui fait la récursivité et de faire des appels dans chacun des sous-répertoires (voir mon commentaire de @robert, dans sa réponse) quelque Chose comme cela va faire le travail (et ne dépend pas de GNU make caractéristiques)
bien sûr, vous pouvez mettre cette séquence (dans la cible
cleanrec
) à l'intérieur de votreMakefile
et de conserver votre
clean
cible pour le local de nettoyage d'un seul répertoire. La raison en est que le Makefile a seulement statique info pour faire le faire, et vous devez obtenir une aide extérieure pour savoir ce que les sous-répertoires que vous avez dans chaque répertoire. Donc dans le cas où vous allez pour obtenir de l'aide externe, vous feriez mieux d'utiliser un bon outil de trouver(1) et sh(1)OriginalL'auteur
Une variation de @Christoph réponse:
C'est un exemple pour les fichiers latex. Le premier motif sur
GARBAGE_TYPES
a le double guillemets autour d'elle à cause de la parenthèse sur le type de fichier nom. Sans elle,rm
ne peut pas les supprimer. Les autres modèles n'a pas besoin de guillemets.La deuxième
DIRECTORIES_TO_CLEAN
utilise l'opposé d'une liste de répertoires à nettoyer, c'est à dire, une liste de répertoires à ne pas nettoyer. Ceci est utile lorsque vous avez seulement un ou deux répertoires.git
etimages
qui vous ne souhaitez pas nettoyer, mais que vous voulez nettoyer tout le reste.OriginalL'auteur user