2017-06-30 1 views
0

J'ai un projet avec plusieurs sous-répertoires, le principal Makefile doit être capable de construire/nettoyer certains sous-répertoires - les noms exacts des sous-répertoires sont passés dans une variable (DIRS dans l'exemple):GNU Make ne parvient pas à entrer des sous-répertoires à partir d'une boucle

DIRS = dir1 dir2 # Usually passed from the command line 

.PHONY: all clean $(DIRS) 

all: $(DIRS) 
    # ... do stuff in this direcotry ... 

$(DIRS): 
    $(MAKE) -C $(@) 

clean: 
    # ... Clean this directory ... 
    $(foreach d,$(DIRS),cd $(d) && $(MAKE) clean;) 

Depuis que je suis déjà en utilisant les noms des répertoires comme une cible de construction, je veux utiliser une boucle pour le nettoyage de chaque sous-répertoire. Mais je reçois l'erreur suivante:

$ make clean 
# ... Clean this directory ... 
cd dir1 && make clean; cd dir2 && make clean; 
make[1]: Entering directory `/home/ex/clean_try/dir1' 
rm -fr *.o 
make[1]: Leaving directory `/home/ex/clean_try/dir1' 
/bin/sh: 1: cd: can't cd to dir2 
make: *** [clean] Error 2 

Il semble que c'est déjà laissant dir1, comment se fait-il ne peut pas entrer dir2 dans le répertoire principal?

Répondre

2

cd dir2 est dans le contexte d'avoir juste fait cd dir1 --- et dir2 n'est pas un sous-répertoire de dir1, non? :-)

Essayez: make -C $d clean

HTH

+0

OK, qui a fait l'affaire. Mais ... comment se fait-il qu'il dit: 'Quitter le répertoire '/ home/ex/clean_try/dir1'' avant l'erreur? C'est pour le moins déroutant ... – TKKS

+0

C'est normal de faire un make-in-make. Suppressable avec '--no-print-directory' – Mischa