在我的makefile中,我有一个变量“NDK_PROJECT_PATH”,我的问题是我如何在编译时将它打印出来?
我读了使文件回显“$PATH”字符串,我尝试了:
@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)
两者都给了我
"build-local.mk:102: *** missing separator. Stop."
有人知道为什么对我没用吗?
在我的makefile中,我有一个变量“NDK_PROJECT_PATH”,我的问题是我如何在编译时将它打印出来?
我读了使文件回显“$PATH”字符串,我尝试了:
@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”之前有一个制表符(尽管done: rule和action在很大程度上是多余的),但在@echo PATH=$(PATH)之前没有。
问题是,以all开头的行应该有冒号:或等号=来表示它是目标行或宏行,但它两者都没有,所以分隔符不见了。
响应变量值的操作必须与目标相关联,可能是虚拟目标或伪目标。目标行上必须有冒号。如果在示例makefile中添加a:并将下一行的前导空格替换为制表符,则可以正常工作。
您可能在原始makefile中的第102行附近遇到类似的问题。如果在出现失败的回显操作之前显示5行非空、非注释行,则很可能完成诊断。然而,由于这个问题是在2013年5月提出的,所以这个损坏的makefile现在(2014年8月)不太可能仍然可用,所以这个答案不能正式验证。它只能用来说明问题发生的一种合理的方式。
其他回答
make的所有版本都要求命令行缩进,第一个字符是制表符(而不是空格)。如果你向我们展示整个规则,而不是问题中的两行,我们可以给出更清晰的答案,但它应该是这样的:
myTarget: myDependencies
@echo hi
其中第二行第一个字符必须是TAB。
不需要修改Makefile。
$ cat printvars.mak
print-%:
@echo '$*=$($*)'
$ cd /to/Makefile/dir
$ make -f ~/printvars.mak -f Makefile print-VARIABLE
这个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月)不太可能仍然可用,所以这个答案不能正式验证。它只能用来说明问题发生的一种合理的方式。
运行make -n;它告诉你变量的值。
Makefile……
all:
@echo $(NDK_PROJECT_PATH)
命令:
export NDK_PROJECT_PATH=/opt/ndk/project
make -n
输出:
echo /opt/ndk/project
你可以在读取makefile时打印出变量(假设你已经适当地标记了这个问题),使用这个方法(使用一个名为“var”的变量):
$(info $$var is [${var}])
你可以把这个构造添加到任何recipe中,看看make会传递给shell什么:
.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world
现在,这里发生的事情是,make将整个食谱($(info $$var is [${var}])echo Hello world)存储为一个递归展开的变量。当make决定运行配方时(例如,当您告诉它构建所有时),它展开变量,然后将每一行结果分别传递给shell。
所以,在痛苦的细节中:
它扩展$(info $$var is [${var}])echo Hello world 为此,首先展开$(info $$var is [${var}]) $$变成字面上的$ ${var}变成:-)(说) 副作用是$var is[:-)]出现在标准输出 $(info…)的展开为空 Make留下echo Hello world 首先让打印在stdout上echo Hello world,让你知道它将要求shell做什么 shell在stdout上输出Hello world。