utilizar primer make instalar entre diferencia configurar como comando archivos shell makefile

shell - primer - Cómo asignar el resultado de un comando a una variable Makefile



makefile make (4)

Necesito ejecutar algunas reglas make condicionalmente, solo si el Python instalado es mayor que cierta versión (digamos 2.5).

Pensé que podría hacer algo así como ejecutar:

python -c ''import sys; print int(sys.version_info >= (2,5))''

y luego usar la salida (''1'' si está bien, ''0'' en caso contrario) en una declaración ifeq .

En un simple script de bash shell es solo:

MY_VAR=`python -c ''import sys; print int(sys.version_info >= (2,5))''`

pero eso no funciona en un Makefile.

¿Alguna sugerencia? Podría utilizar cualquier otra solución sensata para lograr esto.


Envolver la tarea en una eval está funcionando para mí.

set_opts: $(eval DOCKER_OPTS = -v $(shell mktemp -d -p /scratch):/output) @true

Nota: El @true aquí evita que Make piense que no hay nothing to be done .


Este es un ejemplo un poco más complicado con tuberías y asignación de variables dentro de la receta:

getpodname: # Getting pod name @eval $$(minikube docker-env) ;/ $(eval PODNAME=$(shell sh -c "kubectl get pods | grep profile-posts-api | grep Running" | awk ''{print $$1}'')) echo $(PODNAME)


Estoy escribiendo una respuesta para aumentar la visibilidad de la sintaxis real que resuelve el problema. Desafortunadamente, lo que alguien podría ver como trivial puede convertirse en un dolor de cabeza muy importante para alguien que busca una respuesta simple a una pregunta razonable.

Coloque lo siguiente en el archivo "Makefile".

MY_VAR := $(shell python -c ''import sys; print int(sys.version_info >= (2,5))'') all: @echo MY_VAR IS $(MY_VAR)

El comportamiento que le gustaría ver es el siguiente (suponiendo que tiene python reciente instalado).

make MY_VAR IS 1

Si copia y pega el texto anterior en el Makefile, ¿lo obtendrá? Probablemente no. Probablemente recibirá un error como el que se informa aquí:

archivo MAKE: 4: *** separador faltante. Detener

Por qué: Porque aunque utilicé personalmente una pestaña auténtica, (que intenta ser útil) convierte mi pestaña en varios espacios. Usted, ciudadano de Internet frustrado, ahora copie esto, pensando que ahora tiene el mismo texto que yo usé. El comando make, ahora lee los espacios y encuentra que el comando "all" está incorrectamente formateado. Así que copie el texto anterior, péguelo y luego convierta el espacio en blanco antes de "@echo" a una pestaña, y este ejemplo debería, por fin, funcionar para usted.


Utilice el comando Make shell MY_VAR=$(shell echo whatever) in en MY_VAR=$(shell echo whatever)

me@Zack:~$make MY_VAR IS whatever me@Zack:~$ cat Makefile MY_VAR := $(shell echo whatever) all: @echo MY_VAR IS $(MY_VAR)