数字要由Make重建的文件

时间:2017-09-29 12:46:46

标签: makefile

有没有办法让make在实际编译之前确定要重新编译的文件数?问题是:考虑拥有一个包含数百个源文件的大项目。粗略地了解编译需要多长时间是非常方便的,但要知道,需要知道要编译的文件数。

3 个答案:

答案 0 :(得分:2)

一般的答案是否定的,因为你的构建可以生成文件,这些文件本身就是生成更多文件的其他规则的输入。等等。但是,如果粗略的答案足够好,您可以尝试--dry-run标志。来自GNU make documentation ...

  

“空操作”。 make make打印使目标更新所需的配方,但不实际执行它们。请注意,即使使用此标志,仍会执行某些配方(请参阅MAKE变量的工作原理)。此外,还需要更新包含的makefile所需的任何配方(请参阅如何重新制作Makefile)。

正如您所看到的,即使它的名称,--dry-run标志也会改变您的构建状态。

答案 1 :(得分:0)

" make -n"将干运行。但是你无法获得要重建的文件列表。也许你可以编写shell脚本来存储文件的最后修改时间并获取文件列表。

答案 2 :(得分:0)

我认为找到了一个适合unix的解决方案。这里SRC是你的源文件,HDR你的头文件和DEP依赖文件(比如DEP:= $(OBJ:.o = .d))

isInDepFile+=$(shell grep -q $(modifiedFile) $(depFile) 1>&2 2> /dev/null && echo $(depFile))

COMPFILES=

checkDepFiles=$(foreach depFile,$(DEP), $(eval filesToCompile+=$(isInDepFile))) $(thinOutDepFiles)

thinOutDepFiles=$(foreach fileToCompile,$(filesToCompile),$(eval DEP=$(filter-out $(fileToCompile),$(DEP))))

countFilesToCompile: $(SRC) $(HDR)
    $(eval modifiedFiles=$?)
    $(foreach modifiedFile,$(modifiedFiles), $(call checkDepFiles))
    $(eval numOfFilesToCompile = $(words $(filesToCompile)))
    $(eval numDepFiles = $(words $(DEP)))
    $(eval NumSRCFiles = $(words $(SRC)))
    @echo $(NumSRCFiles) sources
    @echo $(numDepFiles) files to leave
    @echo $(numOfFilesToCompile) files to compile
    @touch $@

首先在源文件和标题文件列表中生成已修改文件的列表。然后,对于每个修改的文件,它检查所有依赖项文件的文件名。如果依赖项文件包含我们正在查看的当前文件,则会将其添加到filesToCompile列表中。它也会从依赖项文件列表中删除,以避免重复 这可以在项目的主要建筑规则中调用。与干运行相比,它的优势在于它为您提供了一个简单的数字。