我知道有许多针对编程语言的代码检查工具,如Python的pep8
,但我从未遇到过适用于makefile
的检查工具。是否有这样的makefile
检查工具?
除了运行makefile
来检测错误或问题之外,还有其他以编程方式进行检测的方法吗?
随着我对makefile
的使用越来越深入,它变得越来越复杂和冗长,因此使用检查工具可以使makefile
更易读。
空格是可读性的一个方面,因为制表符和空格在make文件中有不同的语义。默认情况下,Emacs makefile-mode
会在你试图保存具有错误空格制表符的make文件时警告你“可疑”的行。也许可以在批处理模式下运行emacs,并从该模式调用解析和验证函数。如果有人开始实现这样一个make file lint实用程序,那么Emacs lisp模式可能是一个有趣的检查点。
关于检查正确性,@Mark Galeck在他的回答中已经提到了--warn-undefined-variables
。问题在于未定义但标准化变量有很多输出。为了改进这个想法,可以添加一个简单的包装器来过滤有关这些变量消息,以便发现真正的拼写错误。在这种情况下,make
可以使用--just-print
选项(也称为-n
或--dry-run
)运行,以便不运行实际的命令来构建目标。
在使用--just-print
选项运行make时不执行任何更改并不是一个好主意。我们可以搜索$(shell ...)
函数调用,并尝试确保其中没有任何更改。我们可以首先检查以下内容:$(shell pwd)
和一些其他常见的非破坏性用法是可以的,但其他任何情况都应引发手动检查的警告。
我们可以搜索不跟随(
的$
(可能类似于使用POSIX正则表达式表示的[$][^$(][[:space:]]
),以捕获类似$VARIABLE
的情况,它解析为$(V)ARIABLE
,这可能不是作者想要的,也不是良好的风格。
make文件的问题在于它们具有所有嵌套结构,例如$(shell)
、$(call)
、$(eval)
和规则评估;结果可以从环境或命令行输入或调用make调用而更改;此外,还有许多隐式规则或其他定义,使得进行任何更深层次的语义分析都很困难。我认为全面的make lint实用程序不可行(除了可能内置于make实用程序本身),但一些编码准则和启发式检查已经非常有用。