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
Odpowiedz
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 :;
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. –
@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
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? –
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.
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. –
Lepsze łącze do "Recursive Make Considered Harmful" to http://aegis.sourceforge.net/auug97.pdf, ponieważ ten link wydaje się być martwy. – rfay
- 1. Nowrap/Nie przerywaj linii po wprowadzeniu
- 2. Nie przerywaj słów w spacji za pomocą CSS
- 3. Błąd kompilacji w 'winbase.h'
- 4. Zrób błąd instalowania monitów na linux ec2
- 5. Składniki Ember w podkatalogu
- 6. kątowe cli Błąd kompilacji AOT
- 7. Błąd kompilacji w środowisku Eclipse
- 8. CUpewnij: dodać zależność nie w podkatalogu
- 9. Ścieżki pośredników nie działają w podkatalogu
- 10. Zrób zasięg w postgresie
- 11. Błąd kompilacji: Pakiet javax.servlet nie istnieje
- 12. Błąd kompilacji "Nie można znaleźć symbolu"
- 13. Błąd kompilacji szablonu - standardowy czy nie?
- 14. Błąd kompilacji Gradle: pakiet javax.servlet nie istnieje
- 15. Rozszerzanie application.cfc w podkatalogu
- 16. Błąd kompilacji Constexpr z clang ++ nie g ++
- 17. Wdrażanie yii2 w podkatalogu
- 18. Błąd kompilacji Xcode
- 19. Błąd kompilacji Scala OptionBuilder
- 20. Aplikacja szyny w podkatalogu
- 21. Sterownik w podkatalogu
- 22. CS0433 Błąd kompilacji
- 23. Błąd kompilacji XCTest.framework
- 24. Błąd kompilacji Typesafe Activator
- 25. błąd Rack (nie kompilacji w locie) obsługujących aktywa w rozwoju
- 26. Błąd kompilacji Nan
- 27. Błąd kompilacji unique_ptr
- 28. Błąd kompilacji Haskella Parsetu
- 29. Gtest: testowy błąd kompilacji
- 30. Ant Błąd kompilacji - NavUtils
rozwiązanie jest podane w 'informacji make': http://www.gnu.org/software/make/manual/make.html#Phony-Targets –