xref: /llvm-project/lldb/bindings/python/get-python-config.py (revision c8387a31a4adfa9c29a578cf67321f756d3b4ac1)
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)
13*c8387a31SDavid Spickett    if parts and parts[0] == "..":
144c2cf3a3SLawrence D'Anna        raise ValueError(f"{path} is not under {base}")
154c2cf3a3SLawrence D'Anna    return rel
164c2cf3a3SLawrence D'Anna
17*c8387a31SDavid Spickett
184c2cf3a3SLawrence D'Annadef main():
194c2cf3a3SLawrence D'Anna    parser = argparse.ArgumentParser(description="extract cmake variables from python")
204c2cf3a3SLawrence D'Anna    parser.add_argument("variable_name")
214c2cf3a3SLawrence D'Anna    args = parser.parse_args()
224c2cf3a3SLawrence D'Anna    if args.variable_name == "LLDB_PYTHON_RELATIVE_PATH":
2363270710SLawrence D'Anna        # LLDB_PYTHON_RELATIVE_PATH is the relative path from lldb's prefix
2463270710SLawrence D'Anna        # to where lldb's python libraries will be installed.
2563270710SLawrence D'Anna        #
2663270710SLawrence D'Anna        # The way we're going to compute this is to take the relative path from
2763270710SLawrence D'Anna        # PYTHON'S prefix to where python libraries are supposed to be
2863270710SLawrence D'Anna        # installed.
2963270710SLawrence D'Anna        #
3063270710SLawrence D'Anna        # The result is if LLDB and python are give the same prefix, then
3163270710SLawrence D'Anna        # lldb's python lib will be put in the correct place for python to find it.
3263270710SLawrence D'Anna        # If not, you'll have to use lldb -P or lldb -print-script-interpreter-info
3363270710SLawrence D'Anna        # to figure out where it is.
3427ca9458SLawrence D'Anna        try:
3563270710SLawrence D'Anna            print(relpath_nodots(sysconfig.get_path("platlib"), sys.prefix))
3627ca9458SLawrence D'Anna        except ValueError:
3727ca9458SLawrence D'Anna            # Try to fall back to something reasonable if sysconfig's platlib
3827ca9458SLawrence D'Anna            # is outside of sys.prefix
39*c8387a31SDavid Spickett            if os.name == "posix":
40*c8387a31SDavid Spickett                print("lib/python%d.%d/site-packages" % sys.version_info[:2])
41*c8387a31SDavid Spickett            elif os.name == "nt":
42*c8387a31SDavid Spickett                print("Lib\\site-packages")
4327ca9458SLawrence D'Anna            else:
4427ca9458SLawrence D'Anna                raise
454c2cf3a3SLawrence D'Anna    elif args.variable_name == "LLDB_PYTHON_EXE_RELATIVE_PATH":
464c2cf3a3SLawrence D'Anna        tried = list()
474c2cf3a3SLawrence D'Anna        exe = sys.executable
48f07ddbc6SLawrence D'Anna        prefix = os.path.realpath(sys.prefix)
494c2cf3a3SLawrence D'Anna        while True:
504c2cf3a3SLawrence D'Anna            try:
51f07ddbc6SLawrence D'Anna                print(relpath_nodots(exe, prefix))
524c2cf3a3SLawrence D'Anna                break
534c2cf3a3SLawrence D'Anna            except ValueError:
544c2cf3a3SLawrence D'Anna                tried.append(exe)
559e84e038SMarkus Böck                # Retry if the executable is symlinked or similar.
569e84e038SMarkus Böck                # This is roughly equal to os.path.islink, except it also works for junctions on Windows.
579e84e038SMarkus Böck                if os.path.realpath(exe) != exe:
589e84e038SMarkus Böck                    exe = os.path.realpath(exe)
594c2cf3a3SLawrence D'Anna                    continue
604c2cf3a3SLawrence D'Anna                else:
61*c8387a31SDavid Spickett                    print(
62*c8387a31SDavid Spickett                        "Could not find a relative path to sys.executable under sys.prefix",
63*c8387a31SDavid Spickett                        file=sys.stderr,
64*c8387a31SDavid Spickett                    )
654c2cf3a3SLawrence D'Anna                    for e in tried:
664c2cf3a3SLawrence D'Anna                        print("tried:", e, file=sys.stderr)
67f07ddbc6SLawrence D'Anna                    print("realpath(sys.prefix):", prefix, file=sys.stderr)
684c2cf3a3SLawrence D'Anna                    print("sys.prefix:", sys.prefix, file=sys.stderr)
694c2cf3a3SLawrence D'Anna                    sys.exit(1)
70ae389b24SLawrence D'Anna    elif args.variable_name == "LLDB_PYTHON_EXT_SUFFIX":
71*c8387a31SDavid Spickett        print(sysconfig.get_config_var("EXT_SUFFIX"))
724c2cf3a3SLawrence D'Anna    else:
734c2cf3a3SLawrence D'Anna        parser.error(f"unknown variable {args.variable_name}")
744c2cf3a3SLawrence D'Anna
75*c8387a31SDavid Spickett
76*c8387a31SDavid Spickettif __name__ == "__main__":
774c2cf3a3SLawrence D'Anna    main()
78