2016-07-29 23 views
2

Ich dachte, das ist ganz einfachMakefile: verhindern unendliche Muster Rekursion

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

Das heißt, ich möchte ein Bild in diesem Verzeichnis aus dem entsprechenden Bild in „../figs/“ erzeugen.

Aber die oben führt zu einer unendlichen Kette von Abhängigkeiten, weil ../figs/foo.png%.png paßt und deshalb versucht machen ../figs/../figs/foo.png zu überprüfen, welche %.png paßt und deshalb versucht zu machen. . . Schließlich stoppt mit "Dateiname zu lang".

Ich muss etwas fehlen. Was ist eine saubere Lösung?

Antwort

1

Töten Sie die Kette mit einer leeren Regel

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

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

Danke! Das ist perfekt. Interessanterweise erzeugt GNU Make 3.81, das mit Mac OS X geliefert wird, immer noch eine unendliche Kette mit Ihrem Code, während GNU Make 4.2.1, das ich separat installiert habe, dies nicht tut. Bedeutet das, dass dieses Problem erst kürzlich gelöst wurde? – Ryo

+0

Sieht aus wie Musterregeln auf kürzesten Stamm um umgestellt wurden in [3,82] (http://git.savannah.gnu.org/cgit/make.git/tree/NEWS), können Sie die leeren, indem in 3.81 dieses Problem umgehen herrsche vor dem anderen. – user657267

0

user657267 ‚s Lösung perfekt. Eine weitere Option ist statisch Musterregeln zu verwenden:

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

all: $(PNGS) 

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

clean: 
    rm -f $(PNGS) 

Berechnung der Liste aller Ziele aus der Liste aller Voraussetzungen einige nette Nebenwirkungen hat, wie die prossibility der Zugabe der all und clean Ziele, zum Beispiel.

+0

Danke! Ich benutze bereits eine Liste von Zielen wie Ihre PNGS, aber ich wusste nicht, dass Sie die Liste verwenden können, um die Anwendung des Musters zu begrenzen (Ihre dritte nicht leere Zeile mit zwei Doppelpunkten). Nebenbei verwende ich '$ (notdir...)' Funktion anstelle von 'patsubst'. – Ryo