我的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
有没有办法在不放弃结构的情况下做到这一点?
答案 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