С помощью nmake с шаблонами в Makefile
Я пытаюсь настроить nmake makefile для автоматического экспорта наших файлов макета balsamiq в png-файлы, но, боюсь, я не могу сделать головы или хвосты о том, как сделать общее правило для этого, без явного перечисления всех файлов, которые я хочу экспортировать.
на этой странице детали синтаксис командной строки для экспорта файлов, и на этой странице содержит пример, который выглядит так, как будто он содержит общее правило для .obj-файлы .исполняемый файлы.
makefile, который я пробовал до сих пор, выглядит так:
.bmml.png:
"C:Program FilesBalsamiq MockupsBalsamiq 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] :
любые гуру nmake там, которые могут установить меня прямо?
пример makefile, который просто делает .DAT файлы из .txt файлы, копируя их, экспериментировать с, выглядит так:
.txt.dat:
copy $< $@
это тоже ничего не делает, поэтому ясно, что я не понимаю, как работают такие общие правила. Нужно ли указывать цель выше, которая каким-то образом перечисляет файлы, которые я хочу?
редактировать: в ответ на ответ:
этот makefile:
{}.txt{}.dat:
copy $** $@
этот файл (тест.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.
2 ответов
правила шаблона NMAKE очень похожи на правила суффикса GNU make old-school. В вашем случае, вы были почти правы с самого начала, но вы пропустили .Объявление суффиксов. Например:
.SUFFIXES: .bmml .png
.bmml.png:
@echo Building $@ 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 $@ 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 в различных формах).
будет ли это работать для вас? Поместите это в 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.дат.