2010-03-17 16 views
6

Mam konfigurację, w której make przechodzi przez szereg podkatalogów i robi wewnątrz tych katalogów. Chciałbym natychmiast powstrzymać kompilację od awarii. Poniższy fragment kodu ilustruje to. Czy ktoś może wskazać mi właściwy kierunek na to, jak należy przygotować plik Makefile, czy też na temat dokumentacji dotyczącej budowania od najwyższego poziomu przez podkatalogi?Zrób błąd w podkatalogu, nie przerywaj kompilacji

+1

rozwiązanie jest podane w 'informacji make': http://www.gnu.org/software/make/manual/make.html#Phony-Targets –

Odpowiedz

9

Jestem w (widocznej) mniejszości, która nie zgadza się z "Recursive Make Considered Harmful". Napisałem rekursywne Systemy do tworzenia dużych, niechlujnych baz kodu i działają całkiem nieźle.

Oto jak to zrobić: (. Dodałem -s aby rzeczy ciszej)

all: $(SUBDIRS) 

$(SUBDIRS): force 
    @ $(MAKE) -s -C [email protected] 

.PHONY: force 
force :; 

EDIT: Aby zdać sobie za cel aż do submakes (I należy zrobić to wcześniej):

.PHONY: all check clean 
all check clean: $(SUBDIRS) 

all: TARGET=all 
check: TARGET=check 
clean: TARGET=clean 
# No, you can't do [email protected], or at least I don't know how to. 

# recursive call to make 
$(SUBDIRS): force 
    @ $(MAKE) -s -C [email protected] $(TARGET) 

.PHONY: force 
    force :; 
+1

Używanie programu rekurencyjnego, pełne poznanie jego ograniczeń, to jedno. Ale jeśli mówisz, że dosłownie "nie zgadzasz się" z artykułem RMCH (to znaczy, myślisz, że wyciąga on błędne wnioski), ja (i wiele innych jestem tego pewien) byłbym bardzo zainteresowany usłyszeniem twoich kontrargumentów. –

+0

@Dan Molding, myślę, że papier zawiera pewne ważne punkty i niektóre błędne argumenty, i że jego główny wniosek jest zawyżony. Czy możesz zaproponować dobre forum do kontrargumentów? Nie mam bloga i nie chcę zaprzątać sobie głowy swoimi długofalowymi krytykami, jeśli tak naprawdę nie dotyczą pytania PO. – Beta

+0

Dzięki za wskazanie mnie we właściwym kierunku! Co się dzieje, gdy masz wiele celów i chcesz przekazać ten cel do podkatalogów? Więc jeśli zamiast "all:" miałbyś "wszystko check clean:" w jaki sposób dostałbym to do linii make podkatalogu, aby przejść do podkatalogu i zrobić make clean lub dokonać check etc? –

2

Zachęcam do rezygnacji z podejścia rekurencyjnego. Może to spowodować niekończące się trudności później, gdy Twoje pliki Makefile będą rosły. Zobacz artykuł Recursive Make Considered Harmful dla bardzo dobrego wyjaśnienia, dlaczego wywoływanie rekursywnie jest złym pomysłem.

Natychmiastową korzyścią wynikającą z przejścia na nierekurencyjną markę jest to, że ten problem, który występuje obecnie, po prostu odejdzie odparuje. Nie będziesz mieć tego problemu z nierekurencyjnym plikiem Makefile.

Zapraszam również do wypróbowania tego boilerplate non-recursive Makefile, które utworzyłem. Wymaga GNU Make 3.81, ale jest naprawdę łatwy w użyciu. Przynajmniej może to być dobry przykład nierekurencyjnego pliku Makefile, jeśli chcesz stworzyć własny.

+0

Pomyślałem, że to będzie debata na temat rekurencyjnej marki i wszystkiego. Nie martw się jednak, to jest utrzymanie starego systemu kompilacji. Używam autotools do innych rzeczy. –

+0

Lepsze łącze do "Recursive Make Considered Harmful" to http://aegis.sourceforge.net/auug97.pdf, ponieważ ten link wydaje się być martwy. – rfay