2012-07-12 13 views
14

GNU make manual mówigdy wiele reguł wzór pasuje ruchomym celem

Jest możliwe, że więcej niż jedna reguła wzór będzie spełniać te kryteria. W takim przypadku make wybierze regułę z najkrótszym trzpieniem (czyli wzorcem, który pasuje najbardziej).

Więc to mnie zaskoczyło, że:

$ touch make_specific.cpp 

$ cat Makefile.general_first 
%.o: %.cpp 
@echo using general rule 
$(CXX) -c $< -o [email protected] 

%_specific.o: %_specific.cpp 
@echo using specific rule 
$(CXX) -c $< -o [email protected] 

$ make -B -f Makefile.general_first make_specific.o 
using general rule 
g++44 -c make_specific.cpp -o make_specific.o 

wiele reguł wzór pasuje do celu, a od trzonu do %_specific.o : %_specific.cpp reguły („make” w tym przypadku) jest krótszy niż łodygi na %.o : %.cpp zasada, spodziewałem się, że wybrana zostanie konkretna reguła, ale tak nie jest.

Czego mi brakuje?

Odpowiedz

16

Prawdopodobnie używasz wersji make niższej niż 3.82.

W wersji 3.81 i niższym kryterium wyboru było inne; make wybrałaby pierwszą regułę pasującą do wzorca. Dokumentacja, do której się odnosisz, dotyczy wersji 3.82. Ta wersja wybiera regułę z najbardziej konkretnym rdzeniem, która jest zgodna z Twoimi oczekiwaniami.

Z pliku NEWS w drzewie make źródło:

Version 3.82 
... 
* WARNING: Backward-incompatibility! 
    The pattern-specific variables and pattern rules are now applied in the 
    shortest stem first order instead of the definition order (variables 
    and rules with the same stem length are still applied in the definition 
    order). This produces the usually-desired behavior where more specific 
    patterns are preferred. To detect this feature search for 'shortest-stem' 
    in the .FEATURES special variable. 
+1

Dzięki. Używam 3,81, więc jest to najprawdopodobniej przyczyną. Oczekiwanie na sysadmins, aby zainstalować 3.82 w celu weryfikacji. –

+0

Czy można to osiągnąć za pomocą clearmake zamiast GNU make? Nie mogę znaleźć żadnych informacji o wyborze reguły wzorca w clearmake ... – dragonator

+0

Dzięki. Drapałem się w głowę, próbując zrozumieć, dlaczego tak się dzieje. Mój błąd; Nigdy nie zwracałem uwagi na numer wersji, której używałem :) – Fernando

Powiązane problemy