Làm cách nào để diễn tả logic sau trong Makefile?So sánh chuỗi lớn hơn trong Makefile
if $(XORG_VERSION) > "7.7"
<do some thing>
fi
Conditional Parts of Makefiles chỉ cung cấp ifeq hoặc ifneq.
Làm cách nào để diễn tả logic sau trong Makefile?So sánh chuỗi lớn hơn trong Makefile
if $(XORG_VERSION) > "7.7"
<do some thing>
fi
Conditional Parts of Makefiles chỉ cung cấp ifeq hoặc ifneq.
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.
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)
và 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.7
và 7.11
.
+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. –
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!
chỉ tò mò, vậy tại sao họ thực hiện ifdef có điều kiện, v.v ...? –
'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