GNU Makefile Pattern中的多个通配符

时间:2014-09-09 19:56:56

标签: build makefile build-process gnu-make

我的filetree看起来有点像这样:

Makefile
src/foo/foo.c
src/bar/bar.c
build/bin/
build/libs/

每个子目录包含与源相关的其他文件,所以我想要 一些结构。由于我有很多 foos 甚至更多,我想到了一个模式规则:

PROGS=foo bar

all : $(PROGS)

% :: src/%/%.c
    @echo $@ $<

不幸的是,make并不认为这是一种有效的模式:

make: *** No rule to make target `foo', needed by `all'.  Stop.

但是,如果我将所有文件保存在 src / 目录中,则单个%按预期工作:

% :: src/%.c
    @echo $@ $<

Output:
foo src/foo
bar src/bar

有没有办法在不放弃结构的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

使用vpath

PROGS=foo bar

all : $(PROGS)

% : %.c
    @echo $@ $<

vpath %.c src/foo src/bar

如果你想把二进制文件放在build/bin/

PROGS = build/bin/foo build/bin/bar

all : $(PROGS)

build/bin/% : %.c
    @echo $@ $<

vpath %.c src/foo src/bar