2010-09-16 32 views
7

Tôi đang quan sát một hành vi thú vị của việc thực hiện và tôi tự hỏi nếu có một lời giải thích hợp lý cho nó bên cạnh một lỗi trong gmake.quy tắc mẫu makefile không có công thức nấu ăn

Hãy nói rằng chúng tôi đã điều sau đây trong makefile:

%-animal: 
     echo "$* is an animal" 

%-fox: %-fox-animal 

%-wolf: %-wolf-animal 

Sự khác biệt giữa hai mục tiêu cuối cùng là "% -wolf" không có bất kỳ công thức, và "% -fox" có một công thức có sản phẩm nào (tức là chỉ một dòng có một thẻ ở đầu).

Khi chúng tôi cố gắng thực hiện các quy tắc, đây là những gì sẽ xảy ra:

[[email protected] tmp]# make freddy-animal 
echo "freddy is an animal" 
freddy is an animal 
[[email protected] tmp]# make freddy-wolf 
make: *** No rule to make target `freddy-wolf'. Stop. 
[[email protected] tmp]# make freddy-fox 
echo "freddy-fox is an animal" 
freddy-fox is an animal 

i.e.the quy tắc mẫu mà có một công thức (mặc dù là một sản phẩm nào) hoạt động, một trong đó không làm thì không. Tôi có thiếu thứ gì đó theo cách mà nó phải làm việc không?

+0

Điều bạn gọi là 'công thức', thực hiện quy tắc của cuộc gọi để thực hiện '. Vì vậy, thông điệp của nó đồng ý với những gì bạn nghĩ rằng nó nên làm: có một quy tắc cho freddy-wolf, nhưng không có quy tắc '* để làm cho * freddy-wolf. – reinierpost

+0

@reinierpost: GNU Tạo phiên bản 3.82 bao gồm tìm kiếm tài liệu sử thi/thay thế tạo thuật ngữ 'công thức' cho tập lệnh được sử dụng để cập nhật mục tiêu của quy tắc. Vì vậy, (1) nó không chỉ là thuật ngữ của m1tk4 và (2) đây cũng là một điều bất ngờ đối với tôi. Xem r1.51 của http://cvs.savannah.gnu.org/viewvc/make/doc/make.texi?root=make&view=log –

+0

@John Marshall: hmmm ... tốt để biết, cảm ơn bạn. (Tôi đang ở mức 3.81 cho đến khi Cygwin cập nhật nó.) – reinierpost

Trả lời

9

Quy tắc mẫu không có công thức nấu ăn nào được ghi nhận là có ý nghĩa gì đó khác với những gì cung cấp công thức, thậm chí là một công thức trống. Thay vào đó, họ cancel any pre-existing implicit rule:

Bạn có thể hủy quy tắc ngầm được tạo sẵn bằng cách xác định quy tắc mẫu có cùng mục tiêu và điều kiện tiên quyết, nhưng không có công thức.

Như vậy "% -wolf" mô hình của bạn thực sự phục vụ để hủy bỏ bất kỳ quy tắc ngầm hiện tại cho % -wolf-động vật ->% -wolf. Và không có ai.

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