2016-07-29 2 views
2

내가이 즉메이크 : 방지 무한 패턴 재귀

%.png: ../figs/%.png 
     convert $? -resize '40%' [email protected] 

매우 간단합니다 생각 나는 "../figs/"에서 해당 이미지에서이 디렉토리에 이미지를 생성합니다.

그러나 종속성 무한 체인 상기 리드 ../figs/foo.png %.png가 일치하므로 %.png 일치하는 ../figs/../figs/foo.png를 확인하므로하려고을 시도 할 때문이다. . . 결국 make는 "File name too long"으로 멈 춥니 다.

나는 뭔가를 놓쳤을 것입니다. 깨끗한 솔루션은 무엇입니까?

답변

1

%.png: ../figs/%.png 
    convert $? -resize '40%' [email protected] 

../figs/%.png: ; 
+0

고마워요! 저건 완벽 해. 흥미롭게도 Mac OS X과 함께 제공되는 GNU Make 3.81은 여전히 ​​코드로 무한한 체인을 생성하지만, 별도로 설치 한 GNU Make 4.2.1은 그렇지 않습니다. 이것은이 문제가 최근에야 해결되었다는 것을 의미합니까? – Ryo

+0

패턴 규칙이 [3.82] (http://git.savannah.gnu.org/cgit/make.git/tree/NEWS)에서 가장 짧은 줄기 순서로 전환 된 것처럼 보입니다. 3.81에서 빈을 넣음으로써이 문제를 해결할 수 있습니다 다른 하나 앞에 규칙. – user657267

0

user657267의 솔루션은 완벽 빈 규칙과 체인을 연속으로 처치하십시오. 예를 들어, allclean 목표를 추가하는 prossibility처럼, 모든 전제 조건 목록에서 여러 좋은 부작용을 모든 대상의 목록을했다 컴퓨팅

PNGS := $(patsubst ../figs/%.png,%.png,$(wildcard ../figs/*.png)) 

all: $(PNGS) 

$(PNGS): %.png: ../figs/%.png 
    convert $< -resize '40%' [email protected] 

clean: 
    rm -f $(PNGS) 

: 또 다른 옵션은 정적 패턴 규칙을 사용하는 것입니다.

+0

감사! 이미 PNGS와 같은 대상 목록을 사용하고 있지만이 목록을 사용하여 패턴의 적용을 제한 할 수 있다는 것을 알지 못했습니다 (두 번째 콜론이 아닌 비어 있지 않은 세 번째 줄). 그런데, 나는'patsubst' 대신'$ (notdir ...) '함수를 사용합니다. – Ryo