run phony makefile

phony - Makefile ifeq logical o



makefile windows (5)

¿Cómo se realiza un OR lógico utilizando el operador ifeq de ifeq ?

por ejemplo, tengo (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, configure, etc, etc., demasiado torpes para la situación actual, me gustaría mantener todo dentro del Makefile aquí)

[opuesto lógico de esta pregunta: Cómo usar la condición múltiple en la declaración ''ifeq'' ]


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

Otro que 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

De hecho, uso el mismo en mi código porque no quiero mantener una config separada o Configure .

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

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


Aquí la variante más flexible: usa shell externo, pero permite verificar condiciones arbitrarias:

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


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

uno puede usar la función de filtro .

Por ejemplo

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

el filtro X, AB devolverá los de A, B que son iguales a X.

Una variación de esto es

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

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

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


No creo que haya una manera concisa y sensata de hacer eso, pero hay formas verbales y sensatas (como las 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 la cadena $ (GCC_MINOR) aparezca dentro de la cadena 4-5).


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