【问题标题】:How to turn makefile into JSON Compilation Database?如何将 makefile 转换为 JSON 编译数据库?
【发布时间】:2014-02-03 17:27:00
【问题描述】:

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

【问题讨论】:

  • 你看过github.com/rizsotto/Bear吗? (哪个是从 clang-modernize 网站链接的?
  • @EtanReisner:这就是答案。
  • 在我看来,这是一个非常有趣的问题。也许关闭它是一个错误。里德斯
  • 我最近发现了一个compiledb。这可能会有所帮助github.com/nickdiego/compiledb-generator
  • Bear 是一个非常有用的工具。即使对于复杂的 Linux 内核 Makefiles 也能很好地工作。

标签: c++ makefile compilation clang compilation-database


【解决方案1】:

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

【讨论】:

  • 甚至适用于 Linux 内核模块!非常感谢!
【解决方案2】:

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 语法类似:

  • 使用^ 代替\ 继续行
  • 仅使用" 分隔的字符串
  • 使用""" 在"-delimited 字符串中转义"
  • 使用^^ 在"-delimited 字符串中转义^

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

【讨论】:

  • 第一个 grep 必须使用 grep -E -w 'gcc|g++',否则我没有结果。对于使用 msys/cygwin 的任何人,将 jq 行替换为 | jq -nR "[inputs|{directory:\"$(cygpath -m $(pwd))\", command:., file: match(\" [^ ]+$\").string[1:]}]" \
  • @Teharez 谢谢,更新了grep。对于 MSYS2,可能还需要使用 mingw32-make 而不是 make。
  • 这个答案真的很好,如果有人像我一样使用clang,请尝试在第2行添加gcc|g++|clang。
  • @Tanz87: grep -wE 'gcc|g++' 应该是 grep -wE 'gcc|g\+\+'。
  • @rtx13 感谢您的发现!
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    我在https://texttoolkit.com/compilation-database-generator 构建了这样一个简单的网络应用程序,它从make 输出生成compile_commands.json。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2018-03-06
      • 2012-06-21
      相关资源
      最近更新 更多