AST проекта Clang
Я использую привязку Clang Python для извлечения AST файлов c/ C++. Он отлично работает для простой программы, которую я написал. Проблема в том, когда я хочу использовать его для большого проекта, такого как openssl. Я могу запустить clang для любого отдельного файла проекта, но кажется, что clang пропускает некоторые заголовки проекта и просто дает мне AST для нескольких функций файла, а не для всех функций. Я установил папку включения с помощью -I, но все еще получаю часть функций.
Это мой код:
import clang.cindex as cl
cl.Config.set_library_path(clang_lib_dir)
index = cl.Index.create()
lib = 'Path to include folder'
args = ['-I{}'.format(lib)]
translation_unit = index.parse(source_file, args=args)
my_get_info(translation_unit.cursor)
Я получаю слишком много заголовочных файлов, не найдено ошибок.
ОБНОВИТЬ
Я использовал Make для компиляции openssl clang? Я могу передать опцию -emit-ast в clang, чтобы записать ast каждого файла, но сейчас я не могу прочитать его с помощью привязки clang python.
Любые подсказки, как я могу сохранить сериализованное представление единиц перевода, чтобы я мог прочитать его с помощью index.read()?
Спасибо!
1 ответ
Вам бы "просто" нужно было предоставить право args
, Но помните о двух возможных проблемах.
Разные файлы могут требовать разные аргументы для разбора. Самое простое решение - получить базу данных компиляции, а затем извлечь из нее команды компиляции. Если вы пойдете этим путем, знайте, что вам нужно будет немного отфильтровать аргументы и удалить такие вещи, как -c FooBar.cpp
(возможно, некоторые другие), в противном случае вы можете получить что-то вроде ASTReadError.
Другая проблема заключается в том, что пути включения (-I ...
) может быть относительно исходного каталога. Т.е. если файл main.cpp
составлен из каталога /opt/project/
с -I include/path
аргумент, то перед вызовом index.parse(source_file, args=args)
тебе нужно вмешаться (chdir
) в /opt/project
и когда вы закончите, вам, вероятно, придется вернуться в исходный рабочий каталог. Таким образом, код может выглядеть следующим образом (псевдокод):
cwd = getcwd()
chdir('/opt/project')
translation_unit = index.parse(source_file, args=args)
chdir(cwd)
Я надеюсь, что это помогает.