在我的makefile中,我有一个变量“NDK_PROJECT_PATH”,我的问题是我如何在编译时将它打印出来?

我读了使文件回显“$PATH”字符串,我尝试了:

@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)

两者都给了我

"build-local.mk:102: *** missing separator.  Stop."

有人知道为什么对我没用吗?


当前回答

来自“Mr. Make post” https://www.cmcrossroads.com/article/printing-value-makefile-variable

在Makefile中添加以下规则:

print-%  : ; @echo $* = $($*)

然后,如果你想找出makefile变量的值,只需:

make print-VARIABLE

它会返回:

VARIABLE = the_value_of_the_variable

其他回答

@echo $(NDK_PROJECT_PATH)是一个很好的方法。 我不认为错误来自这里。 通常,当您键入错误的意图时,会出现此错误:我认为您在应该有制表符的地方有空格。

make的所有版本都要求命令行缩进,第一个字符是制表符(而不是空格)。如果你向我们展示整个规则,而不是问题中的两行,我们可以给出更清晰的答案,但它应该是这样的:

myTarget: myDependencies
        @echo hi

其中第二行第一个字符必须是TAB。

如果您只是想要一些输出,则需要单独使用$(info)。你可以在Makefile的任何地方这样做,它会显示这一行何时被求值:

$(info VAR="$(VAR)")

将输出VAR="<值的VAR>"每当make处理该行。这种行为非常依赖于位置,所以你必须确保$(info)展开发生在所有可以修改$(VAR)的事情已经发生之后!

一个更通用的选项是创建一个特殊的规则来打印变量的值。一般来说,规则是在变量赋值之后执行的,因此这将显示实际使用的值。(尽管规则可以改变变量。)良好的格式将有助于阐明变量的设置,而$(flavor)函数将告诉您某个变量的类型。所以在这个规则中:

print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true

$* expands to the stem that the % pattern matched in the rule. $($*) expands to the value of the variable whose name is given by by $*. The [ and ] clearly delineate the variable expansion. You could also use " and " or similar. $(flavor $*) tells you what kind of variable it is. NOTE: $(flavor) takes a variable name, and not its expansion. So if you say make print-LDFLAGS, you get $(flavor LDFLAGS), which is what you want. $(info text) provides output. Make prints text on its stdout as a side-effect of the expansion. The expansion of $(info) though is empty. You can think of it like @echo, but importantly it doesn't use the shell, so you don't have to worry about shell quoting rules. @true is there just to provide a command for the rule. Without that, make will also output print-blah is up to date. I feel @true makes it more clear that it's meant to be a no-op.

运行它,你得到

$ make print-LDFLAGS
LDFLAGS is a recursive variable set to [-L/Users/...]

这个makefile将生成'缺少分隔符'错误消息:

all
    @echo NDK_PROJECT_PATH=$(NDK_PROJECT_PATH)

done:
        @echo "All done"

在@echo“All done”之前有一个制表符(尽管done: rule和action在很大程度上是多余的),但在@echo PATH=$(PATH)之前没有。

问题是,以all开头的行应该有冒号:或等号=来表示它是目标行或宏行,但它两者都没有,所以分隔符不见了。

响应变量值的操作必须与目标相关联,可能是虚拟目标或伪目标。目标行上必须有冒号。如果在示例makefile中添加a:并将下一行的前导空格替换为制表符,则可以正常工作。

您可能在原始makefile中的第102行附近遇到类似的问题。如果在出现失败的回显操作之前显示5行非空、非注释行,则很可能完成诊断。然而,由于这个问题是在2013年5月提出的,所以这个损坏的makefile现在(2014年8月)不太可能仍然可用,所以这个答案不能正式验证。它只能用来说明问题发生的一种合理的方式。

如果我想查看变量值,我通常会返回一个错误。(除非你想看看价值。它将停止执行。)

@echo $(NDK_PROJECT_PATH = $(NDK_PROJECT_PATH))