打印变量,包括Makefile和/或变量自省中的函数

时间:2017-01-18 16:32:11

标签: function makefile multiline introspection

如果迭代.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包括此函数。)我该怎么办?是否只有函数变量的容器,或者测试变量是否是函数定义的方法?

1 个答案:

答案 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功能,但我认为这只是让这个调试输出可用的步骤太远了。)。