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



如果迭代.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规则。作为一种变通方法,我在函数定义的每一行中都添加了;,但这并不能修复现有的多行函数(通过此生成文件中的includes或通过包括此生成文件在内的其他生成文件)。我该怎么办?有没有一个只包含函数变量的容器,或者一种测试变量是否是函数定义的方法?

一个简单的最小示例会更容易理解;这与.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 = "foonbar"n'
F = "foo
bar"

最后一个选项是将makefile转换为使用.ONESHELL功能,但我认为这一步太远了,无法获得调试输出:)。

最新更新