@@ -28,6 +28,7 @@ load("//rust/private:rustc.bzl", "rustc_compile_action")
2828load (
2929 "//rust/private:utils.bzl" ,
3030 "can_build_metadata" ,
31+ "can_use_metadata_for_pipelining" ,
3132 "compute_crate_name" ,
3233 "crate_root_src" ,
3334 "dedent" ,
@@ -177,12 +178,22 @@ def _rust_library_common(ctx, crate_type):
177178 rust_lib = ctx .actions .declare_file (rust_lib_name )
178179 rust_metadata = None
179180 rustc_rmeta_output = None
180- if can_build_metadata (toolchain , ctx , crate_type ) and not ctx .attr .disable_pipelining :
181+ metadata_supports_pipelining = False
182+ if can_build_metadata (
183+ toolchain ,
184+ ctx ,
185+ crate_type ,
186+ disable_pipelining = getattr (ctx .attr , "disable_pipelining" , False ),
187+ ):
181188 rust_metadata = ctx .actions .declare_file (
182189 paths .replace_extension (rust_lib_name , ".rmeta" ),
183190 sibling = rust_lib ,
184191 )
185192 rustc_rmeta_output = generate_output_diagnostics (ctx , rust_metadata )
193+ metadata_supports_pipelining = (
194+ can_use_metadata_for_pipelining (toolchain , crate_type ) and
195+ not ctx .attr .disable_pipelining
196+ )
186197
187198 deps = transform_deps (ctx .attr .deps )
188199 proc_macro_deps = transform_deps (ctx .attr .proc_macro_deps + get_import_macro_deps (ctx ))
@@ -203,6 +214,7 @@ def _rust_library_common(ctx, crate_type):
203214 output = rust_lib ,
204215 rustc_output = generate_output_diagnostics (ctx , rust_lib ),
205216 metadata = rust_metadata ,
217+ metadata_supports_pipelining = metadata_supports_pipelining ,
206218 rustc_rmeta_output = rustc_rmeta_output ,
207219 edition = get_edition (ctx .attr , toolchain , ctx .label ),
208220 rustc_env = ctx .attr .rustc_env ,
@@ -242,6 +254,15 @@ def _rust_binary_impl(ctx):
242254 crate_root = crate_root_src (ctx .attr .name , ctx .attr .crate_name , ctx .files .srcs , ctx .attr .crate_type )
243255 srcs , compile_data , crate_root = transform_sources (ctx , ctx .files .srcs , ctx .files .compile_data , crate_root )
244256
257+ rust_metadata = None
258+ rustc_rmeta_output = None
259+ if can_build_metadata (toolchain , ctx , ctx .attr .crate_type ):
260+ rust_metadata = ctx .actions .declare_file (
261+ paths .replace_extension ("lib" + crate_name , ".rmeta" ),
262+ sibling = output ,
263+ )
264+ rustc_rmeta_output = generate_output_diagnostics (ctx , rust_metadata )
265+
245266 providers = rustc_compile_action (
246267 ctx = ctx ,
247268 attr = ctx .attr ,
@@ -256,6 +277,8 @@ def _rust_binary_impl(ctx):
256277 aliases = ctx .attr .aliases ,
257278 output = output ,
258279 rustc_output = generate_output_diagnostics (ctx , output ),
280+ metadata = rust_metadata ,
281+ rustc_rmeta_output = rustc_rmeta_output ,
259282 edition = get_edition (ctx .attr , toolchain , ctx .label ),
260283 rustc_env = ctx .attr .rustc_env ,
261284 rustc_env_files = ctx .files .rustc_env_files ,
@@ -337,6 +360,15 @@ def _rust_test_impl(ctx):
337360 ),
338361 )
339362
363+ rust_metadata = None
364+ rustc_rmeta_output = None
365+ if can_build_metadata (toolchain , ctx , crate_type ):
366+ rust_metadata = ctx .actions .declare_file (
367+ paths .replace_extension ("lib" + crate_name , ".rmeta" ),
368+ sibling = output ,
369+ )
370+ rustc_rmeta_output = generate_output_diagnostics (ctx , rust_metadata )
371+
340372 # Need to consider all src files together when transforming
341373 srcs = depset (ctx .files .srcs , transitive = [crate .srcs ]).to_list ()
342374 compile_data = depset (ctx .files .compile_data , transitive = [crate .compile_data ]).to_list ()
@@ -371,6 +403,8 @@ def _rust_test_impl(ctx):
371403 aliases = aliases ,
372404 output = output ,
373405 rustc_output = generate_output_diagnostics (ctx , output ),
406+ metadata = rust_metadata ,
407+ rustc_rmeta_output = rustc_rmeta_output ,
374408 edition = crate .edition ,
375409 rustc_env = rustc_env ,
376410 rustc_env_files = rustc_env_files ,
@@ -381,6 +415,8 @@ def _rust_test_impl(ctx):
381415 owner = ctx .label ,
382416 )
383417 else :
418+ crate_name = compute_crate_name (ctx .workspace_name , ctx .label , toolchain , ctx .attr .crate_name )
419+
384420 crate_root = getattr (ctx .file , "crate_root" , None )
385421
386422 if not crate_root :
@@ -402,6 +438,15 @@ def _rust_test_impl(ctx):
402438 ),
403439 )
404440
441+ rust_metadata = None
442+ rustc_rmeta_output = None
443+ if can_build_metadata (toolchain , ctx , crate_type ):
444+ rust_metadata = ctx .actions .declare_file (
445+ paths .replace_extension ("lib" + crate_name , ".rmeta" ),
446+ sibling = output ,
447+ )
448+ rustc_rmeta_output = generate_output_diagnostics (ctx , rust_metadata )
449+
405450 data_paths = depset (direct = getattr (ctx .attr , "data" , [])).to_list ()
406451 rustc_env = expand_dict_value_locations (
407452 ctx ,
@@ -412,7 +457,7 @@ def _rust_test_impl(ctx):
412457
413458 # Target is a standalone crate. Build the test binary as its own crate.
414459 crate_info_dict = dict (
415- name = compute_crate_name ( ctx . workspace_name , ctx . label , toolchain , ctx . attr . crate_name ) ,
460+ name = crate_name ,
416461 type = crate_type ,
417462 root = crate_root ,
418463 srcs = depset (srcs ),
@@ -421,6 +466,8 @@ def _rust_test_impl(ctx):
421466 aliases = ctx .attr .aliases ,
422467 output = output ,
423468 rustc_output = generate_output_diagnostics (ctx , output ),
469+ metadata = rust_metadata ,
470+ rustc_rmeta_output = rustc_rmeta_output ,
424471 edition = get_edition (ctx .attr , toolchain , ctx .label ),
425472 rustc_env = rustc_env ,
426473 rustc_env_files = ctx .files .rustc_env_files ,
@@ -534,6 +581,9 @@ def _stamp_attribute(default_value):
534581
535582# Internal attributes core to Rustc actions.
536583RUSTC_ATTRS = {
584+ "_always_enable_metadata_output_groups" : attr .label (
585+ default = Label ("//rust/settings:always_enable_metadata_output_groups" ),
586+ ),
537587 "_error_format" : attr .label (
538588 default = Label ("//rust/settings:error_format" ),
539589 ),
0 commit comments