首页 > 解决方案 > 如何调试 GNU make 的变量赋值

问题描述

我的 Makefile 包含类似

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

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

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

标签: debuggingmakefile

解决方案


问题来自:

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

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

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

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

$ 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))

推荐阅读