归档到指定的路径在非递归的Makefile

问题描述:

我使用一个类似这里所涉及的非递归化妆的实现:http://evbergen.home.xs4all.nl/nonrecursive-make.html归档到指定的路径在非递归的Makefile

这里的问题的一个例子。

Makefile包括foo/Rules.mkfoo/Rules.mk包含片段:

# Here, d is bound to foo, the path to the current directory 
$(d)/foo.zip: $(d)/bar 
    zip -r [email protected] $^ 
    # 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 [email protected] $^ 
    # This expands to the recipe: cd foo; zip -r foo/foo.zip foo/bar 

我怎样才能使这项工作在一般情况下(d可以是任何路径,则压缩包含文件和子目录的任意选择)?

我想出了下面的黑客,编程之神可能会原谅我。

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 

只是这样吗?

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

不适用于子目录,我需要一个通用的解决方案。 '$(d)/foo.zip:$(d)/ bar/baz',包含'bar/baz'的zip? – darkfeline

+0

好的,如果我弄清楚了,你只需要移除每个路径的'$(d)/'部分?然后尝试我的编辑(你用这个黑客就可以做到这一点)。 – Chnossos

+0

我之前曾尝试过,它没有工作,现在我意识到问题所在。您需要添加'$(d)/foo.zip:d:= $(d)'(参见非递归make链接以了解'd'如何工作)。一般情况下用'^'替换' darkfeline