Создание zip-архива относительно заданного пути в нерекурсивном make-файле

Я использую реализацию нерекурсивного make, похожую на ту, что описана здесь: http://evbergen.home.xs4all.nl/nonrecursive-make.html

Вот пример проблемы.

Главный Makefile включает в себя foo/Rules.mk, foo/Rules.mk содержит фрагмент:

# Here, d is bound to foo, the path to the current directory
$(d)/foo.zip: $(d)/bar
    zip -r $@ $^
    # This expands to the recipe: zip -r foo/foo.zip foo/bar

К сожалению, это создает ZIP-архив, содержащий foo/bar, но мне нужно, чтобы он содержал barто есть сделать архив относительно заданного каталога. cd не работает.

# DOES NOT WORK
$(d)/foo.zip: d := $(d)  # this makes the variable d work in the recipe
$(d)/foo.zip: $(d)/bar
    cd $(d); zip -r $@ $^
    # This expands to the recipe: cd foo; zip -r foo/foo.zip foo/bar

Как я могу сделать эту работу в общем случае (d может быть любым путем, zip содержит произвольный выбор файлов и подкаталогов)?

2 ответа

Просто это?

$(d)/foo.zip: $(d)/bar
    zip -r $(@:$(d)/%=%) $(<:$(d)/%=%) # Expands to zip -r foo.zip bar

Я придумал следующий взлом, да простят меня боги программирования.

x := $(d)/foo.zip  # targets
y := $(d)/bar  # prerequisites
$(x): x := $(x)
$(x): y := $(y)
$(x): d := $(d)
$(x): $(y)
    cd $(d); zip -r $(x:$(d)/%=%) $(y:$(d)/%=%)
    # Expands to cd foo; zip -r foo.zip bar
Другие вопросы по тегам