Makefile - 将多个文件夹中的头文件复制到一个包含依赖项的包含文件夹中

时间:2010-12-17 12:14:56

标签: makefile

我在各种文件夹中有多个文件需要复制到一个包含文件夹:

make之前

../security/security_features.h
../this/this_features.h
    [etc]
../that/that_features.h

make之后

./include/security_features.h
./include/this_features.h
    [etc]
./include/that_features.h

./include文件夹中的文件都需要依赖于各种文件夹中的文件。

Makefiles对我来说有点神秘,我试着阅读手册并了解如何制作依赖:

./include/security_features.h: ../security/security_features.h
    @cp -av $< $@

但我必须为我的所有文件执行此操作 - 还有另一种更优雅的方法吗?

理想情况下,我只想编写分散文件夹中各种文件的Makefile变量,并且makefile知道将该变量中的所有文件复制到include文件夹。

那里有任何Makefile专家吗?

谢谢,

马特

UPDATE:

我已经设法完成了这样的文件列表:

INCLUDES_SRC := ../security/security_features.h ../this/this_features.h
INCLUDES_DST := $(addprefix ./include/,$(notdir $(INCLUDES_SRC)))

可以让一个人依赖另一个人:

$(INCLUDES_DST): $(INCLUDES_SRC)
    @cp -av $< $@

然而,这只是将第一个先决条件(../security/security_features.h)两次复制到两个目标(./include/security_features.h./include/this_features.h):

'../security/security_features.h' -> './include/security_features.h'
'../security/security_features.h' -> './include/this_features.h'

所以我现在有一个文件的src和目标位置的make变量列表 - 任何人都知道如何依次复制所有文件?

由于

马特

2 个答案:

答案 0 :(得分:4)

您的规则存在问题:

$(INCLUDES_DST): $(INCLUDES_SRC)
    @cp -av $< $@

是它使每个源头都成为每个目标头的先决条件,并且只复制第一个(使用$<)。

这样做:

.PHONY: INCLUDES
INCLUDES: $(INCLUDES_DST)

include/%: %
        cp $^ include

vpath %.h security this

粗略翻译,这意味着“制作include/something,找到something并将其复制到include/,在查找x.h形式的文件时,请查看security/this/。“

(请注意,如果您有两个具有相同名称的标题,则会错过其中一个标题,但在这种情况下,无论如何都无法将它们都放入include。)

如果你有很多源目录并且你不想全部输入它们,那么Make可以跟踪它们:

INCLUDE_PATHS := $(dir $(INCLUDES_SRC))

vpath %.h $(INCLUDE_PATHS)

答案 1 :(得分:0)

这是一个棘手的问题。我发现的最佳解决方案是:

FEATURES = a b c
HEADERS = $(foreach ftr,$(FEATURES),include/$(ftr)_feature.h)

default: $(HEADERS)
        @echo "Headers: $^"

$(HEADERS): include/%_feature.h: %

$(FEATURES):
        @echo "Copying $(subst DUMMY,$@,'../DUMMY/DUMMY_feature.h') to include/$@_feature.h"
        @cp $(subst DUMMY,$@,../DUMMY/DUMMY_feature.h) include/$@_feature.h

.PHONY: $(FEATURES)

更新:也许我应该解释一下这里发生的事情:

  1. 第一行定义了您的所有功能,即安全 。我简称为tham a,b和c。
  2. 标题名称来自您的功能名称。 E. g。功能 a 成为标题include/a_feature.h
  3. 默认目标需要所有标题
  4. $(HEADERS): include/%_feature.h: %允许所有头文件依赖于他们的基本功能名称,i。即它用 SOMETHING 替换* include / SOMETHING_feature.h *。
  5. 最后一个目标将头文件从该位置的目录复制到项目中的目标目录。
  6. 不幸的是,它没有检查../FEATURE目录中头文件的时间戳。

    干杯,

    马丁。