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.

Другие вопросы по тегам