如何计算makefile for循环中的操作并对某些计数值采取措施?

时间:2015-06-10 22:55:39

标签: android makefile

AOSP makefile会输出很多"包括文件......"线。我想稍微减少一点,只打印每10或100包括。

来自build/core/main.mk的原始行:

$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))

我想不经常打印包含...行。

1 个答案:

答案 0 :(得分:0)

此代码使用shell和eval函数更新计数。然后它进行简单的模式匹配,查找以00结尾的任何数字。

define count_includes
    $(eval INCLUDE_COUNT := $(shell echo "$$(( $(INCLUDE_COUNT) + 1 ))" ) ) \
    $(if $(patsubst %00,,$(INCLUDE_COUNT)),,$(info $(INCLUDE_COUNT): including $(1) ...) )
endef

$(foreach mk, $(subdir_makefiles), $(call count_includes, $(mk))$(eval include $(mk)))

注意:我无需在上面初始化INCLUDE_COUNT,因为它从空/未定义开始,$(( + 1 ))评估为1

我使用原始代码运行了几个测试,此代码和所有打印都已删除。我的机器上的所有时间都在35秒内的1秒内。所以,没有真正的性能损失。

这是我用于测试的makefile:

define count_includes
    $(eval INCLUDE_COUNT := $(shell echo "$$(( $(INCLUDE_COUNT) + 1 ))" ) ) \
    $(if $(patsubst %00,,$(INCLUDE_COUNT)),,$(info $(INCLUDE_COUNT): including $(1) ...) )
endef

FILELIST := $(wildcard /usr/share/man/man1/*)
$(foreach mk, $(FILELIST), $(call count_includes, $(mk)))

.PHONY: all
all:
    @echo "All done." $(INCLUDE_COUNT)

如果我希望模式匹配以外的时间间隔为0,我可能会使用shell命令输出当前计数和测试结果,然后拆分结果字符串。这只是为了避免另一个shell调用。