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

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

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

两者都给了我

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

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


当前回答

运行make -n;它告诉你变量的值。

Makefile……

all:
        @echo $(NDK_PROJECT_PATH)

命令:

export NDK_PROJECT_PATH=/opt/ndk/project
make -n 

输出:

echo /opt/ndk/project

其他回答

根据GNU制作手册以及下面答案中的“bobbogo”所指出的, 你可以使用info / warning / error来显示文本。

$(error   text…)
$(warning text…)
$(info    text…)

要打印变量,

$(error   VAR is $(VAR))
$(warning VAR is $(VAR))
$(info    VAR is $(VAR))

'error'将在显示错误字符串后停止make执行

如果您只是想要一些输出,则需要单独使用$(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/...]

问题是echo只在执行块下工作。即任何在“xx:”之后的内容

因此,第一个执行块以上的任何内容都只是初始化,因此不能使用任何执行命令。

因此,创建一个执行块

这个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月)不太可能仍然可用,所以这个答案不能正式验证。它只能用来说明问题发生的一种合理的方式。

下面的命令在Windows上为我做了这件事:

Path | tr ; "\n"