我在各种文件夹中有多个文件需要复制到一个包含文件夹:
在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专家吗?
谢谢,
马特
我已经设法完成了这样的文件列表:
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变量列表 - 任何人都知道如何依次复制所有文件?
由于
马特
答案 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)
更新:也许我应该解释一下这里发生的事情:
include/a_feature.h
。$(HEADERS): include/%_feature.h: %
允许所有头文件依赖于他们的基本功能名称,i。即它用 SOMETHING 替换* include / SOMETHING_feature.h *。不幸的是,它没有检查../FEATURE目录中头文件的时间戳。
干杯,
马丁。