Использование nmake с подстановочными знаками в make-файле - PullRequest
9 голосов
/ 03 октября 2008

Я пытаюсь настроить 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] :

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

Пример make-файла, который просто создает файлы .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.

Ответы [ 2 ]

16 голосов
/ 13 марта 2009

Правила шаблонов 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 в различных формах).

0 голосов
/ 10 марта 2009

Будет ли это работать для вас? Поместите это в 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.

...