GNU는 많은 대상 디렉토리로 만듭니다
-
06-09-2019 - |
문제
기존의 많은 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
매뉴얼, 규칙 검색은 다음과 같이 작동합니다.
- t는 d라고 불리는 디렉토리 부분으로 분할되고 나머지는 n이라고합니다. 예를 들어, t 인 경우
src/foo.o', then d is
src/'및 n은`foo.o'입니다.- 대상이 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
하위 디렉토리를 다루는 표준 방법이지만 "재귀적인 것으로 간주되는 재귀"기사에 언급 된 의미를 조심해야합니다.