gpt4 book ai didi

python - 如何将 compile_commands.json 与 clang python 绑定(bind)一起使用?

转载 作者:太空狗 更新时间:2023-10-29 22:29:27 45 4
gpt4 key购买 nike

我有以下脚本尝试打印出给定 C++ 文件中的所有 AST 节点。当在包含普通包含的简单文件(同一目录中的头文件等)上使用它时,这很好用。

#!/usr/bin/env python
from argparse import ArgumentParser, FileType
from clang import cindex


def node_info(node):
return {'kind': node.kind,
'usr': node.get_usr(),
'spelling': node.spelling,
'location': node.location,
'file': node.location.file.name,
'extent.start': node.extent.start,
'extent.end': node.extent.end,
'is_definition': node.is_definition()
}


def get_nodes_in_file(node, filename, ls=None):
ls = ls if ls is not None else []
for n in node.get_children():
if n.location.file is not None and n.location.file.name == filename:
ls.append(n)
get_nodes_in_file(n, filename, ls)
return ls


def main():
arg_parser = ArgumentParser()
arg_parser.add_argument('source_file', type=FileType('r+'),
help='C++ source file to parse.')
arg_parser.add_argument('compilation_database', type=FileType('r+'),
help='The compile_commands.json to use to parse the source file.')
args = arg_parser.parse_args()
compilation_database_path = args.compilation_database.name
source_file_path = args.source_file.name
clang_args = ['-x', 'c++', '-std=c++11', '-p', compilation_database_path]
index = cindex.Index.create()
translation_unit = index.parse(source_file_path, clang_args)
file_nodes = get_nodes_in_file(translation_unit.cursor, source_file_path)
print [p.spelling for p in file_nodes]


if __name__ == '__main__':
main()

但是,当我运行脚本并提供一个有效的 C++ 文件,该文件的父目录中有一个 compile_commands.json 文件时,我得到了一个 clang.cindex.TranslationUnitLoadError: Error parsing translation unit.。这段代码使用带有 clang 的 CMake 运行和构建良好,但我似乎无法弄清楚如何正确传递指向 compile_commands.json 的参数。

我也很难在 clang 文档中找到这个选项,并且无法让 -ast-dump 工作。但是,clang-check 只需传递文件路径即可正常工作!

最佳答案

您自己接受的答案不正确。 libclang does support compilation databasesso does cindex.py , libclang python 绑定(bind)。

混淆的主要来源可能是 libclang 知道/使用的编译标志只是可以传递给 clang 前端的所有参数的一个子集。编译数据库受支持但不会自动工作:必须手动加载和查询。这样的事情应该有效:

#!/usr/bin/env python
from argparse import ArgumentParser, FileType
from clang import cindex

compilation_database_path = args.compilation_database.name
source_file_path = args.source_file.name
index = cindex.Index.create()

# Step 1: load the compilation database
compdb = cindex.CompilationDatabase.fromDirectory(compilation_database_path)

# Step 2: query compilation flags
try:
file_args = compdb.getCompileCommands(source_file_path)
translation_unit = index.parse(source_file_path, file_args)
file_nodes = get_nodes_in_file(translation_unit.cursor, source_file_path)
print [p.spelling for p in file_nodes]
except CompilationDatabaseError:
print 'Could not load compilation flags for', source_file_path

关于python - 如何将 compile_commands.json 与 clang python 绑定(bind)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652540/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com