# This file is licensed under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception """A macro to produce a loadable plugin library for the target OS. This macro produces a set of platform-specific `cc_binary` rules, by appending the platform suffix (`.dll`, `.dylib`, or `.so`) to the provided `name`. It then connects these to a `cc_import` rule with `name` exactly and `hdrs` that can be used by other Bazel rules to depend on the plugin library. The `srcs` attribute for the `cc_binary` rules is `srcs + hdrs`. Other explicit arguments are passed to all of the rules where they apply, and can be used to configure generic aspects of all generated rules such as `testonly`. Lastly, `kwargs` is expanded into all the `cc_binary` rules. """ load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_import", "cc_library") def cc_plugin_library(name, srcs, hdrs, include_prefix = None, strip_include_prefix = None, alwayslink = False, features = [], tags = [], testonly = False, **kwargs): # Neither the name of the plugin binary nor tags on whether it is built are # configurable. Instead, we build a `cc_binary` with each name and # selectively depend on them based on platform. # # All-in-all, this is a pretty poor workaround. I think this is part of the # Bazel issue: https://github.com/bazelbuild/bazel/issues/7538 so_name = name + ".so" dll_name = name + ".dll" dylib_name = name + ".dylib" interface_output_name = name + "_interface_output" import_name = name + "_import" for impl_name in [dll_name, dylib_name, so_name]: cc_binary( name = impl_name, srcs = srcs + hdrs, linkshared = True, linkstatic = True, features = features, tags = ["manual"] + tags, testonly = testonly, **kwargs ) native.filegroup( name = interface_output_name, srcs = select({ "@bazel_tools//src/conditions:windows": [":" + dll_name], "@bazel_tools//src/conditions:darwin": [":" + dylib_name], "//conditions:default": [":" + so_name], }), output_group = "interface_library", ) cc_import( name = import_name, interface_library = ":" + interface_output_name, shared_library = select({ "@bazel_tools//src/conditions:windows": ":" + dll_name, "@bazel_tools//src/conditions:darwin": ":" + dylib_name, "//conditions:default": ":" + so_name, }), alwayslink = alwayslink, features = features, tags = tags, testonly = testonly, ) cc_library( name = name, hdrs = hdrs, include_prefix = include_prefix, strip_include_prefix = strip_include_prefix, deps = [":" + import_name], alwayslink = alwayslink, features = features, tags = tags, testonly = testonly, )