假设我们的项目有make
文件(不是cmake / premake / ninja等),这些文件适用于gcc和clang。我们希望从它们生成JSON编译数据库,将其提供给clang-modernize
工具。怎么办这样的事情? (clang基础结构中是否有任何解析器或某些脚本具有make CC='cc_args.py gcc' CXX='cc_args.py g++'
或其他工具的用法?
答案 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作为解决方法。不幸的是,我仍然得到一个空文件。我发现了两个替代解决方案:
答案 3 :(得分:1)
如果您没有安装Bear / compiledb的权限,或者您无法从源代码构建Bear,那么Web应用程序可以提供帮助。
我在https://texttoolkit.com/compilation-database-generator处构建了一个简单的Web应用程序,该应用程序从make输出生成compile_commands.json
。