2010-07-18 2 views
15

나는makefile에 대상 디렉토리가있을 수 있습니까?

yank/gist.el/gist.el : yank 
    cd yank ; git clone http://github.com/defunkt/gist.el.git 

yank: 
    mkdir yank 

내가 makepp을 사용하고 있습니다. "디렉토리 십중팔구는/다음 존재하지 않는 경우 디렉토리 십중팔구는 /이 존재하는 경우 자식 저장소의 다운로드에만 작동합니다"라고하는 것을 시도하고있다 - http://makepp.sf.net 을 오류가 나타납니다 :

[[email protected] ~/edan/pkg/gist.el] makepp 
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile' 
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el' 
mkdir yank 
mkdir: cannot create directory `yank': File exists 
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1] 
makepp: 0 files updated, 0 phony targets built and 1 target failed 
[[email protected] ~/edan/pkg/gist.el] 

그러나 왜 yank 디렉토리가 존재한다면 어떻게 만들려고합니까? "소스"는 이미 생성되었습니다 ...

+0

이미 디렉토리 생성에 대한 토론이있었습니다. http://stackoverflow.com/questions/1950926/create-directories-using-make-file. [디렉토리를 만드는 방법은 스레드로부터 안전하지 않습니다.] (http://stackoverflow.com/questions/1894427/makefile-with-directory-tree-creation-suitable-for-parallel-j- 짓다). –

+0

@Pavel : 디렉토리의 작성 방법은 파일의 종속성 때문에 잘됩니다. 당신이 인용 한 예제에서, 문제는 디렉토리가 그것을 사용하는 대상의 종속성이 아니라 다른 대상의 의존성이 아니라는 점입니다. – Gilles

+0

@ Gilles, 네, 맞아. 문제가 섞여있어. 그냥 목표로 디렉토리가 좋은 옵션이 아니라는 것을 당신에게 설득하고 싶었던 것입니다 ... –

답변

16

예, Makefile은 대상으로 디렉토리를 가질 수 있습니다.

귀하의 문제는 cd 당신이 원하는 것을하지 않는 것을 수 : 그것은 cd을 수행하고 git clone 원래 디렉토리 (한 당신의 cd 에드, 하지 한 당신에게 cd 에디션에)에서 수행된다 . Makefile의 모든 명령에 대해 추가 셸이 만들어지기 때문입니다. 해결 방법은 cd을 실행하고 쉘의 &&을 사용하여 하나의 명령으로 복제하는 것입니다.

이 작동합니다 :

bla/f: dir 
    cd dir && touch f 

dir: 
    mkdir dir 
+1

진실하고 일반적인 원칙에 따라 makefile은';'보다는 항상'&&'이어야합니다. 그러나 이것은 여기서 문제가 될 수 없습니다.'cd'는'yank' 타겟이 다시 제작 된 후에 * 실행됩니다. – Gilles

+6

나는 보통'dir' 대신에'dir/.dirstamp'의 타겟을'mkdir -p dir && touch $ @'의 규칙으로 사용합니다. UNIX의 dir에 대한 타임 스탬프는 디렉토리의 내용이 변경되어 종속 규칙이 실행되는 것을 방지합니다. –

1

귀하의 메이크 당신이 무엇을 기대해야한다. yank는 종속성이 없으므로 존재하지 않으면 다시 작성되지 않습니다. 그래서 이것은 makepp의 버그처럼 보입니다. make의 전통적인 구현으로 makefile을 시험해 봄으로써 이것을 확인할 수있다.

+0

노력했지만 재현되지 않았습니다. –

관련 문제