【发布时间】:2016-04-29 12:40:34
【问题描述】:
假设我有一个这样的源文件列表:
SOURCE=aaa.src bbb.src ccc.src
我想创建一个规则来在自己的文件夹中构建每个对应的目标,其名称取决于源文件。
源文件---->对应的输出文件/目标
aaa.src -------------------> aaa/aaa.out
bbb.src -------------------> bbb/bbb.out
ccc.src -------------------> ccc/ccc.out
如何使用 GNUMake 为此编写规则?我最大的努力是以下 Makefile:
.PHONY: all clean
CC=somecompiler
SOURCE := aaa.src bbb.src ccc.src
RTARGS := $(SOURCE:%.src=%.out)
TDIRS := $(addsuffix /,$(basename $(SOURCE)))
TARGS := $(join $(TDIRS), $(RTARGS))
all:$(TARGS)
%.out: $(SOURCE) # Better source specification?
@[ ! -d "$(dir $*)" ] && mkdir "$(dir $*)"
$(CC) "$(patsubst %/,%,$(dir $*)).src" "$@"
clean:
rm -f $(TARGS)
rmdir --ignore-fail-on-non-empty $(TDIRS)
这里的问题是,任何一个目标(即.out 文件)都依赖于每个 源(即.src 文件),而不仅仅是具有相同基本名称的目标。我可以将注释行更改为%.out: %.src,但源文件必须与输出文件位于同一目录中。我也可以像这样编译它:
%.out: %.src
$(CC) "$>" -o "$*/$@"
但是 make 总是会编译每个目标,不管它是否已经存在。
如何让 make 只使用适当的源文件。 在通用规则中分别指定每个目标的依赖关系的正确方法是什么?
【问题讨论】: