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