2013-07-24 18 views
19

Mam katalog (root_dir), który zawiera wiele podkatalogów (subdir1, subdir2, ...).Uruchamianie make w każdym podkatalogu

Chcę uruchomić make w każdym katalogu w root_dir, przy użyciu umieszczonego w nim pliku Makefile. (Oczywiście przypuszczam, że każdy z subdir... ma swój własny plik Makefile).

Więc istnieją zasadniczo dwa pytania:

  1. Jak uzyskać listę katalogów w Makefile (automatycznie)?
  2. Jak uruchomić make dla każdego z katalogów wewnątrz pliku make?

Jak knwow w celu uruchomienia dokonać w określonym katalogu I słuchać wykonać następujące czynności:

$(MAKE) -C subdir 

Odpowiedz

33

Istnieją różne problemy z robieniem sub-make wewnątrz pętli for w jednym przepisie. Najlepszym sposobem, aby zrobić kilka podkatalogów jest tak:

SUBDIRS := $(wildcard */.) 

all: $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] 

.PHONY: all $(SUBDIRS) 

(Wystarczy wskazać, to jest GNU make specyficzny; ty nie wspomina o żadnych ograniczeń w wersji make używasz).

ETA Oto wersja, która obsługuje wiele celów najwyższego poziomu.

TOPTARGETS := all clean 

SUBDIRS := $(wildcard */.) 

$(TOPTARGETS): $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] $(MAKECMDGOALS) 

.PHONY: $(TOPTARGETS) $(SUBDIRS) 
+1

Co jeśli chcę też czysty cel? – Claudio

+0

Dlaczego $ (SUBDIRS) znajduje się w .PHONY? Czy to dlatego, że data/godzina modyfikacji katalogu nie ma znaczenia? Mam to pytanie, ponieważ katalogi nie są podróbkami. .PHONY ma być dla fałszywych celów. – shuva

+0

'.PHONY' jest dla celów, które chcesz zbudować za każdym razem, gdy uruchomi się plik Makefile, niezależnie od tego, czy istnieje, czy nie, lub jest nieaktualny. – MadScientist

3

Spróbuj tego:

SUBDIRS = foo bar baz 

subdirs: 
    for dir in $(SUBDIRS); do \ 
     $(MAKE) -C $$dir; \ 
    done 

To może pomóc link

Edytuj: możesz również zrobić:

Najprościej jest to zrobić:

CODE_DIR = code 

.PHONY: project_code 

project_code: 
     $(MAKE) -C $(CODE_DIR) 

Reguła .PHONY oznacza, że ​​project_code nie jest plikiem, który musi być zbudowany i -C Flaga wskazuje zmiany w katalogu (odpowiednik uruchomiony kod cd przed wywołaniem make). Możesz użyć tego samego podejścia do wywoływania innych celów w kodzie Makefile.

Na przykład:

clean: 
    $(MAKE) -C $(CODE_DIR) clean 

Source

+0

Właściwie nie chcę mieć listę katalogów w makefile – Alex

0

Jest biblioteka nazywa prorab dla GNU make, która wspiera integrację autonomicznych makefile w podkatalogów.

Kilka informacji na github: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md

Zasadniczo z prorab powołując się wszystkie pliki Makefile w podkatalogów wygląda następująco:

include prorab.mk 

$(eval $(prorab-build-subdirs))