2008-10-03 17 views
9

Ich versuche ein nmake-Makefile einzurichten, um unsere Balsamiq-Mockup-Dateien automatisch in PNG-Dateien zu exportieren, aber ich fürchte, ich kann nicht Kopf oder Zahl davon machen dafür, ohne explizit alle Dateien aufzulisten, die ich exportieren möchte.Verwendung von nmake mit Wildcards im Makefile

This page Details der Befehlszeilensyntax für den Export der Dateien, und this page enthält ein Beispiel, das aussieht, als ob es eine generische Regel für .obj-Dateien zu .exe-Dateien enthält.

Das Make-Datei habe ich versucht, so sieht weit wie folgt aus:

.bmml.png: 
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< [email protected] 

Aber das funktioniert nicht.

Wenn ich einfach Nmake (mit einigen veralteten png-Dateien) laufen, NMake nur tut dies:

[C:\Temp] :nmake 

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


[C:\Temp] : 

Wenn ich es frage eine bestimmte Datei zu erstellen, tut es dies:

[C:\Temp] :nmake "TestFile.png" 

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

NMAKE : fatal error U1073: don't know how to make '"TestFile.png"' 
Stop. 

[C:\Temp] : 

Irgendwelche Nymphegurus da draußen, die mich richtig stellen können?

Ein Beispiel Make-Datei, die einfach DAT-Dateien aus TXT-Dateien durch Kopieren macht, zu experimentieren, sieht wie folgt aus:

.txt.dat: 
    copy $< [email protected] 

dies tut nichts als gut, so klar verstehe ich nicht, wie Solche generischen Regeln funktionieren. Muss ich ein Ziel oberhalb angeben, das irgendwie die gewünschten Dateien auflistet?


bearbeiten: Als Antwort auf neue Antwort:

Dieses Make-Datei:

{}.txt{}.dat: 
    copy $** [email protected] 

mit dieser Datei (test.dat)

1 
2 
3 

und diesen Befehl ein:

NMAKE test.txt 

Erzeugt diese Fehlermeldung:

[C:\] :nmake test.txt 

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

NMAKE : fatal error U1073: don't know how to make 'test.txt' 
Stop. 

Antwort

16

NMAKE-Musterregeln sind wie GNU-Suffixregeln für alte Schulen.In Ihrem Fall hatten Sie es fast schon richtig, aber Sie haben die .SUFFIXES-Deklaration verfehlt. Zum Beispiel: wenn

.SUFFIXES: .bmml .png 
.bmml.png: 
    @echo Building [email protected] from $< 

Ich denke, das nur ein Teil der Lösung ist, weil Sie auch explizit vermeiden erwähnt wollen alle Dateien Auflistung umgewandelt werden. Leider weiß ich von einer sehr sauberen Möglichkeit, das in NMAKE zu tun, da es nur Platzhalter in Abhängigkeitslisten erweitert, und was Sie wirklich in Ihrer Abhängigkeitsliste möchten, ist nicht die Liste der Dateien, die bereits vorhanden sind (das * .bmml Dateien), aber die Liste der Dateien, die aus diesen Dateien erstellt werden (die * .png-Dateien). Trotzdem denke ich, Sie Ihr Ziel mit einem rekursiven NMAKE Aufruf wie dies erreichen können:

all: *.bmml 
    $(MAKE) $(**:.bmml=.png) 

Hier findet NMAKE *.bmml erweitert in der prereq Liste für all in die Liste der .bmml Dateien in dem Verzeichnis, und dann wird eine neue NMAKE-Instanz starten, in der die zu erstellenden Ziele als Liste der Dateien mit allen Instanzen von .bmml durch .png ersetzt werden. So setzen sie alle zusammen:

.SUFFIXES: .bmml .png 
all: *.bmml 
    @echo Converting $(**) to .png... 
    @$(MAKE) $(**:.bmml=.png) 

.bmml.png: 
    @echo Building [email protected] from $< 

Wenn ich Dateien Test1.bmml und Test2.bmml erstellen und dann dieses Make-Datei ausführen, bekomme ich die folgende Ausgabe:

Converting Test1.bmml Test2.bmml to .png... 
Building Test1.png from Test1.bmml 
Building Test2.png from Test2.bmml 

Natürlich, wenn Sie Bei sehr vielen dieser .bmml-Dateien können Sie die Einschränkungen der Befehlszeilenlänge nicht beachten. Achten Sie also darauf. In diesem Fall empfehle ich, entweder die Quelldateien explizit aufzulisten oder ein leistungsfähigeres make-Tool zu verwenden, wie GNU make (das für Windows in verschiedenen Formen verfügbar ist).

+0

Das ist sehr gut. Das einzige ist, dass ich finde, dass es jedes Mal neu erstellt wird, selbst wenn das Ziel auf dem neuesten Stand ist. Wie würde man es auch überspringen, wenn das Ziel neuer ist als die Quelle? – CashCow

+0

@CashCow Ich sehe das Problem nicht. In Erics Beispiel existiert das Ziel nie! Es echote nur etwas Text, es erzeugt nie ein Ziel. Wenn Sie eine Regel 'copy $ <$ @' hinzufügen, werden auch die Ziele erstellt. In diesem Fall werden die aktuellen Ziele nicht unnötigerweise neu erstellt. –

+0

Ich brauchte eine Weile, um das herauszufinden. Wenn Ihr Makefile nicht den Namen makefile hat, müssen Sie auch den rekursiven Aufruf '-f' verwenden. –

0

Wird diese Arbeit für Sie? Setzen Sie diese in MAKE .:

export : *.bmml 
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $** $(**B).png 

Dann laufen:

nmake /A 

Ich habe nicht Balsamiq so kann ich das nicht testen, aber in meinem Fall, wenn ich die folgenden MAKE habe .:

export : *.txt 
    copy $** $(**B).dat 

und führen Sie nmake /A in einem Ordner mit myFile.txt, es erstellt myFile.dat.