2017-11-17 9 views
0

아래 메이크를 고려 메이크 기능을 쉘 루프 변수 전달하는 방법 : make가 생성 된 다음 결과를 실행어떻게

CFG_DIR = /media/test/ 
all: 
    for list in $(CFG_DIR); do \ 
     echo "list is $$list"; \ 
     for file in $(shell ls $${list}); do \ 
     echo "file is $$file"; \ 
     done \ 
    done 

:

list is /media/test/ 
file is Makefile 

대신의 디렉토리 목록을 인쇄/media/test/디렉토리에서 make 명령이 실행되는 현재 디렉토리의 디렉토리 목록이 인쇄됩니다.

쉘 함수 $$ 목록 내에서 빈 값으로 평가되고있는 것 같습니다. 쉘 함수 내에서 루프 변수를 액세스하는 올바른 방법을 지적 할 수 있다면 도움이 될 것입니다.

+0

이 [이전에 몇 시간의 질문]과 동일한 것으로 보인다을 (https://stackoverflow.com/questions/47352145/ 중첩 된 for-loop-not-working-in-makefile). – Beta

답변

0

make 함수에서 쉘 변수를 사용할 수 없습니다.

make가 작동하는 방식을 고려하십시오. 레서피 명령을 실행할 때 먼저 명령의 모든 make 변수와 함수를 확장 한 다음 결과 문자열을 가져 와서 쉘에 전달하여 실행합니다. 쉘을 종료하십시오. 쉘이 성공 코드 (0)로 끝나면 make는 "yay it worked!"라고 말합니다. 쉘이 실패 코드 (0이 아닌)로 종료되면 make는 "실패했습니다."라고 말합니다.

for list in $(CFG_DIR); do \ 
    echo "list is $$list"; \ 
    for file in $(shell ls $${list}); do \ 
    echo "file is $$file"; \ 
    done \ 
done 

그래서, FIRST make가 모든 변수와 함수를 포함하여이 확장됩니다 :

여기 레시피입니다. $(CFG_DIR) 변수와 $(shell...) 함수가 있습니다. 변수는 간단히 /media/test/입니다. make가 함수를 확장 할 때 쉘에 전달할 명령이 ls ${list}이라고 봅니다. 그래서 실행합니다

/bin/sh -c 'ls ${list}' 

글쎄, 당신은 쉘이 ls을 실행하고 현재 디렉토리의 모든 내용을 반환 그래서 어딘가에는 빈 문자열,의 사용자 환경에서 쉘 변수 list를 설정하지 않았다면. 그런 다음이를 제조법으로 대체하고 실행 결과를 쉘로 전달하여 실행하십시오.

/bin/sh -c 'for list in /media/test; do 
    echo "list is $list"; 
    for file in <current-wd-files>; do 
    echo "file is $file"; 
    done 
done' 

So. 이야기의 도덕 : 요리법 명령에서 너는 이미 쉘 안에이다. 따라서 을 사용하여 $(shell ...) 메이크 기능을 사용해야합니다. 혼란과 슬픔으로 만 이어질 것입니다.

이미 쉘이 있기 때문에 당신은 쉘 구문을 사용한다 :

all: 
     for list in $(CFG_DIR); do \ 
      echo "list is $$list"; \ 
      for file in `ls $${list}`; do \ 
      echo "file is $$file"; \ 
      done \ 
     done