xref: /aosp_15_r20/bootable/libbootloader/gbl/toolchain/gbl_toolchain.bzl (revision 5225e6b173e52d2efc6bcf950c27374fd72adabc)
1*5225e6b1SAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project
2*5225e6b1SAndroid Build Coastguard Worker#
3*5225e6b1SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*5225e6b1SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*5225e6b1SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*5225e6b1SAndroid Build Coastguard Worker#
7*5225e6b1SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*5225e6b1SAndroid Build Coastguard Worker#
9*5225e6b1SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*5225e6b1SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*5225e6b1SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5225e6b1SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*5225e6b1SAndroid Build Coastguard Worker# limitations under the License.
14*5225e6b1SAndroid Build Coastguard Worker
15*5225e6b1SAndroid Build Coastguard Worker"""
16*5225e6b1SAndroid Build Coastguard WorkerThis file contains rules for defininig GBL toolchains.
17*5225e6b1SAndroid Build Coastguard Worker"""
18*5225e6b1SAndroid Build Coastguard Worker
19*5225e6b1SAndroid Build Coastguard Workerload(
20*5225e6b1SAndroid Build Coastguard Worker    "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
21*5225e6b1SAndroid Build Coastguard Worker    "action_config",
22*5225e6b1SAndroid Build Coastguard Worker    "flag_group",
23*5225e6b1SAndroid Build Coastguard Worker    "flag_set",
24*5225e6b1SAndroid Build Coastguard Worker    "tool",
25*5225e6b1SAndroid Build Coastguard Worker    "tool_path",
26*5225e6b1SAndroid Build Coastguard Worker)
27*5225e6b1SAndroid Build Coastguard Workerload("@gbl_llvm_prebuilts//:info.bzl", "LLVM_PREBUILTS_C_INCLUDE", "gbl_llvm_tool_path")
28*5225e6b1SAndroid Build Coastguard Workerload("@rules_cc//cc:action_names.bzl", "ACTION_NAMES", "ALL_CPP_COMPILE_ACTION_NAMES")
29*5225e6b1SAndroid Build Coastguard Worker
30*5225e6b1SAndroid Build Coastguard Workerdef _flag_set(flags):
31*5225e6b1SAndroid Build Coastguard Worker    """Convert a list of compile/link flags to a flag_set type."""
32*5225e6b1SAndroid Build Coastguard Worker    return flag_set(
33*5225e6b1SAndroid Build Coastguard Worker        flag_groups = [
34*5225e6b1SAndroid Build Coastguard Worker            flag_group(
35*5225e6b1SAndroid Build Coastguard Worker                flags = flags,
36*5225e6b1SAndroid Build Coastguard Worker            ),
37*5225e6b1SAndroid Build Coastguard Worker        ],
38*5225e6b1SAndroid Build Coastguard Worker    )
39*5225e6b1SAndroid Build Coastguard Worker
40*5225e6b1SAndroid Build Coastguard Workerdef _gbl_clang_cc_toolchain_config_impl(ctx):
41*5225e6b1SAndroid Build Coastguard Worker    """Implementation for rule _gbl_clang_cc_toolchain_config()"""
42*5225e6b1SAndroid Build Coastguard Worker    builtin_includes = ctx.attr.builtin_includes or [LLVM_PREBUILTS_C_INCLUDE]
43*5225e6b1SAndroid Build Coastguard Worker    common_compile_flagset = [
44*5225e6b1SAndroid Build Coastguard Worker        _flag_set([
45*5225e6b1SAndroid Build Coastguard Worker            "--target={}".format(ctx.attr.target_system_triple),
46*5225e6b1SAndroid Build Coastguard Worker            "-nostdinc",
47*5225e6b1SAndroid Build Coastguard Worker            "-no-canonical-prefixes",
48*5225e6b1SAndroid Build Coastguard Worker            "-Werror",
49*5225e6b1SAndroid Build Coastguard Worker            "-Wall",
50*5225e6b1SAndroid Build Coastguard Worker        ] + ["-I{}".format(inc) for inc in builtin_includes] + ctx.attr.cc_flags),
51*5225e6b1SAndroid Build Coastguard Worker    ]
52*5225e6b1SAndroid Build Coastguard Worker    return cc_common.create_cc_toolchain_config_info(
53*5225e6b1SAndroid Build Coastguard Worker        ctx = ctx,
54*5225e6b1SAndroid Build Coastguard Worker        cxx_builtin_include_directories = builtin_includes,
55*5225e6b1SAndroid Build Coastguard Worker        toolchain_identifier = "{}_id".format(ctx.attr.cc_toolchain_name),
56*5225e6b1SAndroid Build Coastguard Worker        host_system_name = "local",
57*5225e6b1SAndroid Build Coastguard Worker        target_system_name = ctx.attr.target_system_triple,
58*5225e6b1SAndroid Build Coastguard Worker        target_cpu = ctx.attr.target_cpu,
59*5225e6b1SAndroid Build Coastguard Worker        target_libc = "unknown",
60*5225e6b1SAndroid Build Coastguard Worker        compiler = "clang",
61*5225e6b1SAndroid Build Coastguard Worker        abi_version = "unknown",
62*5225e6b1SAndroid Build Coastguard Worker        abi_libc_version = "unknown",
63*5225e6b1SAndroid Build Coastguard Worker        action_configs = [
64*5225e6b1SAndroid Build Coastguard Worker            action_config(
65*5225e6b1SAndroid Build Coastguard Worker                action_name = action_name,
66*5225e6b1SAndroid Build Coastguard Worker                enabled = True,
67*5225e6b1SAndroid Build Coastguard Worker                tools = [tool(path = gbl_llvm_tool_path("clang++"))],
68*5225e6b1SAndroid Build Coastguard Worker                flag_sets = common_compile_flagset,
69*5225e6b1SAndroid Build Coastguard Worker            )
70*5225e6b1SAndroid Build Coastguard Worker            for action_name in ALL_CPP_COMPILE_ACTION_NAMES +
71*5225e6b1SAndroid Build Coastguard Worker                               [ACTION_NAMES.assemble, ACTION_NAMES.preprocess_assemble]
72*5225e6b1SAndroid Build Coastguard Worker        ] + [
73*5225e6b1SAndroid Build Coastguard Worker            action_config(
74*5225e6b1SAndroid Build Coastguard Worker                action_name = ACTION_NAMES.c_compile,
75*5225e6b1SAndroid Build Coastguard Worker                enabled = True,
76*5225e6b1SAndroid Build Coastguard Worker                tools = [tool(path = gbl_llvm_tool_path("clang"))],
77*5225e6b1SAndroid Build Coastguard Worker                flag_sets = common_compile_flagset,
78*5225e6b1SAndroid Build Coastguard Worker            ),
79*5225e6b1SAndroid Build Coastguard Worker        ] + [
80*5225e6b1SAndroid Build Coastguard Worker            action_config(
81*5225e6b1SAndroid Build Coastguard Worker                action_name = ACTION_NAMES.cpp_link_executable,
82*5225e6b1SAndroid Build Coastguard Worker                enabled = True,
83*5225e6b1SAndroid Build Coastguard Worker                tools = [tool(path = gbl_llvm_tool_path("clang++"))],
84*5225e6b1SAndroid Build Coastguard Worker                flag_sets = [_flag_set(ctx.attr.ld_flags)] if ctx.attr.ld_flags else [],
85*5225e6b1SAndroid Build Coastguard Worker            ),
86*5225e6b1SAndroid Build Coastguard Worker        ],
87*5225e6b1SAndroid Build Coastguard Worker        tool_paths = [
88*5225e6b1SAndroid Build Coastguard Worker            tool_path(
89*5225e6b1SAndroid Build Coastguard Worker                name = "ld",
90*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("clang++"),
91*5225e6b1SAndroid Build Coastguard Worker            ),
92*5225e6b1SAndroid Build Coastguard Worker            tool_path(
93*5225e6b1SAndroid Build Coastguard Worker                name = "ar",
94*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("llvm-ar"),
95*5225e6b1SAndroid Build Coastguard Worker            ),
96*5225e6b1SAndroid Build Coastguard Worker            tool_path(
97*5225e6b1SAndroid Build Coastguard Worker                name = "cpp",
98*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("clang++"),
99*5225e6b1SAndroid Build Coastguard Worker            ),
100*5225e6b1SAndroid Build Coastguard Worker            tool_path(
101*5225e6b1SAndroid Build Coastguard Worker                name = "gcc",
102*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("clang"),
103*5225e6b1SAndroid Build Coastguard Worker            ),
104*5225e6b1SAndroid Build Coastguard Worker            tool_path(
105*5225e6b1SAndroid Build Coastguard Worker                name = "gcov",
106*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("llvm-cov"),
107*5225e6b1SAndroid Build Coastguard Worker            ),
108*5225e6b1SAndroid Build Coastguard Worker            tool_path(
109*5225e6b1SAndroid Build Coastguard Worker                name = "nm",
110*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("llvm-nm"),
111*5225e6b1SAndroid Build Coastguard Worker            ),
112*5225e6b1SAndroid Build Coastguard Worker            tool_path(
113*5225e6b1SAndroid Build Coastguard Worker                name = "objdump",
114*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("llvm-objdump"),
115*5225e6b1SAndroid Build Coastguard Worker            ),
116*5225e6b1SAndroid Build Coastguard Worker            tool_path(
117*5225e6b1SAndroid Build Coastguard Worker                name = "strip",
118*5225e6b1SAndroid Build Coastguard Worker                path = gbl_llvm_tool_path("llvm-strip"),
119*5225e6b1SAndroid Build Coastguard Worker            ),
120*5225e6b1SAndroid Build Coastguard Worker        ],
121*5225e6b1SAndroid Build Coastguard Worker    )
122*5225e6b1SAndroid Build Coastguard Worker
123*5225e6b1SAndroid Build Coastguard Worker_gbl_clang_cc_toolchain_config = rule(
124*5225e6b1SAndroid Build Coastguard Worker    implementation = _gbl_clang_cc_toolchain_config_impl,
125*5225e6b1SAndroid Build Coastguard Worker    attrs = {
126*5225e6b1SAndroid Build Coastguard Worker        "cc_toolchain_name": attr.string(),
127*5225e6b1SAndroid Build Coastguard Worker        "target_cpu": attr.string(),
128*5225e6b1SAndroid Build Coastguard Worker        "target_system_triple": attr.string(),
129*5225e6b1SAndroid Build Coastguard Worker        "cc_flags": attr.string_list(),
130*5225e6b1SAndroid Build Coastguard Worker        "ld_flags": attr.string_list(),
131*5225e6b1SAndroid Build Coastguard Worker        "builtin_includes": attr.string_list(),
132*5225e6b1SAndroid Build Coastguard Worker    },
133*5225e6b1SAndroid Build Coastguard Worker    provides = [CcToolchainConfigInfo],
134*5225e6b1SAndroid Build Coastguard Worker)
135*5225e6b1SAndroid Build Coastguard Worker
136*5225e6b1SAndroid Build Coastguard Workerdef gbl_clang_cc_toolchain(
137*5225e6b1SAndroid Build Coastguard Worker        name,
138*5225e6b1SAndroid Build Coastguard Worker        target_cpu,
139*5225e6b1SAndroid Build Coastguard Worker        target_system_triple,
140*5225e6b1SAndroid Build Coastguard Worker        cc_flags = None,
141*5225e6b1SAndroid Build Coastguard Worker        ld_flags = None,
142*5225e6b1SAndroid Build Coastguard Worker        builtin_includes = None):
143*5225e6b1SAndroid Build Coastguard Worker    """Configure a clang based cc_toolchain().
144*5225e6b1SAndroid Build Coastguard Worker
145*5225e6b1SAndroid Build Coastguard Worker    Args:
146*5225e6b1SAndroid Build Coastguard Worker        name (String): Name of the target.
147*5225e6b1SAndroid Build Coastguard Worker        target_cpu (string): Target CPU.
148*5225e6b1SAndroid Build Coastguard Worker        target_system_triple (string): LLVM-style target system triple.
149*5225e6b1SAndroid Build Coastguard Worker        cc_flags (List): clang compile flags.
150*5225e6b1SAndroid Build Coastguard Worker        ld_flags (List): clang link flags
151*5225e6b1SAndroid Build Coastguard Worker        builtin_includes (List): Override the default list of builtin include dirs.
152*5225e6b1SAndroid Build Coastguard Worker    """
153*5225e6b1SAndroid Build Coastguard Worker    config_name = "_{}_config".format(name)
154*5225e6b1SAndroid Build Coastguard Worker    _gbl_clang_cc_toolchain_config(
155*5225e6b1SAndroid Build Coastguard Worker        name = config_name,
156*5225e6b1SAndroid Build Coastguard Worker        cc_toolchain_name = name,
157*5225e6b1SAndroid Build Coastguard Worker        target_cpu = target_cpu,
158*5225e6b1SAndroid Build Coastguard Worker        target_system_triple = target_system_triple,
159*5225e6b1SAndroid Build Coastguard Worker        cc_flags = cc_flags,
160*5225e6b1SAndroid Build Coastguard Worker        ld_flags = ld_flags,
161*5225e6b1SAndroid Build Coastguard Worker        builtin_includes = builtin_includes,
162*5225e6b1SAndroid Build Coastguard Worker    )
163*5225e6b1SAndroid Build Coastguard Worker
164*5225e6b1SAndroid Build Coastguard Worker    empty_filegroup = "_empty_{}".format(name)
165*5225e6b1SAndroid Build Coastguard Worker    native.filegroup(name = empty_filegroup)
166*5225e6b1SAndroid Build Coastguard Worker    empty_filegroup_target = ":{}".format(empty_filegroup)
167*5225e6b1SAndroid Build Coastguard Worker
168*5225e6b1SAndroid Build Coastguard Worker    native.cc_toolchain(
169*5225e6b1SAndroid Build Coastguard Worker        name = name,
170*5225e6b1SAndroid Build Coastguard Worker        toolchain_identifier = name,
171*5225e6b1SAndroid Build Coastguard Worker        toolchain_config = ":{}".format(config_name),
172*5225e6b1SAndroid Build Coastguard Worker        all_files = empty_filegroup_target,
173*5225e6b1SAndroid Build Coastguard Worker        compiler_files = empty_filegroup_target,
174*5225e6b1SAndroid Build Coastguard Worker        dwp_files = empty_filegroup_target,
175*5225e6b1SAndroid Build Coastguard Worker        linker_files = empty_filegroup_target,
176*5225e6b1SAndroid Build Coastguard Worker        objcopy_files = empty_filegroup_target,
177*5225e6b1SAndroid Build Coastguard Worker        strip_files = empty_filegroup_target,
178*5225e6b1SAndroid Build Coastguard Worker        supports_param_files = 0,
179*5225e6b1SAndroid Build Coastguard Worker    )
180*5225e6b1SAndroid Build Coastguard Worker
181*5225e6b1SAndroid Build Coastguard Workerdef _prebuilt_binary_impl(ctx):
182*5225e6b1SAndroid Build Coastguard Worker    """Generate a wrapper executable type target that simply symlinks to a given executable binary.
183*5225e6b1SAndroid Build Coastguard Worker
184*5225e6b1SAndroid Build Coastguard Worker    This is for rules that only accept executable type target but not binary file directly.
185*5225e6b1SAndroid Build Coastguard Worker    i.e. `rust_bindgen_toolchain`
186*5225e6b1SAndroid Build Coastguard Worker    """
187*5225e6b1SAndroid Build Coastguard Worker    out = ctx.actions.declare_file(ctx.label.name)
188*5225e6b1SAndroid Build Coastguard Worker    ctx.actions.symlink(
189*5225e6b1SAndroid Build Coastguard Worker        output = out,
190*5225e6b1SAndroid Build Coastguard Worker        target_file = ctx.executable.bin,
191*5225e6b1SAndroid Build Coastguard Worker    )
192*5225e6b1SAndroid Build Coastguard Worker    return [DefaultInfo(files = depset([out]), executable = out)]
193*5225e6b1SAndroid Build Coastguard Worker
194*5225e6b1SAndroid Build Coastguard Workerprebuilt_binary = rule(
195*5225e6b1SAndroid Build Coastguard Worker    implementation = _prebuilt_binary_impl,
196*5225e6b1SAndroid Build Coastguard Worker    executable = True,
197*5225e6b1SAndroid Build Coastguard Worker    attrs = {
198*5225e6b1SAndroid Build Coastguard Worker        "bin": attr.label(allow_single_file = True, executable = True, cfg = "exec"),
199*5225e6b1SAndroid Build Coastguard Worker    },
200*5225e6b1SAndroid Build Coastguard Worker)
201*5225e6b1SAndroid Build Coastguard Worker
202*5225e6b1SAndroid Build Coastguard Worker# A transition rule that emits the `@gbl//toolchain:rust_no_sysroot_true` setting.
203*5225e6b1SAndroid Build Coastguard Workerdef _no_sysroot_transition_impl(_, __):
204*5225e6b1SAndroid Build Coastguard Worker    return {"@gbl//toolchain:rust_no_sysroot": True}
205*5225e6b1SAndroid Build Coastguard Worker
206*5225e6b1SAndroid Build Coastguard Worker_no_sysroot_transition = transition(
207*5225e6b1SAndroid Build Coastguard Worker    implementation = _no_sysroot_transition_impl,
208*5225e6b1SAndroid Build Coastguard Worker    inputs = [],
209*5225e6b1SAndroid Build Coastguard Worker    outputs = ["@gbl//toolchain:rust_no_sysroot"],
210*5225e6b1SAndroid Build Coastguard Worker)
211*5225e6b1SAndroid Build Coastguard Worker
212*5225e6b1SAndroid Build Coastguard Worker# A rule implementation that simply forwards dependencies from attribute `deps` and generates
213*5225e6b1SAndroid Build Coastguard Worker# symlinks to their output files.
214*5225e6b1SAndroid Build Coastguard Workerdef _forward_and_symlink(ctx):
215*5225e6b1SAndroid Build Coastguard Worker    outs = []
216*5225e6b1SAndroid Build Coastguard Worker    for file in ctx.files.deps:
217*5225e6b1SAndroid Build Coastguard Worker        # Append the label name to the file name but keep the same extension. i.e.
218*5225e6b1SAndroid Build Coastguard Worker        # "<file>.<extension>" -> "<file>_<label>.<extension>"
219*5225e6b1SAndroid Build Coastguard Worker        stem = file.basename.removesuffix(".{}".format(file.extension))
220*5225e6b1SAndroid Build Coastguard Worker        out = ctx.actions.declare_file("{}_{}.{}".format(stem, ctx.label.name, file.extension))
221*5225e6b1SAndroid Build Coastguard Worker        ctx.actions.symlink(output = out, target_file = file)
222*5225e6b1SAndroid Build Coastguard Worker        outs.append(out)
223*5225e6b1SAndroid Build Coastguard Worker    return [DefaultInfo(files = depset(outs))]
224*5225e6b1SAndroid Build Coastguard Worker
225*5225e6b1SAndroid Build Coastguard Worker# A rule for building rust targets with the `@gbl//toolchain:rust_no_sysroot_true` setting.
226*5225e6b1SAndroid Build Coastguard Workerbuild_with_no_rust_sysroot = rule(
227*5225e6b1SAndroid Build Coastguard Worker    implementation = _forward_and_symlink,
228*5225e6b1SAndroid Build Coastguard Worker    cfg = _no_sysroot_transition,
229*5225e6b1SAndroid Build Coastguard Worker    attrs = {
230*5225e6b1SAndroid Build Coastguard Worker        # Mandatory attribute for rules with transition.
231*5225e6b1SAndroid Build Coastguard Worker        "_allowlist_function_transition": attr.label(
232*5225e6b1SAndroid Build Coastguard Worker            default = Label("@bazel_tools//tools/allowlists/function_transition_allowlist"),
233*5225e6b1SAndroid Build Coastguard Worker        ),
234*5225e6b1SAndroid Build Coastguard Worker        "deps": attr.label_list(allow_files = True, mandatory = True),
235*5225e6b1SAndroid Build Coastguard Worker    },
236*5225e6b1SAndroid Build Coastguard Worker)
237*5225e6b1SAndroid Build Coastguard Worker
238*5225e6b1SAndroid Build Coastguard Worker# A transition rule that emits the "--platforms=<attr.platform>" option.
239*5225e6b1SAndroid Build Coastguard Workerdef _platform_transition_impl(_, attr):
240*5225e6b1SAndroid Build Coastguard Worker    return {"//command_line_option:platforms": attr.platform}
241*5225e6b1SAndroid Build Coastguard Worker
242*5225e6b1SAndroid Build Coastguard Worker_platform_transition = transition(
243*5225e6b1SAndroid Build Coastguard Worker    implementation = _platform_transition_impl,
244*5225e6b1SAndroid Build Coastguard Worker    inputs = [],
245*5225e6b1SAndroid Build Coastguard Worker    outputs = ["//command_line_option:platforms"],
246*5225e6b1SAndroid Build Coastguard Worker)
247*5225e6b1SAndroid Build Coastguard Worker
248*5225e6b1SAndroid Build Coastguard Workerbuild_with_platform = rule(
249*5225e6b1SAndroid Build Coastguard Worker    implementation = _forward_and_symlink,
250*5225e6b1SAndroid Build Coastguard Worker    cfg = _platform_transition,
251*5225e6b1SAndroid Build Coastguard Worker    attrs = {
252*5225e6b1SAndroid Build Coastguard Worker        # Mandatory attribute for rules with transition.
253*5225e6b1SAndroid Build Coastguard Worker        "_allowlist_function_transition": attr.label(
254*5225e6b1SAndroid Build Coastguard Worker            default = Label("@bazel_tools//tools/allowlists/function_transition_allowlist"),
255*5225e6b1SAndroid Build Coastguard Worker        ),
256*5225e6b1SAndroid Build Coastguard Worker        "platform": attr.string(mandatory = True),
257*5225e6b1SAndroid Build Coastguard Worker        "deps": attr.label_list(allow_files = True, mandatory = True),
258*5225e6b1SAndroid Build Coastguard Worker    },
259*5225e6b1SAndroid Build Coastguard Worker)
260*5225e6b1SAndroid Build Coastguard Worker
261*5225e6b1SAndroid Build Coastguard Worker# This rule creates symlink for a static library in both Linux/GNU and MSVC naming styles so that
262*5225e6b1SAndroid Build Coastguard Worker# rust linker is able to find it when building for them.
263*5225e6b1SAndroid Build Coastguard Worker#
264*5225e6b1SAndroid Build Coastguard Worker# When flag "-Clink-arg=-l<libname>" is passed to rustc, for Linux/GNU target platforms, the linker
265*5225e6b1SAndroid Build Coastguard Worker# looks for library named "lib<libname>.a", for MSVC target plaforms (i.e. UEFI), the linker looks
266*5225e6b1SAndroid Build Coastguard Worker# for library named "<libname>.lib". When bazel builds a cc_library target, it always outputs the
267*5225e6b1SAndroid Build Coastguard Worker# Linux/GNU naming style and therefore fails linking when building for UEFI targets.
268*5225e6b1SAndroid Build Coastguard Workerdef _link_static_cc_library_impl(ctx):
269*5225e6b1SAndroid Build Coastguard Worker    # Put an underscore so that we don't need to deal with potential "lib" prefix from user
270*5225e6b1SAndroid Build Coastguard Worker    # provided name.
271*5225e6b1SAndroid Build Coastguard Worker    libname = "_{}".format(ctx.label.name)
272*5225e6b1SAndroid Build Coastguard Worker
273*5225e6b1SAndroid Build Coastguard Worker    # Create symlink for both naming styles.
274*5225e6b1SAndroid Build Coastguard Worker    out_msvc_style = ctx.actions.declare_file("{}.lib".format(libname))
275*5225e6b1SAndroid Build Coastguard Worker    ctx.actions.symlink(output = out_msvc_style, target_file = ctx.files.cc_library[0])
276*5225e6b1SAndroid Build Coastguard Worker    out_linux_style = ctx.actions.declare_file("lib{}.a".format(libname))
277*5225e6b1SAndroid Build Coastguard Worker    ctx.actions.symlink(output = out_linux_style, target_file = ctx.files.cc_library[0])
278*5225e6b1SAndroid Build Coastguard Worker
279*5225e6b1SAndroid Build Coastguard Worker    # Construct and return a `CcInfo` for this rule that includes the library to link, so that
280*5225e6b1SAndroid Build Coastguard Worker    # other rust_library/cc_library can depend directly on this target.
281*5225e6b1SAndroid Build Coastguard Worker    library_to_link = cc_common.create_library_to_link(
282*5225e6b1SAndroid Build Coastguard Worker        actions = ctx.actions,
283*5225e6b1SAndroid Build Coastguard Worker        # Either is fine, since both yield the same linker option by Bazel.
284*5225e6b1SAndroid Build Coastguard Worker        static_library = out_linux_style,
285*5225e6b1SAndroid Build Coastguard Worker    )
286*5225e6b1SAndroid Build Coastguard Worker    linking_input = cc_common.create_linker_input(
287*5225e6b1SAndroid Build Coastguard Worker        owner = ctx.label,
288*5225e6b1SAndroid Build Coastguard Worker        libraries = depset([library_to_link]),
289*5225e6b1SAndroid Build Coastguard Worker        # Make sure both symlinks are generated.
290*5225e6b1SAndroid Build Coastguard Worker        additional_inputs = depset([out_msvc_style, out_linux_style]),
291*5225e6b1SAndroid Build Coastguard Worker    )
292*5225e6b1SAndroid Build Coastguard Worker    linking_context = cc_common.create_linking_context(linker_inputs = depset([linking_input]))
293*5225e6b1SAndroid Build Coastguard Worker    return [CcInfo(linking_context = linking_context)]
294*5225e6b1SAndroid Build Coastguard Worker
295*5225e6b1SAndroid Build Coastguard Workerlink_static_cc_library = rule(
296*5225e6b1SAndroid Build Coastguard Worker    implementation = _link_static_cc_library_impl,
297*5225e6b1SAndroid Build Coastguard Worker    attrs = {
298*5225e6b1SAndroid Build Coastguard Worker        "cc_library": attr.label(),  # The cc_library() target for the static library.
299*5225e6b1SAndroid Build Coastguard Worker    },
300*5225e6b1SAndroid Build Coastguard Worker)
301