2010-05-21 4 views
3

기존 Makefile을 최적화하려고합니다. logfilename을 인수로 취하는 모든 플롯에 대해 scriptfile을 사용하여 주어진 디렉토리의 모든 로그 파일에 대해 여러 개의 플롯 (Octave 사용)을 만드는 데 사용됩니다. 필자는 사용 가능한 모든 종류의 플롯에 대해 하나의 규칙을 사용하고 Octave에 직접 작성한 호출을 통해 특정 scriptfile/logfile을 인수로 사용합니다.make : 여러 파일의 여러 대상에 대해 명령을 호출 하시겠습니까?

모든 음모에 "his"옥타브 스크립트 (물론 로그 파일 포함)가있는 경우 스크립트가 변경되면 하나의 음모가 재생성됩니다.

그만큼 입력하고 싶지 않으므로 "a"줄을 만드는 데 하나의 일반적인 규칙 만 사용하면 어떻게 단순화 할 수 있을지 궁금합니다.

  • 로그 파일 : "$ (LOGNAME) .LOG"
  • Scriptfile :

    는 명확하게하려면 "플롯 $ (PLOTNAME)하는 .m"가 "생성 $ (LOGNAME) _ $ (PLOTNAME)

    %1_%2.png: %1.log 
        $(OCTAVE) --eval "plot$<2('$<1')" 
    

    하지만이 허용되지 않는 것 같다 "

처음 내가 생각했던 일을 .png를. 누군가 나에게 힌트를 줄 수 있을까요?

답변

5

make가 직접적으로 이것을 지원하지 않는다는 것은 꽤 미친 짓이며, 나는 항상 그것을 필요로합니다.

define OCT_template 

all: %_$(1).png 

%_$(1).png: %.log 
    $$(OCTAVE) --eval "plot$(1)('$$*')" 

endef 

PLOT_NAMES = plot1 plot2 plot3 

$(foreach p, $(PLOT_NAMES), \ 
    $(eval $(call OCT_template,$(p))) \ 
) 

in the GNU make documentation입니다 :

나는 순간에 사용하는 기술 (디디에 Trosset의 예에 건물) (GNU로 만들).

+0

오, 고마워요! 매우 도움이됩니다. 매력처럼 작동합니다 - Makefile을 더 작지만 더 복잡하게 만들기 위해) – marvin2k

+0

이것은 매우 유용했습니다. 한 가지주의해야 할 점은 OCT_template을 정의한 후에'= '가 없으면 ** 중요합니다 **입니다. make 매뉴얼은 =가 필요하다는 것을 나타내는 것처럼 보이지만 그 존재로 인해 호출이 어떤 것으로 확장되지 않습니다. 감사. –

+0

@ Christopher Mason : 온라인에서 가장 쉽게 찾을 수있는 make 매뉴얼은 3.82이며 대부분의 사람들은 make가 3.81입니다. 나는 이것이 불일치 중 하나라고 생각한다. – reinierpost

3

패턴 규칙은 패턴 1 개만 사용할 수 있습니다. 즉, %1%2은 단지 % 일 수 없습니다.

따라서 PLOTNAMELOGNAME의 수에 따라 필요에 따라 가장 작은 패턴 규칙을 선택하고 작성하십시오.

%_plot1.png: %.log 
     $(OCTAVE) --eval "plot1('$*')" 

다른 플롯 (또는 로그)이있는 것처럼 많은 규칙을 쓰지 않으려면 두 개의 Makefile 메커니즘을 사용할 수 있습니다. 하위 Makefile에서는 위의 명령을 사용하지만 플롯 이름에는 매개 변수를 사용하십시오. 마스터 Makefile에서 원하는 플롯 이름의 다양한 값으로 호출하십시오.

Makefile.sub :

%_$(PLOTNAME).png: %.log 
     $(OCTAVE) --eval "plot$(PLOTNAME)('$*')" 

메이크 :

all: 
     $(MAKE) PLOTNAME=plot1 -f Makefile.sub 
     $(MAKE) PLOTNAME=plot2 -f Makefile.sub 
     $(MAKE) PLOTNAME=plot3 -f Makefile.sub 

그것은 다음 규칙에 많은 시간을 쓰고 저장합니다 (필요할 때 그것을 여러 번 업데이트 저장합니다), 그러나 다른 특수 처리가 필요합니다 목표는 보다 크며, 예를 들어 clean입니다.

+0

흠 나는 비교적 복잡한 것처럼 보였고 내가 찾던 아싱과는 달랐다. 그러나 나는 시험해 보았다. 그래서 그것은 감사한다. 어떻게해서든지! – marvin2k

+0

이것은 패턴 규칙을 사용하여 재귀 의존성 검색을 수행하는 방법으로는 훨씬 명확합니다.나는 spec plot target을위한 패턴을 사용할 것이다 : 'all : plot1 plot2 plot3' 그리고 나서'plot % : \ n \ t $ (MAKE) PLOTNAME = plot $ * -f Makefile.sub' –

관련 문제