2012-06-05 2 views
0

나는이 문제가 상당히 흔한 문제라고 생각하지만, 필자의 구체적인 상황에서는 그 답을 찾을 수 없다.Makefile 대상이 만족스럽지 않음

initfs.tar: $(INITFS_FILES) 
    rm -f ./initfs.tar 
    cd initfs_root 
    tar --format ustar --exclude-vcs -cf ../initfs.tar ./ 

INITFS_FILES가 정의 :

INITFS_FILES:=$(shell find ./initfs_root/ -not -path '*/.*/*' -not -name '.*' -type f) 

내가 make initfs.tar 호출 할 때마다,이 대상이 실행될 때 나는 대상과 같이 있습니다. initfs_root 디렉토리에서 파일을 수정하지 않습니다 (그리고 find 명령을 사용하여 모든 파일을 찾습니다). 실제로 initfs.tar가 생성됩니다.

왜 이런 일이 일어나는 지 아는 사람이 있습니까? 나에게, 그리고 인터넷과 현재의 전문성에 관해서 만난 다른 모든 글에 따르면 나는 정확한 것을 가지고있다. (분명히, 나의 전문 기술은 Makefile 영역에서 부족하다.)

+0

'INITFS_FILES' 변수의 내용은 무엇입니까? – sarnold

+0

'INITFS_FILES'리스트에있는 어떤 파일도 나중에 어떻게 든 미친 마지막 수정 시간이 있다고 가정하지 않습니까? –

+0

@sarnold "binary-file test.txt"를 보유하고 있습니다. – Caleb1994

답변

5

make의 모든 명령은 각 명령 행의 새로운 서브 쉘에서 실행됩니다. 이것은 명령이 두 개의 서로 다른 서브 쉘에서 실행된다는 것을 의미합니다 :

따라서 명령은 작업 디렉토리로 initfs_root 디렉토리와 함께 실행되지 않습니다.

당신은 하나의 명령 행에 두 가지를 결합하여이를 방지 할 수 있습니다 : 당신이 tar하려고하는 모든 파일들의 경로 나 이름에 공백이있는 경우 그런데

cd initfs_root; tar --format ustar --exclude-vcs -cf ../initfs.tar ./ 

은주의해야합니다. 그것들은 변수 $INITFS_FILES에 여러 이름으로 나뉘어져 당신의 메커니즘은 깨질 것입니다.

+0

+1. 좋은 장소!. –

+0

@Reinier 그걸 고쳤어! initfs 드라이버의 테스트 단계에 있었기 때문에 initfs_root를 크게 변경하지 않았습니다. 실제로 변경 사항이 없기 때문에 업데이트되지 않은 것을 알지 못했습니다. 또한 필자는 절대적으로 필요하지 않는 한 파일 이름에 공백을 두지 않는 것이 중요하다. (하하는 본질적으로 그렇다.)하지만 그것은 중요한 포인트이다. – Caleb1994

관련 문제