目前,要使用 compdb 工具,您需要知道要查询的规则的确切名称。 如果这些名称是可预测的,这可以正常工作,但某些生成器的情况不一定如此。
最值得注意的是,在 3.2 版中(我认为)CMake 的 ninja 生成器已经开始生成<lang>_COMPILER__<directory>
形式的规则。 这意味着为了查询编译数据库,您需要先扫描项目目录树,或者求助于其他hacks。 3.2 之前的 CMake 生成<lang>_COMPILER
形式的规则,这使得它们可以从通用工具进行查询 - 无需特定的项目知识。
因此,此功能请求是为了更灵活地将规则名称与命令行参数进行匹配。 最小有用的实现将允许仅前缀匹配。 或者,正则表达式匹配也很有用。
过去有一个“规则”工具(7b67e48a1479c6fc7326c55756088bd57d64fc82)可以打印所有规则的列表。 有了这个工具,我们可以做这样的事情:
ninja -t compdb `ninja -t rules | grep 'CXX_COMPILER_'`
我认为复活这个工具是个好主意,因为它也可以帮助编写 shell 完成脚本。 我将在接下来的几天内尝试这样做。
这也行,谢谢。
我发现 compdb 工具很难使用——对我来说,令人惊讶的是它需要一个规则列表(我花了一段时间才弄明白)。 也许如果没有明确通过明确的规则,那可能只是意味着“所有规则”? 这对于基于 cmake 的构建是否足够?
(无关:我认为您可以将CMAKE_EXPORT_COMPILE_COMMANDS
传递给 cmake,让它直接编写编译数据库。)
这里有人吗? 🙂
规则工具似乎从构建中删除了?
这真的很有帮助。
我喜欢@nico的建议,默认情况下只打印所有规则。 如果需要,将来可以添加更复杂的东西(如通配符匹配)。
我注意到@sarcasm在这里建议的解决方法相当丑陋,在 ninja 本身中激发了更漂亮的解决方案:)
现在有 #1377 用于默认转储所有规则。
想在这里添加一个小注释,似乎对于某些 CMake 项目 [0], ninja -t compdb
(无参数)不会转储任何内容(输出是一个空列表[]
)。
cmake -G Ninja .
ninja -t compdb
[
]
但是,按照 nico 的建议使用CMAKE_EXPORT_COMPILE_COMMANDS
将:
cmake -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=1
ninja -t compdb
[
]
ninja -t compdb
仍然返回空,但 compile_commands.json 已经生成。
谢谢尼哥!
[0] 对于Binaryen至少
ninja --version
说什么?
1.8.2,顺便说一句,这个忍者来自depot_tools
该版本缺失 #1377。
最有用的评论
我发现 compdb 工具很难使用——对我来说,令人惊讶的是它需要一个规则列表(我花了一段时间才弄明白)。 也许如果没有明确通过明确的规则,那可能只是意味着“所有规则”? 这对于基于 cmake 的构建是否足够?
(无关:我认为您可以将
CMAKE_EXPORT_COMPILE_COMMANDS
传递给 cmake,让它直接编写编译数据库。)