2013-07-24 1 views
0

여기 내 Makefile의 두 대상이 있습니다. Makefile의 경로 종속성

.SECONDARY: 
exp-%.ans: 
    echo $* > eval/[email protected] 

%.scores: %.ans 
    cat eval/$< > eval/[email protected] 

내가 make -n exp-40.scores 출력이 될 것이다 쓰기

: 한 가지를 제외하고 좋은

echo 40 > eval/exp-40.ans 
cat eval/exp-40.ans > eval/exp-40.scores 

. 종속성이 이미 보유되었음을 인식하지 못합니다. eval/exp-40.scores (처음으로)를 만들면 동일한 명령을 실행하면 make가 이미 거기에 있다고 말할 것입니다. 그래서 이렇게 내 Makefile을 변경하려고 :

.SECONDARY: 
exp-%.ans: 
    echo $* > eval/[email protected] 

%.scores: eval/%.ans 
    cat eval/$< > [email protected] 

내가 다시 make -n exp-40.scores를 작성하고 출력 될 때 : 완전히 잘못

echo eval/40 > eval/eval/exp-40.ans 
cat eval/eval/exp-40.ans > exp-40.scores 

을 내 매개 변수를 평가하지 40분의 40해야하기 때문이다.

나는 어떻게이 두 세계에서 최고의 것을 얻을 수 있습니까? 즉, eval/폴더에 * .scores를 만들고 싶습니다. 나는 또한 파일이 이미 존재하는지 여부를 확인하기 위해 make를 원한다. 그런 다음 make는 해당 파일의 존재에 따라 진행해야합니다.

감사합니다.

답변

2

make의 핵심 규칙 중 하나는 빌드 할 규칙에 대해 말한 대상을 작성해야한다는 것입니다. foo : bar과 같은 규칙은 제조법에서 해당 제조법을 실행하면 foo이라는 파일을 만들거나 업데이트한다는 것을 알려줍니다. 레서피가 biz/foo 파일을 생성하거나 업데이트하는 경우 메이크 파일이 잘못되어 작동하지 않습니다.

Make는 항상 자동 변수 [email protected]에 작성하기를 기대하는 대상을 넣습니다. 귀하의 요리법은 [email protected]과 정확히 [email protected]을 생성하거나 업데이트해야합니다. 다른 게 아니야.

당신이 make exp-40.scores을 실행할 수 있도록 원하는 실제로 eval/exp-40.scores을 만들 경우
eval/exp-%.ans: 
     echo $* > [email protected] 

eval/%.scores: eval/%.ans 
     cat $< > [email protected] 

, 다음과 같은 규칙을 추가 할 수 있습니다 :

%.scores: eval/%.scores ; @: 
귀하의 경우 그래서

, 당신은 쓸 필요가

(패턴 규칙에 대한 일종의 조리법을 제공해야하며, 빈 조리법을 가질 수 없으며 위의 방법은 아무 것도하지 않습니다.)

+0

처음에 답변과 설명을 해주셔서 감사합니다. Makefile의 특성을 담은 튜토리얼이 필요합니다. 이것에 대해 아는 것이 있습니까? 웹에 짧은 튜토리얼이 많이 있는데, 그 목적에는 빠르고 더러운 일을하기위한 팁과 트릭이 있습니다. 나는 (그리고 나는 확실하지 않다) make의 문서화는 좋지 않고 많은 버그가있다. Make (http://shop.oreilly.com/product/9780596006105.do)에 대한 O'Reilly의 책이 있지만 등급은 평균입니다. – Thorn

+0

실례지만, 두 가지 더 묻고 싶습니다. (1) .SECONDARY를 제거하면, make는이 경우에 매우 중요한 내 중간 파일을 삭제합니다. .SECONDARY, .INTERMEDIATE 및 .PRECIOUS에 대한 섹션을 읽었으나 어느 것이이 경우에 적합한 지 이해하지 못합니다. (2) 그리고 .SECONDARY는 그 아래 모든 목표에 영향을 미칩니 까? – Thorn

+2

GNU 매뉴얼이 나쁘지는 않다. 나는 그 안에 어떤 버그도 모르고있다. _ 그러나, GNU 웹 사이트의 매뉴얼 버전은 GNU make의 최신 안정 버전을 설명합니다. 이전 버전을 사용하는 경우 설명서의 일부 문구가 해당 버전에 적합하지 않습니다.혼란을 피하기 위해 사용하고있는 GNU 버전과 같은 버전의 매뉴얼을 읽어야합니다. 이 매뉴얼은 GNU make와 함께 패키지되어 있으므로, 패키지를 만들 때와 같은 위치에서 해당 버전의 올바른 문서를 얻을 수 있어야합니다. – MadScientist