2014-01-23 20 views
0

다음 코드와 같이 run.mk이라는 간단한 makefile을 작성하고 있습니다. makefile의 while 루프 내에서 변수의 값을 변경하는 방법은 무엇입니까?

a = 0 
b := $(shell echo `expr $(a) + 1`) 

app: main.o 
    gcc -o app main.o 
main.o: main.c 
    gcc -c main.c 
test: 
    while [ $(a) -lt 10 ];\ 
    do\ 
     echo $(a);\ 
     a:= $(shell echo `expr $(a) + 1`);\ 
     echo $(a);\ 
    done 

내가 명령 을 사용하여이 메이크 파일을 실행

은 -f run.mk 테스트을, 오류가 온다 : 발견 루프가 에 업데이트되지 않습니다 무한히 변수 A의 예 값을 실행하지 : = $ (셸 반향 expr $(a) + 1) while 루프 내에. 그러나 변수 b의 값은 처음에 동일한 코드 줄 $ (쉘 에코 expr $(a) + 1)을 통해 1로 설정됩니다. 누군가가 루프 내에서 변수 a의 값을 업데이트하는 방법을 알려주십시오.

감사합니다.

+0

4.0을 다음 $$이 쉘 스크립트에서 메이크업에 의해 확장되는 변수 및 결과를 탈출

test: a=$(a); \ while [ $$a -lt 10 ];\ do\ echo $$a;\ a='expr $$a + 1';\ echo $$a;\ done 

는 쉘에 의해 실행되는 . –

답변

4

구문 및 셸 구문이 make입니다. 레서피에있는 명령은 쉘에 의해 실행됩니다 (make가 한 번 확장하면). 쉘은 별도의 프로세스이고 쉘에서 발생하는 모든 것은 완전히 보이지 않습니다. 모든 make는 오류가 있는지 여부를 알 수있는 종료 코드를 보게됩니다. 쉘이 어떤 식 으로든 make의 동작을 수정할 수 없습니다 (변수 값 변경 등)

그래서 어떤 make가 먼저 test의 레시피를 확장합니까? (그런데, 이것은 a 그 확장은 분명히 그 의지가 실행하는 쉘에 텍스트를 전송 완료하고, 이후

while [ 0 -lt 10 ]; \ 
do \ 
    echo 0; \ 
    a:= 1; \ 
    echo 0;\ 
done 

: test 실제 프로그램이 시스템에 이미 사실이기 때문에 대상), 매우 나쁜 이름은이 결과를 얻기 위해 영원히 계속 실행하십시오 (물론, a:= 1은 유효한 쉘 명령이 아닙니다).

당신이 시도한 내용 만 말했기 때문에 실제로 처음에 무엇을하고 싶었는지 알려주지 않았기 때문에 원하는 것을 할 수 없습니다.

당신이하고 싶은 일은 값을 인쇄하는 것을 10 배 반복하는 요리법을 쓰는 것입니다. 셸 구문을 사용하고 구문을 만들어서는 안됩니다. 이 같은 복잡한 작업을 수행 할 계략을 사용할 수있는 GNU와

a=0; \ 
while [ $a -lt 10 ];\ 
do\ 
    echo $a;\ 
    a=`expr $a + 1`;\ 
    echo $a;\ 
done 
1

셸 스크립트 변수를 혼합하고 변수를 만듭니다.

test의 제조법은 쉘 스크립트입니다 (while에서 done까지). $(a)과 같은 make 변수는 실행되기 전에 확장되므로 while 행은 항상 while [ 0 -lt 10 ]이며 항상 참입니다.
a:=... 지정은 쉘 구문이 아닌 makefile 구문이므로 작동하지 않습니다. 작동 했더라도 while 행에 영향을 미치지 않습니다.

관련 문제