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