Saltar al contenido

Makefile ifeq lógico o

El tutorial o código que verás en este post es la resolución más fácil y válida que hallamos a esta inquietud o problema.

Solución:

Como se encuentra en el archivo de la lista de correo,

  • http://osdir.com/ml/gnu.make.windows/2004-03/msg00063.html
  • http://osdir.com/ml/gnu.make.general/2005-10/msg00064.html

uno puede usar el filter función.

Por ejemplo

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

filter X, A B devolverá aquellos de A,B que son iguales a X. Tenga en cuenta que, aunque esto no es relevante en el ejemplo anterior, esta es una operación XOR. Es decir, si en cambio tienes algo como:

ifeq (4, $(filter 4, $(VAR1) $(VAR2)))

Y luego haz por ejemplo make VAR1=4 VAR2=4el filtro volverá 4 4que no es igual a 4.

Una variación que realiza una operación OR en su lugar es:

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

donde una comparación negativa contra un vacío string se usa en su lugar (filter volverá en vacío string si GCC_MINOR no coincide con los argumentos). Utilizando el VAR1/VAR2 ejemplo se vería así:

ifneq (, $(filter 4, $(VAR1) $(VAR2)))

La desventaja de esos métodos es que debe estar seguro de que estos argumentos siempre serán palabras sueltas. Por ejemplo, si VAR1 es 4 fooel resultado del filtro sigue siendo 4y el ifneq la expresión sigue siendo true. Si VAR1 es 4 5el resultado del filtro es 4 5 y el ifneq la expresión es true.

Una alternativa fácil es simplemente poner la misma operación en ambos ifeq y else ifeq rama, por ejemplo, así:

ifeq ($(GCC_MINOR),4)
    @echo Supported version
else ifeq ($(GCC_MINOR),5)
    @echo Supported version
else
    @echo Unsupported version
endif

Puedes introducir otra variable. No consolida ambos controles, pero al menos evita tener que meter el cuerpo 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

No creo que haya una forma concisa y sensata de hacerlo, pero hay formas detalladas y sensatas (como la de Foo Bah) y formas concisas y patológicas, como

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

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

Finalizando este artículo puedes encontrar las crónicas de otros usuarios, tú igualmente puedes mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *