【发布时间】:2010-07-21 18:32:24
【问题描述】:
这个问题与2543127的问题在本质上相似。
我有一个带有头文件列表的 gnu makefile。每个头文件可能位于不同的目录中,例如,
HEADERS = $(wildcard *.h) $(wildcard foo/*.h) $(wildcard bar/*.h)
我想让 makefile 将所有头文件复制到包含目录
INCDIR = ../include
当一个虚拟目标(例如,ALL)被调用时,它将适当地更新包含目录中的头文件,即,
.PHONY: ALL
ALL : $(addprefix $(INCDIR)/,$(notdir $(HEADERS)))
显然,如果我知道目录列表是什么,我可以很容易地完成我想要的。如果我这样做了,那么我可以像这样写一些规则(东西)(不完全正确,但你明白了):
$(addprefix $(INCDIR)/,$(notdir $(filter foo/%.h,$(HEADERS)))) : %.h : foo/%.h
@cp -f $< $@
$(addprefix $(INCDIR)/,$(notdir $(filter bar/%.h,$(HEADERS)))) : %.h : bar/%.h
@cp -f $< $@
$(addprefix $(INCDIR)/,$(notdir $(filter-out bar/%.h,$(filter-out foo/%.h,$(HEADERS))))) : %.h : %.h
@cp -f $< $@
这种方法有两个问题,(1)随着目录数量的增加,它变得乏味,(2)我在 makefile 包含中写这个,它不知道目录,它只知道变量 INCDIR和标题;它不直接知道目录 foo/、bar/ 和 ./,而是通过 $(sort $(dir $(HEADERS)))
问题:在只提供 INCDIR 和 HEADERS 变量的限制下,如何编写规则以达到预期的效果。
【问题讨论】:
标签: gnu-make