Makefile 对要通过Make重建的文件进行编号

Makefile 对要通过Make重建的文件进行编号,makefile,Makefile,有没有办法让make在实际编译之前确定要重新编译的文件数?问题是:考虑一个有数百个源文件的相当大的项目。大致了解编译需要多长时间非常方便,但要知道这一点,需要知道要编译的文件数量 一般的答案是否定的,因为您的构建可以生成文件,而这些文件本身就是生成更多文件的其他规则的输入。等等但是,如果粗略的回答足够好,您可以尝试使用--dry run标志。从 “无操作”。使make打印使目标更新所需的配方,但不实际执行它们。请注意,即使使用此标志,仍会执行某些配方(请参见MAKE变量的工作方式)。此外,更新包

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

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

“无操作”。使make打印使目标更新所需的配方,但不实际执行它们。请注意,即使使用此标志,仍会执行某些配方(请参见MAKE变量的工作方式)。此外,更新包含的makefiles所需的任何配方仍将执行(请参见如何重新生成makefiles)


正如您所看到的,尽管名称不同,但即使是
--dry run
标志也会更改构建的状态。

“make-n”将执行dry run。但是您无法获取要重建的文件列表。可能您可以编写shell脚本来存储文件的上次修改时间,并获取文件列表。

我认为a为unix找到了一个不错的解决方案。这里SRC是您的源文件,HDR是您的头文件,DEP是依赖文件(类似于DEP:=$(OBJ:.o=.d))

这首先在源文件和头文件列表中生成一个修改文件列表。然后,对于每个修改过的文件,它检查所有依赖项文件的文件名。如果依赖项文件包含我们正在查看的当前文件,它将添加到filesToCompile列表中。它也从依赖项文件列表中删除,以避免重复。

这可以在项目的主建筑规则中调用。与干运行相比,它的优点是,它提供了一个简单的数字供您使用。

是的,这可能是一个选项,尽管它可能会变得复杂,包括依赖项。
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 $@