| """ |
| This file contains general helper macros that make our BUILD.bazel files easier to read. |
| """ |
| |
| # https://github.com/bazelbuild/bazel-skylib |
| load("@bazel_skylib//lib:selects.bzl", _selects = "selects") |
| load("@rules_python//python:defs.bzl", _py_binary = "py_binary") |
| load("@py_deps//:requirements.bzl", _requirement = "requirement") |
| load("@bazel_gazelle//:def.bzl", _gazelle = "gazelle") |
| |
| # re-export symbols that are commonly used or that are not supported in G3 |
| # (and thus we need to stub out) |
| selects = _selects |
| py_binary = _py_binary |
| requirement = _requirement |
| gazelle = _gazelle |
| |
| def select_multi(values_map, default, name = ""): |
| """select() but allowing multiple matches of the keys. |
| |
| select_multi works around a restriction in native select() that prevents multiple |
| keys from being matched unless one is a strict subset of another. For some features, |
| we allow multiple of that component to be active. For example, with codecs, we let |
| the clients mix and match anywhere from 0 built in codecs to all of them. |
| |
| select_multi takes a given map and turns it into several distinct select statements |
| that have the effect of using any values associated with any active keys. |
| For example, if the following parameters are passed in: |
| values_map = { |
| ":alpha": ["apple", "apricot"], |
| ":beta": ["banana"], |
| ":gamma": ["grapefruit"], |
| }, |
| default = [] |
| it will be unrolled into the following select statements |
| [] + select({ |
| ":apple": ["apple", "apricot"], |
| "//conditions:default": [], |
| }) + select({ |
| ":beta": ["banana"], |
| "//conditions:default": [], |
| }) + select({ |
| ":gamma": ["grapefruit"], |
| "//conditions:default": [], |
| }) |
| |
| Args: |
| values_map: dictionary of labels to a list of labels, just like select() |
| default: list of labels, the value that should be used if any of the options do not match. |
| This is typically an empty list |
| name: string unused, https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#unnamed-macro |
| |
| Returns: |
| A list of values that is filled in by the generated select statements. |
| """ |
| if len(values_map) == 0: |
| return default |
| rv = [] |
| for key, value in values_map.items(): |
| rv += select({ |
| key: value, |
| "//conditions:default": default, |
| }) |
| return rv |
| |
| def generated_cc_atom(name, enforce_iwyu = False, **kwargs): |
| """A self-annotating label for a generated cc_library for exactly one file. |
| |
| Args: |
| name: string, the name of the cc_library |
| enforce_iwyu: boolean, if true, this file will fail to compile if the headers to not comply |
| with the include-what-you-use standards. This does not affect dependencies nor |
| dependents, only the file listed in srcs/hdrs. |
| **kwargs: All other arguments are passed verbatim to cc_library |
| """ |
| if len(kwargs.get("srcs", [])) > 1 or len(kwargs.get("hdrs", [])) > 1: |
| fail("Cannot have more than one src or hdr file in generated_cc_atom") |
| if len(kwargs.get("srcs", [])) > 0 and len(kwargs.get("hdrs", [])) > 0: |
| fail("Cannot set both srcs and hdrs in generated_cc_atom") |
| if len(kwargs.get("srcs", [])) == 0 and len(kwargs.get("hdrs", [])) == 0: |
| fail("Must set exactly one of srcs or hdrs in generated_cc_atom") |
| deps = kwargs.get("deps", []) |
| deps.append("//bazel:defines_from_flags") |
| kwargs["deps"] = deps |
| |
| features = kwargs.get("features", []) |
| if enforce_iwyu: |
| features.append("skia_opt_file_into_iwyu") |
| native.cc_library( |
| name = name, |
| features = features, |
| **kwargs |
| ) |
| |
| # buildifier: disable=unnamed-macro |
| # buildifier: disable=native-package |
| def enforce_iwyu_on_package(): |
| """A self-annotating macro to set force_iwyu = True on all rules in this package.""" |
| native.package(features = ["skia_opt_file_into_iwyu"]) |
| |
| # buildifier: disable=unnamed-macro |
| def cc_library(**kwargs): |
| """A shim around cc_library that lets us tweak settings for G3 if necessary.""" |
| native.cc_library(**kwargs) |
| |
| # buildifier: disable=unnamed-macro |
| def exports_files_legacy(): |
| """A self-annotating macro to export all files in this package for legacy G3 rules.""" |
| pass |