【问题标题】:How to debug GNU make's variable assignment如何调试 GNU make 的变量赋值
【发布时间】:2020-12-11 18:14:28
【问题描述】:

我的 Makefile 包含类似的东西

BASE_VAR=$(cat path/to/value.txt)

DERIVED_VAR=$(if $(BASE_VAR),foo,bar)

这不会产生我预期的结果。 make --debug=a 会生成详细的跟踪信息,但 path/to/value.txt 不会出现在其中的任何位置。如何在 makefile 中调试这种变量赋值?

【问题讨论】:

  • 我不完全确定我理解你想要达到的目标,但我怀疑 BASE_VAR=$(cat path/to/value.txt) 应该是 BASE_VAR=$(shell cat path/to/value.txt)
  • 我不想帮助调试这组特定的变量。我想了解如何调试 make 如何一般地 填充其变量。输出如“执行foo bar 并将'RESULT'分配给VARIABLE”。
  • Make 没有提供类似的东西。你只需要知道它是如何工作的。喜欢的可以看翻拍:bashdb.sourceforge.net/remake
  • 你可以运行make -p,make会打印出它解析的最终结果。这在某些情况下可能会有所帮助,但不会帮助您解决上述错误。

标签: debugging makefile


【解决方案1】:

问题来自:

BASE_VAR=$(cat path/to/value.txt)

由于没有生成变量或名为cat path/to/value.txt 的宏扩展 $(cat path/to/value.txt) 产生空字符串。如果你想用文件path/to/value.txt的内容设置变量BASE_VAR,你需要shell make函数:

BASE_VAR = $(shell cat path/to/value.txt)

关于你关于调试变量的问题,在你的情况下最简单的可能是使用info make 函数:

$ cat Makefile
BASE_VAR = $(shell cat path/to/value.txt)
DERIVED_VAR = $(if $(BASE_VAR),foo,bar)

.PHONY: debug
debug:
    $(info BASE_VAR = $(BASE_VAR))
    $(info DERIVED_VAR = $(DERIVED_VAR))

$ make debug
BASE_VAR = blah
DERIVED_VAR = foo
make: Nothing to be done for 'debug'.

但是特定于目标的变量在不同的目标中具有不同的值。在感兴趣的目标的配方中使用$(info ...)

target: VAR = value

target: ...
    $(info VAR of $@ = $(VAR))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多