gpt4 book ai didi

makefile - Gnu Make 自动依赖生成

转载 作者:行者123 更新时间:2023-12-01 13:19:25 25 4
gpt4 key购买 nike

基于 this famous link改编自 this gist , 并且假设你所有的源文件都是 .cpp, 你很容易得到这样的解决方案来自动生成依赖:

SRCS := $(wildcard *.cpp */*.cpp)

DEPDIR := .d
DEPS := $(SRCS:%.cpp=$(DEPDIR)/%.d)

# Temporary .Td dependence file... ?
DEPFLAGS = -MT $@ -MD -MP -MF $(DEPDIR)/$*.Td

# Isn't it better a order-only prerequisite?
$(shell mkdir -p $(dir $(DEPS)) >/dev/null)

%.o: %.cpp # Removal of implicit rules... ? Twice?
%.o: %.cpp $(DEPDIR)/%.d # Dependency on .d... ?
g++ -o $@ $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c $<
# Avoid some bugs?
mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d && touch $@

# If the `%.d` dependency is removed, is this still necessary?
.PRECIOUS = $(DEPDIR)/%.d
$(DEPDIR)/%.d: ;

-include $(DEPS)

为了不让这个问题太长,深入讨论为什么我认为上面代码段中评论的所有行都是不必要的,我会以简短的形式提问;如果我只是将此代码段更改为:

SRCS := $(wildcard *.cpp */*.cpp)
DEPDIR := .d
DEPS := $(SRCS:%.cpp=$(DEPDIR)/%.d)

DEPFLAGS := -MT $@ -MD -MP -MF $(DEPDIR)/$*.d

$(DEPDIR)/%:
mkdir -p $@

%.o: %.cpp | $(DEPDIR)/$(dir %)
g++ -o $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c $<
# touch $(DEPDIR)/$.d # ??

-include $(DEPS)

我还有两个疑惑;在上面的第一个链接中,它说

it’s been reported that some versions of GCC may leave the object file older than the dependency file, which causes unnecessary rebuilds.

然而,在gist(上面的第二个链接)中,touch 命令被删除了,并且由于依赖文件不再是任何规则的先决条件,是否有任何有理由保留它吗?这个“gcc bug”是否仍然以任何形式存在?

第二个疑点与目录创建有关,移至order-only规则;我是否需要制定“仅订单”$(DEPDIR)/% 规则 .PRECIOUS?我不知道如果 %.o 配方失败,make 是否会尝试删除目录,因为我不知道仅顺序规则的具体特征。

最佳答案

您不能删除 %.d 先决条件。需要这个的原因 is explained在您链接的页面中。

我不知道您的评论是什么意思删除隐式规则...?两次?。需要删除隐式规则,以确保使用我们的新隐式规则,并且我们只将其删除一次。

临时文件 .Td 用于防止有人在创建此文件的过程中使用 ^C 或类似命令终止他们的 make 作业。通过写入一个临时文件然后只在我们知道它完成后才自动替换真实文件,我们永远不必担心部分文件可能导致下一次调用 make 产生错误,或者更糟的是,不重新编译应该是的源文件重新编译。

关于关于早于依赖文件的目标文件的评论,首先你链接到的要点使用 clang 而不是 GCC,也许 Clang 没有这个问题(或者它可能有但人们没有'没有意识到)。其次,博客文章的更新相对较新,因为人们已经通过 GCC 向我报告了这个问题。我自己没有看到它(我只使用 GCC)所以可能这只是某些版本的 GCC 的问题。

关于 .PRECIOUSmake 从不(当前)递归删除目录,因此无论该设置如何,它都不会删除任何非空目录。

关于makefile - Gnu Make 自动依赖生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179100/

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