2008-10-03 9 views
9

Estoy intentando configurar un makemape nmake para exportar nuestros archivos de maqueta de balsamiq a archivos png automáticamente, pero me temo que no puedo entender cómo hacer una regla genérica para hacerlo, sin enumerar explícitamente todos los archivos que deseo exportar.Usando nmake con comodines en el archivo MAKE

This page detalla la sintaxis de la línea de comando para exportar los archivos, y this page contiene un ejemplo que parece que contiene una regla genérica para los archivos .obj a los archivos .exe.

El makefile que he probado hasta ahora es así:

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

Pero esto no funciona.

Si sólo tiene que ejecutar nmake (con algunos archivos PNG obsoletos), nmake sólo hace esto:

[C:\Temp] :nmake 

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


[C:\Temp] : 

Si lo pido para construir un archivo específico, se hace esto:

[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] : 

¿Alguna gurú nmake que me pueda aclarar?

Un makefile ejemplo, que simplemente hace que los archivos .dat de archivos .txt copiándolos, para experimentar, es el siguiente:

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

esto no hace nada, así que claramente no estoy entender cómo tales reglas genéricas funcionan. ¿Debo especificar un objetivo anterior que de alguna manera enumere los archivos que quiero?


Editar: En respuesta a la nueva respuesta:

Este makefile:

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

con este archivo (test.dat)

1 
2 
3 

y este comando:

NMAKE test.txt 

Produce este mensaje de error:

[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. 

Respuesta

16

Las reglas de patrón NMAKE son muy parecidas a las reglas de sufijo de la vieja escuela de GNU.En su caso, tenía casi derecho para empezar, pero le faltaba la declaración .SUFFIXES. Por ejemplo:

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

creo que esto es sólo una parte de su solución, sin embargo, debido a que también mencionó que quieran evitar explícitamente lista de todos los archivos que desea convertir. Desafortunadamente, no conozco una manera muy clara de hacerlo en NMAKE, ya que solo expande comodines en las listas de dependencias, y lo que realmente desea en su lista de dependencias no es la lista de archivos que ya existen (el * .bmml archivos), pero la lista de archivos que se crearán a partir de esos archivos (los archivos * .png). Sin embargo, creo que se puede lograr su objetivo con una invocación recursiva NMAKE como esto:

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

Aquí, NMAKE ampliará *.bmml en la lista prerrequisito para all en la lista de archivos .bmml en el directorio, y luego se iniciará una nueva instancia de NMAKE, especificando los objetivos para compilar como esa lista de archivos con todas las instancias de .bmml reemplazadas por .png. Por lo tanto, poner todo junto:

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

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

Si creo archivos Test1.bmml y Test2.bmml y luego ejecutar este archivo MAKE, me sale el siguiente resultado:

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

Por supuesto, si usted tiene muchos de estos archivos .bmml, puede encontrarse con limitaciones de longitud de línea de comandos, así que ten cuidado con eso. En ese caso, recomiendo que se incluyan explícitamente los archivos de origen o que se use una herramienta de creación más capaz, como GNU make (que está disponible para Windows en una variedad de formas).

+0

Esto es muy bueno. Lo único es que estoy encontrando que se reconstruye cada vez, incluso cuando el objetivo está actualizado. ¿Cómo podría uno también omitir si el objetivo es más nuevo que la fuente? – CashCow

+0

@CashCow No veo ese problema. En el ejemplo de Eric, ¡el objetivo nunca existe! Simplemente echos un poco de texto, en realidad nunca crea un objetivo. Si agrega una regla 'copy $ <$ @', entonces también creará los objetivos. En ese caso, no reconstruye innecesariamente objetivos actualizados. –

+0

Me tomó un tiempo resolver esto. Si su archivo MAKE no se llama 'makefile', entonces necesita usar' -f' en la invocación recursiva también. –

0

¿Funcionará para usted? Poner esto en MAKE .:

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

A continuación, ejecute:

nmake /A 

no tengo Balsamiq así que no puedo probar esto, pero en mi caso si tengo la siguiente MAKE .:

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

y ejecuta nmake /A en una carpeta con myFile.txt, creará myFile.dat.