如何在makefile中打印变量

363

在我的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."

有人知道为什么对我不起作用吗?

16个回答

3
这个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可用,因此这个答案无法正式验证。它只能用来说明问题发生的一种合理方式。


1

1

这可以以通用的方式完成,并且在调试复杂的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

0

在Windows上,以下命令可以为我完成此操作:

Path | tr ; "\n"

0

在编程中,如果我想查看变量的值,通常会使用错误输出。但这只是为了查看变量的值,它会停止程序的执行。

@echo $(error NDK_PROJECT_PATH= $(NDK_PROJECT_PATH))


0
如果您使用Android Make(mka),@echo $(NDK_PROJECT_PATH)将无法正常工作,并显示错误*** missing separator. Stop."。如果您想在Android Make中打印变量,请使用this answer
NDK_PROJECT_PATH := some_value
$(warning $(NDK_PROJECT_PATH))

那对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接