문제

기존의 많은 HTML 파일의 생성을 통합해야합니다. Makefile. 문제는 HTML 파일이 다양한 디렉토리에 상주해야한다는 것입니다. 내 아이디어는 소스 파일 (*.st)을 해당 HTML 파일로 변환하는 암시 적 규칙을 작성하는 것입니다.

%.html: %.st
    $(HPC) -o $@ $<

모든 HTML 파일에 의존하는 규칙

all: $(html)

HTML 파일이 BuildDir에없는 경우 make 암시 적 규칙을 찾지 못합니다. *** No rule to make target. 내가 암시 적 규칙을 바꾸면 그렇게

$(rootdir)/build/doc/2009/06/01/%.html: %.st  
    $(HPC) -o $@ $<

발견되었지만 프로젝트의 거의 모든 파일에 대한 암시 적 규칙이 있어야합니다. 에 따르면 암시 적 규칙 검색 알고리즘 GNU에서 make 매뉴얼, 규칙 검색은 다음과 같이 작동합니다.

  1. t는 d라고 불리는 디렉토리 부분으로 분할되고 나머지는 n이라고합니다. 예를 들어, t 인 경우 src/foo.o', then d issrc/'및 n은`foo.o'입니다.
  2. 대상이 T 또는 N과 일치하는 모든 패턴 규칙의 목록을 작성하십시오. 대상 패턴에 슬래시가 포함되어 있으면 t와 일치합니다. 그렇지 않으면, n에 대하여.

GNU를 가정 할 때 암시 적 규칙이 발견되지 않으며 가장 우아한 솔루션이 될 수있는 이유는 무엇입니까? make 사용?

여기에 내 버전이 있습니다 Makefile:

rootdir  = /home/user/project/doc
HPC      = /usr/local/bin/hpc

html = $(rootdir)/build/doc/2009/06/01/some.html

%.html: %.st
    $(HPC) -o $@ $<

#This works, but requires a rule for every output dir
#$(rootdir)/build/doc/2009/06/01/%.html: %.st  
#   $(HPC) -o $@ $<

.PHONY: all
all: $(html)
도움이 되었습니까?

해결책

Maria Shalnova와 마찬가지로 나는 재귀 적 만들기를 좋아하지만 (나는 "재귀를 해로운 것으로 여겨지는"것에 동의하지 않지만) 일반적으로 그곳에서 소스에서 무언가를 만드는 것이 더 낫습니다. 그러나 당신이해야한다면, 나는 약간의 개선을 제안합니다.

다른 팁

지금까지 찾은 가장 좋은 솔루션은 대상 디렉토리 당 암시 적 규칙을 생성하는 것입니다. eval-call 용,에 설명 된 바와 같이 암소 비슷한 일종의 영양 make 수동. 나는 이것이 어떻게 수천 개의 대상 디렉토리로 확장되는지 전혀 모른다. 그러나 우리는 볼 것이다 ...

더 나은 솔루션이 있으면 게시하십시오!

코드는 다음과 같습니다.

rootdir  = /home/user/project/doc
HPC      = /usr/local/bin/hpc

html = $(rootdir)/build/doc/2009/06/01/some.html \
       $(rootdir)/build/doc/2009/06/02/some.html

targetdirs = $(rootdir)/build/doc/2009/06/01 \
             $(rootdir)/build/doc/2009/06/02

define generateHtml
 $(1)/%.html: %.st
    -mkdir -p $(1)
    $(HPC) -o $$@ $$<
endef   

$(foreach targetdir, $(targetdirs), $(eval $(call generateHtml, $(targetdir))))

.PHONY: all
all: $(html)

당신의 능동적 암시 적 규칙이 만듭니다 $(rootdir)/build/doc/2009/06/01/some.html 의지하다 $(rootdir)/build/doc/2009/06/01/some.st. 만약에 $(rootdir)/build/doc/2009/06/01/some.st 존재하지 않으면 규칙이 사용/찾을 수 없습니다.

주석은 규칙이 만들어집니다 $(rootdir)/build/doc/2009/06/01/some.html 의지하다 some.st.

한 가지 해결책은 소스 레이아웃과 대상/결과 레이아웃과 일치하도록하는 것입니다.

또 다른 옵션은 필요에 따라 규칙을 작성하는 것입니다. eval. 그러나 그것은 매우 복잡 할 것입니다 :

define HTML_template
 $(1) : $(basename $(1))
      cp $< $@
endef

$(foreach htmlfile,$(html),$(eval $(call HTML_template,$(htmlfile))))

다른 가능성은 특공대를 갖는 것입니다 make 모든 출력 디렉토리와 함께 인수 -C로 재귀 적으로 호출하십시오. 재귀 make 하위 디렉토리를 다루는 표준 방법이지만 "재귀적인 것으로 간주되는 재귀"기사에 언급 된 의미를 조심해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top