【问题标题】:How to find unused variables in a Makefile如何在 Makefile 中查找未使用的变量
【发布时间】:2021-10-25 18:51:42
【问题描述】:

我正在为一个项目维护一个 Makefile,其中包含许多变量声明:

DOCKER_IMAGE_VERSION := latest
DOCKER_EXPOSE_PORT := 8080
PIP := python -m pip
...

有时使用这些变量的行会被删除,这些声明就会过时。

是否有工具可以在 Makefile 中查找未使用的变量声明?

【问题讨论】:

  • 我不知道有这样的情况。你可以使用grep
  • 我可以一一grep,但是大多数现代编译器可以通过分析AST来向我发出警告。我希望 Makefile 也有一些东西。
  • 这里没有 AST。 makefile 本身不是“编译”的。每个配方都是一个文本 blob,它被传递给 shell 以执行,此外,对于任何给定的 make 执行,也没有办法知道其他执行(构建了其他一些目标集)是否可能使用了该变量。没有任何 GNU make 模式会搜索所有配方以查找被引用的变量。

标签: makefile unused-variables


【解决方案1】:

如果可以将变量更改为递归展开,可以使用以下技巧:

DOCKER_IMAGE_VERSION = latest$(warning DOCKER_IMAGE_VERSION accessed)

等,然后 grep 输出以查看它的访问位置。请注意,这不适用于立即扩展变量(因为警告出现在赋值而不是引用处)。另请注意,这只会在变量展开时打印,例如,如果它在一个从未运行的目标的配方中被引用,它不会输出日志。此外,如果它位于 makefile 中的 ifdef'd 位置,或者作为逻辑函数的一部分($(or...)$(if ...),其中参数被短路,则它不会输出日志。

但是,虽然它可能会丢失引用,但这个技巧的好处是,如果你有一个 makefile,你想假设不再使用一个变量,你可以这样做:

SOME_VAR = $(error use of deprecated variable)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2012-11-26
    • 2018-02-21
    相关资源
    最近更新 更多