Python Clang не включает в поисковую систему пути
При использовании libclang из Python, он не выполняет автоматический поиск путей включения системы.
Есть ли надежный способ получить эти пути? Мне не нравятся пути жесткого кодирования, так как я пишу код, который будет работать на различных системах UNIX.
Например, данный test.cpp
#include <stdio.h>
int main()
{
puts("Hello, world!");
}
и test.py
from clang.cindex import Index
tu = Index.create().parse(None, ["test.cpp"])
print(list(tu.diagnostics))
Бег python test.py
напечатает:
[<Diagnostic severity 4, location <SourceLocation file 'test.cpp', line 1,
column 10>, spelling "'stdio.h' file not found">]
Конечно, я могу найти пути включения системы, выполнив
$ clang -v -E test.cpp
и добавление "-Isome/path"
к parse
список аргументов, т.е.
args = ["-I/Applications/[...]", "test.cpp"]
Это на самом деле работает и не дает ошибок.
Тем не менее, это не переносимо, и было бы неплохо, если бы я мог программно заставить Clang автоматически использовать их.
1 ответ
Этот вопрос уже давно задан, поэтому я попытаюсь ответить на него сам.
Кажется, что даже сам Clang использует в основном жестко закодированные пути.
Он перечисляет возможные пути и добавляет те, которые соответствуют текущему контексту. Это можно увидеть в clang / lib / Frontend / InitHeaderSearch.cpp. Например,
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
"i686-apple-darwin10", "", "x86_64", triple);
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
"i686-apple-darwin8", "", "", triple);
// ...
Для Linux этот код имеет уведомление:
llvm_unreachable("Include management is handled in the driver.");
Под clang/lib/Driver/
мы можем найти больше этих путей в файлах, таких как ToolChains.cpp
, CrossWindowsToolChain.cpp
а также MinGWToolChain.cpp
,
Я надеялся, что код в InitHeaderSearch.cpp
будет выставлен на Python через libclang.