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,
- 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 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