2012-05-15 10 views
5

Cel: gdy użytkownik wpisze "make paczki", automatycznie wyszuka pakiet libx11-dev (wymagany do kompilacji mojego programu) i, jeśli go nie znajdzie, zainstaluje. Oto okrojoną wersję moim makefile:Automatyczne instalowanie pakietów z pliku makefile

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

[other definitions and targets] 

packages: $(PACKAGES) 

Po wpisaniu „make pakiety”, jestem poproszony o hasło super-użytkownika. Jeśli wprowadzone poprawnie, to zawiesza się na czas nieokreślony.

Czy to, co próbuję zrobić, nawet możliwe z pliku Makefile? Jeśli tak to jak?

Dziękuję bardzo.

Odpowiedz

6

Problem polega na tym, że funkcja shell działa podobnie do zwrotnych w powłoce: pobiera wyjście na standardowe wyjście i zwraca je jako wartość funkcji. A więc apt-get nie zwisa, czeka na odpowiedź na jakieś pytanie. Ale nie widzisz pytania, ponieważ make ma wyjście.

Sposób, w jaki to robisz, nie zadziała. Dlaczego używasz shell zamiast po prostu pisać z reguły?

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

Widzę tutaj szablon; wyciągnij libx11-dev i popracuj nad listą pakietów? –

+0

@MadScientist Dziękuję bardzo! Działa to, z wyjątkiem tego, że jeśli pakiet jest już zainstalowany, pojawia się błąd: "/ bin/sh: 1: [: ii: nieoczekiwany operator" co jest prawdopodobnie związane z faktem, że wynik polecenia dpkg -l | grep libx11-dev to "ii libx11-dev 2: 1.4.99.1-0ubuntu2" –

+0

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

3

zorientowali się lepszy sposób, który pozwala uniknąć problemu konieczności nieoczekiwanych argumenty do if:

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

Flaga -c na grep sprawia, że ​​zwraca liczbę wierszy w dpkg - l, które zawierają łańcuch libx11-dEV, które będą albo 0 (jeśli odinstalowane) lub 1 (jeśli jest zainstalowany), umożliwiając

dpkg -l | grep libx11-dev -c 

być traktowany jak zwykły zmiennej logicznej.

Powiązane problemy