2011-12-27 50 views

Trả lời

55

Hoặc phụ thuộc sử dụng hoặc làm đệ quy để kết nối từ một quy tắc khác.

Dependencies sẽ được thực hiện như thế này (mặc dù thứ tự sẽ khác nhau):

rule1: 
     echo "bye" 
rule2: 
     date 
rule3: rule1 
     @echo "hello" 

làm đệ quy sẽ được thực hiện như thế này (mặc dù nó không liên quan đến một tiến trình con):

rule1: 
     echo "bye" 
rule2: 
     date 
rule3: 
     @echo "hello" 
     $(MAKE) rule1 

Cả là hoàn hảo; thực sự, với đệ quy làm cho bạn có thể nhận được vào các vấn đề quan trọng nếu bạn xây dựng một vòng lặp. Bạn cũng có thể phải thêm quy tắc .PHONY để đánh dấu các quy tắc trên là tổng hợp, sao cho một số rule1 đi lạc trong thư mục sẽ không gây nhầm lẫn.

16

Makefiles không phải là thủ tục; "quy tắc" không giống như chức năng. Điều đó nói rằng, bạn có thể xác định rằng một quy tắc là một điều kiện tiên quyết của người khác:

rule1: 
    @echo "Rule 1" 

rule2: rule1 
    @echo "Rule 2" 

Nếu bạn làm make rule2, bạn sẽ thấy:

Rule 1 
Rule 2 
+2

phiền, tuy nhiên, bạn không thể nhận được "Quy tắc 2 \ nRule 1" ra khỏi nó –

+2

@Tomalak: Phụ thuộc vào định nghĩa của bạn "bực bội"! Một khi OP chấp nhận rằng các quy tắc đó không phải là các hàm thủ tục, thì không có nhiều điều phải thất vọng. –

+0

Nó không trả lời câu hỏi. Nó sẽ xuất ra Quy tắc 2 và sau đó là Quy tắc 1. Đây là những gì tác giả muốn đạt được. – nosbor

2

Có hai chức năng tiên tiến trong GNU Make mà có thể làm được điều này , mặc dù nó chỉ nên được sử dụng trong những tình tiết giảm nhẹ. SO này được xếp hạng cao nhất trong google.

Điều kiện tiên quyết quy tắc được đề xuất nhiều hơn, nhưng đôi khi bạn cần một điều kiện tiên quyết.

GNU Make Call function

GNU Make Eval function

Về cơ bản, Eval phép bạn xây dựng các mục tiêu một cách nhanh chóng, và Call cho phép chức năng như "định nghĩa" được tạo ra.

7

Chỉ cần thêm một quy tắc mới với thứ tự bạn muốn ..

rule1: 
     echo "bye" 
rule2: 
     date 
rule3: 
     @echo "hello" 

rule4: rule3 rule1 
+0

Imho đây là một giải pháp đẹp hơn nhiều so với các câu trả lời khác. –

+0

Đơn giản - Tôi thích nó. –

+0

Điều này sẽ không áp đặt lệnh. Nó sẽ chỉ đảm bảo rằng rule1 và rule3 được thực hiện trước khi rule4, không có bảo đảm khi đặt hàng – CristianDonosoC