J'ai un répertoire (root_dir
), qui contient un certain nombre de sous-répertoires (subdir1, subdir2, ...
).
Je veux exécuter la make
dans chaque répertoire en root_dir
, en utilisant un Makefile placé dans celui-ci. (Evidemment supposé que chaque subdir...
a son propre Makefile).
Donc, il y a essentiellement deux questions:
Comme je le sais pour exécuter make dans un répertoire spécifique, je tiens à effectuer les opérations suivantes:
$(MAKE) -C subdir
Faire la sous-fabrication à l'intérieur d'une boucle for dans une seule recette pose divers problèmes. La meilleure façon de créer plusieurs sous-répertoires est la suivante:
SUBDIRS := $(wildcard */.)
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
.PHONY: all $(SUBDIRS)
(Il est juste de préciser que GNU est spécifique; vous n'avez mentionné aucune restriction sur la version de make utilisée).
ETAVoici une version qui prend en charge plusieurs cibles de premier niveau.
TOPTARGETS := all clean
SUBDIRS := $(wildcard */.)
$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@ $(MAKECMDGOALS)
.PHONY: $(TOPTARGETS) $(SUBDIRS)
Essaye ça :
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Cela peut vous aider link
Edit: vous pouvez aussi faire:
Le moyen le plus simple est de faire:
CODE_DIR = code
.PHONY: project_code
project_code:
$(MAKE) -C $(CODE_DIR)
La règle .PHONY signifie que project_code n'est pas un fichier qui doit être construit .__ et le drapeau -C indique un changement de répertoire (équivalent à Exécuter le code cd avant d'appeler make). Vous pouvez utiliser la même approche Pour appeler d’autres cibles dans le code Makefile.
Par exemple:
clean:
$(MAKE) -C $(CODE_DIR) clean
Il existe une bibliothèque appelée prorab pour GNU make qui prend en charge l’inclusion de fichiers Make autonomes dans des sous-répertoires.
Quelques informations sur github: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md
En gros, avec prorab, l’appel de tous les makefiles dans les sous-répertoires ressemble à ceci:
include prorab.mk
$(eval $(prorab-build-subdirs))