2012-05-15 1 views
5

목표 : 사용자가 'make packages'를 입력하면 자동으로 libx11-dev 패키지를 검색하고 (컴파일 할 때 필요) 찾아 내지 않으면 설치하십시오. 내 메이크 파일의 줄여서 내려간 버전이 있습니다 :makefile 내부에서 패키지 자동 설치

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

[other definitions and targets] 

packages: $(PACKAGES) 

'make packages'를 입력하면 수퍼 유저 암호를 입력하라는 메시지가 나타납니다. 올바르게 입력하면 무기한 정지됩니다.

메이크 파일 내에서 가능한 작업을 수행하려고합니까? 그렇다면 어떻게?

고마워요.

답변

6

문제는 shell 함수가 쉘에서 역 따옴표처럼 작동한다는 것입니다. 출력을 stdout으로 가져 와서 함수의 값으로 반환합니다. 그래서, apt-get은 매달 리지 않고, 어떤 질문에 대한 응답을 기다리고 있습니다. 그러나 make가 결과를 얻었으므로이 질문을 볼 수 없습니다.

당신이하는 방식은 효과가 없습니다. 일반적으로 그냥 쓰는 대신 shell을 사용하는 이유는 무엇입니까?

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

여기 템플릿을 참조하십시오. libx11-dev를 꺼내서 패키지 목록에서 사용할 수 있습니까? –

+0

@MadScientist 대단히 감사합니다! 이 작업은 패키지가 이미 설치되어있는 경우 다음과 같은 오류가 발생합니다 : "/ bin/sh : 1 : [: ii : 예기치 않은 연산자" 아마도 dpkg -l 명령의 출력 | grep libx11-dev는 입니다. "ii libx11-dev 2 : 1.4.99.1-0ubuntu2" –

+0

따옴표를 추가하십시오 :'[-z "\'dpkg -l | grep libx11-dev \'"]' – MadScientist

3

은 내가 if 문에 예기치 않은 인수를 갖는 문제를 피하는 좋은 방법, 알아 낸 : 그렙에

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

-c 플래그는이 때 dpkg에서 라인의 수를 반환한다을 -

dpkg -l | grep libx11-dev -c 

가 통상 부울 변수처럼 취급 할 수 있도록 설치되어있는 경우에는 (제거 된 경우) 중 0 것이다 libx11 데브 문자열 또는 1 리터를 포함.