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

时间:2014-01-15 09:53:47

标签: c++ compilation makefile clang

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

4 个答案:

答案 0 :(得分:21)

我没有个人经验,但Bear似乎是针对您的情景。 (它是从clang-modernize网站链接的。)

答案 1 :(得分:10)

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

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

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

  • 使用^代替\进行行连续
  • 仅使用"分隔的字符串
  • 使用"""来分隔"分隔的字符串中的"
  • 使用^^来分隔^分隔的字符串中的"

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

答案 2 :(得分:2)

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

  • compiledb,在我的案例中有效。
  • clang ++编译器的-MJ选项加上sed的详细here的组合,看起来很简单,也很容易转换成make目标。我还没有测试过。

答案 3 :(得分:1)

如果您没有安装Bear / compiledb的权限,或者您无法从源代码构建Bear,那么Web应用程序可以提供帮助。

我在https://texttoolkit.com/compilation-database-generator处构建了一个简单的Web应用程序,该应用程序从make输出生成compile_commands.json