2011-11-28 12 views
10

¿Hay un operador OR lógico para la instrucción 'ifneq ... endif'?¿Hay un operador OR lógico para el 'ifneq'?

Es decir, no me gustaría ejecutar algunas declaraciones si la variable 'var1' o 'var2' está definida. Algo como esto:

ifneq ($(WNDAP660),y) OR $(WNADAP620),y)) 
... 
endif 

he intentado ifneq ($(WNDAP660),$(filter $(WNADAP620),y y)), pero no está funcionando.

+1

Es posible que desee una Y en lugar de un O, ¿verdad? Si escribió 'y! = WNDAP660 || y! = WNADAP620', entonces al menos una y posiblemente ambas alternativas serán verdaderas, por lo que siempre se tomará la acción. –

+0

Posible duplicado de [Makefile ifeq logical or] (http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or) –

+0

Duplicación anterior: * [Verificación de condiciones complejas en Makefile] (http: // stackoverflow. com/questions/5584872/complex-conditions-check-in-makefile) *. –

Respuesta

8

prueba este:

ifeq ($(filter y,$(WNDAP660) $(WNADAP620)),) 
... 
endif 
+0

¿Puedes explicarme esto? supongamos que quiero ifeq ($ (WNDAP660), y) OR $ (WNADAP620), y)) entonces, ¿qué debo hacer? –

+1

Solo niega el condicional: 'ifneq ($ (filtro y, $ (WNDAP660) $ (WNADAP620)),)' –

+0

Si alguna de sus variables está configurada en ''y'',' filter' las devuelve, digamos si ninguno de ellos está configurado, '' y' 'para una sola variable de conjunto,' 'yy'' para el caso cuando ambos estén configurados. –

2

crudo pero efectivo:

ifneq ($(WNDAP660),y) 
ifneq ($(WNADAP620),y) 
... 
endif 
endif 
3

¿Hay un operador lógico OR para la 'ifneq'

NO. Posix Make es anémico. No hay OR lógico para ninguno de ellos. Ver, por ejemplo, Logical AND, OR, XOR operators inside ifeq ... endif construct condition en la lista de correo de make GNU. Han sido solicitados por décadas (literalmente).

Posix make es casi inútil, y una de las primeras cosas que suele hacer en un sistema BSD es instalar el puerto GNU Make (gmake) para que pueda compilar bibliotecas y programas.

Si está utilizando GNU Make, entonces tiene otras opciones.

Una alternativa es utilizar la shell de matemáticas para simular un circuito. Por ejemplo, la siguiente es de Crypto++'sGNUmakefile:

IS_DARWIN = $(shell uname -s | $(EGREP) -i -c "darwin") 
GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4\.[2-9]|[5-9])") 
CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang") 

# Below, we are building a boolean circuit that says "Darwin && (GCC 4.2 || Clang)" 
MULTIARCH_SUPPORT = $(shell echo $$(($(IS_DARWIN) * ($(GCC42_OR_LATER) + $(CLANG_COMPILER))))) 
ifneq ($(MULTIARCH_SUPPORT),0) 
    CXXFLAGS += -arch x86_64 -arch i386 
else 
    CXXFLAGS += -march=native 
endif 

Cuando se construye un circuito de este tipo, utilice -c para grep y egrep para contar golpes. Luego use los valores non-0 y 0. Eso es en caso de que algo tenga un valor de, por ejemplo, 2. Es por eso que la prueba anterior es ifneq ($(MULTIARCH_SUPPORT),0) (si no es igual a 0).

Otra alternativa es usar GNU Make Standard Library. Agrega los siguientes operadores: no, y, o, xor, nand, nor, xnor a la versión de CVS.

0

he probar el siguiente código, que funciona bien

ifeq ($(var1),value1) or ($(var2), value2) 
    #do something here 
endif 
+0

ignora la segunda condición en mi GNU make 4.1 en Fedora –

Cuestiones relacionadas