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