2012-07-12 35 views
14

Các GNU make manual nóikhi nhiều quy tắc mẫu phù hợp với một mục tiêu

Có thể là nhiều hơn một quy tắc mẫu sẽ đáp ứng các tiêu chí này. Trong trường hợp đó, thực hiện sẽ chọn quy tắc với thân ngắn nhất (có nghĩa là, mẫu phù hợp nhất).

Vì vậy, nó làm tôi ngạc nhiên rằng:

$ 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 

Nhiều quy mô phù hợp với mục tiêu, và kể từ gốc cho %_specific.o : %_specific.cpp quy tắc ('make' trong trường hợp này) là ngắn hơn thân cho %.o : %.cpp quy tắc, tôi dự kiến ​​quy tắc cụ thể sẽ được chọn, nhưng không phải.

Tôi đang thiếu gì?

Trả lời

16

Có thể bạn đang sử dụng phiên bản thực hiện thấp hơn 3.82.

Trong phiên bản 3.81 trở xuống, tiêu chí lựa chọn khác nhau; make sẽ chọn quy tắc đầu tiên phù hợp với mẫu. Tài liệu bạn đang đề cập đến là dành cho phiên bản 3.82. Phiên bản đó không chọn quy tắc có thân cây cụ thể nhất, đó là theo mong đợi của bạn.

Từ file NEWS trong cây make nguồn:

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

Cảm ơn. Tôi đang sử dụng 3,81, do đó rất có thể là nguyên nhân. Đang chờ hệ thống quản trị cài đặt 3.82 để xác minh. –

+0

Có cách nào để đạt được điều này với clearmake thay vì GNU thực hiện? Tôi không thể tìm thấy bất kỳ thông tin nào về lựa chọn quy tắc mẫu trong xóa ... – dragonator

+0

Cảm ơn. Tôi đã gãi đầu cố gắng hiểu tại sao điều này lại xảy ra. Lỗi của tôi; Tôi chưa bao giờ chú ý đến số phiên bản tôi đã sử dụng :) – Fernando

Các vấn đề liên quan