2014-02-13 4 views
13

제목과 마찬가지로 특정 파일이 존재하지 않는 경우에만 종속성을 만들고 싶습니다.Makefile - 파일이 존재하지 않는 경우에만 종속성 만들기

나는 루트 디렉토리 (makefile이있는 디렉토리)와 "example"이라는 서브 디렉토리를 가지고있다. 내 루트 디렉토리에 4 개의 .h 파일 (functions.h, parser.h, node.h 및 exception.h)이 있습니다.이 파일들이 이미 존재하지 않으면 "example"하위 디렉토리에 복사하고 싶습니다. "예제"에서.

유감스럽게도 "example"의 헤더 파일을 루트에서 "example"으로 복사 할 때마다 "example"의 헤더 파일이 업데이트로 간주되므로 "example"의 헤더 파일을 확인하기 위해 표준 종속성을 설정할 수는 없습니다. make를 실행할 때마다 그 의존성을 트리거 할 것입니다. 나는 makefile이 "example"에 존재하지 않는 경우에만 루트 디렉토리의 "example"에 헤더 파일을 복사하는 방법을 원합니다.

+0

수동 (예 :'$의 @'등의) 자동 변수 래서 내에서 유효 _only_ 것을 매우 분명하다. 목표, 전제 조건 또는 make 조건문을 사용할 수 없습니다 (makefile이 읽혀지는 동안 확장되므로). 이 경우'$ @'는 빈 문자열로 확장됩니다. – MadScientist

+0

나는 본다. 그러나 "example /"을 추가하기 때문에 ifeq()가 여전히 false로 평가할 수있는 것이있다. 그 문제를 해결해 주셔서 감사합니다. 나머지 게시물에 초점을 맞추기 위해 내 게시물을 수정했습니다. – Daniel

답변

21

이입니다 order-only prerequisites/dependencies을 위해 무엇을 : 당신이 그 중 하나가 업데이트 될 대상을 시작하지 않고 호출 할 규칙의 특정 순서를 부과하려는 때때로

, 그러나, 당신은 상황을 규칙이 실행됩니다. 이 경우 주문 전용 전제 조건을 정의하려고합니다. 선행 조건 목록에 파이프 기호 (|)를 배치하여 주문 전용 선행 조건을 지정할 수 있습니다. 파이프 기호 왼쪽의 전제 조건은 정상입니다. 오른쪽의 전제 조건은 주문 전용입니다. 귀하의 경우에는

:

examples/%.h : | %.h 
    cp $| [email protected] 

은 참조 : Order-only prerequisites do not show up in $^ or $+.

+1

GNU make를 사용하고 있다면 (아마도 존재할 것입니다.) 좋은 대답입니다. – reinierpost

+0

@reinierpost 다른 make를 사용하는 이유가 확실하지 않습니다. –

+0

@reinierpost 당신이 바로 편집 할 수 있습니다. –

3

상대 파일 보존 기간에 대한 종속성을 표현해야합니다. 또한 example/foo.h.hasbeencopied에 따라 example/foo.h에 따라 어떤 원칙으로

examples/%.h.hasbeencopied: %.h 
    if [ -f example/[email protected] ] || cp -p $< examples/[email protected]; \ 
    then touch [email protected]; \ 
    else rm -f [email protected]; \ 
    fi 

과 :

일반적으로 사용되는 해결 방법은 더미를 사용하는 플래그 작업의 완료를 ("감시") 파일입니다.

관련 문제