该问题在精神上与问题2543127类似.
我有一个带有头文件列表的gnu makefile.每个头文件可以位于不同的目录中,例如,
HEADERS = $(wildcard *.h) $(wildcard foo/*.h) $(wildcard bar/*.h)
Run Code Online (Sandbox Code Playgroud)
我想让makefile将所有标题复制到include目录
INCDIR = ../include
Run Code Online (Sandbox Code Playgroud)
当调用虚拟目标(例如ALL)时,它将适当地更新include目录中的头文件,即
.PHONY: ALL
ALL : $(addprefix $(INCDIR)/,$(notdir $(HEADERS)))
Run Code Online (Sandbox Code Playgroud)
显然,如果我知道目录列表是什么,我可以很容易地完成我想要的.如果我这样做,那么我可以写一些规则(某些东西)就像这样(不完全正确,但你得到了这个):
$(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 $< $@
Run Code Online (Sandbox Code Playgroud)
有两个问题的方法,(1)随着的目录数量的增加和(2)我在makefile写这包括,不知道目录,所有它知道是变量INCDIR和头繁琐; 它不直接知道目录foo /,bar /和./,而不是通过$(sort $(dir $(HEADERS)))
问题:如何在仅提供INCDIR和HEADERS变量的约束下编写规则以实现期望的效果.
这应该这样做:
HFILES = $(notdir $(HEADERS))
DIRS = $(dir $(HEADERS))
TARGETS = $(addprefix $(INCDIR)/, $(HFILES))
all: $(TARGETS)
$(INCDIR)/%.h: %.h
cp $< $@
vpath %.h $(DIRS)
Run Code Online (Sandbox Code Playgroud)