Jak wykonać logiczne OR przy użyciu ifeq
operatora make ?
np. mam (uproszczone):
ifeq ($(GCC_MINOR), 4)
CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
CFLAGS += -fno-strict-overflow
endif
ale chciałbym skonsolidować te linie.
(tak, tak, narzędzia automatyczne, konfiguracja itp.; zbyt ciężki w obecnej sytuacji, chciałbym zachować wszystko w pliku Makefile tutaj)
[logiczne przeciwieństwo tego pytania: jak używać warunku wielokrotnego w instrukcji „ifeq” ]
ifdef
operatorów łańcuchowych , to pytanie dotyczyifeq
operatorów łańcuchowych , podobnie, ale odpowiedzi są zdecydowanie inne.OR
operator logicznyifneq
?Odpowiedzi:
Jak stwierdzono w archiwum listy mailingowej,
można użyć funkcji filtru .
Na przykład
filtr X, AB zwróci te z A, B, które są równe X.
Odmiana tego jest
gdzie zamiast tego używane jest negatywne porównanie z pustym ciągiem ( filtr zwróci pusty ciąg, jeśli GCC_MINOR nie pasuje do argumentów)
Wadą tych metod jest to, że argumenty muszą być pojedynczymi słowami.
źródło
ifneq (,$(filter 4 5,$(GCC_MINOR)))
:)if(flagA == TRUE || flagB == true)
, ale jeśli to zrobisz$(filter true, $(flagA) $(flagB)
i oba są prawdziwe, otrzymaszifeq(true, true true)
Możesz wprowadzić inną zmienną. Nie konsoliduje obu kontroli, ale przynajmniej unika konieczności dwukrotnego umieszczania ciała:
źródło
Nie sądzę, aby istniał zwięzły, rozsądny sposób, aby to zrobić, ale są rozwlekłe, rozsądne sposoby (takie jak Foo Bah) i zwięzłe, patologiczne sposoby, takie jak
(co wykona polecenie pod warunkiem, że ciąg $ (GCC_MINOR) pojawi się wewnątrz ciągu 4-5).
źródło
Tutaj wariant bardziej elastyczny: wykorzystuje zewnętrzną powłokę, ale pozwala sprawdzić dowolne warunki:
źródło
Innym, który możesz rozważyć w tym przypadku, jest:
Właściwie używam tego samego w moim kodzie, ponieważ nie chcę utrzymywać oddzielnego
config
lubConfigure
.Ale musisz użyć przenośnego, nie-anemicznego
make
, takiego jak GNU make (gmake
), a nie Posixmake
.I nie rozwiązuje problemu logicznego
AND
iOR
.źródło