2012-05-15 17 views
5

Hedef: kullanıcı 'paketleri oluştur' yazdığında, libx11-dev paketini otomatik olarak arar (programımın derlenmesi için gereklidir) ve bulunamadıysa, yükleyin.İç makefile içindeki paketleri otomatik olarak yükle

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

[other definitions and targets] 

packages: $(PACKAGES) 

I tipi 'paketleri yapmak', ben süper kullanıcı parola sorulur ediyorum: İşte benim makefile'daki sadeleştirilmiş versiyonu. Doğru girilirse, süresiz olarak askıda kalıyor.

Makefile içinde mümkün olanı yapmaya çalıştığım şey mi? Öyleyse nasıl?

Çok teşekkürler.

cevap

6

Sorun, shell işlevinin, kabuktaki backtick'ler gibi davranmasıdır: çıktıyı stdout'a alır ve işlevin değeri olarak döndürür. Yani, apt-get asılı değil, bazı sorulara cevap girmenizi bekliyor. Ama soruyu göremezsiniz çünkü çıktı çıktıyı almıştır.

Bunu yapmanın yolu işe yaramayacak. Bir kural olarak yazmak yerine neden shell kullanıyorsunuz?

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

Burada bir şablon görüyorum; libx11-dev'i dışarı çekin ve bir paketler listesinde çalışmasını sağlayın. –

+0

@MadScientist Çok teşekkürler! Bu, paketin zaten yüklü olması durumunda, aşağıdaki hata iletisini alır: "/ bin/sh: 1: [: ii: beklenmedik operatör" . Bu, muhtemelen dpkg -l komutunun çıktısı ile ilişkilidir. | grep libx11-dev "ii libx11-dev 2: 1.4.99.1-0ubuntu2" –

+0

Tırnak işaretleri ekle: '[-z" \ dpkg -l | grep libx11-dev \ '"] ' – MadScientist

3

Ben eğer açıklamaya beklenmedik argümanlar olması problemini önler daha iyi bir yol, anladım: grep üzerine

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

-c bayrağı o dpkg satırların sayısını döndürmek yapar -

dpkg -l | grep libx11-dev -c 

sıradan boolean değişkeni gibi tedavi sağlayan (eğer varsa) (kaldırıldığında ise) ya da 0 olur libX11-dev dize veya 1 içeren l,.