Try to autodetect the location of the clang standard libraries.

On some linuxes, /usr/include belongs to GCC and the standard
libraries that work with clang are in /usr/lib/clang/8.0.0 or
some variation thereof.

This results in errors such as:

```
/../lib64/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/bits/cxxabi_init_exception.h:38:10: fatal error: 'stddef.h' file not found

```

during extraction.
This commit is contained in:
Dan 2019-05-15 20:06:08 -04:00 committed by Wenzel Jakob
parent a175b21e4b
commit 4612db54ac

View File

@ -14,6 +14,7 @@ import textwrap
from clang import cindex from clang import cindex
from clang.cindex import CursorKind from clang.cindex import CursorKind
from collections import OrderedDict from collections import OrderedDict
from glob import glob
from threading import Thread, Semaphore from threading import Thread, Semaphore
from multiprocessing import cpu_count from multiprocessing import cpu_count
@ -240,6 +241,20 @@ if __name__ == '__main__':
sysroot_dir = os.path.join(sdk_dir, next(os.walk(sdk_dir))[1][0]) sysroot_dir = os.path.join(sdk_dir, next(os.walk(sdk_dir))[1][0])
parameters.append('-isysroot') parameters.append('-isysroot')
parameters.append(sysroot_dir) parameters.append(sysroot_dir)
elif platform.system() == 'Linux':
# clang doesn't find its own base includes by default on Linux,
# but different distros install them in different paths.
# Try to autodetect, preferring the highest numbered version.
def clang_folder_version(d):
return [int(ver) for ver in re.findall(r'(?<!lib)(?<!\d)\d+', d)]
clang_include_dir = max((
path
for libdir in ['lib64', 'lib', 'lib32']
for path in glob('/usr/%s/clang/*/include' % libdir)
if os.path.isdir(path)
), default=None, key=clang_folder_version)
if clang_include_dir:
parameters.extend(['-isystem', clang_include_dir])
for item in sys.argv[1:]: for item in sys.argv[1:]:
if item.startswith('-'): if item.startswith('-'):