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()