¿Cómo expreso la siguiente lógica en un Makefile?Mayor que la comparación de cadenas en un Makefile
if $(XORG_VERSION) > "7.7"
<do some thing>
fi
Conditional Parts of Makefiles sólo proporciona ifeq o ifneq.
¿Cómo expreso la siguiente lógica en un Makefile?Mayor que la comparación de cadenas en un Makefile
if $(XORG_VERSION) > "7.7"
<do some thing>
fi
Conditional Parts of Makefiles sólo proporciona ifeq o ifneq.
Usted no está restringido a usar los make
sentencias condicionales - cada comando es un comando de shell que puede ser tan compleja como sea necesario (incluyendo una declaración condicional shell):
Considere el siguiente makefile
:
dummy:
if [ ${xyz} -gt 8 ] ; then \
echo urk!! ${xyz} ;\
fi
Cuando usa xyz=7 make --silent
, no hay salida. Cuando usa xyz=9 make --silent
, emite urk!! 9
como se esperaba.
Uso la función sort
para comparar valores lexicográficamente. La idea es ordenar la lista de dos valores, $(XORG_VERSION)
y 7.7
, luego tomar el primer valor - si es 7.7
, entonces la versión es igual o mayor.
ifeq "7.7" "$(word 1, $(sort 7.7 $(XORG_VERSION)))"
<do some thing>
endif
Ajuste 7.7
a 7.8
si necesita la estricta mayor que condiciones.
Este enfoque mejora la portabilidad al evitar guiones de shell y suposiciones concomitantes sobre las capacidades del shell del sistema operativo disponible. Sin embargo, falla si el orden lexicográfico no es equivalente al orden numérico, por ejemplo al comparar 7.7
y 7.11
.
+1 Forma realmente inteligente de hacer la comparación sin tener que recurrir al uso de un comando de shell. –
El uso de comandos de shell, como se menciona en las otras respuestas, debería ser suficiente para la mayoría de los casos de uso:
if [ 1 -gt 0 ]; then \
#do something \
fi
Sin embargo, si usted, como yo, desea utilizar mayor que comparación con el fin de continuación que la variable make
a través de comandos make
's $(eval)
, a continuación, usted encontrará que intentar hacerlo utilizando el modelo de la otra respuesta:
if [ 1 -gt 0 ]; then \
$(eval FOO := value) \
fi
genera un error:
if [ 1 -gt 0 ]; then fi;
/bin/bash: -c: line 0: syntax error near unexpected token `fi'
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then fi;'
make: *** [clean] Error 2```
he encontrado una manera de cómo resolver ese problema y lo publicó as a solution to this other question. ¡Espero que alguien lo encuentre útil!
solo curiosidad, ¿por qué hacen el ifdef condicional, etc.? –
'Make' no supone (y probablemente no debería) algo sobre el shell subyacente. Por ejemplo, si lo está ejecutando en Windows, solo puede tener 'cmd.exe' que no es tan poderoso como' bash'. La verdadera pregunta sería ¿por qué Gnu no proporcionó operadores de comparación más potentes? A lo que mi respuesta es "No tengo ni idea" :-) – paxdiablo