2009-09-16 12 views
15

En un Makefile, estoy tratando de asignar el resultado de un comando shell a una variable:variable de Informática Makefile en la asignación

TMP=`mktemp -d /tmp/.XXXXX` 

all: 
    echo $(TMP) 
    echo $(TMP) 

pero

$ make Makefile all 

se hace eco de 2 valores diferentes, por ejemplo, :

/tmp/.gLpm1T 
/tmp/.aR4cDi 

¿Cuál es la sintaxis para calcular mktemp en la asignación de variables?

Gracias.

Respuesta

30

Depende del sabor de la marca. Con GNU Make, puede utilizar := en lugar de = como en

TMP:=$(shell mktemp -d /tmp/.XXXXX) 

Editar Como ha señalado Novelocrat, la asignación = difiere de := asignación en que los valores asignados utilizando = será evaluado durante la sustitución (y por lo tanto , cada vez, se usa la variable), mientras que las variables asignadas := tendrán sus valores evaluados solo una vez (durante la asignación), y por lo tanto, los valores se fijarán después de eso. Consulte el documentation de GNU Make para obtener una explicación más detallada.

Para que el valor sea realmente constante después de la asignación, no debe contener ninguna parte, que podría ser especial para el shell (que make llama para ejecutar realmente las reglas de actualización, etc.) En particular , es mejor evitar los backticks. En su lugar, utilice la función de shell incorporada de GNU make y similar para lograr sus objetivos.

+1

Las variables asignadas con '=' se evalúan en cada sustitución. Las variables asignadas con ': =' se evalúan en la asignación, como usted desee. – Novelocrat

+0

Hola Dirk, Parece que no funciona: http://pastie.org/619606 ¿Hay algún error de sintaxis en mi Makefile? Gracias – abernier

+1

Respuesta editada de nuevo. Creo que el problema es el uso de los backticks; para make, el valor (incluidos los backticks) es esencialmente "constante" y se pegará como está en el punto de uso, y luego, los backticks serán vistos por el shell en cada punto de uso. Solo una teoría, sin embargo. – Dirk

7

Si está utilizando GNU Make, en lugar de utilizar barras, use $(shell ...). Por ejemplo,

TMP=$(shell mktemp -d /tmp/.XXXXX) 
Cuestiones relacionadas