Skip to content

Commit 30bef02

Browse files
committed
Implement env_flags sub_target in buildscript_run
* Collect build script `cargo:rustc-env=NAME=val` output as `--env=NAME=val` flags * Export flags as an Artifact, which can be passed to cargo.rust_library/binary with `env_flags = ["@$(location :my_crate-0.0.0-build-script-run[env_flags])"],` Signed-off-by: Yuxuan Dai <[email protected]>
1 parent c552243 commit 30bef02

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

prelude/rust/cargo_buildscript.bzl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ def _cargo_buildscript_impl(ctx: AnalysisContext) -> list[Provider]:
8585
cwd = ctx.actions.declare_output("cwd", dir = True)
8686
out_dir = ctx.actions.declare_output("OUT_DIR", dir = True)
8787
rustc_flags = ctx.actions.declare_output("rustc_flags")
88+
env_flags = ctx.actions.declare_output("env_flags")
8889

8990
if ctx.attrs.manifest_dir != None:
9091
manifest_dir = ctx.attrs.manifest_dir[DefaultInfo].default_outputs[0]
@@ -97,7 +98,8 @@ def _cargo_buildscript_impl(ctx: AnalysisContext) -> list[Provider]:
9798
cmd_args("--rustc-cfg=", ctx.attrs.rustc_cfg[DefaultInfo].default_outputs[0], delimiter = ""),
9899
cmd_args("--manifest-dir=", manifest_dir, delimiter = ""),
99100
cmd_args("--create-cwd=", cwd.as_output(), delimiter = ""),
100-
cmd_args("--outfile=", rustc_flags.as_output(), delimiter = ""),
101+
cmd_args("--rustc-flags-outfile=", rustc_flags.as_output(), delimiter = ""),
102+
cmd_args("--env-flags-outfile=", env_flags.as_output(), delimiter = ""),
101103
]
102104

103105
# See https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts
@@ -144,6 +146,7 @@ def _cargo_buildscript_impl(ctx: AnalysisContext) -> list[Provider]:
144146
sub_targets = {
145147
"out_dir": [DefaultInfo(default_output = out_dir)],
146148
"rustc_flags": [DefaultInfo(default_output = rustc_flags)],
149+
"env_flags": [DefaultInfo(default_output = env_flags)],
147150
},
148151
)]
149152

prelude/rust/tools/buildscript_run.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ class Args(NamedTuple):
181181
rustc_host_tuple: Optional[Path]
182182
manifest_dir: Path
183183
create_cwd: Path
184-
outfile: IO[str]
184+
rustc_flags_outfile: IO[str]
185+
env_flags_outfile: IO[str]
185186

186187

187188
def arg_parse() -> Args:
@@ -191,7 +192,8 @@ def arg_parse() -> Args:
191192
parser.add_argument("--rustc-host-tuple", type=Path)
192193
parser.add_argument("--manifest-dir", type=Path, required=True)
193194
parser.add_argument("--create-cwd", type=Path, required=True)
194-
parser.add_argument("--outfile", type=argparse.FileType("w"), required=True)
195+
parser.add_argument("--rustc-flags-outfile", type=argparse.FileType("w"), required=True)
196+
parser.add_argument("--env-flags-outfile", type=argparse.FileType("w"), required=True)
195197

196198
return Args(**vars(parser.parse_args()))
197199

@@ -227,14 +229,23 @@ def main() -> None: # noqa: C901
227229
script_output = run_buildscript(args.buildscript, env=env, cwd=cwd)
228230

229231
cargo_rustc_cfg_pattern = re.compile("^cargo:rustc-cfg=(.*)")
230-
flags = ""
232+
cargo_env_flag_pattern = re.compile("^cargo:rustc-env=(.+?)=(.*)")
233+
rustc_flags = ""
234+
env_flags = ""
231235
for line in script_output.split("\n"):
232236
cargo_rustc_cfg_match = cargo_rustc_cfg_pattern.match(line)
233237
if cargo_rustc_cfg_match:
234-
flags += "--cfg={}\n".format(cargo_rustc_cfg_match.group(1))
238+
rustc_flags += "--cfg={}\n".format(cargo_rustc_cfg_match.group(1))
235239
else:
236-
print(line, end="\n")
237-
args.outfile.write(flags)
240+
cargo_env_flag_match = cargo_env_flag_pattern.match(line)
241+
if cargo_env_flag_match:
242+
key = cargo_env_flag_match.group(1)
243+
val = cargo_env_flag_match.group(2)
244+
env_flags += "--env={}={}\n".format(key, val)
245+
else:
246+
print(line, end="\n")
247+
args.rustc_flags_outfile.write(rustc_flags)
248+
args.env_flags_outfile.write(env_flags)
238249

239250

240251
if __name__ == "__main__":

0 commit comments

Comments
 (0)