Использование nmake с подстановочными знаками в make-файле
Вопрос
Я пытаюсь настроить make-файл nmake для автоматического экспорта наших макетных файлов balsamiq в png-файлы, но я боюсь, что не могу придумать, как сделать общее правило для этого, без явного перечисления все файлы, которые я хочу экспортировать.
На этой странице подробно описывается синтаксис командной строки для экспорта файлов и эта страница содержит пример, который выглядит как общее правило для файлов .obj в .exe файлы.
Makefile, который я пробовал до сих пор, выглядит следующим образом:
.bmml.png:
"C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< $@
Но это не работает.
Если я просто запускаю 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 $< $@
это тоже ничего не делает, так что я явно не понимаю, как работают такие общие правила. Нужно ли указывать выше цель, которая каким-то образом перечисляет файлы, которые я хочу?
<Ч>Изменить . В ответ на новый ответ:
Этот make-файл:
{}.txt{}.dat:
copy $** $@
с этим файлом (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.
Решение
Правила шаблонов NMAKE во многом похожи на правила суффиксов старой школы GNU. В вашем случае у вас было почти правильное начало, но вы пропустили объявление .SUFFIXES. Например:
.SUFFIXES: .bmml .png
.bmml.png:
@echo Building $@ from $<
Я думаю, что это только часть вашего решения, потому что вы также упомянули о желании избегать явного перечисления всех файлов, которые нужно конвертировать. К сожалению, я не знаю очень чистого способа сделать это в NMAKE, так как он только расширяет подстановочные знаки в списках зависимостей, и что вы действительно хотите в своем списке зависимостей, это не список файлов, которые уже существуют (* .bmml файлы), но список файлов, которые будут созданы из этих файлов (файлы * .png). Тем не менее, я думаю, что вы можете достичь своей цели с помощью рекурсивного вызова NMAKE, подобного этому:
all: *.bmml
$(MAKE) $(**:.bmml=.png)
Здесь NMAKE развернет *.bmml
в списке предварительных требований для all
в список файлов .bmml в каталоге, а затем запустит новый экземпляр NMAKE, указав цели для построения в виде этого списка файлов. со всеми экземплярами .bmml
заменены на .png
. Итак, все вместе:
.SUFFIXES: .bmml .png
all: *.bmml
@echo Converting $(**) to .png...
@$(MAKE) $(**:.bmml=.png)
.bmml.png:
@echo Building $@ from $<
Если я создаю файлы Test1.bmml и Test2.bmml, а затем запускаю этот make-файл, я получаю следующий вывод:
Converting Test1.bmml Test2.bmml to .png...
Building Test1.png from Test1.bmml
Building Test2.png from Test2.bmml
Конечно, если у вас очень много таких файлов .bmml, вы можете столкнуться с ограничениями длины командной строки, так что следите за этим. В этом случае я рекомендую либо явно перечислить исходные файлы, либо использовать более способный инструмент make, такой как GNU make (который доступен для Windows в различных формах).
Другие советы
Будет ли это работать для вас? Поместите это в 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.