Makefile 对要通过Make重建的文件进行编号
有没有办法让make在实际编译之前确定要重新编译的文件数?问题是:考虑一个有数百个源文件的相当大的项目。大致了解编译需要多长时间非常方便,但要知道这一点,需要知道要编译的文件数量 一般的答案是否定的,因为您的构建可以生成文件,而这些文件本身就是生成更多文件的其他规则的输入。等等但是,如果粗略的回答足够好,您可以尝试使用Makefile 对要通过Make重建的文件进行编号,makefile,Makefile,有没有办法让make在实际编译之前确定要重新编译的文件数?问题是:考虑一个有数百个源文件的相当大的项目。大致了解编译需要多长时间非常方便,但要知道这一点,需要知道要编译的文件数量 一般的答案是否定的,因为您的构建可以生成文件,而这些文件本身就是生成更多文件的其他规则的输入。等等但是,如果粗略的回答足够好,您可以尝试使用--dry run标志。从 “无操作”。使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 $@