2012-04-05 2 views
4

대상이 X.pdf이고 전제어가 X/X.tex 인 것으로 가정 할 때, makefile 대상의 사전 작업에서 % 기호를 다시 사용하는 방법을 배우고 싶습니다.서브 파일 이름으로 Makefile prerequesite의 퍼센트 기호를 다시 사용하십시오.

all: foo.pdf 

%.pdf: %.tex 
    pdflatex $*.tex 

내가 추가 파일 foo.tex을 가지고, 내가 make를 입력 할 때이 pdflatex foo.tex을 실행하여 foo.pdf를 만들 것입니다 :

내가 현재 메이크과 같이 가지고 정교합니다. 내가 통제 할 수없는 여러 가지 이유로 지금

은 내 디렉토리 구조가 변경되었습니다 :

my_dir 
|- Makefile 
|- foo 
    |- foo.tex 
내가 파일 X/X.tex 것이 X.pdf을하려고 할 때, 그것은 보이는 그런 나의 Makefile을 수정하고 싶습니다

.

나는 시도 (나는 '%/% 텍스.' foo/foo.tex을 찾아 그것을 말할 수 으려고) 다음

all: foo.pdf 

%.pdf: %/%.tex 
    pdflatex $*/$*.tex 

그러나,이 수율 :

No rule to make target `foo.pdf', needed by `all'. Stop. 

그래서 수행을 %.pdf: $*/$*.tex.

내가 변경하는 경우 %/%.texfoo/%.tex에이를 것으로 예상하지만, 미래에 내가 all: foo.pdf bar.pdf을 다하겠습니다하고 foo/foo.texbar/bar.tex 찾아야하기 때문에 나는 거기에 하드 코딩 foo하지 않으려로 작동합니다.

저는 Makefile (다른 사람을 내 요구에 맞게 수정하는 데 경험이 많음)에 상당히 익숙하며, 절대적으로 기본적인 것을 한 적이 없기 때문에 누군가가 나에게 도움이되는 포인터를 줄 수 있다면 유망한 것으로 보이는 유일한 것들은 %$*이고, 나는 작동하지 못했다.).

+0

이렇게해야합니다. 와일드 카드를 처리하는 것은 Make가 현저하게 나쁜 것 중 하나입니다. 그렇게 할 수는 있지만 못 생기므로 @ wisent의 해결책이 당신의 목적에 충분하다면, 아마도 그걸로 가야 할 것입니다. – Beta

답변

2

VPATH를 사용하여 검색해야하는 디렉토리 목록을 지정할 수 있습니다.

일 실시 메이크 :

# Find all tex files 
tex := $(shell find -iname '*.tex') 

# Make targets out of them 
PDFS := $(notdir $(tex:%.tex=%.pdf)) 
# specify search folder 
VPATH := $(dir $(tex)) 

all : $(PDFS) 

%.pdf : %.tex 
     pdflatex $< 

또는 더 나은 VPATH (소문자)를 사용하는 것입니다 :

vpath %.tex $(dir $(tex)) 

는 그 디렉토리에 .tex 파일 만 찾을 것입니다.

+0

'foo.tex'가 없어도'foo/foo.tex'가 있으면 충분할 것입니다. './foo.tex' 또는'bar/baz/foo.tex'가 주위에 있으면 문제가 발생할 것입니다. – Beta

+0

다행히 나는 그 문제가 없을 것이다. (내 모든 % .tex는 폴더 %로 보장된다.) 이것은 제 목적을 위해 작동합니다 (Makefile의 전제 조건에서'$ *'등을 사용할 수 없다는 것에 놀랐지 만, 필자의 어려움은 초보자 인 Makefile에 의한 것이라고 생각했습니다). 건배! –

+1

충분히 새로운 버전의 GNU make를 가지고있는'$ *'IFF (a)를 사용할 수 있습니다. (b).SECONDEXPANSION 특수 타겟, 그리고 (c) 당신을'$$ * '로 이스케이프합니다. 2 차 확장에 대한 문서는 GNU make 매뉴얼을 참조하십시오. – MadScientist

관련 문제