2010-11-11 23 views
19

W przypadku zmiany pliku Makefile, bezpieczny zakład będzie uwzględniał wszystkie cele przestarzałe.Zależy od samego pliku make

Czy istnieje sprytny sposób na dodanie tej zależności? Czy są jakieś alternatywy?

+1

Zadałem to samo pytanie nie tak dawno temu: http://stackoverflow.com/questions/3871444/making-all-rules-depend-on-the-makefile-self – reinierpost

+0

Dziwne, że nie pojawił się w wyszukiwanie, nawet nie jest powiązane. –

+0

To może nie wystarczyć. Co się dzieje, gdy zmienne ulegną zmianie? (Na przykład, może być konieczne zrobienie _clean_ między 'make CDEFS = debug' i' make CDEFS = release'.) – bobbogo

Odpowiedz

6

Bezpieczny zakład, ale straszny pomysł. Przykład: używasz automake i aktualizujesz Makefile.am, aby dodać pojedynczy plik źródłowy. Poprawną odpowiedzią jest skompilowanie nowego pliku i połączenie go. W twoim schemacie wszystko zostanie odbudowane.

Ponadto, dodając zależność nie zrobi nic, jeśli nie dotykać plik, coś jak:

$(SRCS): Makefile 
    touch [email protected] 

Będzie to potknąć się redaktorzy, które korzystają z mtime wykryć jednoczesną modyfikację (Emacs jest jedną przykład).

Jeśli robisz coś ważnego, po wykonaniu zmiany uruchom po prostu make clean all.

+0

Nie sądziłem, że źródła nie zostaną zaktualizowane. Ale co, jeśli wszystkie _targets_ zależą od Makefile? +1 za podniesienie dobrego punktu. –

+0

@Matt Joiner: To by działało (trzeba by było również uwzględnić przechodnie zamknięcie wszystkich dołączonych plików .mk), ale nadal będziesz miał nadmiarową rekompilację, częściej niż nie. Lepiej się nie przejmować: domyślnie masz krótkie kompilacje i możliwość wykonania pełnej kompilacji, jeśli zajdzie taka potrzeba. Jeśli to załatwisz, nie będziesz miał możliwości wykonania krótkiej kompilacji, jeśli wykonasz tylko drobne poprawki. Wiem, że robisz dużo rzeczy w C++. Nie możesz poważnie zasugerować, że koszt pełnej przebudowy projektu C++ jest niewielki? –

+0

Dlaczego musisz dotknąć pliku Makefile? Reguła jest uruchamiana tylko wtedy, gdy Makefile jest już nowszy niż pliki obiektów. –

4

Upewnij się, że pliki wynikowe zależą makefile:

$(OBJFILES) : Makefile 

Gdzie Makefile to nazwa pliku make.

+0

Zakładam, że jestem zobowiązany do samodzielnego wypełniania SRCFILES? –

+0

Tak. Moje pytanie może brzmieć nieco arogancko, ale chciałem zapytać, jakiego rodzaju właściwości chciałbyś wybrać z alternatywnego rozwiązania. Nie znam sposobu na uzależnienie się od "każdego celu". –

Powiązane problemy