我得到一个非常神秘的"不支持的ARCH"我尝试在GNU Make 4.1中打印变量定义时出错。
上下文是一个非常大的Makefile集合,它们相互包含并编译了一长串目标和全局变量(它是cyanogenmod android构建树)。
我已将目标添加到其中一个Makefile:
2273 .PHONY: showvars
2274 showvars:
2275 $(foreach v, $(.VARIABLES), $(info $(v) = $($(v))))
make showvars的输出是:
ALL_MODULES.TtsEngine.INTERMEDIATE_SOURCE_DIR = /elements/Data/Android/android-source/out/target/common/obj/APPS/TtsEngine_intermediates/src
ALL_MODULES.sound.BUILT = /elements/Data/Android/android-source/out/target/product/d851/obj/EXECUTABLES/sound_intermediates/sound
..
..
ALL_MODULES.CMFileManagerTests.MAKEFILE = packages/apps/CMFileManager/tests/Android.mk
build/core/Makefile:2275: *** Unsupported ARCH . Stop.
#### make failed to build some targets (01:36 (mm:ss)) ####
如何打印变量会导致架构错误?或者ARCH是下一个变量名,但那么错误是什么意思?
编辑: 我将$(info $(。VARIABLES))添加到同一个Makefile的末尾。此命令完成且没有错误,变量名称列表大约为3兆字节!的文字。 305个变量包含单词" ARCH"。但他们都打印得很好。一小时后运行多次(每次运行需要一分钟才能运行),答案是......
功能定义!如果v是函数的名称,则$($(v))运行该函数。不同的函数生成各种有趣的错误消息这是ARCH错误消息的来源,它来自函数define-libcompiler-rt-source-files,它恰好出现在我的原始测试中,紧跟在包含单词ARCH的变量名后面。
define get-libcompiler-rt-source-files
$(if $(findstring $(1),arm),$(call get-libcompiler-rt-arm-source-files),
$(if $(findstring $(1),mips),$(call get-libcompiler-rt-mips-source-files),
$(if $(findstring $(1),x86),$(call get-libcompiler-rt-x86-source-files),
$(if $(findstring $(1),x86_64),$(call get-libcompiler-rt-x86_64-source-files),
$(if $(findstring $(1),x32),$(call get-libcompiler-rt-x86-source-files),
$(if $(findstring $(1),arm64),$(call get-libcompiler-rt-arm64-source-files),
$(if $(findstring $(1),mips64),$(call get-libcompiler-rt-mips64-source-files),
$(error Unsupported ARCH $(1)))))))))
endef
那么,有没有办法获取所有已定义函数的列表,以便我可以将它们从变量列表中过滤掉来?