web-dev-qa-db-fra.com

Exécuter make dans chaque sous-répertoire

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:

  1. Comment obtenir une liste de répertoires dans Makefile (automatiquement)?
  2. Comment exécuter make pour chacun des répertoires d'un fichier make?

Comme je le sais pour exécuter make dans un répertoire spécifique, je tiens à effectuer les opérations suivantes:

$(MAKE) -C subdir
29
Alex

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)
57
MadScientist

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

La source

4
avignat

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))
1
igagis