1"""A function to compile C/C++ code, like cc_library() but from Starlark.""" 2 3load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain", "use_cpp_toolchain") 4 5def upb_use_cpp_toolchain(): 6 return use_cpp_toolchain() 7 8def cc_library_func(ctx, name, hdrs, srcs, copts, includes, dep_ccinfos): 9 """Like cc_library(), but callable from rules. 10 11 Args: 12 ctx: Rule context. 13 name: Unique name used to generate output files. 14 hdrs: Public headers that can be #included from other rules. 15 srcs: C/C++ source files. 16 copts: Additional options for cc compilation. 17 includes: Additional include paths. 18 dep_ccinfos: CcInfo providers of dependencies we should build/link against. 19 20 Returns: 21 CcInfo provider for this compilation. 22 """ 23 24 compilation_contexts = [info.compilation_context for info in dep_ccinfos] 25 linking_contexts = [info.linking_context for info in dep_ccinfos] 26 toolchain = find_cpp_toolchain(ctx) 27 feature_configuration = cc_common.configure_features( 28 ctx = ctx, 29 cc_toolchain = toolchain, 30 requested_features = ctx.features, 31 unsupported_features = ctx.disabled_features, 32 ) 33 34 (compilation_context, compilation_outputs) = cc_common.compile( 35 actions = ctx.actions, 36 feature_configuration = feature_configuration, 37 cc_toolchain = toolchain, 38 name = name, 39 srcs = srcs, 40 includes = includes, 41 public_hdrs = hdrs, 42 user_compile_flags = copts, 43 compilation_contexts = compilation_contexts, 44 ) 45 46 # buildifier: disable=unused-variable 47 (linking_context, linking_outputs) = cc_common.create_linking_context_from_compilation_outputs( 48 actions = ctx.actions, 49 name = name, 50 feature_configuration = feature_configuration, 51 cc_toolchain = toolchain, 52 compilation_outputs = compilation_outputs, 53 linking_contexts = linking_contexts, 54 disallow_dynamic_library = cc_common.is_enabled(feature_configuration = feature_configuration, feature_name = "targets_windows") or not cc_common.is_enabled(feature_configuration = feature_configuration, feature_name = "supports_dynamic_linker"), 55 ) 56 57 return CcInfo( 58 compilation_context = compilation_context, 59 linking_context = linking_context, 60 ) 61