С помощью 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.дат.