如果迭代.VARIABLES并打印每个,则可以使用以下规则正确打印任何真实变量:
print_variables: $(foreach V,$(.VARIABLES),print-$(V)) .phony_explicit
print-%: .phony_explicit; @echo "$* = \"$($*)\""
.PHONY: .phony_explicit ...
0行或1行函数仍然有效,但不再有Syntax error: Unterminated quote string
。只有一个多行函数会破坏整个print_variables
规则。作为一种解决方法,我在函数定义中的每一行添加了;\
,但这不会修复现有的多行函数(通过此makefile中的包含或通过其他makefile包括此函数。)我该怎么办?是否只有函数变量的容器,或者测试变量是否是函数定义的方法?
答案 0 :(得分:1)
一个简单的简单例子会更容易理解;这与.VARIABLES
,模式规则等无关(我不确定.phony_explicit
先决条件的重点是什么......)
define F
foo
bar
endef
print: ; echo "F = $(F)"
将显示问题:
echo "F = foo
/bin/sh: 1: Syntax error: Unterminated quoted string
这是因为当make看到一个包含配方中换行符的变量时,它会假定换行符意味着您希望变量的行成为配方中的行。
首先,你应该在发送给shell的字符串周围使用单引号,除非你需要shell来扩展它们;在这种情况下它无济于事,但总的来说它更安全。
真的没有办法撤消这个。你有很多选择。
第一种是不使用echo,而是使用make函数info
:
print-F: ; $(info F = "$(F)")
的产率:
F = "foo
bar"
另一种选择是使用subst
将换行替换为其他值。新值本身不能包含显式换行符,但您可以要求 shell 为您打印换行符:
# Create a variable containing a single newline
# Note this must contain TWO newlines!
define NL
endef
print-F: printf 'F = "$(subst %,%%,$(subst $(NL),\n,$(F))"\n'
收率:
printf 'F = "foo\nbar"\n'
F = "foo
bar"
最后一个选项是将您的makefile转换为使用.ONESHELL
功能,但我认为这只是让这个调试输出可用的步骤太远了。)。