Skip to content

Commit 5022140

Browse files
committed
wip
1 parent 3a23bf1 commit 5022140

1 file changed

Lines changed: 47 additions & 105 deletions

File tree

rust/private/rustc.bzl

Lines changed: 47 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
11761152
def 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-
17921713
def 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

Comments
 (0)