我一直在查看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应该能够创建一个自己执行的规则,就像它一样强大是。我只是不知道如何创建专注于依赖变量的通用规则,而不是目标。
答案 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 $<
...