2012-07-20 39 views
7

Tôi vẫn không hiểu tại sao quy tắc "giả mạo" trong Makefiles có ".PHONY" là mục tiêu của chúng. Nó sẽ hợp lý hơn nhiều khi điều kiện tiên quyết .Tại sao .PHONY: nhắm mục tiêu và không nhắm mục tiêu: .PHONY?

Tôi có phải giải thích kỹ về điều này không? Nếu A phụ thuộc vào BB là giả mạo thì A cũng là giả mạo. Vì vậy, biểu đồ phụ thuộc .PHONYBA là waay đáng ngạc nhiên so với .PHONYBA. (Một lý lẽ khác là việc triển khai make phải xử lý mục tiêu .PHONY rất đặc biệt.)

Trong khi phê bình này có vẻ khá lý thuyết (vô nghĩa), cú pháp của nó vẫn ở đây ". Nhưng tôi không đề xuất bất kỳ sự thay đổi cú pháp, có một sự thay thế:

Với GNU Make (ít nhất), các Makefile sau tuyên bố một giả mạo target_A:

target_A: _PHONY 
     touch target_A 

_PHONY: 
     #noop 

Câu hỏi 1: này là để đơn giản và sạch sẽ, chắc chắn tôi không phải là nhà phát minh đầu tiên của nó. Trên thực tế, với phương án này, tại sao make cần cú pháp đặc biệt nào?

Dường như với tôi rằng điều này cũng sẽ khá độc đáo giải quyết các câu hỏi về wildcards in phony targets và thậm chí có thể shed some light on .PHONY's meaning khi người mới bắt đầu nghi ngờ.

Câu hỏi 2: Bạn có thể nghĩ đến bất kỳ hoàn cảnh nào mà phương pháp này kém hơn không? (? Là cách gọi make .PHONY của bất kỳ sử dụng)

(tôi nên đề cập rằng trong khi tôi đã gọi make s khác, GNU Make là việc thực hiện duy nhất mà tôi có một số kinh nghiệm với -. Đọc và viết Makefiles)

+0

(nên có RTFM) GNU Thực hiện thủ công thực sự [đề cập đến công thức này] (http://www.gnu.org/software/make/manual/html_node/Force-Targets.html#Force-Targets) càng ít hiệu quả, nhưng di động hơn. Tôi phỏng đoán rằng tốc độ tăng lên nhanh chóng. Điều này cho thấy một câu trả lời tiêu cực cho câu hỏi 2. (?) – tiwo

Trả lời

3

Một vấn đề lớn khi sử dụng target_A: .PHONY là nó làm cho việc sử dụng nhiều biến tích hợp sẵn của bạn trở nên khó khăn hơn nhiều. Đi công thức chung này là một ví dụ:

%.a: $(OBJ_FILES) 
    $(LD) $(LFLAGS) -o [email protected] $^ 

Các $^ Kéo biến trong tất cả mọi thứ được liệt kê như là một điều kiện tiên quyết. Nếu .PHONY cũng được liệt kê ở đó thì nó sẽ được chuyển đến trình liên kết trên dòng lệnh, điều này có thể sẽ không dẫn đến bất kỳ điều gì xảy ra tốt đẹp. Sử dụng siêu mục tiêu như .PHONY làm điều kiện tiên quyết làm cho các biến tích hợp này ít hữu ích hơn, vì chúng yêu cầu nhiều xử lý bổ sung như $(filter-out .PHONY,$^) mỗi khi chúng được sử dụng. Đảo ngược mối quan hệ và thay vì làm cho .PHONY mục tiêu là một chút khó xử vì lợi ích của việc suy nghĩ về cây phụ thuộc, nhưng nó làm sạch phần còn lại của makefile.

+0

Ồ, tôi hiểu rồi. Và sự hiện diện của [mục tiêu "đặc biệt" khác] (http://www.gnu.org/software/make/manual/html_node/Special-Targets.html # Special-Targets) - bao gồm một số không phù hợp (ngữ nghĩa) vào đồ thị phụ thuộc - dường như giảm thiểu sự phản đối "tại sao lại quá đặc biệt". – tiwo

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