2011-10-05 8 views
75

W jaki sposób wykonać operację logiczną OR przy użyciu operatora make ifeq?Makefile ifeq logical or

przykład I (uproszczonych)

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

ale chciałby łączy te linie.

(tak, tak, autotools, konfigurować, etc etc; zbyt brutalne dla obecnej sytuacji, chciałby, aby utrzymać wszystko w Makefile tutaj)

[logiczne przeciwieństwo tego pytania: How to Use of Multiple condition in 'ifeq' statement]

+0

Możliwe duplikat * [warunkach złożonych sprawdzić w Makefile] (http://stackoverflow.com/questions/ 5584872/complex-conditions-check-in-makefile) *. –

+0

Nie myśl, że to dupek, powiązane pytanie dotyczy łańcuchów operatorów 'ifdef', to pytanie jest związane z łańcuchem operatorów' ifeq', podobne, ale odpowiedzi są zdecydowanie różne. – Pat

+0

Podobny do [Czy istnieje logiczny operator 'OR' dla' ifneq'?] (Http://stackoverflow.com/q/8296723/471376) – JamesThomasMoon1979

Odpowiedz

68

Jak znaleźć w archiwum listy dyskusyjnej,

można użyć filtra funkcję.

Przykładowo

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

filtr X AB powróci tych A, B, które są równe X.

Odmianą tego jest

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

gdzie ujemny porównuje się z pustym łańcuchem (filtr zwróci en pusty ciąg, jeśli GCC_MINOR d nie pasuje do argumentów)

Wadą tych metod jest to, że argumenty muszą być pojedynczymi słowami.

+5

Spóźniona uwaga: w dwóch odmianach, które masz powyżej, pierwsza zmieni się na true, jeśli $ (GCC_MINOR) jest pusta, podczas gdy druga nie (więc druga jest ogólnie lepszym rozwiązaniem). – John

+1

Właściwie powinno to być 'ifneq (, $ (filter 4 5, $ (GCC_MINOR))) :) :) – Tuxdude

+2

Być może lepiej jest wyjść tak, jak to jest z prostotą? – Jason

20

Możesz wprowadzić inną zmienną. robi konsolidacji zarówno kontroli, ale przynajmniej unika konieczności umieścić ciało dwukrotnie:

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

Zdolność do zachowania tego na skalę nie wydaje mi się bardzo dobra:/ Jeszcze raz, gdy zaczynamy mówić o skali, myślę, że mówimy autotools – Pat

+0

@Pat: Wolę takie podejście, w którym mogę oddzielić przypisanie w jednym miejscu w pliku Makefile, prawdopodobnie porównując z większą liczbą wartości używając ifeq/else ifeq/else, zamiast używać funkcji filtrującej, która mogłaby spowodować strasznie długie odczytanie linii. – jcarballo

12

nie sądzę istnieje zwięzłe, rozsądny sposób, aby to zrobić, ale nie są zbyt obszerne, sensowne sposoby (takie jak Foo Bah'S) i zwięzły, patologicznych sposobów, takich jak

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

(która wykona polecenie pod warunkiem, że ciąg $ (GCC_MINOR) pojawia się wewnątrz ciągu 4-5).

+2

Na lepsze lub gorsze (prawdopodobnie gorzej), po prostu rodzaj brudnego hacka, którego szukałem; dzięki – Pat

+1

Nie sądzę, że jest to w ogóle patologia, poza tym, że * wszystko * w pliku Makefile jest patologiczne. To naprawdę dość eleganckie. Czytałem cztery lub pięć różnych sposobów, aby to osiągnąć, a twoja jest zdecydowanie najłatwiejsza do zrozumienia. –

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

Innym można rozważyć użycie w tym przypadku jest:

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 

I rzeczywiście korzystać z tego samego w moim kodu, ponieważ nie chcę, aby utrzymać oddzielny config lub Configure.

Ale musisz użyć przenośnego, nie-anemicznego modelu make, takiego jak GNU make (gmake), a nie Posixa make.

I nie rozwiązuje problemu logicznego AND i OR.

3

tutaj bardziej elastyczne odmiana: używa powłoki zewnętrznej, ale pozwala na sprawdzenie dla dowolnych warunkach:

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