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

Makefile-将多个文件夹中的头文件复制到一个包含依赖项的文件夹中,makefile,Makefile,我在不同文件夹中有多个文件,需要复制到一个包含文件夹: 制作前 制造后 ./include文件夹中的文件都需要依赖于各个文件夹中的文件 Makefiles对我来说有点神秘,我试着阅读手册并了解如何建立依赖关系: ./include/security_features.h: ../security/security_features.h @cp -av $< $@ 并且可以使一个依赖于另一个: $(INCLUDES_DST): $(INCLUDES_SRC) @cp -av

我在不同文件夹中有多个文件,需要复制到一个包含文件夹:

制作前

制造后

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

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

./include/security_features.h: ../security/security_features.h
    @cp -av $< $@
并且可以使一个依赖于另一个:

$(INCLUDES_DST): $(INCLUDES_SRC)
    @cp -av $< $@
所以我现在有了一个src变量列表和文件的目标位置-有人知道如何依次复制所有文件吗

谢谢


马特:这是个棘手的问题。我找到的最佳解决方案是:

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)
更新:也许我应该解释一下这里发生了什么:

第一行定义了您的所有特性,即安全性、这个和那个。我simpy打电话给tham a、b和c。 标题名称源自要素名称。例如。特征a变为标题include/a_feature.h。 默认目标需要所有标题 行$HEADERS:include/%\u feature.h:%允许所有头文件依赖于它们的基本功能名称,即。E它将*include/SOMETHING\u feature.h*替换为某物。 最后一个目标将头文件从位置目录复制到项目中的目标目录。 不幸的是,它没有检查../FEATURE目录中头文件的时间戳

干杯


马丁。

你的规则有问题:

$(INCLUDES_DST): $(INCLUDES_SRC)
    @cp -av $< $@
粗略地翻译,这意味着创建include/something,查找某物并将其复制到include/,当查找格式为x.h的文件时,查找security/和this/

请注意,如果您有两个同名的标题,这将丢失其中一个,但在这种情况下,您无论如何都无法将它们都包含在include中

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

INCLUDE_PATHS := $(dir $(INCLUDES_SRC))

vpath %.h $(INCLUDE_PATHS)

你真的需要依赖吗?瞧,你是只想在文件发生更改时复制,还是总是想复制?这样就可以了。我现在学到了很多关于makefile的知识,以及可以使用的make函数。谢谢你的回答。
'../security/security_features.h' -> './include/security_features.h'
'../security/security_features.h' -> './include/this_features.h'
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)
$(INCLUDES_DST): $(INCLUDES_SRC)
    @cp -av $< $@
.PHONY: INCLUDES
INCLUDES: $(INCLUDES_DST)

include/%: %
        cp $^ include

vpath %.h security this
INCLUDE_PATHS := $(dir $(INCLUDES_SRC))

vpath %.h $(INCLUDE_PATHS)