2016-01-23 59 views
0

比方说,我有这样的GNU生成文件:

SOURCE = source1/a source2/b source3/c 
BUILD = build/a build/b build/c 
BASE = build/ 

$(BUILD): $(BASE)%: % 
    install $< [email protected] 

所以基本上我在目录来源1源2source3,文件,这我想无论如何放进建立目录。

我想用一个静态模式规则来实现这一点。我天真的做法是:

$(BUILD): $(BASE)%: $(filter *%, $(SOURCE)) 
    install $< [email protected] 

这是行不通的。我知道过滤器也用百分号表示。

$(BUILD): $(BASE)%: $(wildcard */$(notdir %)) 
    install $< [email protected] 

这也行不通。但即使如此,这仍然是不令人满意的,因为我可能想touch一个新的文件source1/b,这会弄乱一切。

如何在GNU makefile静态模式规则中使用$(filter)函数?还是有另一种方法来做到这一点?

层次结构现在看起来是这样的:

source1/ 
     a 
source2/ 
     b 
source3/ 
     c 
build/ 

我希望它看起来像这样:

source1/ 
     a 
source2/ 
     b 
source3/ 
     c 
build/ 
     a 
     b 
     c 
+0

如果你有'源1/B'和'源2/B',你要投入'然后呢建/'? – Beta

+0

我想把'a','b'和'c'放入'build'中。 – hgiesel

+0

*您想将哪个''b'放入'build /'中?你说你可能希望在'source2/b'之外引入'source/b',但是你没有说你想在这种情况下做什么。 – Beta

回答

2

你可以用the VPATH variable做到这一点:

SOURCE = source1/a source2/b source3/c 
BUILD = build/a build/b build/c 
BASE = build/ 

VPATH = source1 source2 source3 

$(BUILD): $(BASE)%: % 
    install $< [email protected] 

或者:

SOURCE = source1/a source2/b source3/c 
BASE = build/ 
BUILD = $(addprefix $(BASE), $(notdir $(SOURCE))) 

VPATH = $(dir $(SOURCE)) 

$(BUILD): $(BASE)%: % 
    install $< [email protected] 
1

读一千#1的问题和GNU做教程了几个小时后,我终于得到它的工作:

SOURCE = source1/a source2/b source3/c 
TEST = a b c 
BUILD = build/a build/b build/c 
BASE = build/ 
PERCENT = % 

.SECONDEXPANSION: 
$(BUILD): $(BASE)%: $$(filter $$(PERCENT)/$$*,$$(SOURCE)) 
    install $< [email protected] 

这是有点hacky,但我很高兴它。如果有人有任何更好的想法,请让我知道。