Uso de comandos shell, como se mencionó en el otras respuestas, deberían ser suficientes 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, encontrará que el intento de hacerlo a través de la El modelo de 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```
La razón es que make
's $(eval)
expression returns the empty string. El código de bash resultante se forma incorrectamente. **
Se me ocurrió la siguiente solución (¡después de probar muchos enfoques diferentes!).
$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \
$(eval BAR := true), \
$(eval BAR := false))
Es necesario imprimir una cadena después de realizar la comparación aritmética (la parte echo "OK"
) porque make
's $(if)
operador de su basada en la lógica vacía cuerdas:
$(if condition,then-part[,else-part])
The if function provides support for conditional expansion in a functional context (as opposed to the GNU make makefile conditionals such as ifeq (see Syntax of Conditionals).
The first argument, condition, first has all preceding and trailing whitespace stripped, then is expanded. If it expands to any non-empty string, then the condition is considered to be true. If it expands to an empty string, the condition is considered to be false.
Fuente: GNU Make Manual
Espero que esto ayude!
** Nota : Al principio, pensé que esa cuestión podría ser fácilmente fijado por la adición de un comando de bash que no hace nada a la expresión, tales como true
:
if [ $(VALUE) -ge 1 ]; then \
true; $(eval BAR := GreaterOrEqualThan1) \
else \
true; $(eval BAR := LowerThan1) \
fi
que resultó ser una idea terribleTodavía no entiendo por qué, pero la rama else
siempre se ejecuta, independientemente del resultado de la comparación.
Creo que debería abrir una pregunta para este caso.
Posible duplicado de * [Mayor que la comparación de cadenas en un Makefile] (http://stackoverflow.com/questions/3437160/greater-than-string-comparison-in-a-makefile) *. –