Sử dụng ký tự đại diện trong GNU Tạo quy tắc mẫu


7

Giả sử doc.pdflà mục tiêu.

Quy tắc sau đây kích hoạt tái tạo doc.pdfbất cứ khi nào doc.referđược cập nhật, nhưng cũng rất vui khi doc.referhoàn toàn không tồn tại:

doc.pdf: doc.mom $(wildcard doc.refer)
    pdfmom -e -k < $< > $@

Tuy nhiên, quy tắc mẫu sau không thực hiện giống nhau (PDF được tạo chính xác, nhưng việc xây dựng lại không được kích hoạt khi thay đổi doc.refer):

%.pdf: %.mom Makefile $(wildcard %.refer)
    pdfmom -e -k < $< > $@

Tôi nghi ngờ rằng wildcardlệnh được thực thi trước khi %nhân vật được mở rộng. Làm thế nào tôi có thể làm việc xung quanh này?

Câu trả lời:


12

Hàm GNU Makewildcard lấy một mẫu hình cầu vỏ và mở rộng nó thành các tệp khớp với mẫu đó. Các mô hình %.referkhông chứa bất kỳ mô hình bao quanh vỏ.

Bạn có thể muốn một cái gì đó như

%.pdf: %.mom %.refer
        pdfmom -e -k < $< > $@

%.pdf: %.mom
        pdfmom -e -k < $< > $@

Mục tiêu đầu tiên sẽ được gọi để tạo tệp PDF khi có .mom một .refertệp có sẵn cho tên cơ sở của tài liệu. Mục tiêu thứ hai sẽ được gọi khi không .refercó sẵn tệp.

Thứ tự của các mục tiêu này là quan trọng.


1

GNU Hãy đánh giá tất cả các hàm để tạo biểu diễn bên trong của các quy tắc mẫu.

Do đó $(wildcard %.refer)đánh giá chuỗi trống cho quy tắc của bạn.

Cách duy nhất để đạt được mục tiêu của bạn là khai thác trật tự quy tắc như giải pháp của Kusalananda đề xuất (info "(make)Pattern Match"):

10.5.4 How Patterns Match

   It is possible that more than one pattern rule will meet these
criteria.  In that case, 'make' will choose the rule with the shortest
stem (that is, the pattern that matches most specifically).  If more
than one pattern rule has the shortest stem, 'make' will choose the
first one found in the makefile.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.