Makefile 依赖迭代通用规则

Makefile dependency-iterating generic rule

我一直在查看 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 生我的气了,因为错误开始告诉我停止。

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

注意:我已经通过忽略依赖链完成了它,但这是行不通的。我也可以使用 make to 运行 脚本来生成一个可以正确执行的显式 makefile,但这感觉有点矫枉过正和浪费资源,并且 make 应该能够创建一个规则来自行完成,尽可能强大。我只是不知道如何创建通用规则来关注其文本匹配的依赖变量,而不是目标。

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

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

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

这会遍历您 $(LIST) 中的每个 headers,并创建一个规则以将其复制到构建目录

您可以使用 vpath 使事情变得非常简单:

TARGS:= $(addprefix build/, $(notdir $(LIST)))

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

all: $(TARGS)

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