2011-10-05 10 views
75

¿Cómo se realiza un O lógico con el operador ifeq de make?Makefile ifeq logical o

por ejemplo, He (simplificado):

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

pero me gustaría consolidar estas líneas.

(sí, sí, autotools, configurar, etc, etc; también de mano dura para la situación actual, les gustaría mantener todo dentro del Makefile aquí)

[opuesto lógico de esta pregunta: How to Use of Multiple condition in 'ifeq' statement]

+0

duplicado Posible de * [Condiciones complejas mide en Makefile] (http://stackoverflow.com/questions/ 5584872/complex-conditions-check-in-makefile) *. –

+0

No creas que es una tontería, la pregunta relacionada se relaciona con el encadenamiento de operadores 'ifdef', esta pregunta está relacionada con encadenar operadores' ifeq', similar, pero las respuestas son definitivamente diferentes. – Pat

+0

Similar a [¿Hay un operador 'OR' lógico para el' ifneq'?] (Http://stackoverflow.com/q/8296723/471376) – JamesThomasMoon1979

Respuesta

68

que se encuentran en el archivo de lista de correo,

se puede utilizar la función de filtro de .

Por ejemplo

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

filtro X, AB volverá los de A, B que son iguales X.

Una variación de esto es

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

donde un negativo se usa la comparación contra una cadena vacía en su lugar (filtro devolverá una cadena vacía si GCC_MINOR d no coincide con los argumentos)

La desventaja de esos métodos es que los argumentos tienen que ser palabras sueltas.

+5

Una nota tardía: en las dos variaciones que tiene arriba, la primera se resolverá en verdadero si $ (GCC_MINOR) está en blanco, mientras que la segunda no (por lo tanto, la segunda es la mejor solución genéricamente hablando). – John

+1

En realidad, debería ser 'ifneq (, $ (filtro 4 5, $ (GCC_MINOR)))' :) – Tuxdude

+2

¿Quizás sea mejor dejar lo que está para simplificar? – Jason

20

Puede introducir otra variable. Eso no consolidar los dos cheques, pero al menos evita tener que poner el cuerpo en dos veces:

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

El mantenimiento de esto a escala no me parece muy bueno:/ Por otra parte, una vez que comenzamos a hablar de escala, creo que estamos hablando de autotools – Pat

+0

@Pat: Prefiero este enfoque donde puedo separar la asignación en un lugar en el archivo Makefile, posiblemente comparando contra más valores utilizando ifeq/else ifeq/else, en lugar de usar la función de filtro que podría hacer que las líneas sean difíciles de leer. – jcarballo

12

No creo que hay una manera concisa, sensible a hacer eso, pero hay maneras sensatas prolijo (tales como Foo Bah 's) y formas patológicas, concisos, como

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

(que ejecutará el comando siempre que la cadena $ (GCC_MINOR) aparece dentro de la cadena 4-5).

+2

Para bien o para mal (probablemente peor), el tipo de hack sucio que estaba buscando; gracias – Pat

+1

No creo que esto sea patológico en absoluto, aparte del hecho de que * todo * en un Makefile es patológico. Es realmente bastante elegante. He leído cuatro o cinco maneras diferentes de lograr esto, y la suya es de lejos la más fácil de entender. –

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

Otra puede considerar usar en este caso es:

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 

realidad Puedo usar el mismo código en mi porque yo no quiero mantener un config separada o Configure.

Pero tiene que usar una portátil, no anémica make, como la marca GNU (gmake), y no la make de Posix.

Y no resuelve el problema de AND y OR lógicos.

3

variante Aquí más flexible: utiliza la cáscara externa, pero permite comprobar para condiciones arbitrarias:

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