@@ -1149,30 +1149,6 @@ def construct_arguments(
11491149
11501150 return args , env
11511151
1152- def _get_dynamic_libraries_for_runtime (cc_infos , is_linking_statically ):
1153- libraries = []
1154-
1155- for cc_info in cc_infos :
1156- for linker_input in cc_info .linking_context .linker_inputs .to_list ():
1157- libraries .extend (linker_input .libraries )
1158-
1159- dynamic_libraries_for_runtime = []
1160- for library in libraries :
1161- artifact = _get_dynamic_library_for_runtime_or_none (library , is_linking_statically )
1162- if artifact != None :
1163- dynamic_libraries_for_runtime .append (artifact )
1164-
1165- return dynamic_libraries_for_runtime
1166-
1167- def _get_dynamic_library_for_runtime_or_none (library , is_linking_statically ):
1168- if library .dynamic_library == None :
1169- return None
1170-
1171- if is_linking_statically and (library .static_library != None or library .pic_static_library != None ):
1172- return None
1173-
1174- return library .dynamic_library
1175-
11761152def rustc_compile_action (
11771153 * ,
11781154 ctx ,
@@ -1527,58 +1503,30 @@ def rustc_compile_action(
15271503
15281504 experimental_use_coverage_metadata_files = toolchain ._experimental_use_coverage_metadata_files
15291505
1530- runfiles_list = []
1531- for data_dep in getattr (ctx .attr , "data" , []):
1532- if data_dep [DefaultInfo ].data_runfiles .files :
1533- runfiles_list .append (data_dep [DefaultInfo ].data_runfiles )
1534- else :
1535- # This branch ensures interop with custom Starlark rules following
1536- # https://bazel.build/extending/rules#runfiles_features_to_avoid
1537- runfiles_list .append (ctx .runfiles (transitive_files = data_dep [DefaultInfo ].files ))
1538- runfiles_list .append (data_dep [DefaultInfo ].default_runfiles )
1539-
1540- for src in getattr (ctx .attr , "srcs" , []):
1541- runfiles_list .append (src [DefaultInfo ].default_runfiles )
1542-
1543- for dep in getattr (ctx .attr , "deps" , []):
1544- runfiles_list .append (dep [DefaultInfo ].default_runfiles )
1545-
1546- if not experimental_use_coverage_metadata_files :
1547- runfiles_list .append (ctx .runfiles (files = coverage_runfiles ))
1548-
1549- common_runfiles = ctx .runfiles ().merge_all (runfiles_list )
1550-
1551- cc_infos_from_deps = _collect_cc_infos_from_deps (ctx , toolchain , crate_info )
1552-
1553- dynamic_libraries = ctx .runfiles (
1554- files = _get_dynamic_libraries_for_runtime (cc_infos_from_deps , True ),
1555- )
1556- library_default_runfiles = None
1557- library_data_runfiles = None
1558- binary_runfiles = None
1559- if crate_info .type in ["rlib" , "lib" , "dylib" ]:
1560- # Default runfiles for library include dynamic libraries that don't have
1561- # a static library equivalent.
1562- library_default_runfiles = common_runfiles .merge (dynamic_libraries )
1563-
1564- data_runfiles = ctx .runfiles (
1565- files = _get_dynamic_libraries_for_runtime (cc_infos_from_deps , False ),
1566- )
1567-
1568- # Data runfiles for library include dynamic libraries even when they have
1569- # a static library equivalent.
1570- library_data_runfiles = common_runfiles .merge (data_runfiles )
1571- else :
1572- binary_runfiles = common_runfiles .merge (dynamic_libraries )
1573-
1574- if getattr (ctx .attr , "crate" , None ):
1575- crate_default_info = ctx .attr .crate [DefaultInfo ]
1576- binary_runfiles = binary_runfiles .merge_all (
1577- [
1578- crate_default_info .default_runfiles ,
1579- crate_default_info .data_runfiles ,
1580- ],
1581- )
1506+ runfiles = ctx .runfiles (files = getattr (ctx .files , "data" , []))
1507+ transitive_runfiles = []
1508+ crate_attr = getattr (ctx .attr , "crate" , None )
1509+ for runfiles_attr in (
1510+ getattr (ctx .attr , "srcs" , []),
1511+ getattr (ctx .attr , "deps" , []),
1512+ getattr (ctx .attr , "data" , []),
1513+ [crate_attr ] if crate_attr else [],
1514+ ):
1515+ if not runfiles_attr :
1516+ continue
1517+ for target in runfiles_attr :
1518+ transitive_runfiles .append (target [DefaultInfo ].default_runfiles )
1519+ if crate_info .type in ["bin" , "cdylib" , "staticlib" ]:
1520+ dynamic_libraries = ctx .runfiles (files = [
1521+ library_to_link .dynamic_library
1522+ for dep in getattr (ctx .attr , "deps" , [])
1523+ if CcInfo in dep
1524+ for linker_input in dep [CcInfo ].linking_context .linker_inputs .to_list ()
1525+ for library_to_link in linker_input .libraries
1526+ if _is_dylib (library_to_link )
1527+ ])
1528+ transitive_runfiles .append (dynamic_libraries )
1529+ runfiles = runfiles .merge_all (transitive_runfiles )
15821530
15831531 # TODO: Remove after some resolution to
15841532 # https://github.com/bazelbuild/rules_rust/issues/771
@@ -1601,9 +1549,7 @@ def rustc_compile_action(
16011549 DefaultInfo (
16021550 # nb. This field is required for cc_library to depend on our output.
16031551 files = depset (outputs ),
1604- default_runfiles = library_default_runfiles ,
1605- data_runfiles = library_data_runfiles ,
1606- runfiles = binary_runfiles ,
1552+ runfiles = runfiles ,
16071553 executable = executable ,
16081554 ),
16091555 ]
@@ -1764,31 +1710,6 @@ def _add_codegen_units_flags(toolchain, emit, args):
17641710
17651711 args .add ("-Ccodegen-units={}" .format (toolchain ._codegen_units ))
17661712
1767- def _collect_cc_infos_from_deps (ctx , toolchain , crate_info ):
1768- cc_infos = []
1769-
1770- # Flattening is okay since crate_info.deps only records direct deps.
1771- for dep in crate_info .deps .to_list ():
1772- if dep .cc_info :
1773- # A Rust staticlib or shared library doesn't need to propagate linker inputs
1774- # of its dependencies, except for shared libraries.
1775- if crate_info .type in ["cdylib" , "staticlib" ]:
1776- shared_linker_inputs = _collect_nonstatic_linker_inputs (dep .cc_info )
1777- if shared_linker_inputs :
1778- linking_context = cc_common .create_linking_context (
1779- linker_inputs = depset (shared_linker_inputs ),
1780- )
1781- cc_infos .append (CcInfo (linking_context = linking_context ))
1782- else :
1783- cc_infos .append (dep .cc_info )
1784-
1785- if crate_info .type in ("rlib" , "lib" ):
1786- libstd_and_allocator_cc_info = _get_std_and_alloc_info (ctx , toolchain , crate_info )
1787- if libstd_and_allocator_cc_info :
1788- # TODO: if we already have an rlib in our deps, we could skip this
1789- cc_infos .append (libstd_and_allocator_cc_info )
1790- return cc_infos
1791-
17921713def establish_cc_info (ctx , attr , crate_info , toolchain , cc_toolchain , feature_configuration , interface_library ):
17931714 """If the produced crate is suitable yield a CcInfo to allow for interop with cc rules
17941715
@@ -1871,7 +1792,28 @@ def establish_cc_info(ctx, attr, crate_info, toolchain, cc_toolchain, feature_co
18711792 cc_infos = [
18721793 CcInfo (linking_context = linking_context ),
18731794 toolchain .stdlib_linkflags ,
1874- ] + _collect_cc_infos_from_deps (ctx , toolchain , crate_info )
1795+ ]
1796+
1797+ # Flattening is okay since crate_info.deps only records direct deps.
1798+ for dep in crate_info .deps .to_list ():
1799+ if dep .cc_info :
1800+ # A Rust staticlib or shared library doesn't need to propagate linker inputs
1801+ # of its dependencies, except for shared libraries.
1802+ if crate_info .type in ["cdylib" , "staticlib" ]:
1803+ shared_linker_inputs = _collect_nonstatic_linker_inputs (dep .cc_info )
1804+ if shared_linker_inputs :
1805+ linking_context = cc_common .create_linking_context (
1806+ linker_inputs = depset (shared_linker_inputs ),
1807+ )
1808+ cc_infos .append (CcInfo (linking_context = linking_context ))
1809+ else :
1810+ cc_infos .append (dep .cc_info )
1811+
1812+ if crate_info .type in ("rlib" , "lib" ):
1813+ libstd_and_allocator_cc_info = _get_std_and_alloc_info (ctx , toolchain , crate_info )
1814+ if libstd_and_allocator_cc_info :
1815+ # TODO: if we already have an rlib in our deps, we could skip this
1816+ cc_infos .append (libstd_and_allocator_cc_info )
18751817
18761818 providers = [cc_common .merge_cc_infos (cc_infos = cc_infos )]
18771819 if dot_a :
0 commit comments