2008-10-03 6 views
9

Я пытаюсь настроить makefile для makefile, чтобы экспортировать наши файлы-макеты balsamiq в png-файлы автоматически, но я боюсь, что не могу делать головы или хвосты того, как создавать общее правило для этого, без явного перечисления всех файлов, которые я хочу экспортировать.Использование nmake с подстановочными знаками в make-файле

This page подробно описывает синтаксис командной строки для экспорта файлов, а this page содержит пример, который похож, что содержит общее правило для .obj-файлов в .exe-файлы.

Makefile, я пытался до сих пор выглядит следующим образом:

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

Но это не работает.

Если я просто запустить NMAKE (с некоторыми устаревшими PNG файлов), NMake просто делает это:

[C:\Temp] :nmake 

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


[C:\Temp] : 

Если я прошу его построить один конкретный файл, он делает это:

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

Какие-нибудь гуру-красавицы, которые могут меня выпрямить?

Пример Makefile, который просто делает .dat файлы из .txt файлов, копируя их, чтобы экспериментировать с, выглядит следующим образом:

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

это не делает ничего, как хорошо, так ясно, что я не понимая, как такие общие правила работают. Нужно ли указывать выше цель, которая каким-то образом перечисляет файлы, которые я хочу?


Edit: В ответ на новый ответ:

Это Makefile:

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

с этим файлом (test.dat)

1 
2 
3 

и команды:

NMAKE test.txt 

Выдает сообщение об ошибке:

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

ответ

16

Правила шаблона NMAKE очень похожи на правила суффикса старой школы GNU.В вашем случае вы почти всегда начинаете с самого начала, но вам не хватает декларации .SUFFIXES. Например:

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

Я думаю, что это только часть вашего решения, хотя, потому что вы также упомянули желая избежать явного перечисления всех файлов, которые будут преобразованы. К сожалению, я не знаю очень простой способ сделать это в NMAKE, поскольку он только расширяет групповые символы в списках зависимостей, а то, что вы действительно хотите в списке зависимостей, - это не список файлов, которые уже существуют (* .bmml файлы), но список файлов, которые будут созданы из этих файлов (файлы * .png). Тем не менее, я думаю, что вы можете достичь своей цели с помощью рекурсивного NMake вызова, как это:

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

Здесь NMAKE расширит *.bmml в списке PREREQ для all в список .bmml файлов в каталоге, а затем его начнет новый экземпляр NMAKE, указав цели для создания как списка файлов со всеми экземплярами .bmml, замененными на .png. Таким образом, поставив его все вместе:

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

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

Если я создаю файлы Test1.bmml и Test2.bmml, а затем запустить этот Makefile, я получаю следующий результат:

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

Конечно, если у вас есть очень многие из этих .bmml файлов, вы можете столкнуться с ограничениями длины командной строки, поэтому следите за этим. В этом случае я рекомендую либо явно указывать исходные файлы, либо использовать более способный инструмент make, например GNU make (который доступен для Windows в самых разных формах).

+0

Это очень хорошо. Единственное, что я нахожу, что он перестраивает каждый раз, даже когда цель обновлена. Как можно также пропустить его, если цель более новая, чем исходная? – CashCow 2011-12-29 17:54:18

0

Будет ли эта работа для вас? Put это в Makefile .:

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

Затем запустите:

nmake /A 

Я не Balsamiq, так что я не могу проверить это, но в моем случае, если у меня есть следующий Makefile .:

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

и запустите nmake /A в папке с myFile.txt, он создаст файл myFile.dat.