2010-08-09 22 views
7

que estoy tratando de hacer esto en un Makefile:mayor que menos-que los cálculos en un Makefile

value = 2.0 

if ${greaterthan ${value}, 1.50} 
-> execute a rule 
elseif ${lessthan ${value}, 0.50} 
-> execute a rule 
endif 

Parece como una cosa bastante común que querer hacerlo. ¿Cuál es la mejor manera de hacer esto?

+0

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) *. –

Respuesta

8

Similar a this question, pero básicamente puede usar comandos de shell dentro de un Makefile. Así que la siguiente es perfectamente legal:

foo: 
    if [ ${value} -gt 2 ] ; then \ 
     #Do stuff;\ 
    fi 

Editar para una pequeña aclaración: IIRC, bash no entiende la aritmética de coma flotante. Puede interpretarlos como strings, pero podría hacer las cosas un poco raras. Asegúrate de tomar esto en consideración.

+0

¿Eso funcionaría en Windows? ¿Y/o en [MinGW] (http://en.wikipedia.org/wiki/MinGW)? –

+0

¿Entonces la sintaxis de Linux/Unix funciona en makefile? –

11

Prueba este

En este ejemplo VER se comprueba la mayor que 4

ifeq ($(shell test $(VER) -gt 4; echo $$?),0) 
    IFLAGS += -I$(TOPDIR)/include 
    LIBS += -L$(TOPDIR)/libs -lpcap 
endif 
+0

¿Qué está implicado aquí? [Bash] (http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29)? Solo funciona en Linux (y [Mac OS X] (http://en.wikipedia.org/wiki/Mac_OS_X))? –

0

Mi manera preferida de hacer esto es:

value = 2.0 
ifeq ($(shell expr $(value) \>= 1.5), 1) 
    # execute a rule 
else ifeq ($(shell expr $(value) \<= 0.5), 1) 
    # execute a rule 
endif 
0

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.

Cuestiones relacionadas