2010-08-09 43 views

Trả lời

4

Bạn sẽ không hạn chế việc sử dụng make báo cáo có điều kiện - mỗi lệnh là một lệnh shell mà có thể phức tạp như bạn cần (bao gồm một tuyên bố có điều kiện vỏ):

Xem xét makefile sau:

dummy: 
    if [ ${xyz} -gt 8 ] ; then \ 
     echo urk!! ${xyz} ;\ 
    fi 

Khi bạn sử dụng xyz=7 make --silent, không có đầu ra. Khi bạn sử dụng xyz=9 make --silent, kết quả đầu ra là urk!! 9 như mong đợi.

+0

chỉ tò mò, vậy tại sao họ thực hiện ifdef có điều kiện, v.v ...? –

+3

'Make' không (và có lẽ không nên) giả định bất cứ điều gì về vỏ bên dưới. Ví dụ, nếu bạn đang chạy nó dưới Windows, nó chỉ có thể có 'cmd.exe' không mạnh bằng' bash'. Câu hỏi thực sự là tại sao gnu không cung cấp các toán tử so sánh mạnh mẽ hơn? Câu trả lời của tôi là "Tôi không có ý kiến" :-) – paxdiablo

11

Tôi sử dụng hàm sort để so sánh các giá trị theo từ điển. Ý tưởng là, sắp xếp danh sách hai giá trị, $(XORG_VERSION)7.7, sau đó lấy giá trị đầu tiên - nếu đó là 7.7 thì phiên bản giống hoặc lớn hơn.

ifeq "7.7" "$(word 1, $(sort 7.7 $(XORG_VERSION)))" 
    <do some thing> 
endif 

Điều chỉnh 7.7 thành 7.8 nếu bạn cần điều kiện lớn hơn nghiêm ngặt.

Cách tiếp cận này cải thiện tính di động bằng cách tránh các tập lệnh shell và các giả định đồng thời về khả năng của vỏ hệ điều hành có sẵn. Tuy nhiên, nó thất bại nếu thứ tự từ điển không tương đương với thứ tự số, ví dụ như khi so sánh 7.77.11.

+1

+1 Cách thực sự thông minh để thực hiện so sánh mà không cần phải sử dụng lệnh shell. –

0

Sử dụng các lệnh shell, như đã đề cập trong câu trả lời khác, nên là đủ cho hầu hết các trường hợp sử dụng:

if [ 1 -gt 0 ]; then \ 
    #do something \ 
fi 

Tuy nhiên, nếu bạn, như tôi, muốn sử dụng nhiều hơn hơn so để sau đó thiết lập một biến make qua $(eval) lệnh make 's, sau đó bạn sẽ thấy rằng cố gắng làm như vậy sử dụng mô hình câu trả lời khác:

if [ 1 -gt 0 ]; then \ 
    $(eval FOO := value) \ 
fi 

đặt ra một lỗi:

if [ 1 -gt 0 ]; then fi; 
/bin/bash: -c: line 0: syntax error near unexpected token `fi' 
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then fi;' 
make: *** [clean] Error 2``` 

Tôi tìm thấy một cách làm thế nào để sắp xếp ra vấn đề đó và đăng nó as a solution to this other question. Tôi hy vọng ai đó thấy nó hữu ích!