.PHONY tất cả các quy tắc trong GNU tạo tệp?


16

Tôi có sai trong cách giải thích của tôi rằng về cơ bản tôi nên đặt lên hàng đầu trước khi tất cả đưa ra các quy tắc:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Đã bao giờ có trường hợp bạn không muốn làm theo 'công thức' này chưa?

http://www.gnu.org/software/make/manual/make.html#Phony-Target

Câu trả lời:


23

Hướng dẫn phong cách Makefile của Clark Grubb khuyến nghị rằng:

  • Tất cả các mục tiêu giả mạo phải được khai báo bằng cách biến chúng thành các điều kiện tiên quyết của .PHONY.
  • thêm từng mục tiêu giả mạo làm điều kiện tiên quyết của .PHONY ngay trước khi khai báo mục tiêu, thay vì liệt kê tất cả các mục tiêu giả mạo ở một nơi duy nhất.
  • Không có mục tiêu tệp nào là điều kiện tiên quyết của .PHONY.
  • mục tiêu giả mạo không nên là điều kiện tiên quyết của mục tiêu tập tin.

Ví dụ của bạn, điều này có nghĩa là:

.PHONY: all
all:
    echo "Executing all ..."

.PHONY: of
of:
    echo "Executing of ..."

.PHONY: my
my:
    echo "Executing my ..."

.PHONY: rules
rules:
    echo "Executing rules ..."

Nhiều PHONYmục tiêu được cho phép; xem thêm câu hỏi Stack Overflow này: "Có thể có nhiều mục tiêu .PHONY trong tệp tạo gnu không?"

Ngoài ra, trong khi điều này không được đề cập trực tiếp trong câu hỏi của bạn, thì cần chú ý không có PHONYmục tiêu có cùng tên của một tệp đầu vào hoặc tệp trung gian thực trong dự án của bạn. Ví dụ, nếu giả thuyết dự án của bạn có tệp mã nguồn có tên rules(không có hậu tố), việc đưa chuỗi đó vào PHONYmục tiêu có thể phá vỡ makehành vi dự kiến .


1
chia sẻ tuyệt vời về hướng dẫn phong cách. cảm ơn bạn.
tarabyte

2

Tôi nghĩ rằng đó là một cách thực hành tốt để làm theo nhưng phân đoạn nó và đặt các mảnh ngay cả sau khi các công thức quy tắc đầy đủ cũng hoạt động trên gmake của tôi (3,81):

Ví dụ:

#Makefile
all:
   @echo hello world
.PHONY: all

CMD:

$ touch all
$ make all    #this would be a no-op if all weren't a phoney target
  hello world 
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.