@@ -45,6 +45,18 @@ py_toolchain_suite(
4545)
4646""" .lstrip ()
4747
48+ _WORKSPACE_TOOLCHAINS_BUILD_TEMPLATE = """
49+ # Generated by python/private/toolchains_repo.bzl
50+ #
51+ # These can be registered in the workspace file or passed to --extra_toolchains
52+ # flag. By default all these toolchains are registered by the
53+ # python_register_toolchains macro so you don't normally need to interact with
54+ # these targets.
55+
56+ load("@@{rules_python}//python/private:py_toolchain_suite.bzl", "py_toolchain_suite")
57+
58+ """ .lstrip ()
59+
4860_TOOLCHAIN_ALIASES_BUILD_TEMPLATE = """
4961# Generated by python/private/toolchains_repo.bzl
5062load("@rules_python//python/private:toolchain_aliases.bzl", "toolchain_aliases")
@@ -62,6 +74,42 @@ toolchain_aliases(
6274)
6375""" .lstrip ()
6476
77+ _TOOLCHAIN_ALIASES_DEFS_TEMPLATE = """
78+ # Generated by python/private/toolchains_repo.bzl
79+
80+ load("@@{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
81+ load("@@{rules_python}//python/private:deprecation.bzl", "with_deprecation")
82+ load("@@{rules_python}//python/private:text_util.bzl", "render")
83+ load("@@{rules_python}//python:py_binary.bzl", _py_binary = "py_binary")
84+ load("@@{rules_python}//python:py_test.bzl", _py_test = "py_test")
85+ load(
86+ "@@{rules_python}//python/entry_points:py_console_script_binary.bzl",
87+ _py_console_script_binary = "py_console_script_binary",
88+ )
89+
90+ def _with_deprecation(kwargs, *, name):
91+ kwargs["python_version"] = "{python_version}"
92+ return with_deprecation.symbol(
93+ kwargs,
94+ symbol_name = name,
95+ old_load = "@{name}//:defs.bzl",
96+ new_load = "@rules_python//python:{{}}.bzl".format(name),
97+ snippet = render.call(name, **{{k: repr(v) for k,v in kwargs.items()}})
98+ )
99+
100+ def py_binary(**kwargs):
101+ return _py_binary(**_with_deprecation(kwargs, name = "py_binary"))
102+
103+ def py_console_script_binary(**kwargs):
104+ return _py_console_script_binary(**_with_deprecation(kwargs, name = "py_console_script_binary"))
105+
106+ def py_test(**kwargs):
107+ return _py_test(**_with_deprecation(kwargs, name = "py_test"))
108+
109+ def compile_pip_requirements(**kwargs):
110+ return _compile_pip_requirements(**_with_deprecation(kwargs, name = "compile_pip_requirements"))
111+ """ .lstrip ()
112+
65113_HOST_TOOLCHAIN_BUILD_CONTENT = """
66114# Generated by python/private/toolchains_repo.bzl
67115
@@ -83,6 +131,58 @@ assert want_python == got_python, \
83131 )
84132""" .lstrip ()
85133
134+ _MULTI_TOOLCHAIN_ALIASES_DEFS_TEMPLATE = """
135+ # Generated by python/private/toolchains_repo.bzl
136+
137+ load("@@{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
138+ load("@@{rules_python}//python/private:deprecation.bzl", "with_deprecation")
139+ load("@@{rules_python}//python/private:text_util.bzl", "render")
140+ load("@@{rules_python}//python:py_binary.bzl", _py_binary = "py_binary")
141+ load("@@{rules_python}//python:py_test.bzl", _py_test = "py_test")
142+ load(
143+ "@@{rules_python}//python/entry_points:py_console_script_binary.bzl",
144+ _py_console_script_binary = "py_console_script_binary",
145+ )
146+
147+ def _with_deprecation(kwargs, *, name):
148+ kwargs["python_version"] = "{python_version}"
149+ return with_deprecation.symbol(
150+ kwargs,
151+ symbol_name = name,
152+ old_load = "@{name}//{python_version}:defs.bzl",
153+ new_load = "@rules_python//python:{{}}.bzl".format(name),
154+ snippet = render.call(name, **{{k: repr(v) for k,v in kwargs.items()}})
155+ )
156+
157+ def py_binary(**kwargs):
158+ return _py_binary(**_with_deprecation(kwargs, name = "py_binary"))
159+
160+ def py_console_script_binary(**kwargs):
161+ return _py_console_script_binary(**_with_deprecation(kwargs, name = "py_console_script_binary"))
162+
163+ def py_test(**kwargs):
164+ return _py_test(**_with_deprecation(kwargs, name = "py_test"))
165+
166+ def compile_pip_requirements(**kwargs):
167+ return _compile_pip_requirements(**_with_deprecation(kwargs, name = "compile_pip_requirements"))
168+ """ .lstrip ()
169+
170+ _MULTI_TOOLCHAIN_ALIASES_PIP_TEMPLATE = """
171+ # Generated by python/private/toolchains_repo.bzl
172+
173+ load("@@{rules_python}//python:pip.bzl", "pip_parse", _multi_pip_parse = "multi_pip_parse")
174+
175+ def multi_pip_parse(name, requirements_lock, **kwargs):
176+ return _multi_pip_parse(
177+ name = name,
178+ python_versions = {python_versions},
179+ requirements_lock = requirements_lock,
180+ minor_mapping = {minor_mapping},
181+ **kwargs
182+ )
183+
184+ """ .lstrip ()
185+
86186def python_toolchain_build_file_content (
87187 prefix ,
88188 python_version ,
@@ -168,7 +268,7 @@ toolchains_repo = repository_rule(
168268 "python_version" : attr .string (doc = "The Python version." ),
169269 "set_python_version_constraint" : attr .bool (doc = "if target_compatible_with for the toolchain should set the version constraint" ),
170270 "user_repository_name" : attr .string (doc = "what the user chose for the base name" ),
171- "_rules_python_workspace" : attr .label (default = Label ("//:MODULE.bazel " )),
271+ "_rules_python_workspace" : attr .label (default = Label ("//:WORKSPACE " )),
172272 },
173273)
174274
@@ -204,7 +304,7 @@ actions.""",
204304 mandatory = True ,
205305 doc = "The base name for all created repositories, like 'python38'." ,
206306 ),
207- "_rules_python_workspace" : attr .label (default = Label ("//:MODULE.bazel " )),
307+ "_rules_python_workspace" : attr .label (default = Label ("//:WORKSPACE " )),
208308 },
209309 environ = [REPO_DEBUG_ENV_VAR ],
210310)
@@ -352,7 +452,37 @@ Major.Minor.Micro format. Keyed by index in `platforms`.
352452""" ,
353453 ),
354454 "_rule_name" : attr .string (default = "host_compatible_python_repo" ),
355- "_rules_python_workspace" : attr .label (default = Label ("//:MODULE.bazel" )),
455+ "_rules_python_workspace" : attr .label (default = Label ("//:WORKSPACE" )),
456+ },
457+ )
458+
459+ def _multi_toolchain_aliases_impl (rctx ):
460+ rules_python = rctx .attr ._rules_python_workspace .repo_name
461+
462+ for python_version , repository_name in rctx .attr .python_versions .items ():
463+ file = "{}/defs.bzl" .format (python_version )
464+ rctx .file (file , content = _MULTI_TOOLCHAIN_ALIASES_DEFS_TEMPLATE .format (
465+ repository_name = repository_name ,
466+ name = rctx .attr .name ,
467+ python_version = python_version ,
468+ rules_python = rules_python ,
469+ ))
470+ rctx .file ("{}/BUILD.bazel" .format (python_version ), "" )
471+
472+ pip_bzl = _MULTI_TOOLCHAIN_ALIASES_PIP_TEMPLATE .format (
473+ python_versions = rctx .attr .python_versions .keys (),
474+ minor_mapping = render .indent (render .dict (rctx .attr .minor_mapping ), indent = " " * 8 ).lstrip (),
475+ rules_python = rules_python ,
476+ )
477+ rctx .file ("pip.bzl" , content = pip_bzl )
478+ rctx .file ("BUILD.bazel" , "" )
479+
480+ multi_toolchain_aliases = repository_rule (
481+ _multi_toolchain_aliases_impl ,
482+ attrs = {
483+ "minor_mapping" : attr .string_dict (doc = "The mapping between `X.Y` and `X.Y.Z` python version values" ),
484+ "python_versions" : attr .string_dict (doc = "The Python versions." ),
485+ "_rules_python_workspace" : attr .label (default = Label ("//:WORKSPACE" )),
356486 },
357487)
358488
0 commit comments