![]() |
骑白马的小蝌蚪 · 数据湖构建—如何构建湖上统一的数据权限-阿里 ...· 11 月前 · |
![]() |
小眼睛的葡萄酒 · Swift:Date+Extension-阿 ...· 1 年前 · |
![]() |
冲动的树叶 · 如何通过永洪BI连接AnalyticDBMy ...· 1 年前 · |
![]() |
怕考试的鼠标 · tinyxml2 ...· 1 年前 · |
在我的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."
有人知道为什么它对我不起作用吗?
@echo $(NDK_PROJECT_PATH)是一种很好的方法。我不认为错误来自那里。通常,当您输入错误的提示时,会出现此错误:我认为您应该有制表符的地方有空格。
所有版本的
make
都要求命令行的第一个字符使用制表符(而不是空格)进行缩进。如果您向我们展示了整个规则,而不仅仅是这两行,我们就可以给出更清晰的答案,但它应该是这样的:
myTarget: myDependencies
@echo hi
其中第二行的第一个字符必须是TAB。
运行
make -n
;它将显示变量的值。
生成文件...
all:
@echo $(NDK_PROJECT_PATH)
命令:
export NDK_PROJECT_PATH=/opt/ndk/project
make -n
输出:
echo /opt/ndk/project
此
makefile
将生成“缺少分隔符”错误消息:
all
@echo NDK_PROJECT_PATH=$(NDK_PROJECT_PATH)
done:
@echo "All done"
在
@echo "All done"
之前有一个选项卡(尽管
done:
规则和操作在很大程度上是多余的),但不是在
@echo PATH=$(PATH)
之前。
问题是,开始
all
的行应具有冒号
:
或等于
=
,以指示它是目标行或宏行,并且两者都没有,因此缺少分隔符。
回显变量值的操作必须与目标关联,可能是虚拟目标或伪目标。并且目标行上必须有冒号。如果您在示例
makefile
中的
all
之后添加一个
:
,并用制表符替换下一行的前导空白,它将正常工作。
您可能在原始
makefile
的第102行附近遇到了类似的问题。如果在回显操作失败之前显示了5行非空白、非注释行,则可能可以完成诊断。然而,由于这个问题是在2013年5月提出的,故障的
makefile
现在(2014年8月)不太可能仍然存在,所以这个答案不能被正式验证。它只能用来说明问题发生的一种合理方式。
来自“Make post先生”的 https://www.cmcrossroads.com/article/printing-value-makefile-variable
将以下规则添加到Makefile中:
print-% : ; @echo $* = $($*)
然后,如果您想要找出makefile变量的值,只需:
make print-VARIABLE
然后它就会返回:
VARIABLE = the_value_of_the_variable
您可以在make文件中创建一个vars规则,如下所示:
dispvar = echo $(1)=$($(1)) ; echo
.PHONY: vars
vars:
@$(call dispvar,SOMEVAR1)
@$(call dispvar,SOMEVAR2)
这里有一些更健壮的方法来转储所有变量: gnu make: list the values of all variables (or "macros") in a particular run 。
问题是echo只能在执行块下工作。即"xx:“之后的任何内容
因此,第一个执行块以上的任何内容都只是初始化,因此不能使用任何执行命令。
所以创建一个执行区块
这可以通过一种通用的方式来完成,并且在调试复杂的makefile时非常有用。遵循与 another answer 中所述的相同技术,您可以将以下内容插入到任何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
如果不想修改Makefile本身,可以使用
--eval
添加一个新目标,然后执行新目标,例如
make --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
可以使用
CTRL-V, TAB
在命令行中插入所需的制表符
上面的Makefile示例:
all: do-something
TESTS=
TESTS+='a'
TESTS+='b'
TESTS+='c'
do-something:
@echo "doing something"
@echo "running tests $(TESTS)"
@exit 1
如果你使用android make,
@echo $(NDK_PROJECT_PATH)
将无法工作,如果你试图在android make中打印变量,会出现
*** missing separator. Stop."
this answer
错误
NDK_PROJECT_PATH := some_value
![]() |
骑白马的小蝌蚪 · 数据湖构建—如何构建湖上统一的数据权限-阿里云开发者社区 11 月前 |