Динамическая цель в make - PullRequest
       1

Динамическая цель в make

4 голосов
/ 25 ноября 2010

Я новичок в make, и я пытаюсь использовать его для развертывания некоторых файлов javascript. Я долго боролся со следующей проблемой, но безуспешно.

Моя структура каталогов выглядит следующим образом:

helpers/
    foo/
        foo.js
        test/
            test1.js
            test2.js
            ...
    bar/
        bar.js
        test/
            test1.js
            test2.js
            ...
    other helpers...
distrib/
    files ready for distribution
other stuff...

Мой make-файл должен содержать, среди прочего, помощников. Для каждого помощника foo я хочу создать под дистрибутивом следующие файлы: foo-version.js, foo-version-uncommented.js, foo-version-packed.js и foo-version-tests.zip. Первые три получаются с помощью foo.js, соответственно, в виде копии, путем удаления комментариев и запуска миниатора javascript. У меня уже есть команды для выполнения этих задач.

Номер версии следует читать в комментариях к самому файлу, что я легко могу сделать с

def version
    $(shell cat $1 | grep @version | sed -e"s/.*version *//")
endef

Моя проблема в том, что такие цели, как foo-version.js, являются динамическими, поскольку они зависят от номера версии, который читается при запуске make. Я пытался использовать шаблоны, но мне не удалось сделать эту работу. Проблема в том, что что-то подобное не будет работать

helpers := foo bar
helpers: $(helpers)
$(helpers): %: $(call version, %)

потому что второй% не раскрывается при вызове макроса, но используется буквально.

Мне нужно иметь возможность make helpers собрать всех помощников или make foo собрать одного. Вторым шагом будет удаление всех файлов в distrib с меньшим номером версии. Есть идеи как это сделать?

В качестве дополнительного вопроса: будет ли такая задача проще с другим инструментом сборки? Я не эксперт, и, возможно, стоит учиться чему-то другому.

Ответы [ 2 ]

10 голосов
/ 26 ноября 2010

В GNU make вы можете использовать функции call и eval, обычно в сочетании с foreach:

%-version.js: %.js
   # your recipe here
%-version-uncommented.js: %.js
   # your recipe here
%-version-packed.js: %.js
   # your recipe here
%-version-tests.zip: %.js
   # your recipe here

versions_sfxs := .js -uncommented.js -packed.js -tests.zip
helpers := $(shell ls $(HELPERSDIR))

define JS_template

helpers: $(1)-version$(2)

endef

$(foreach h, $(helpers), \
  $(foreach sfx, $(versions_sfxs), \
    $(eval $(call JS_template,$(h),$(sfx)) \
  ) \
)

Этот код не проверен, но дает общее представление. Будьте готовы потратить на отладку использования пробелов, вкладок, знаков доллара и обратной косой черты, как в сценариях оболочки. Поиск переполнения стека для make eval или что-то для получения дополнительной информации и указателей.

0 голосов
/ 30 ноября 2010

В конце я решил написать свой собственный инструмент для сборки PHPmake .Он имеет синтаксис, напоминающий стандартные make-файлы, но он уже более мощный, чем стандартный make, и его легко расширить, так как сами make-файлы написаны на простом PHP.

Больше нет отладочных пробелов, вкладок и знаков доллара!: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...