xref: /aosp_15_r20/external/skia/bazel/skia_rules.bzl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker"""
2*c8dee2aaSAndroid Build Coastguard WorkerTHIS IS THE EXTERNAL-ONLY VERSION OF THIS FILE. G3 HAS ITS OWN.
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard WorkerThis file contains macros which require no third-party dependencies.
5*c8dee2aaSAndroid Build Coastguard WorkerUsing these where possible makes it easier for clients to use Skia
6*c8dee2aaSAndroid Build Coastguard Workerwithout needing to download a bunch of unnecessary dependencies
7*c8dee2aaSAndroid Build Coastguard Workerin their WORKSPACE.bazel file.
8*c8dee2aaSAndroid Build Coastguard Worker"""
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Workerload("@skia_user_config//:copts.bzl", "DEFAULT_COPTS", "DEFAULT_OBJC_COPTS")
11*c8dee2aaSAndroid Build Coastguard Workerload("@skia_user_config//:linkopts.bzl", "DEFAULT_LINKOPTS")
12*c8dee2aaSAndroid Build Coastguard Workerload(
13*c8dee2aaSAndroid Build Coastguard Worker    "//bazel:generate_cpp_files_for_headers.bzl",
14*c8dee2aaSAndroid Build Coastguard Worker    _generate_cpp_files_for_headers = "generate_cpp_files_for_headers",
15*c8dee2aaSAndroid Build Coastguard Worker)
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Workergenerate_cpp_files_for_headers = _generate_cpp_files_for_headers
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Workerdef select_multi(values_map, default_cases = None):
20*c8dee2aaSAndroid Build Coastguard Worker    """select() but allowing multiple matches of the keys.
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker    select_multi works around a restriction in native select() that prevents multiple
23*c8dee2aaSAndroid Build Coastguard Worker    keys from being matched unless one is a strict subset of another. For some features,
24*c8dee2aaSAndroid Build Coastguard Worker    we allow multiple of that component to be active. For example, with codecs, we let
25*c8dee2aaSAndroid Build Coastguard Worker    the clients mix and match anywhere from 0 built in codecs to all of them.
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker    select_multi takes a given map and turns it into several distinct select statements
28*c8dee2aaSAndroid Build Coastguard Worker    that have the effect of using any values associated with any active keys.
29*c8dee2aaSAndroid Build Coastguard Worker    For example, if the following parameter is passed in:
30*c8dee2aaSAndroid Build Coastguard Worker        values_map = {
31*c8dee2aaSAndroid Build Coastguard Worker            ":alpha": ["apple", "apricot"],
32*c8dee2aaSAndroid Build Coastguard Worker            ":beta": ["banana"],
33*c8dee2aaSAndroid Build Coastguard Worker            ":gamma": ["grapefruit"],
34*c8dee2aaSAndroid Build Coastguard Worker        }
35*c8dee2aaSAndroid Build Coastguard Worker    it will be unrolled into the following select statements
36*c8dee2aaSAndroid Build Coastguard Worker        [] + select({
37*c8dee2aaSAndroid Build Coastguard Worker            ":apple": ["apple", "apricot"],
38*c8dee2aaSAndroid Build Coastguard Worker            "//conditions:default": [],
39*c8dee2aaSAndroid Build Coastguard Worker        }) + select({
40*c8dee2aaSAndroid Build Coastguard Worker            ":beta": ["banana"],
41*c8dee2aaSAndroid Build Coastguard Worker            "//conditions:default": [],
42*c8dee2aaSAndroid Build Coastguard Worker        }) + select({
43*c8dee2aaSAndroid Build Coastguard Worker            ":gamma": ["grapefruit"],
44*c8dee2aaSAndroid Build Coastguard Worker            "//conditions:default": [],
45*c8dee2aaSAndroid Build Coastguard Worker        })
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker    Args:
48*c8dee2aaSAndroid Build Coastguard Worker        values_map: dictionary of labels to a list of labels, just like select()
49*c8dee2aaSAndroid Build Coastguard Worker        default_cases: dictionary of labels to a list of labels to be used in the default case.
50*c8dee2aaSAndroid Build Coastguard Worker                       If not provided or a key is not mentioned, an empty list will be used.
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker    Returns:
53*c8dee2aaSAndroid Build Coastguard Worker        A list of values that is filled in by the generated select statements.
54*c8dee2aaSAndroid Build Coastguard Worker    """
55*c8dee2aaSAndroid Build Coastguard Worker    if len(values_map) == 0:
56*c8dee2aaSAndroid Build Coastguard Worker        return []
57*c8dee2aaSAndroid Build Coastguard Worker    rv = []
58*c8dee2aaSAndroid Build Coastguard Worker    if not default_cases:
59*c8dee2aaSAndroid Build Coastguard Worker        default_cases = {}
60*c8dee2aaSAndroid Build Coastguard Worker    for key, value in values_map.items():
61*c8dee2aaSAndroid Build Coastguard Worker        rv += select({
62*c8dee2aaSAndroid Build Coastguard Worker            key: value,
63*c8dee2aaSAndroid Build Coastguard Worker            "//conditions:default": default_cases.get(key, []),
64*c8dee2aaSAndroid Build Coastguard Worker        })
65*c8dee2aaSAndroid Build Coastguard Worker    return rv
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Workerdef supports_platforms(*platforms):
68*c8dee2aaSAndroid Build Coastguard Worker    """Convenience macro to set the "target_compatible_with" argument of binary and test targets.
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker    The example below shows a binary that is compatible with all desktop OSes:
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker        skia_cc_binary(
73*c8dee2aaSAndroid Build Coastguard Worker            name = "my_binary",
74*c8dee2aaSAndroid Build Coastguard Worker            target_compatible_with = supports_platforms(
75*c8dee2aaSAndroid Build Coastguard Worker                "@platforms//os:linux",
76*c8dee2aaSAndroid Build Coastguard Worker                "@platforms//os:windows",
77*c8dee2aaSAndroid Build Coastguard Worker                "@platforms//os:macos",
78*c8dee2aaSAndroid Build Coastguard Worker            ),
79*c8dee2aaSAndroid Build Coastguard Worker            ...
80*c8dee2aaSAndroid Build Coastguard Worker        )
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker    Args:
83*c8dee2aaSAndroid Build Coastguard Worker        *platforms: One or more supported platforms, e.g. "@platforms//os:linux".
84*c8dee2aaSAndroid Build Coastguard Worker    Returns:
85*c8dee2aaSAndroid Build Coastguard Worker        A select() statement with an empty list for each provided platform, and
86*c8dee2aaSAndroid Build Coastguard Worker            ["@platforms//:incompatible"] as the default condition.
87*c8dee2aaSAndroid Build Coastguard Worker    """
88*c8dee2aaSAndroid Build Coastguard Worker    if len(platforms) == 0:
89*c8dee2aaSAndroid Build Coastguard Worker        fail("Please provide at least one platform.")
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker    platforms_map = {
92*c8dee2aaSAndroid Build Coastguard Worker        "//conditions:default": ["@platforms//:incompatible"],
93*c8dee2aaSAndroid Build Coastguard Worker    }
94*c8dee2aaSAndroid Build Coastguard Worker    for platform in platforms:
95*c8dee2aaSAndroid Build Coastguard Worker        platforms_map[platform] = []
96*c8dee2aaSAndroid Build Coastguard Worker    return select(platforms_map)
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Workerdef skia_cc_binary(name, copts = DEFAULT_COPTS, linkopts = DEFAULT_LINKOPTS, **kwargs):
99*c8dee2aaSAndroid Build Coastguard Worker    """A wrapper around cc_library for Skia C++ executables (e.g. tools).
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker    This lets us provide compiler flags (copts) and global linker flags (linkopts) consistently
102*c8dee2aaSAndroid Build Coastguard Worker    to Skia built executables. These executables are almost always things like dev tools.
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker    Args:
105*c8dee2aaSAndroid Build Coastguard Worker        name: the name of the underlying executable.
106*c8dee2aaSAndroid Build Coastguard Worker        copts: Flags which should be passed to the C++ compiler. By default, we use DEFAULT_COPTS
107*c8dee2aaSAndroid Build Coastguard Worker            from @skia_user_config//:copts.bzl.
108*c8dee2aaSAndroid Build Coastguard Worker        linkopts: Global flags which should be passed to the C++ linker. By default, we use
109*c8dee2aaSAndroid Build Coastguard Worker            DEFAULT_LINKOPTS from  @skia_user_config//:linkopts.bzl. Other linker flags will be
110*c8dee2aaSAndroid Build Coastguard Worker            passed in via deps (see deps_and_linkopts below).
111*c8dee2aaSAndroid Build Coastguard Worker        **kwargs: All the normal arguments that cc_binary takes.
112*c8dee2aaSAndroid Build Coastguard Worker    """
113*c8dee2aaSAndroid Build Coastguard Worker    native.cc_binary(name = name, copts = copts, linkopts = linkopts, **kwargs)
114*c8dee2aaSAndroid Build Coastguard Worker
115*c8dee2aaSAndroid Build Coastguard Workerdef skia_cc_test(name, copts = DEFAULT_COPTS, linkopts = DEFAULT_LINKOPTS, **kwargs):
116*c8dee2aaSAndroid Build Coastguard Worker    """A wrapper around cc_test for Skia C++ executables (e.g. tests).
117*c8dee2aaSAndroid Build Coastguard Worker
118*c8dee2aaSAndroid Build Coastguard Worker    This lets us provide compiler flags (copts) and global linker flags (linkopts) consistently
119*c8dee2aaSAndroid Build Coastguard Worker    to Skia built executables, that is, tests.
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker    Args:
122*c8dee2aaSAndroid Build Coastguard Worker        name: the name of the underlying executable.
123*c8dee2aaSAndroid Build Coastguard Worker        copts: Flags which should be passed to the C++ compiler. By default, we use DEFAULT_COPTS
124*c8dee2aaSAndroid Build Coastguard Worker            from @skia_user_config//:copts.bzl.
125*c8dee2aaSAndroid Build Coastguard Worker        linkopts: Global flags which should be passed to the C++ linker. By default, we use
126*c8dee2aaSAndroid Build Coastguard Worker            DEFAULT_LINKOPTS from  @skia_user_config//:linkopts.bzl. Other linker flags will be
127*c8dee2aaSAndroid Build Coastguard Worker            passed in via deps (see deps_and_linkopts below).
128*c8dee2aaSAndroid Build Coastguard Worker        **kwargs: All the normal arguments that cc_binary takes.
129*c8dee2aaSAndroid Build Coastguard Worker    """
130*c8dee2aaSAndroid Build Coastguard Worker    native.cc_test(name = name, copts = copts, linkopts = linkopts, **kwargs)
131*c8dee2aaSAndroid Build Coastguard Worker
132*c8dee2aaSAndroid Build Coastguard Workerdef skia_cc_library(name, copts = DEFAULT_COPTS, local_defines = [], **kwargs):
133*c8dee2aaSAndroid Build Coastguard Worker    """A wrapper around cc_library for Skia C++ libraries.
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Worker    This lets us provide compiler flags (copts) consistently to the Skia build. By default,
136*c8dee2aaSAndroid Build Coastguard Worker    copts do not flow up the dependency stack. Additionally, in G3, this allows us to set
137*c8dee2aaSAndroid Build Coastguard Worker    some options universally.
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker    It also lets us easily tweak these settings when being built in G3.
140*c8dee2aaSAndroid Build Coastguard Worker
141*c8dee2aaSAndroid Build Coastguard Worker    Third party libraries should *not* use this directly, as there are likely some flags used
142*c8dee2aaSAndroid Build Coastguard Worker    by Skia (e.g. warnings) that we do not want to have to fix for third party code.
143*c8dee2aaSAndroid Build Coastguard Worker
144*c8dee2aaSAndroid Build Coastguard Worker    Args:
145*c8dee2aaSAndroid Build Coastguard Worker        name: the name of the underlying library.
146*c8dee2aaSAndroid Build Coastguard Worker        copts: Flags which should be passed to the C++ compiler. By default, we use DEFAULT_COPTS
147*c8dee2aaSAndroid Build Coastguard Worker            from @skia_user_config//:copts.bzl.
148*c8dee2aaSAndroid Build Coastguard Worker        local_defines: Defines set when compiling this library, but not dependents. We
149*c8dee2aaSAndroid Build Coastguard Worker            add a define to all our libraries to correctly export/import symbols.
150*c8dee2aaSAndroid Build Coastguard Worker        **kwargs: All the normal arguments that cc_library takes.
151*c8dee2aaSAndroid Build Coastguard Worker    """
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker    # This allows us to mark APIs as exported when building this
154*c8dee2aaSAndroid Build Coastguard Worker    # as a library, but the APIs will be marked as an import
155*c8dee2aaSAndroid Build Coastguard Worker    # (the default) when clients try to use our headers. See SkAPI.h for more.
156*c8dee2aaSAndroid Build Coastguard Worker    # We have to create a new (mutable) list since if the client passes in a list
157*c8dee2aaSAndroid Build Coastguard Worker    # it will be immutable ("frozen").
158*c8dee2aaSAndroid Build Coastguard Worker    ld = []
159*c8dee2aaSAndroid Build Coastguard Worker    ld.extend(local_defines)
160*c8dee2aaSAndroid Build Coastguard Worker    ld.append("SKIA_IMPLEMENTATION=1")
161*c8dee2aaSAndroid Build Coastguard Worker    native.cc_library(name = name, copts = copts, local_defines = ld, **kwargs)
162*c8dee2aaSAndroid Build Coastguard Worker
163*c8dee2aaSAndroid Build Coastguard Workerdef skia_filegroup(**kwargs):
164*c8dee2aaSAndroid Build Coastguard Worker    """A wrapper around filegroup allowing us to customize visibility in G3."""
165*c8dee2aaSAndroid Build Coastguard Worker    native.filegroup(**kwargs)
166*c8dee2aaSAndroid Build Coastguard Worker
167*c8dee2aaSAndroid Build Coastguard Workerdef skia_objc_library(
168*c8dee2aaSAndroid Build Coastguard Worker        name,
169*c8dee2aaSAndroid Build Coastguard Worker        copts = DEFAULT_OBJC_COPTS,
170*c8dee2aaSAndroid Build Coastguard Worker        deps = [],
171*c8dee2aaSAndroid Build Coastguard Worker        ios_frameworks = [],
172*c8dee2aaSAndroid Build Coastguard Worker        mac_frameworks = [],
173*c8dee2aaSAndroid Build Coastguard Worker        sdk_frameworks = [],
174*c8dee2aaSAndroid Build Coastguard Worker        **kwargs):
175*c8dee2aaSAndroid Build Coastguard Worker    """A wrapper around objc_library for Skia Objective C libraries.
176*c8dee2aaSAndroid Build Coastguard Worker
177*c8dee2aaSAndroid Build Coastguard Worker    This lets us provide compiler flags (copts) consistently to the Skia build (e.g. //:core)
178*c8dee2aaSAndroid Build Coastguard Worker    and builds which depend on those targets (e.g. things in //tools or //modules).
179*c8dee2aaSAndroid Build Coastguard Worker
180*c8dee2aaSAndroid Build Coastguard Worker    It also lets us easily tweak these settings when being built in G3.
181*c8dee2aaSAndroid Build Coastguard Worker    Args:
182*c8dee2aaSAndroid Build Coastguard Worker        name: the name of the underlying target.
183*c8dee2aaSAndroid Build Coastguard Worker        copts: Flags which should be passed to the C++ compiler. By default, we use
184*c8dee2aaSAndroid Build Coastguard Worker            DEFAULT_OBJC_COPTS from @skia_user_config//:copts.bzl.
185*c8dee2aaSAndroid Build Coastguard Worker        deps: https://bazel.build/reference/be/objective-c#objc_library.deps
186*c8dee2aaSAndroid Build Coastguard Worker        ios_frameworks: A list (not select) of iOS-specific Frameworks.
187*c8dee2aaSAndroid Build Coastguard Worker        mac_frameworks: A list (not select) of Mac-specific Frameworks.
188*c8dee2aaSAndroid Build Coastguard Worker        sdk_frameworks: https://bazel.build/reference/be/objective-c#objc_library.sdk_frameworks
189*c8dee2aaSAndroid Build Coastguard Worker                        except this should only be a list, not a select.
190*c8dee2aaSAndroid Build Coastguard Worker        **kwargs: Normal arguments to objc_library
191*c8dee2aaSAndroid Build Coastguard Worker    """
192*c8dee2aaSAndroid Build Coastguard Worker    if len(ios_frameworks) > 0 or len(mac_frameworks) > 0:
193*c8dee2aaSAndroid Build Coastguard Worker        sdk_frameworks += select({
194*c8dee2aaSAndroid Build Coastguard Worker            "@platforms//os:ios": ios_frameworks,
195*c8dee2aaSAndroid Build Coastguard Worker            "@platforms//os:macos": mac_frameworks,
196*c8dee2aaSAndroid Build Coastguard Worker            "//conditions:default": [],
197*c8dee2aaSAndroid Build Coastguard Worker        })
198*c8dee2aaSAndroid Build Coastguard Worker
199*c8dee2aaSAndroid Build Coastguard Worker    native.objc_library(
200*c8dee2aaSAndroid Build Coastguard Worker        name = name,
201*c8dee2aaSAndroid Build Coastguard Worker        copts = copts,
202*c8dee2aaSAndroid Build Coastguard Worker        deps = deps,
203*c8dee2aaSAndroid Build Coastguard Worker        sdk_frameworks = sdk_frameworks,
204*c8dee2aaSAndroid Build Coastguard Worker        **kwargs
205*c8dee2aaSAndroid Build Coastguard Worker    )
206*c8dee2aaSAndroid Build Coastguard Worker
207*c8dee2aaSAndroid Build Coastguard Workerdef split_srcs_and_hdrs(name, files, visibility = None):
208*c8dee2aaSAndroid Build Coastguard Worker    """Take a list of files and creates filegroups for C++ sources and headers.
209*c8dee2aaSAndroid Build Coastguard Worker
210*c8dee2aaSAndroid Build Coastguard Worker    The "_srcs" and "_hdrs" filegroups will only be created if there are a non-zero amount
211*c8dee2aaSAndroid Build Coastguard Worker    of files of both types. Otherwise, it will fail because we do not need the macro.
212*c8dee2aaSAndroid Build Coastguard Worker
213*c8dee2aaSAndroid Build Coastguard Worker    Args:
214*c8dee2aaSAndroid Build Coastguard Worker        name: The prefix of the generated filegroups. One will have the suffix "_srcs" and
215*c8dee2aaSAndroid Build Coastguard Worker            the other "_hdrs".
216*c8dee2aaSAndroid Build Coastguard Worker        files: List of file names, e.g. ["SkAAClip.cpp", "SkAAClip.h"]
217*c8dee2aaSAndroid Build Coastguard Worker        visibility: Optional list of visibility rules
218*c8dee2aaSAndroid Build Coastguard Worker    """
219*c8dee2aaSAndroid Build Coastguard Worker    srcs = []
220*c8dee2aaSAndroid Build Coastguard Worker    hdrs = []
221*c8dee2aaSAndroid Build Coastguard Worker    for f in files:
222*c8dee2aaSAndroid Build Coastguard Worker        if f.endswith(".cpp"):
223*c8dee2aaSAndroid Build Coastguard Worker            srcs.append(f)
224*c8dee2aaSAndroid Build Coastguard Worker        elif f.endswith(".mm"):
225*c8dee2aaSAndroid Build Coastguard Worker            srcs.append(f)
226*c8dee2aaSAndroid Build Coastguard Worker        elif f.endswith(".h"):
227*c8dee2aaSAndroid Build Coastguard Worker            hdrs.append(f)
228*c8dee2aaSAndroid Build Coastguard Worker        else:
229*c8dee2aaSAndroid Build Coastguard Worker            fail("Neither .cpp, .mm, nor .h file " + f)
230*c8dee2aaSAndroid Build Coastguard Worker
231*c8dee2aaSAndroid Build Coastguard Worker    if len(srcs) == 0 or len(hdrs) == 0:
232*c8dee2aaSAndroid Build Coastguard Worker        fail("The list consist of either only source or header files. No need to use this macro.")
233*c8dee2aaSAndroid Build Coastguard Worker
234*c8dee2aaSAndroid Build Coastguard Worker    skia_filegroup(
235*c8dee2aaSAndroid Build Coastguard Worker        name = name + "_srcs",
236*c8dee2aaSAndroid Build Coastguard Worker        srcs = srcs,
237*c8dee2aaSAndroid Build Coastguard Worker        visibility = visibility,
238*c8dee2aaSAndroid Build Coastguard Worker    )
239*c8dee2aaSAndroid Build Coastguard Worker    skia_filegroup(
240*c8dee2aaSAndroid Build Coastguard Worker        name = name + "_hdrs",
241*c8dee2aaSAndroid Build Coastguard Worker        srcs = hdrs,
242*c8dee2aaSAndroid Build Coastguard Worker        visibility = visibility,
243*c8dee2aaSAndroid Build Coastguard Worker    )
244