在我的Makefile中,我有一个变量'NDK_PROJECT_PATH',我的问题是如何在它编译时打印它?
我读了Make file echo displaying "$PATH" string并尝试了:
@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)
两者都给了我
"build-local.mk:102: *** missing separator. Stop."
有人知道为什么对我不起作用吗?
在我的Makefile中,我有一个变量'NDK_PROJECT_PATH',我的问题是如何在它编译时打印它?
我读了Make file echo displaying "$PATH" string并尝试了:
@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)
两者都给了我
"build-local.mk:102: *** missing separator. Stop."
有人知道为什么对我不起作用吗?
makefile
会产生“缺少分隔符”的错误提示:all
@echo NDK_PROJECT_PATH=$(NDK_PROJECT_PATH)
done:
@echo "All done"
@echo "All done"
前面有一个制表符(tab)(尽管done:
规则和操作大多是多余的),但在@echo PATH=$(PATH)
之前没有。
问题在于以all
开头的行应该有一个冒号:
或等号=
来表示它是目标行还是宏行,但它既没有,因此分隔符缺失。
回显变量值的操作必须与目标关联,可能是虚拟或PHONEY目标。并且该目标行必须有一个冒号。如果在示例makefile
中的all
后面添加一个:
,并将下一行的前导空格替换为制表符,则会正常工作。
您可能在原始makefile
的第102行附近有类似的问题。如果在失败的回声操作之前显示5个非空白、非注释行,则可能能完成诊断。然而,由于问题是在2013年5月提出的,现在(2014年8月)不太可能仍然有损坏的makefile
可用,因此这个答案无法正式验证。它只能用来说明问题发生的一种合理方式。
dispvar = echo $(1)=$($(1)) ; echo
.PHONY: vars
vars:
@$(call dispvar,SOMEVAR1)
@$(call dispvar,SOMEVAR2)
这可以以通用的方式完成,并且在调试复杂的makefile时非常有用。按照另一个答案中描述的相同技术,您可以将以下内容插入到任何makefile中:
# if the first command line argument is "print"
ifeq ($(firstword $(MAKECMDGOALS)),print)
# take the rest of the arguments as variable names
VAR_NAMES := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# turn them into do-nothing targets
$(eval $(VAR_NAMES):;@:))
# then print them
.PHONY: print
print:
@$(foreach var,$(VAR_NAMES),\
echo '$(var) = $($(var))';)
endif
然后你只需执行 "make print" 命令来打印任何变量的值:
$ make print CXXFLAGS
CXXFLAGS = -g -Wall
在Windows上,以下命令可以为我完成此操作:
Path | tr ; "\n"
在编程中,如果我想查看变量的值,通常会使用错误输出。但这只是为了查看变量的值,它会停止程序的执行。
@echo $(error NDK_PROJECT_PATH= $(NDK_PROJECT_PATH))
@echo $(NDK_PROJECT_PATH)
将无法正常工作,并显示错误*** missing separator. Stop."
。如果您想在Android Make中打印变量,请使用this answer。NDK_PROJECT_PATH := some_value
$(warning $(NDK_PROJECT_PATH))
那对我有用