渲染 makefile 定义

Rendering makefile defines

是否可以渲染 makefile?

我有一个复杂的包含包含的 makefile,我需要调试它。 当我键入 make -f test.mk 并按 Tab 键时,它会显示所有可用的目标,包括那些动态声明的目标。

这意味着,make 可以非常快速地呈现 makefile,所以我想问一下是否可以将呈现的文件保存在某个地方。

示例生成文件:

define define_target
$(eval _target_name := $(1))
$(info Defining a target: $(_target_name))
$(_target_name):
    @echo $(_target_name) triggererd.
endef

$(eval $(call define_target,test))
$(eval $(call define_target,echo))

all: test
all: echo
all:
    @echo Done!

在终端中:

peter@peterpc:~/test$ make  # Double Tab pressed here to trigger autocompletion
all   echo  test            # All targets except the "all" were defined dynamically!
peter@peterpc:~/test$ make all
Defining a target: test
Defining a target: echo
test triggererd.
echo triggererd.
Done!

期望的输出:

test:
    @echo test triggered.

echo:
    @echo echo triggered.

all: test
all: echo
all:
    @echo Done!

制表符完成功能不是由 make 直接提供的。有人已经创建了一个 bash 脚本来为您完成这些……这是 bash_completion 包的一部分。此完成的作用是使用 -p-n-q 选项调用 make,然后解析输出以查找目标名称。

所以,简而言之,您可以通过 运行 make -npq "render" 生成文件(对于它的某些定义)并查看输出。请注意,这看起来不像预处理器的输出,它显示带有扩展变量等的确切 makefile,但其他方面相同。这将是所有解析完成后 make 内部数据结构的转储(尽管以通常类似于 makefile 的格式打印)。