【问题标题】:gnu make copy many files to a single locationgnu make 将许多文件复制到一个位置
【发布时间】: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


    【解决方案1】:

    应该这样做:

    HFILES = $(notdir $(HEADERS))
    DIRS = $(dir $(HEADERS))
    
    TARGETS = $(addprefix $(INCDIR)/, $(HFILES))
    
    all: $(TARGETS)
    
    $(INCDIR)/%.h: %.h
      cp $< $@
    
    vpath %.h $(DIRS)
    

    【讨论】:

      【解决方案2】:

      好的。答案非常“简单”,尽管它需要使用一些我以前没有使用过的 gnu make。我的解决方案是创建一个需要 2 个参数的子例程:(1) 文件名(无目录)和 (2) 文件所在目录的名称。 “子例程”是规则的模板。当一个人评估对子例程的调用时,一个人会启动另一个规则,就像一个人已经明确地编写它一样。

      define COPY_HEADER
      $$(INCDIR)/$(2) : $(1)$(2)
           @cp -f $$< $$@
      endef
      

      然后为每个头文件评估这个子程序,并传入每个头文件的目录部分和文件部分。

      $(foreach file,$(HEADERS),$(eval $(call COPY_HEADER,$(dir $(file)),$(notdir $(file)))))
      

      【讨论】:

        猜你喜欢
        • 2017-05-23
        • 1970-01-01
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 2012-06-21
        相关资源
        最近更新 更多