2008-10-07 29 views
48

Ai đó có thể giải thích cách sử dụng các câu lệnh if-then và cho các vòng lặp trong Makefiles không? Tôi không thể tìm thấy bất kỳ tài liệu hay nào với các ví dụ.Makefile If-Then Else and Loops

+0

Tôi thêm "bằng ví dụ đơn giản". Ok của documenatation, nhưng con người là những ví dụ trừu tượng! Đối với tôi, đây vẫn là một câu hỏi hợp lệ. – Quickredfox

Trả lời

51

Các hình thức có điều kiện

Simple

conditional-directive 
text-if-true 
endif 

vừa Complex

conditional-directive 
text-if-true 
else 
text-if-false 
endif 

More Complex

conditional-directive 
text-if-one-is-true 
else 
conditional-directive 
text-if-true 
else 
text-if-false 
endif 
endif 

Chỉ có điều kiện

Nếu Equal Cú pháp

ifeq (arg1, arg2) 
ifeq 'arg1' 'arg2' 
ifeq "arg1" "arg2" 
ifeq "arg1" 'arg2' 
ifeq 'arg1' "arg2" 

Nếu Không Equal Cú pháp

ifneq (arg1, arg2) 
ifneq 'arg1' 'arg2' 
ifneq "arg1" "arg2" 
ifneq "arg1" 'arg2' 
ifneq 'arg1' "arg2" 

Nếu Defined Cú pháp

ifdef variable-name 

Nếu Không Defined Cú pháp

ifndef variable-name 

foreach Chức năng

foreach Function Cú pháp

$(foreach var, list, text) 

foreach Semantics
Đối với mỗi khoảng trắng tách ra từ trong "danh sách", biến được đặt tên bởi "var" được thiết lập để từ đó và văn bản được thực hiện.

7

Bạn đã thử các GNU make documentation? Nó có một phần toàn bộ về điều kiện với các ví dụ.

13

Dưới đây là một ví dụ nếu:

ifeq ($(strip $(OS)),Linux) 
     PYTHON = /usr/bin/python 
     FIND = /usr/bin/find 
endif 

Lưu ý rằng điều này đi kèm với một lời cảnh báo rằng phiên bản khác nhau của Make có cú pháp hơi khác nhau, không ai trong số đó dường như được ghi lại rất tốt.

+1

Là '$ (OS)' một GNU được xác định trước có tạo biến không? Nếu có, thì có thể bạn nên thêm nó vào đây (http://stackoverflow.com/q/714100/912144). – Shahbaz

3

Bạn thấy rất nhiều lần, nhưng thường không cần thiết. Dưới đây là ví dụ về cách người ta có thể thực hiện vòng lặp for mà không cần đến vỏ

LIST_OF_THINGS_TO_DO = do_this do_that 
$(LIST_OF_THINGS_TO_DO): 
     run [email protected] > [email protected] 

SUBDIRS = snafu fubar 
$(SUBDIRS): 
    cd [email protected] && $(MAKE)