@@ -53,3 +53,48 @@ python_versions = [
53
53
def register_all_toolchains ():
54
54
for version in python_versions :
55
55
python_register_toolchains (name = version ["name" ], python_version = version ["python_version" ], ignore_root_user_error = True )
56
+
57
+ # Symlinks which allow us to use the right python interpreter
58
+ def create_interpreter_symlinks (target_names_to_version ):
59
+ for (name , version ) in target_names_to_version .items ():
60
+ python_interpreter_symlink (name = name , version = version )
61
+
62
+ OS_NAMES = ("mac" , "win" , "linux" )
63
+ OS_ARCHS = ("aarch64" , "x86_64" )
64
+ (MAC , WIN , LINUX ) = OS_NAMES
65
+ (ARM64 , X64 ) = OS_ARCHS
66
+
67
+ PYTHON_INTERPRETER_SUFFIXES = {
68
+ (MAC , ARM64 ) : "aarch64-apple-darwin" ,
69
+ (MAC , X64 ) : "x86_64-apple-darwin" ,
70
+ (LINUX , ARM64 ): "aarch64-unknown-linux-gnu" ,
71
+ (LINUX , X64 ): "x86_64-unknown-linux-gnu" ,
72
+ (WIN , X64 ) : "x86_64-pc-windows-msvc" ,
73
+ }
74
+
75
+ def _python_interpreter_symlink_impl (rctx ):
76
+ os_name = None
77
+ for name in OS_NAMES :
78
+ if name in rctx .os .name :
79
+ os_name = name
80
+
81
+ if os_name == None :
82
+ fail
83
+ os_arch = rctx .os .arch
84
+ interpreter_suffix = PYTHON_INTERPRETER_SUFFIXES .get ((os_name , os_arch ))
85
+
86
+ resolved_interpreter_label = Label ("@" + rctx .attr .version + "_" + interpreter_suffix + "//:python" )
87
+ build_file_content = """
88
+ package(default_visibility = ["//visibility:public"])
89
+ exports_files(["python"])
90
+ """
91
+ rctx .file ("WORKSPACE" , "workspace(name = \" %s\" )" % rctx .attr .name )
92
+ rctx .file ("BUILD.bazel" , content = build_file_content , executable = False )
93
+ rctx .symlink (resolved_interpreter_label , "python" )
94
+
95
+ python_interpreter_symlink = repository_rule (
96
+ implementation = _python_interpreter_symlink_impl ,
97
+ attrs = {
98
+ "version" : attr .string (mandatory = True ),
99
+ }
100
+ )
0 commit comments