【发布时间】:2013-12-22 18:00:59
【问题描述】:
假设我有一个源文件列表,每个源文件都将被编译为单独的二进制文件:
SRCS = abcd.c efgh.c ijkl.c
我希望根据文件名在单独的子目录中输出文件,如下所示:
- 构建/abcd/abcd
- 构建/efgh/efgh
- 构建/ijkl/ijkl
我认为静态模式规则是可行的方法。伪make-rule可以是这样的:
$(TARGETS): build/%/%: %.c
# stuff ...
我首先根据文件名列出子目录:
DIRS = $(SRCS:%.c=build/%)
所以现在我们有了 DIRS = build/abcd build/efgh build/ijkl。我想我现在可以使用以下内容列出目标:
BLDS = $(DIRS:%=%/$(basename %))
但这当然行不通,因为通配符不能在一个模式中多次使用。因此,我现在卡在 BLDS = build/abcd/% build/efgh/% build/ijkl/%。
显然,我完全走错了路。你会怎么做呢?
现在我正在明确地编写每条规则,这开始变得有点乏味:
compile = # command to do stuff
BD = build
all: $(BD)/abcd/abcd $(BD)/efgh/efgh $(BD)/ijkl/ijkl
$(BD)/abcd/abcd: abcd.c
$(call compile)
$(BD)/efgh/efgh: efgh.c
$(call compile)
$(BD)/ijkl/ijkl: ijkl.c
$(call compile)
clean:
rm -rf build/*
.PHONY: all
【问题讨论】:
标签: static makefile target rules substitution