14c2cf3a3SLawrence D'Anna#!/usr/bin/env python3
24c2cf3a3SLawrence D'Anna
34c2cf3a3SLawrence D'Annaimport os
44c2cf3a3SLawrence D'Annaimport sys
54c2cf3a3SLawrence D'Annaimport argparse
64c2cf3a3SLawrence D'Annaimport sysconfig
74c2cf3a3SLawrence D'Anna
84c2cf3a3SLawrence D'Anna
94c2cf3a3SLawrence D'Annadef relpath_nodots(path, base):
104c2cf3a3SLawrence D'Anna    rel = os.path.normpath(os.path.relpath(path, base))
114c2cf3a3SLawrence D'Anna    assert not os.path.isabs(rel)
124c2cf3a3SLawrence D'Anna    parts = rel.split(os.path.sep)
134c2cf3a3SLawrence D'Anna    if parts and parts[0] == '..':
144c2cf3a3SLawrence D'Anna        raise ValueError(f"{path} is not under {base}")
154c2cf3a3SLawrence D'Anna    return rel
164c2cf3a3SLawrence D'Anna
174c2cf3a3SLawrence D'Annadef main():
184c2cf3a3SLawrence D'Anna    parser = argparse.ArgumentParser(description="extract cmake variables from python")
194c2cf3a3SLawrence D'Anna    parser.add_argument("variable_name")
204c2cf3a3SLawrence D'Anna    args = parser.parse_args()
214c2cf3a3SLawrence D'Anna    if args.variable_name == "LLDB_PYTHON_RELATIVE_PATH":
2263270710SLawrence D'Anna        # LLDB_PYTHON_RELATIVE_PATH is the relative path from lldb's prefix
2363270710SLawrence D'Anna        # to where lldb's python libraries will be installed.
2463270710SLawrence D'Anna        #
2563270710SLawrence D'Anna        # The way we're going to compute this is to take the relative path from
2663270710SLawrence D'Anna        # PYTHON'S prefix to where python libraries are supposed to be
2763270710SLawrence D'Anna        # installed.
2863270710SLawrence D'Anna        #
2963270710SLawrence D'Anna        # The result is if LLDB and python are give the same prefix, then
3063270710SLawrence D'Anna        # lldb's python lib will be put in the correct place for python to find it.
3163270710SLawrence D'Anna        # If not, you'll have to use lldb -P or lldb -print-script-interpreter-info
3263270710SLawrence D'Anna        # to figure out where it is.
33*27ca9458SLawrence D'Anna        try:
3463270710SLawrence D'Anna            print(relpath_nodots(sysconfig.get_path("platlib"), sys.prefix))
35*27ca9458SLawrence D'Anna        except ValueError:
36*27ca9458SLawrence D'Anna            # Try to fall back to something reasonable if sysconfig's platlib
37*27ca9458SLawrence D'Anna            # is outside of sys.prefix
38*27ca9458SLawrence D'Anna            if os.name == 'posix':
39*27ca9458SLawrence D'Anna                print('lib/python%d.%d/site-packages' % sys.version_info[:2])
40*27ca9458SLawrence D'Anna            elif os.name == 'nt':
41*27ca9458SLawrence D'Anna                print('Lib\\site-packages')
42*27ca9458SLawrence D'Anna            else:
43*27ca9458SLawrence D'Anna                raise
444c2cf3a3SLawrence D'Anna    elif args.variable_name == "LLDB_PYTHON_EXE_RELATIVE_PATH":
454c2cf3a3SLawrence D'Anna        tried = list()
464c2cf3a3SLawrence D'Anna        exe = sys.executable
47f07ddbc6SLawrence D'Anna        prefix = os.path.realpath(sys.prefix)
484c2cf3a3SLawrence D'Anna        while True:
494c2cf3a3SLawrence D'Anna            try:
50f07ddbc6SLawrence D'Anna                print(relpath_nodots(exe, prefix))
514c2cf3a3SLawrence D'Anna                break
524c2cf3a3SLawrence D'Anna            except ValueError:
534c2cf3a3SLawrence D'Anna                tried.append(exe)
544c2cf3a3SLawrence D'Anna                if os.path.islink(exe):
55f07ddbc6SLawrence D'Anna                    exe = os.path.join(os.path.realpath(os.path.dirname(exe)), os.readlink(exe))
564c2cf3a3SLawrence D'Anna                    continue
574c2cf3a3SLawrence D'Anna                else:
584c2cf3a3SLawrence D'Anna                    print("Could not find a relative path to sys.executable under sys.prefix", file=sys.stderr)
594c2cf3a3SLawrence D'Anna                    for e in tried:
604c2cf3a3SLawrence D'Anna                        print("tried:", e, file=sys.stderr)
61f07ddbc6SLawrence D'Anna                    print("realpath(sys.prefix):", prefix, file=sys.stderr)
624c2cf3a3SLawrence D'Anna                    print("sys.prefix:", sys.prefix, file=sys.stderr)
634c2cf3a3SLawrence D'Anna                    sys.exit(1)
64ae389b24SLawrence D'Anna    elif args.variable_name == "LLDB_PYTHON_EXT_SUFFIX":
65ae389b24SLawrence D'Anna        print(sysconfig.get_config_var('EXT_SUFFIX'))
664c2cf3a3SLawrence D'Anna    else:
674c2cf3a3SLawrence D'Anna        parser.error(f"unknown variable {args.variable_name}")
684c2cf3a3SLawrence D'Anna
694c2cf3a3SLawrence D'Annaif __name__ == '__main__':
704c2cf3a3SLawrence D'Anna    main()
71