我使用的非递归制作实现类似于此处介绍的那种: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
不幸的是,这会创建一个包含foo/bar
的zip存档,但我需要它包含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包含任意选择的文件和子目录)?
答案 0 :(得分:0)
我想出了下面的黑客,编程之神可以原谅我。
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
答案 1 :(得分:0)
只是这个?
$(d)/foo.zip: $(d)/bar
zip -r $(@:$(d)/%=%) $(<:$(d)/%=%) # Expands to zip -r foo.zip bar