Skip to content

Commit 37982c5

Browse files
davidskidmoreUebelAndrehlopko
authored
Add support for passing a custom target specification. (#836)
* Add support for passing a custom target specification. * Pass the target spec ias a dependency. * Created a target_flag_value toolchain info field to avoid recalculating the value. * Prevent passing both target_triple and target_json simultaneously. * Streamline checks for None. * Added unit tests for rust_toolchain rules. * Rename test target spec to avoid collisions with the builtin. * Regenerate documentation * Rename the triple used in unit tests. Co-authored-by: UebelAndre <github@uebelandre.com> Co-authored-by: Marcel Hlopko <hlopko@google.com>
1 parent 4da6858 commit 37982c5

File tree

8 files changed

+137
-5
lines changed

8 files changed

+137
-5
lines changed

cargo/cargo_build_script.bzl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def _build_script_impl(ctx):
7777
# This isn't exactly right, but Bazel doesn't have exact views of "debug" and "release", so...
7878
"PROFILE": {"dbg": "debug", "fastbuild": "debug", "opt": "release"}.get(ctx.var["COMPILATION_MODE"], "unknown"),
7979
"RUSTC": toolchain.rustc.path,
80-
"TARGET": toolchain.target_triple,
80+
"TARGET": toolchain.target_flag_value,
8181
# OUT_DIR is set by the runner itself, rather than on the action.
8282
})
8383

@@ -129,7 +129,7 @@ def _build_script_impl(ctx):
129129
script,
130130
ctx.executable._cargo_build_script_runner,
131131
toolchain.rustc,
132-
] + ctx.files.data,
132+
] + ctx.files.data + ([toolchain.target_json] if toolchain.target_json else []),
133133
transitive = toolchain_tools,
134134
)
135135

docs/flatten.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,8 @@ Run the test with `bazel build //hello_lib:hello_lib_test`.
10851085
<pre>
10861086
rust_toolchain(<a href="#rust_toolchain-name">name</a>, <a href="#rust_toolchain-allocator_library">allocator_library</a>, <a href="#rust_toolchain-binary_ext">binary_ext</a>, <a href="#rust_toolchain-cargo">cargo</a>, <a href="#rust_toolchain-clippy_driver">clippy_driver</a>, <a href="#rust_toolchain-debug_info">debug_info</a>,
10871087
<a href="#rust_toolchain-default_edition">default_edition</a>, <a href="#rust_toolchain-dylib_ext">dylib_ext</a>, <a href="#rust_toolchain-exec_triple">exec_triple</a>, <a href="#rust_toolchain-opt_level">opt_level</a>, <a href="#rust_toolchain-os">os</a>, <a href="#rust_toolchain-rust_doc">rust_doc</a>, <a href="#rust_toolchain-rust_lib">rust_lib</a>, <a href="#rust_toolchain-rustc">rustc</a>,
1088-
<a href="#rust_toolchain-rustc_lib">rustc_lib</a>, <a href="#rust_toolchain-rustc_srcs">rustc_srcs</a>, <a href="#rust_toolchain-rustfmt">rustfmt</a>, <a href="#rust_toolchain-staticlib_ext">staticlib_ext</a>, <a href="#rust_toolchain-stdlib_linkflags">stdlib_linkflags</a>, <a href="#rust_toolchain-target_triple">target_triple</a>)
1088+
<a href="#rust_toolchain-rustc_lib">rustc_lib</a>, <a href="#rust_toolchain-rustc_srcs">rustc_srcs</a>, <a href="#rust_toolchain-rustfmt">rustfmt</a>, <a href="#rust_toolchain-staticlib_ext">staticlib_ext</a>, <a href="#rust_toolchain-stdlib_linkflags">stdlib_linkflags</a>, <a href="#rust_toolchain-target_json">target_json</a>,
1089+
<a href="#rust_toolchain-target_triple">target_triple</a>)
10891090
</pre>
10901091

10911092
Declares a Rust toolchain for use.
@@ -1153,6 +1154,7 @@ See @rules_rust//rust:repositories.bzl for examples of defining the @rust_cpuX r
11531154
| <a id="rust_toolchain-rustfmt"></a>rustfmt | The location of the <code>rustfmt</code> binary. Can be a direct source or a filegroup containing one item. | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | optional | None |
11541155
| <a id="rust_toolchain-staticlib_ext"></a>staticlib_ext | The extension for static libraries created from rustc. | String | required | |
11551156
| <a id="rust_toolchain-stdlib_linkflags"></a>stdlib_linkflags | Additional linker libs used when std lib is linked, see https://github.com/rust-lang/rust/blob/master/src/libstd/build.rs | List of strings | required | |
1157+
| <a id="rust_toolchain-target_json"></a>target_json | Override the target_triple with a custom target specification. For more details see: https://doc.rust-lang.org/rustc/targets/custom.html | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | optional | None |
11561158
| <a id="rust_toolchain-target_triple"></a>target_triple | The platform triple for the toolchains target environment. For more details see: https://docs.bazel.build/versions/master/skylark/rules.html#configurations | String | optional | "" |
11571159

11581160

docs/rust_repositories.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ A dedicated filegroup-like rule for Rust stdlib artifacts.
3434
<pre>
3535
rust_toolchain(<a href="#rust_toolchain-name">name</a>, <a href="#rust_toolchain-allocator_library">allocator_library</a>, <a href="#rust_toolchain-binary_ext">binary_ext</a>, <a href="#rust_toolchain-cargo">cargo</a>, <a href="#rust_toolchain-clippy_driver">clippy_driver</a>, <a href="#rust_toolchain-debug_info">debug_info</a>,
3636
<a href="#rust_toolchain-default_edition">default_edition</a>, <a href="#rust_toolchain-dylib_ext">dylib_ext</a>, <a href="#rust_toolchain-exec_triple">exec_triple</a>, <a href="#rust_toolchain-opt_level">opt_level</a>, <a href="#rust_toolchain-os">os</a>, <a href="#rust_toolchain-rust_doc">rust_doc</a>, <a href="#rust_toolchain-rust_lib">rust_lib</a>, <a href="#rust_toolchain-rustc">rustc</a>,
37-
<a href="#rust_toolchain-rustc_lib">rustc_lib</a>, <a href="#rust_toolchain-rustc_srcs">rustc_srcs</a>, <a href="#rust_toolchain-rustfmt">rustfmt</a>, <a href="#rust_toolchain-staticlib_ext">staticlib_ext</a>, <a href="#rust_toolchain-stdlib_linkflags">stdlib_linkflags</a>, <a href="#rust_toolchain-target_triple">target_triple</a>)
37+
<a href="#rust_toolchain-rustc_lib">rustc_lib</a>, <a href="#rust_toolchain-rustc_srcs">rustc_srcs</a>, <a href="#rust_toolchain-rustfmt">rustfmt</a>, <a href="#rust_toolchain-staticlib_ext">staticlib_ext</a>, <a href="#rust_toolchain-stdlib_linkflags">stdlib_linkflags</a>, <a href="#rust_toolchain-target_json">target_json</a>,
38+
<a href="#rust_toolchain-target_triple">target_triple</a>)
3839
</pre>
3940

4041
Declares a Rust toolchain for use.
@@ -102,6 +103,7 @@ See @rules_rust//rust:repositories.bzl for examples of defining the @rust_cpuX r
102103
| <a id="rust_toolchain-rustfmt"></a>rustfmt | The location of the <code>rustfmt</code> binary. Can be a direct source or a filegroup containing one item. | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | optional | None |
103104
| <a id="rust_toolchain-staticlib_ext"></a>staticlib_ext | The extension for static libraries created from rustc. | String | required | |
104105
| <a id="rust_toolchain-stdlib_linkflags"></a>stdlib_linkflags | Additional linker libs used when std lib is linked, see https://github.com/rust-lang/rust/blob/master/src/libstd/build.rs | List of strings | required | |
106+
| <a id="rust_toolchain-target_json"></a>target_json | Override the target_triple with a custom target specification. For more details see: https://doc.rust-lang.org/rustc/targets/custom.html | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | optional | None |
105107
| <a id="rust_toolchain-target_triple"></a>target_triple | The platform triple for the toolchains target environment. For more details see: https://docs.bazel.build/versions/master/skylark/rules.html#configurations | String | optional | "" |
106108

107109

rust/private/rustc.bzl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def collect_inputs(
287287
[toolchain.rustc] +
288288
toolchain.crosstool_files +
289289
([build_info.rustc_env, build_info.flags] if build_info else []) +
290+
([toolchain.target_json] if toolchain.target_json else []) +
290291
([] if linker_script == None else [linker_script]),
291292
transitive = [
292293
toolchain.rustc_lib.files,
@@ -430,7 +431,7 @@ def construct_arguments(
430431

431432
args.add("--emit=" + ",".join(emit_with_paths))
432433
args.add("--color=always")
433-
args.add("--target=" + toolchain.target_triple)
434+
args.add("--target=" + toolchain.target_flag_value)
434435
if hasattr(attr, "crate_features"):
435436
args.add_all(getattr(attr, "crate_features"), before_each = "--cfg", format_each = 'feature="%s"')
436437
if linker_script:

rust/toolchain.bzl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,17 @@ def _rust_toolchain_impl(ctx):
196196
if not k in ctx.attr.opt_level:
197197
fail("Compilation mode {} is not defined in opt_level but is defined debug_info".format(k))
198198

199+
if ctx.attr.target_triple and ctx.file.target_json:
200+
fail("Do not specify both target_triple and target_json, either use a builtin triple or provide a custom specification file.")
201+
199202
toolchain = platform_common.ToolchainInfo(
200203
rustc = ctx.file.rustc,
201204
rust_doc = ctx.file.rust_doc,
202205
rustfmt = ctx.file.rustfmt,
203206
cargo = ctx.file.cargo,
204207
clippy_driver = ctx.file.clippy_driver,
208+
target_json = ctx.file.target_json,
209+
target_flag_value = ctx.file.target_json.path if ctx.file.target_json else ctx.attr.target_triple,
205210
rustc_lib = ctx.attr.rustc_lib,
206211
rustc_srcs = ctx.attr.rustc_srcs,
207212
rust_lib = ctx.attr.rust_lib,
@@ -305,6 +310,11 @@ rust_toolchain = rule(
305310
),
306311
mandatory = True,
307312
),
313+
"target_json": attr.label(
314+
doc = ("Override the target_triple with a custom target specification. " +
315+
"For more details see: https://doc.rust-lang.org/rustc/targets/custom.html"),
316+
allow_single_file = True,
317+
),
308318
"target_triple": attr.string(
309319
doc = (
310320
"The platform triple for the toolchains target environment. " +

test/unit/toolchain/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
load(":toolchain_test.bzl", "toolchain_test_suite")
2+
3+
toolchain_test_suite(name = "toolchain_test_suite")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"arch": "x86_64",
3+
"cpu": "x86-64",
4+
"crt-static-respected": true,
5+
"data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128",
6+
"dynamic-linking": true,
7+
"env": "gnu",
8+
"executables": true,
9+
"has-elf-tls": true,
10+
"has-rpath": true,
11+
"llvm-target": "x86_64-unknown-linux-gnu",
12+
"max-atomic-width": 64,
13+
"os": "linux",
14+
"position-independent-executables": true,
15+
"pre-link-args": {
16+
"gcc": [
17+
"-m64"
18+
]
19+
},
20+
"relro-level": "full",
21+
"stack-probes": {
22+
"kind": "call"
23+
},
24+
"supported-sanitizers": [
25+
"address",
26+
"leak",
27+
"memory",
28+
"thread"
29+
],
30+
"target-family": [
31+
"unix"
32+
],
33+
"target-pointer-width": "64"
34+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
"""Unit tests for rust toolchains."""
2+
3+
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
4+
load("//rust:toolchain.bzl", "rust_stdlib_filegroup", "rust_toolchain")
5+
6+
def _toolchain_specifies_target_triple_test_impl(ctx):
7+
env = analysistest.begin(ctx)
8+
toolchain_info = analysistest.target_under_test(env)[platform_common.ToolchainInfo]
9+
10+
asserts.equals(env, None, toolchain_info.target_json)
11+
asserts.equals(env, "toolchain-test-triple", toolchain_info.target_flag_value)
12+
asserts.equals(env, "toolchain-test-triple", toolchain_info.target_triple)
13+
14+
return analysistest.end(env)
15+
16+
def _toolchain_specifies_target_json_test_impl(ctx):
17+
env = analysistest.begin(ctx)
18+
toolchain_info = analysistest.target_under_test(env)[platform_common.ToolchainInfo]
19+
20+
asserts.equals(env, "toolchain-test-triple.json", toolchain_info.target_json.basename)
21+
asserts.equals(env, "test/unit/toolchain/toolchain-test-triple.json", toolchain_info.target_flag_value)
22+
asserts.equals(env, "", toolchain_info.target_triple)
23+
24+
return analysistest.end(env)
25+
26+
toolchain_specifies_target_triple_test = analysistest.make(_toolchain_specifies_target_triple_test_impl)
27+
toolchain_specifies_target_json_test = analysistest.make(_toolchain_specifies_target_json_test_impl)
28+
29+
def _toolchain_test():
30+
rust_stdlib_filegroup(
31+
name = "std_libs",
32+
srcs = [],
33+
)
34+
35+
native.filegroup(
36+
name = "target_json",
37+
srcs = ["toolchain-test-triple.json"],
38+
)
39+
40+
rust_toolchain(
41+
name = "rust_triple_toolchain",
42+
binary_ext = "",
43+
dylib_ext = ".so",
44+
os = "linux",
45+
rust_lib = ":std_libs",
46+
staticlib_ext = ".a",
47+
stdlib_linkflags = [],
48+
target_triple = "toolchain-test-triple",
49+
)
50+
51+
rust_toolchain(
52+
name = "rust_json_toolchain",
53+
binary_ext = "",
54+
dylib_ext = ".so",
55+
os = "linux",
56+
rust_lib = ":std_libs",
57+
staticlib_ext = ".a",
58+
stdlib_linkflags = [],
59+
target_json = ":target_json",
60+
)
61+
62+
toolchain_specifies_target_triple_test(
63+
name = "toolchain_specifies_target_triple_test",
64+
target_under_test = ":rust_triple_toolchain",
65+
)
66+
toolchain_specifies_target_json_test(
67+
name = "toolchain_specifies_target_json_test",
68+
target_under_test = ":rust_json_toolchain",
69+
)
70+
71+
def toolchain_test_suite(name):
72+
_toolchain_test()
73+
74+
native.test_suite(
75+
name = name,
76+
tests = [
77+
":toolchain_specifies_target_triple_test",
78+
":toolchain_specifies_target_json_test",
79+
],
80+
)

0 commit comments

Comments
 (0)