xref: /llvm-project/lldb/bindings/python/get-python-config.py (revision f07ddbc620a0466ebbb41ccbc78f20a8591bed5a)
1#!/usr/bin/env python3
2
3import os
4import sys
5import argparse
6import sysconfig
7import distutils.sysconfig
8
9
10def relpath_nodots(path, base):
11    rel = os.path.normpath(os.path.relpath(path, base))
12    assert not os.path.isabs(rel)
13    parts = rel.split(os.path.sep)
14    if parts and parts[0] == '..':
15        raise ValueError(f"{path} is not under {base}")
16    return rel
17
18def main():
19    parser = argparse.ArgumentParser(description="extract cmake variables from python")
20    parser.add_argument("variable_name")
21    args = parser.parse_args()
22    if args.variable_name == "LLDB_PYTHON_RELATIVE_PATH":
23        print(distutils.sysconfig.get_python_lib(True, False, ''))
24    elif args.variable_name == "LLDB_PYTHON_EXE_RELATIVE_PATH":
25        tried = list()
26        exe = sys.executable
27        prefix = os.path.realpath(sys.prefix)
28        while True:
29            try:
30                print(relpath_nodots(exe, prefix))
31                break
32            except ValueError:
33                tried.append(exe)
34                if os.path.islink(exe):
35                    exe = os.path.join(os.path.realpath(os.path.dirname(exe)), os.readlink(exe))
36                    continue
37                else:
38                    print("Could not find a relative path to sys.executable under sys.prefix", file=sys.stderr)
39                    for e in tried:
40                        print("tried:", e, file=sys.stderr)
41                    print("realpath(sys.prefix):", prefix, file=sys.stderr)
42                    print("sys.prefix:", sys.prefix, file=sys.stderr)
43                    sys.exit(1)
44    elif args.variable_name == "LLDB_PYTHON_EXT_SUFFIX":
45        print(sysconfig.get_config_var('EXT_SUFFIX'))
46    else:
47        parser.error(f"unknown variable {args.variable_name}")
48
49if __name__ == '__main__':
50    main()