2011-10-05 24 views
75

Làm thế nào để bạn thực hiện lôgic HOẶC sử dụng toán tử ifeq của make?Makefile ifeq logical hoặc

ví dụ, I have (giản thể):

ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

nhưng muốn củng cố những dòng này.

(vâng, vâng, autotools, cấu hình, vv vv; quá nặng tay đối với tình hình hiện nay, muốn giữ mọi thứ trong Makefile đây)

[ngược lại logic của câu hỏi này: How to Use of Multiple condition in 'ifeq' statement]

+0

có thể trùng lặp của * [điều kiện Complex kiểm tra trong Makefile] (http://stackoverflow.com/questions/ 5584872/điều kiện phức tạp-check-in-makefile) *. –

+0

Đừng nghĩ rằng đó là một dupe, câu hỏi được liên kết liên quan đến chuỗi 'ifdef' operator, câu hỏi này liên quan đến chuỗi' ifeq' operator, tương tự, nhưng câu trả lời chắc chắn là khác nhau. – Pat

+0

Tương tự như [Có toán tử logic 'OR' cho' ifneq'?] (Http://stackoverflow.com/q/8296723/471376) – JamesThomasMoon1979

Trả lời

68

Như tìm thấy trên các kho lưu trữ danh sách gửi thư,

người ta có thể sử dụng các bộ lọc chức năng.

Ví dụ

ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5)) 

lọc X, AB sẽ trả lại những của A, B đều bình đẳng X.

Một biến thể của việc này là

ifneq (,$(filter $(GCC_MINOR),4 5)) 

nơi một tiêu cực so sánh với chuỗi trống được sử dụng thay thế (bộ lọc sẽ trả lại chuỗi trống nếu GCC_MINOR d không khớp với các đối số)

Nhược điểm của các phương pháp đó là các đối số phải là một từ duy nhất.

+5

Ghi chú trễ: trong hai biến thể bạn có ở trên, giá trị đầu tiên sẽ chuyển thành true nếu $ (GCC_MINOR) trống, trong khi giá trị thứ hai sẽ không (do đó thứ hai là giải pháp tốt hơn nói chung). – John

+1

Trên thực tế, nó phải là 'ifneq (, $ (bộ lọc 4 5, $ (GCC_MINOR)))' :) – Tuxdude

+2

Có lẽ tốt hơn hết là để đơn giản? – Jason

20

Bạn có thể giới thiệu một biến khác. Nó không củng cố cả hai séc, nhưng nó ít nhất tránh được việc phải đưa cơ thể trong hai lần:

do_it = 
ifeq ($(GCC_MINOR), 4) 
    do_it = yes 
endif 
ifeq ($(GCC_MINOR), 5) 
    do_it = yes 
endif 
ifdef do_it 
    CFLAGS += -fno-strict-overflow 
endif 
+4

Khả năng bảo trì này ở quy mô không có vẻ rất tốt đối với tôi: Sau đó, một lần nữa, khi chúng ta bắt đầu nói chuyện, tôi đoán chúng ta đang nói autotools – Pat

+0

@Pat: Tôi thích cách tiếp cận này, nơi tôi có thể tách bài tập ở một nơi trong Makefile, có thể so sánh với nhiều giá trị hơn bằng ifeq/else ifeq/else, thay vì sử dụng chức năng lọc mà chỉ có thể làm cho awfully dài khó đọc dòng. – jcarballo

12

Tôi không nghĩ rằng có một cách ngắn gọn hợp lý để làm điều đó, nhưng có những chi tiết, cách hợp lý (ví dụ như của Foo Bah) và súc tích, các cách bệnh lý, chẳng hạn như

ifneq (,$(findstring $(GCC_MINOR),4-5)) 
    CFLAGS += -fno-strict-overflow 
endif 

(sẽ thực thi lệnh với chuỗi $ (GCC_MINOR) xuất hiện bên trong chuỗi 4-5).

+2

Đối với tốt hơn hoặc tệ hơn (có lẽ tồi tệ hơn), chỉ là loại hack bẩn tôi đang tìm kiếm; cảm ơn – Pat

+1

Tôi không nghĩ rằng đây là bệnh lý ở tất cả, khác với thực tế là tất cả mọi thứ * * trong một Makefile là bệnh lý. Nó thực sự khá thanh lịch. Tôi đã đọc bốn hoặc năm cách khác nhau để thực hiện điều này, và của bạn là dễ hiểu nhất. –

0
ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

Một bạn có thể xem xét sử dụng trong trường hợp này là:

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") 

# -Wstrict-overflow: http://www.airs.com/blog/archives/120 
ifeq ($(GCC42_OR_LATER),1) 
    CFLAGS += -Wstrict-overflow 
endif 

Tôi thực sự sử dụng như nhau trong mã của tôi bởi vì tôi không muốn duy trì một riêng biệt config hoặc Configure.

Nhưng bạn phải sử dụng di động, không thiếu máu make, như GNU tạo (gmake) và không phải là số make của Posix.

Và nó không giải quyết vấn đề hợp lý ANDOR.

3

biến Dưới đây linh hoạt hơn: nó sử dụng vỏ bên ngoài, nhưng cho phép để kiểm tra các điều kiện tùy ý:

ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ 
        ".$(GCC_MINOR)" = .5 -o \ 
        ".$(TODAY)"  = .Friday && printf "true"), true) 
    CFLAGS += -fno-strict-overflow 
endif