2012-05-15 10 views
5

Objetivo: cuando el usuario escribe 'make packages', busca automáticamente el paquete libx11-dev (requerido para que mi programa lo compile) y, si no lo encuentra, instálelo. He aquí una versión reducida de mi makefile:Instale paquetes automáticamente desde dentro del archivo MAKE

PACKAGES = $(shell if [ -z $(dpkg -l | grep libx11-dev) ]; then sudo apt-get install libx11-dev; fi) 

[other definitions and targets] 

packages: $(PACKAGES) 

Cuando escribo '' hacer paquetes, estoy pedirá la contraseña de superusuario. Si se ingresa correctamente, se cuelga indefinidamente.

¿Es lo que intento hacer incluso desde dentro del archivo MAKE? ¿Si es así, cómo?

Muchas gracias.

Respuesta

6

El problema es que la función shell actúa como backticks en el shell: lleva la salida a stdout y la devuelve como el valor de la función. Entonces, apt-get no se cuelga, está esperando que ingrese una respuesta a alguna pregunta. Pero no puede ver la pregunta porque make ha tomado la salida.

La forma en que haces esto no va a funcionar. ¿Por qué está usando shell en lugar de simplemente escribirlo como una regla?

packages: 
     [ -z `dpkg -l | grep libx11-dev` ] && sudo apt-get install libx11-dev 
.PHONY: packages 
+0

Veo una plantilla aquí; sacar libx11-dev y hacer que funcione en una lista de paquetes? –

+0

@MadScientist ¡Muchas gracias! Esto funciona, excepto que si el paquete ya está instalado, obtengo el error: "/ bin/sh: 1: [: ii: operador inesperado" que se relaciona presumiblemente con el hecho de que la salida del comando dpkg -l | grep libx11-dev es "ii libx11-dev 2: 1.4.99.1-0ubuntu2" –

+0

Agregar comillas: '[-z" \ 'dpkg -l | grep libx11-dev \' "]' – MadScientist

3

me di cuenta de una mejor manera, lo que evita el problema de tener argumentos inesperados a la sentencia if:

if ! dpkg -l | grep libx11-dev -c >>/dev/null; then sudo apt-get install libx11-dev; fi 

La bandera -c en grep hace devuelven el número de líneas en dpkg - l que contiene la cadena libx11-dev, que, o bien ser 0 (si desinstalado) o 1 (si está instalada), permitiendo

dpkg -l | grep libx11-dev -c 

ser tratado como una variable booleana ordinario.

Cuestiones relacionadas