gpt4 book ai didi

gnu-make - gnu make 将许多文件复制到一个位置

转载 作者:行者123 更新时间:2023-12-04 07:52:13 27 4
gpt4 key购买 nike

这个问题与问题 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变量的约束下,如何编写规则以达到预期的效果。

最佳答案

应该这样做:

HFILES = $(notdir $(HEADERS))
DIRS = $(dir $(HEADERS))

TARGETS = $(addprefix $(INCDIR)/, $(HFILES))

all: $(TARGETS)

$(INCDIR)/%.h: %.h
cp $< $@

vpath %.h $(DIRS)

关于gnu-make - gnu make 将许多文件复制到一个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com