Makefile依赖性迭代通用规则

时间:2015-02-07 03:03:20

标签: makefile

我一直在查看makefile语法手册,但没有找到任何真正有助于我试图在这里制作的用例的内容。

我所拥有的是在公共目录下具有不同目录的源文件列表,如下所示:

src/a.h
src/b.h
src/dir/c.h
src/dir/dir/d.h

并希望make单独使用这些作为最终创建规则的依赖项:

build/a.h
build/b.h
build/c.h
build/d.h

然后单独用作更多规则的依赖项。

到目前为止我所拥有的:

LIST := src/a.h src/b.h src/dir/c.h src/dir/d.h
all : $(addprefix build/,$(notdir ${LIST}))
    @echo 'All rule invoked'

什么行不通:


$(LIST) : build/$(notdir %).h : %.h
    @echo 'dst $* dat $@ din $<'

目标'item'与目标模式

不匹配
build/%.h: %.h

没有规则要求'all'所需的目标'build / a.h'。


我猜这时候让我生气了,因为错误开始让我停下来。

基本上,我正在读取一个文件列表,其中包含与搜索路径和依赖关系相关的路径前缀,并且只有在更新源文件时才想转储每个文件。在此之后,该单个目录中的这些文件将用作另一批规则的依赖项。我怎么能做到这一点?

注意:我已经通过忽略依赖链来完成它,但这不会起作用。我也可以使用make来运行生成一个可以正确执行的显式makefile的脚本,但这感觉就像是过度杀戮和浪费资源,并且make应该能够创建一个自己执行的规则,就像它一样强大是。我只是不知道如何创建专注于依赖变量的通用规则,而不是目标。

2 个答案:

答案 0 :(得分:1)

这里没有使用模式规则的好方法,因为所有标头(可能)都在不同的目录中,并且您希望将它们移动到公共目录。如果你正在使用GNU make,你可以编写一个宏规则,扩展到你需要的所有规则:

define copy_header_rule
build/$(notdir $(1)): $(1)
        cp $$< $$@
endef

$(foreach hdr,$(LIST),$(eval $(call copy_header_rule,$(hdr))))

这会遍历$(LIST)中的每个标头a创建规则以将其复制到构建目录

答案 1 :(得分:0)

您可以使用vpath

使事情变得非常简单
TARGS:= $(addprefix build/, $(notdir $(LIST)))

vpath %.h $(dir $(LIST))

all: $(TARGS)

build/%.h: %.h
    @echo building $@ from $<
    ...