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

Posted

技术标签:

【中文标题】Makefile - 将多个文件夹中的头文件复制到一个包含依赖项的包含文件夹中【英文标题】:Makefile - Copy header files from multiple folders into one include folder with dependecies 【发布时间】:2010-12-17 12:14:55 【问题描述】:

我需要将多个文件夹中的多个文件复制到一个包含文件夹中:

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 文件夹中的文件都需要依赖于各个文件夹中的文件。

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

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

但我必须对我的所有文件都这样做 - 还有其他更优雅的方法吗?

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

那里有任何 Makefile 大师吗?

谢谢,

马特

更新:

我已经设法做这样的文件列表:

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 变量列表 - 有人知道如何依次复制所有文件吗?

谢谢

马特

【问题讨论】:

你真的需要依赖吗? IOW,您是否只想在文件更改时进行复制,还是您总是想要进行复制? 【参考方案1】:

你的规则的问题:

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

是它使每个源标头成为每个目标标头的先决条件,并且只复制第一个(带有$&lt;)。

这样就可以了:

.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)

【讨论】:

就可以了。我现在学到了很多关于 Makefile 和你可以使用的 make 函数的知识。感谢您的回答。【参考方案2】:

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

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)

更新:也许我应该解释一下这里发生了什么:

    第一行定义了您的所有功能,即securitythisthat。我简单地称它们为 a、b 和 c。 标头名称源自您的功能名称。例如。功能 a 成为标题 include/a_feature.h。 默认目标需要所有标题 $(HEADERS): include/%_feature.h: % 行让所有头文件都依赖于它们的基本功能名称,即。 e.它将 *include/SOMETHING_feature.h* 替换为 SOMETHING。 最后一个目标将头文件从该位置的目录复制到项目内的目标目录。

很遗憾,它不检查 ../FEATURE 目录中头文件的时间戳

干杯,

马丁。

【讨论】:

以上是关于Makefile - 将多个文件夹中的头文件复制到一个包含依赖项的包含文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

如何将后缀应用于makefile中的多个文件?

一点一点学写Makefile-增加第三方库和头文件

解释c中的头文件路径

Linux下多个.c文件的编译和Makefile文件

更新linux中的包含路径

Makefile 包含来自其他目录的头文件