如何将makefile转换为JSON编译数据库?

Duc*_*een 23 c++ makefile compilation clang

假设我们的项目有make文件(不是cmake/premake/ninja等),它们适用于gcc和clang.我们希望从它们生成JSON编译数据库以将其提供给clang-modernize工具.怎么办这样的事情?(在clang基础设施中是否有任何解析器或某些使用类似make CC='cc_args.py gcc' CXX='cc_args.py g++'或其他工具的脚本)?

Eta*_*ner 22

我没有个人经验,但似乎是针对你的情况.(它是从clang-modernize网站链接的.)

  • 即使对于 Linux 内核模块也能很好地工作!非常感谢! (2认同)

Tan*_*z87 17

Make 具有将编译器命令行发送到其标准输出的通常不受欢迎的功能,但在这种情况下,您可以将它与 shell(和jq)管道一起使用。使用GNU Make on Bash:

make --always-make --dry-run \
 | grep -wE 'gcc|g\+\+' \
 | grep -w '\-c' \
 | jq -nR '[inputs|{directory:".", command:., file: match(" [^ ]+$").string[1:]}]' \
 > compile_commands.json
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,cmd.exe语法类似:

  • 使用^代替\换行
  • "仅使用-delimited 字符串
  • 用于在-delimited 字符串中"""转义 a""
  • 用于在-delimited 字符串中^^转义 a^"

但是,这不能处理 makefile 使用-C参数在子目录中递归调用自身(或其他 makefile)的情况。

  • 必须使用 `grep -E -w 'gcc|g++'` 作为第一个 grep,否则我没有结果。对于使用 msys/cygwin 的任何人,请将 jq 行替换为 `| jq -nR "[输入|{目录:\"$(cygpath -m $(pwd))\", 命令:., 文件: match(\" [^ ]+$\").string[1:]} ]”\` (2认同)

小智 6

也许有人和我有同样的情况。我有一个 macOS,而Bear正在生成一个空compile_commands.json文件。他们在自述文件中承认了这个问题,并建议使用scan-build作为解决方法。不幸的是,我仍然得到一个空文件。我发现的两个替代解决方案是:

  • Compiledb,在我的情况下有效。
  • clang++ 编译器选项-MJ加上 sed 的组合(详细信息请参见此处),看起来足够简单且易于转换为make目标。这个我没有测试过。