2013-03-30 28 views
20

tôi có một loạt các ứng dụng được xây dựng với cùng một loại làm cho quy tắc:Quy tắc mẫu Makefile không có phần mở rộng?

apps = foo bar baz 

all: $(apps) 

foo: foo.o $(objects) 
    $(link) 

bar: bar.o $(objects) 
    $(link) 

baz: baz.o $(objects) 
    $(link) 

Nếu họ có một phần mở rộng (ví dụ .x) Tôi có thể làm cho một quy tắc khuôn mẫu như:

%.x: %.o $(objects) 
    $(link) 

và tôi sẽ không phải viết ra một quy tắc mới cho từng ứng dụng.

Nhưng họ không có một phần mở rộng, và tôi khá chắc chắn rằng:

%: %.o $(objects) 
    $(link) 

sẽ không hoạt động (vì nó xác định rằng để xây dựng bất kỳ tập tin mà bạn có thể sử dụng quy tắc này).

Có cách nào để chỉ định một quy tắc sẽ bao gồm tất cả các quy tắc xây dựng $(apps)?

Trả lời

6
%: %.o $(objects) 
    $(link) 

Trên đây nên làm việc.

Bạn có thể giới hạn phạm vi của sự cai trị bằng cách chuyển đổi nó thành một static pattern rule, do đó nó chỉ được xem xét danh sách các mục tiêu:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets 
    $(link) 
0

không phải là một câu trả lời cho những gì bạn đang tìm kiếm, nhưng một lý do có thể giải thích tại sao mức độ mã chung như vậy có thể không mang lại kết quả tốt. ....

mẫu tĩnh dựa vào sự hiện diện của thân cây để phù hợp và xây dựng chuỗi phụ thuộc. khá nhiều theo cách tương tự như các quy tắc ngầm định (được sử dụng cho các mục tiêu không có bất kỳ sự hỗ trợ nào.)

tôi thấy những gì bạn đang cố gắng đạt được, tạo quy tắc chung đáp ứng tất cả các mục tiêu kiểm tra đối tượng và liên kết trong mã của bạn.

một cái gì đó như thế này ::

% : % : $(rule1) 
     echo/generic code ; 

để nó được gọi cho tất cả các ứng dụng trong các tình huống differnt

kể từ khi bạn không muốn thêm một phần mở rộng (điều này trở thành nguồn gốc của một số vấn đề) sự vấn đề với điều này là mục tiêu sẽ được phản ánh trong sự phụ thuộc cũng vì sẽ không có cách nào để phân biệt các phụ thuộc tạo thành các mục tiêu.

vì vậy nếu bạn đã cố gắng mà tôi nghĩ rằng bạn sẽ nhận được ở đây ...

$ make -nf mk.t 
    mk.t:18: *** mixed implicit and static pattern rules. Stop. 

:), tôi sẽ cung cấp cho một thử lại vào ngày mai để xem nếu tôi có thể làm việc này một cách chung chung thực . Câu hỏi hay.

+0

Tôi không chắc chắn tôi hiểu, bạn có nói rằng câu trả lời từ [Beta] (http://stackoverflow.com/a/15718701/1131467) không chính xác? –

+0

không, tôi đã không nói điều đó! , cả hai câu trả lời được đăng đều đúng về lý thuyết - thực ra tôi đã thử cùng một điều.Làm cho các quy tắc mẫu tĩnh là lựa chọn hiển nhiên cho những tình huống này ..... nhưng cố gắng làm cho chúng quá chung chung không hiệu quả. Tôi chỉ đăng sự quan sát của tôi mà dường như hợp lý với tôi, chỉ để cho bạn biết. – nsd

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