Skip to content

Commit dbee5b5

Browse files
committed
fix: Only generate toolchain repositories if we're the root module
1 parent 6eb567b commit dbee5b5

3 files changed

Lines changed: 106 additions & 96 deletions

File tree

MODULE.bazel

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,29 @@ bazel_dep(name = "rules_cc", version = "0.2.0")
1212

1313
# Local Toolchains
1414
# ================
15-
gcc_toolchains = use_extension("//toolchain:module_extensions.bzl", "gcc_toolchains")
16-
17-
# Unfortunately, we can't load `ARCHS` directly here.
18-
# But the attributes in `gcc_register_toolchain.register_toolchain` are gated to only contain values from ARCHS
19-
all_architectures = [
20-
"aarch64",
21-
"armv7",
22-
"x86_64",
23-
]
24-
25-
[
26-
gcc_toolchains.toolchain(
27-
name = "gcc_toolchain_{}".format(arch),
28-
target_arch = arch,
29-
)
30-
for arch in all_architectures
31-
]
32-
33-
[
34-
use_repo(gcc_toolchains, "gcc_toolchain_{}".format(arch))
35-
for arch in all_architectures
36-
]
15+
gcc_toolchains = use_extension("//toolchain:module_extensions.bzl", "gcc_toolchains", dev_dependency = True)
3716

3817
[
39-
register_toolchains(
40-
"@gcc_toolchain_{}//:cc_toolchain".format(arch),
41-
"@gcc_toolchain_{}//:fortran_toolchain".format(arch),
42-
# register toolchains as dev dependencies so that we don't pollute the toolchain resolution of consumers.
43-
dev_dependency = True,
44-
)
45-
for arch in all_architectures
18+
[
19+
gcc_toolchains.toolchain(
20+
name = "gcc_toolchain_{}".format(arch),
21+
target_arch = arch,
22+
),
23+
use_repo(gcc_toolchains, "gcc_toolchain_{}".format(arch)),
24+
register_toolchains(
25+
"@gcc_toolchain_{}//:cc_toolchain".format(arch),
26+
"@gcc_toolchain_{}//:fortran_toolchain".format(arch),
27+
# register toolchains as dev dependencies so that we don't pollute the toolchain resolution of consumers.
28+
dev_dependency = True,
29+
),
30+
]
31+
# Unfortunately, we can't load `ARCHS` directly here.
32+
# But the attributes in `gcc_register_toolchain.register_toolchain` are gated to only contain values from ARCHS
33+
for arch in [
34+
"aarch64",
35+
"armv7",
36+
"x86_64",
37+
]
4638
]
4739

4840
# Dev Dependencies (for examples/)

toolchain/defs.bzl

Lines changed: 63 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,67 @@ def _gcc_toolchain_impl(rctx):
223223
extra_ldflags = _format_flags(extra_ldflags),
224224
))
225225

226+
AVAILABLE_GCC_VERSIONS = {
227+
"12.5.0": {
228+
"aarch64": {
229+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-12.5.0-aarch64.tar.xz",
230+
"sha256": "7b0e25133a98d44b648a925ba11f64a3adc470e87668af80ce2c3af389ebe9be",
231+
},
232+
"armv7": {
233+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-12.5.0-armv7.tar.xz",
234+
"sha256": "a0ef76c8cc517b3d76dd2f09b1a371975b2ff1082e2f9372ed79af01b9292934",
235+
},
236+
"x86_64": {
237+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-12.5.0-x86_64.tar.xz",
238+
"sha256": "51076e175839b434bb2dc0006c0096916df585e8c44666d35b0e3ce821d535db",
239+
},
240+
},
241+
"13.4.0": {
242+
"aarch64": {
243+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-13.4.0-aarch64.tar.xz",
244+
"sha256": "770cf6bf62bdf78763de526d3a9f5cae4c19f1a3aca0ef8f18b05f1a46d1ffaf",
245+
},
246+
"armv7": {
247+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-13.4.0-armv7.tar.xz",
248+
"sha256": "1b2739b5003c5a3f0ab7c4cc7fb95cc99c0e933982512de7255c2bd9ced757ad",
249+
},
250+
"x86_64": {
251+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-13.4.0-x86_64.tar.xz",
252+
"sha256": "d96071c1b98499afd7b7b56ebd69ad414020edf66e982004acffe7df8aaf7e02",
253+
},
254+
},
255+
"14.3.0": {
256+
"aarch64": {
257+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-14.3.0-aarch64.tar.xz",
258+
"sha256": "74b1f0072769f8865b62897ab962f6fce174115dab2e6596765bb4e700ffe0d1",
259+
},
260+
"armv7": {
261+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-14.3.0-armv7.tar.xz",
262+
"sha256": "0c20a130f424ce83dd4eb2a4ec8fbcd0c0ddc5f42f0b4660bcd0108cb8c0fb21",
263+
},
264+
"x86_64": {
265+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-14.3.0-x86_64.tar.xz",
266+
"sha256": "0b365e5da451f5c7adc594f967885d7181ff6d187d6089a4bcf36f954bf3ccf9",
267+
},
268+
},
269+
"15.2.0": {
270+
"aarch64": {
271+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-15.2.0-aarch64.tar.xz",
272+
"sha256": "e1ae45038d350b297bea4ac10f095a98e2218971a8a37b8ab95f3faad2ec69f8",
273+
},
274+
"armv7": {
275+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-15.2.0-armv7.tar.xz",
276+
"sha256": "fda64b3ee1c3d7ddcb28378a1b131eadc5d3e3ff1cfab2aab71da7a3f899b601",
277+
},
278+
"x86_64": {
279+
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-15.2.0-x86_64.tar.xz",
280+
"sha256": "50dd28021365e7443853d5e77bc94ab1d1c947ad48fd91cbec44dbdfa61412c9",
281+
},
282+
},
283+
}
284+
285+
DEFAULT_GCC_VERSION = "14.3.0"
286+
226287
_FEATURE_ATTRS = {
227288
"binary_prefix": attr.string(
228289
doc = "An explicit prefix used by each binary in bin/.",
@@ -251,68 +312,11 @@ _FEATURE_ATTRS = {
251312
default = "gcc_toolchain",
252313
),
253314
"gcc_version": attr.string(
254-
default = "14.3.0",
315+
default = DEFAULT_GCC_VERSION,
255316
doc = "The version of GCC.",
256317
),
257318
"gcc_versions": attr.string(
258-
default = json.encode({
259-
"12.5.0": {
260-
"aarch64": {
261-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-12.5.0-aarch64.tar.xz",
262-
"sha256": "7b0e25133a98d44b648a925ba11f64a3adc470e87668af80ce2c3af389ebe9be",
263-
},
264-
"armv7": {
265-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-12.5.0-armv7.tar.xz",
266-
"sha256": "a0ef76c8cc517b3d76dd2f09b1a371975b2ff1082e2f9372ed79af01b9292934",
267-
},
268-
"x86_64": {
269-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-12.5.0-x86_64.tar.xz",
270-
"sha256": "51076e175839b434bb2dc0006c0096916df585e8c44666d35b0e3ce821d535db",
271-
},
272-
},
273-
"13.4.0": {
274-
"aarch64": {
275-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-13.4.0-aarch64.tar.xz",
276-
"sha256": "770cf6bf62bdf78763de526d3a9f5cae4c19f1a3aca0ef8f18b05f1a46d1ffaf",
277-
},
278-
"armv7": {
279-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-13.4.0-armv7.tar.xz",
280-
"sha256": "1b2739b5003c5a3f0ab7c4cc7fb95cc99c0e933982512de7255c2bd9ced757ad",
281-
},
282-
"x86_64": {
283-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-13.4.0-x86_64.tar.xz",
284-
"sha256": "d96071c1b98499afd7b7b56ebd69ad414020edf66e982004acffe7df8aaf7e02",
285-
},
286-
},
287-
"14.3.0": {
288-
"aarch64": {
289-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-14.3.0-aarch64.tar.xz",
290-
"sha256": "74b1f0072769f8865b62897ab962f6fce174115dab2e6596765bb4e700ffe0d1",
291-
},
292-
"armv7": {
293-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-14.3.0-armv7.tar.xz",
294-
"sha256": "0c20a130f424ce83dd4eb2a4ec8fbcd0c0ddc5f42f0b4660bcd0108cb8c0fb21",
295-
},
296-
"x86_64": {
297-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-14.3.0-x86_64.tar.xz",
298-
"sha256": "0b365e5da451f5c7adc594f967885d7181ff6d187d6089a4bcf36f954bf3ccf9",
299-
},
300-
},
301-
"15.2.0": {
302-
"aarch64": {
303-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-15.2.0-aarch64.tar.xz",
304-
"sha256": "e1ae45038d350b297bea4ac10f095a98e2218971a8a37b8ab95f3faad2ec69f8",
305-
},
306-
"armv7": {
307-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-15.2.0-armv7.tar.xz",
308-
"sha256": "fda64b3ee1c3d7ddcb28378a1b131eadc5d3e3ff1cfab2aab71da7a3f899b601",
309-
},
310-
"x86_64": {
311-
"url": "https://github.com/f0rmiga/gcc-builds/releases/download/18082025/gcc-toolchain-15.2.0-x86_64.tar.xz",
312-
"sha256": "50dd28021365e7443853d5e77bc94ab1d1c947ad48fd91cbec44dbdfa61412c9",
313-
},
314-
},
315-
}),
319+
default = json.encode(AVAILABLE_GCC_VERSIONS),
316320
doc = "A JSON dictionary of GCC versions to their download URLs and SHA256 hashes." +
317321
" The structure is {<gcc_version>: {<target_arch>: {url: <url>, sha256: <sha256>}}}.",
318322
),

toolchain/module_extensions.bzl

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,32 @@
1-
load(":defs.bzl", "ARCHS", "gcc_declare_toolchain")
1+
load(":defs.bzl", "ARCHS", "AVAILABLE_GCC_VERSIONS", "DEFAULT_GCC_VERSION", "gcc_declare_toolchain")
22

33
def _gcc_register_toolchain_module_extension(ctx):
44
for mod in ctx.modules:
5-
for declare in mod.tags.toolchain:
6-
gcc_declare_toolchain(
7-
name = declare.name,
8-
target_arch = declare.target_arch
9-
)
5+
# Only root modules are allowed to register repositories.
6+
# This does mean that every consumer has to call gcc_toolchains.toolchain for every toolchain they wish to use,
7+
# but it also means that we avoid polluting the namespace with repositories.
8+
# Some discussion around the practice: https://github.com/bazelbuild/bazel/discussions/22024
9+
if not mod.is_root:
10+
continue
11+
for declare in mod.tags.toolchain:
12+
gcc_declare_toolchain(
13+
name = declare.name,
14+
target_arch = declare.target_arch,
15+
gcc_version = declare.gcc_version,
16+
)
1017

11-
_declare_gcc_toolchain = tag_class(attrs = {"name": attr.string(), "target_arch": attr.string(values = [ARCHS.aarch64, ARCHS.armv7, ARCHS.x86_64])})
18+
_declare_gcc_toolchain = tag_class(attrs = {
19+
"name": attr.string(),
20+
"target_arch": attr.string(values = [ARCHS.aarch64, ARCHS.armv7, ARCHS.x86_64]),
21+
"gcc_version": attr.string(
22+
default = DEFAULT_GCC_VERSION,
23+
values = [k for (k, v) in AVAILABLE_GCC_VERSIONS.items()],
24+
),
25+
})
1226
gcc_toolchains = module_extension(
1327
doc = "Module extension that creates toolchains",
1428
implementation = _gcc_register_toolchain_module_extension,
1529
tag_classes = {
1630
"toolchain": _declare_gcc_toolchain,
17-
}
31+
},
1832
)

0 commit comments

Comments
 (0)