2012-06-06 2 views
0

나는 실행될 때 다음을 수행 메이크 파일을 작성하려고 해요 : 2775 실종 피연산자 : 메이크 파일을 실행하면chmod 명령이 DIR의 내용을 디렉토리로 인식하지 않는 이유는 무엇입니까?

CMVC_VIEW = ../../.. 
TB_DIR = $(CMVC_VIEW)/tarball_images 
SMAC_TOOLS = $(TB_DIR)/smac_tools 
SMAC_BIN = $(SMAC_TOOLS)/bin 
DIR_LIST = $(TB_DIR) \ 
    $(SMAC_TOOLS) \ 
    $(SMAC_BIN) 

install: 
    rm -f *.o 
    for DIR in $(DIR_LIST); do \ 
     echo $${DIR}; \ 
     chmod 2775 $${DIR}; \ 
    done 

그러나, 나는 그 chmod를 말하는 오류가 발생합니다. $${DIR}에 액세스 권한이 변경 될 필요가있는 디렉토리에 해당하는 경로가 포함되어야하는 이유를 이해할 수 없습니다.

이것은 $${DIR}을 고정 디렉토리 경로로 바꿀 때 작동하는 것 같습니다.

이 메이크 파일의 목적 상, DIR_LIST 매크로가 공백으로 구분 된 디렉토리 목록에 할당된다고 가정하십시오.

+2

'$ (DIR_LIST)'에는 무엇이 들어 있습니까? 'chmod' 문 바로 앞의'echo' 문은 무엇을 표시합니까? – larsks

+0

이것은 공백으로 구분 된 디렉토리 목록 일뿐입니다. 예를 들면 다음과 같습니다./tmp/justin1/tmp/justin2/tmp/justin3 – Justin

+1

그게 내 질문 이었어. 'DIR_LIST'를 설정하는 실제 줄을 보여줄 수 있습니까? 이 코드를 잘라내어 Makefile에서 그대로 붙여 넣었습니까? 이 코드는 샘플 Makefile에'DIR_LIST'를 설정 한 후 실행할 때 잘 동작하고 예상대로 작동합니다. – larsks

답변

0

변수 참조와 셸 변수 참조를 혼란스럽게합니다. make는 $(FOO)과 같은 문자열을 make 변수에 대한 참조로 해석하고 해당 이름으로 변수를 찾아 값으로 대체합니다. 쉘 기반 for 루프는 변수를 생성하지만 DIR이라고하는 변수는 단지 $(DIR)이므로 make는 DIR이라는 make 변수를 찾으려 고 시도하고 있습니다.

double $은 make가 자체 변수 참조 해상도를 수행하지 못하게하므로 리터럴 $(DIR)이 자체 변수 해상도를 가진 쉘로 전달됩니다. 물론, for 루프가 DIR 변수를 생성했기 때문에 작동합니다.

관련 문제