#! /bin/bash
# Writing to a common output file, so buffer for atomic output
if file=($(printf "%s\n" "$@" | grep '\.c$'))
then JSON="$(jq -nR '[inputs|{directory:$pwd, arguments:[$ARGS.positional[]], file:.}]' --arg pwd "$PWD" --args -- "$@" <<< "${file}")"
# c2rust transpile "$file.compile_commands.json" will still look for a file called compile_commands.json so we have to provide it
mkdir -p "$file.c2rs"
echo "$JSON" > "$file.c2rs/compile_commands.json"
fi
exec "$@"
7条答案
按热度按时间qzlgjiam1#
我没有使用它的个人经验,但Bear似乎是针对您的场景的(它是从clang-modernize站点链接的)。
5jvtdoz22#
Make有一个通常不受欢迎的功能,即将编译器命令行发送到其标准输出,但在这种情况下,您可以将其与shell(和jq)管道一起使用。使用GNU Make on Bash:
在Windows上,
cmd.exe
语法类似:^
代替\
作为行的延续"
分隔的字符串"""
转义"
分隔字符串中的"
^^
转义"
分隔字符串中的^
但是,这不能处理makefile使用
-C
参数递归调用子目录中的自身(或其他makefile)的情况。4urapxun3#
也许有人和我的情况一样。我有一个macOS,Bear生成了一个空的
compile_commands.json
文件。他们在README中承认了这个问题,并建议使用scan-build作为解决方案。不幸的是,我仍然得到一个空文件。我找到了两个替代解决方案:-MJ
选项加上sed的组合,在这里详细介绍,它看起来很简单,很容易转换成make
目标。q1qsirdb4#
由于我还没有足够的点数来对答案做出React,我想在@Tanz87的答案下发表评论,他建议干运行
make
,并使用grep
和jq
来格式化输出。我的CMake检测到
/usr/bin/c++
是默认编译器(我使用的是WSL 2,Ubuntu 21.10),因此grep -wE 'gcc|g\+\+'
命令不起作用,就像@Hi-Angel一样,我的compile_commands.json
最终得到了[]
。修复方法是也为
c++
使用grep,因此整个命令变为:编辑:也就是说,虽然解决方案似乎确实生成了一个
compile_commands.json
文件,但在build目录中运行clang-tidy
会从clang后端为编译数据库中的每个文件打印一个错误:compile_commands.json
文件中的每个command
条目如下所示:这个项目使用CMake来生成Make构建系统文件。不幸的是,还没有解决方案。
编辑:编辑:从
compile_commands.json
中的每个command
中删除cd /build/src &&
修复了该特定错误。使用sed
:编辑:编辑:编辑:作为一个oneliner,它需要一些额外的斜线用于
&&
令牌:arknldoa5#
如果您没有安装Bear/compiledb的权限,或者您无法从源代码构建Bear,那么Web应用程序可以提供帮助。
我在https://texttoolkit.com/compilation-database-generator上构建了这样一个简单的Web应用程序,它从make输出生成
compile_commands.json
。0sgqnhkj6#
我把这个编译器 Package ,你可能想按摩
if
子句提取文件名参数。它只检测。c文件我这样调用它:
make ... CC="cc_wrapper $CC"
或:
make ... CC="cc_wrapper gcc"
fiei3ece7#
我发现对于某些make项目,
compiledb
能够拦截make输出并生成有效的compile_commands.json
文件。然而,对于某些项目,它生成空([ ])compile_commands.json
文件。对我来说总是有效的解决方案如下所示。这总是会生成一个有效的compile_commands.json文件,即使对于compiledb无法直接拦截make输出的make项目也是如此。希望这能有所帮助。