Использование nmake с подстановочными знаками в make-файле

StackOverflow https://stackoverflow.com/questions/167004

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top