xref: /aosp_15_r20/external/skia/bazel/platform/BUILD.bazel (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker# https://github.com/bazelbuild/bazel-toolchains/blob/master/rules/exec_properties/exec_properties.bzl
2*c8dee2aaSAndroid Build Coastguard Workerload("@bazel_toolchains//rules/exec_properties:exec_properties.bzl", "create_rbe_exec_properties_dict")
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Worker# https://bazel.build/concepts/platforms-intro
5*c8dee2aaSAndroid Build Coastguard Worker# https://bazel.build/docs/platforms
6*c8dee2aaSAndroid Build Coastguard Workerplatform(
7*c8dee2aaSAndroid Build Coastguard Worker    name = "linux_x64_hermetic",
8*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
9*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:linux",  # https://github.com/bazelbuild/platforms/blob/main/os/BUILD
10*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:x86_64",  # https://github.com/bazelbuild/platforms/blob/main/cpu/BUILD
11*c8dee2aaSAndroid Build Coastguard Worker        ":cgo_off",  # Necessary to build on RBE.
12*c8dee2aaSAndroid Build Coastguard Worker        ":use_hermetic_toolchain",
13*c8dee2aaSAndroid Build Coastguard Worker    ],
14*c8dee2aaSAndroid Build Coastguard Worker    # We specify exec_properties because we have an RBE instance that matches this platform.
15*c8dee2aaSAndroid Build Coastguard Worker    # exec_properties specify some information that is passed along the Remote Execution API
16*c8dee2aaSAndroid Build Coastguard Worker    # (REAPI) to the dispatcher which will use it to direct the request to the appropriate
17*c8dee2aaSAndroid Build Coastguard Worker    # machine/worker, using the Remote Worker API (RWAPI).
18*c8dee2aaSAndroid Build Coastguard Worker    # http://go/skolo-rbe
19*c8dee2aaSAndroid Build Coastguard Worker    # These properties will be ignored when running locally, but we must specify them if we want
20*c8dee2aaSAndroid Build Coastguard Worker    # the action cache to treat things built on a local Linux machine to be the same as built on
21*c8dee2aaSAndroid Build Coastguard Worker    # a Linux RBE worker (which they should, assuming our hermetic toolchain *is* hermetic).
22*c8dee2aaSAndroid Build Coastguard Worker    # See https://github.com/bazelbuild/bazel/blob/f28209df2b0ebeff1de0b8b7f6b9e215d890e753/src/main/java/com/google/devtools/build/lib/actions/ActionKeyCacher.java#L67-L73
23*c8dee2aaSAndroid Build Coastguard Worker    # for how the exec_properties and execution platform impact the action cache.
24*c8dee2aaSAndroid Build Coastguard Worker    exec_properties = create_rbe_exec_properties_dict(
25*c8dee2aaSAndroid Build Coastguard Worker        container_image = "docker://gcr.io/skia-public/rbe_linux@sha256:82e8a4c7d06c8f47bbc08ee899c4c03069af0f7f4d8c0d958a50a23d814405e6",
26*c8dee2aaSAndroid Build Coastguard Worker        os_family = "Linux",
27*c8dee2aaSAndroid Build Coastguard Worker        pool = "gce_linux",
28*c8dee2aaSAndroid Build Coastguard Worker    ),
29*c8dee2aaSAndroid Build Coastguard Worker)
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Workerplatform(
32*c8dee2aaSAndroid Build Coastguard Worker    name = "mac_x64_hermetic",
33*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
34*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:macos",
35*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:x86_64",
36*c8dee2aaSAndroid Build Coastguard Worker        ":cgo_off",
37*c8dee2aaSAndroid Build Coastguard Worker        ":use_hermetic_toolchain",
38*c8dee2aaSAndroid Build Coastguard Worker    ],
39*c8dee2aaSAndroid Build Coastguard Worker)
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Workerplatform(
42*c8dee2aaSAndroid Build Coastguard Worker    name = "mac_arm64_hermetic",
43*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
44*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:macos",
45*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:arm64",
46*c8dee2aaSAndroid Build Coastguard Worker        ":cgo_off",
47*c8dee2aaSAndroid Build Coastguard Worker        ":use_hermetic_toolchain",
48*c8dee2aaSAndroid Build Coastguard Worker    ],
49*c8dee2aaSAndroid Build Coastguard Worker)
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Workerplatform(
52*c8dee2aaSAndroid Build Coastguard Worker    name = "windows_x64_hermetic",
53*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
54*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:windows",
55*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:x86_64",
56*c8dee2aaSAndroid Build Coastguard Worker        ":cgo_off",
57*c8dee2aaSAndroid Build Coastguard Worker        ":use_hermetic_toolchain",
58*c8dee2aaSAndroid Build Coastguard Worker    ],
59*c8dee2aaSAndroid Build Coastguard Worker)
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Workerplatform(
62*c8dee2aaSAndroid Build Coastguard Worker    name = "host_with_hermetic_toolchain",
63*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
64*c8dee2aaSAndroid Build Coastguard Worker        ":cgo_off",  # Necessary to build locally (i.e. non-RBE builds).
65*c8dee2aaSAndroid Build Coastguard Worker        ":use_hermetic_toolchain",
66*c8dee2aaSAndroid Build Coastguard Worker    ],
67*c8dee2aaSAndroid Build Coastguard Worker    parents = ["@local_config_platform//:host"],
68*c8dee2aaSAndroid Build Coastguard Worker)
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Workerplatform(
71*c8dee2aaSAndroid Build Coastguard Worker    name = "android_arm32",
72*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
73*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:android",
74*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:armv7",
75*c8dee2aaSAndroid Build Coastguard Worker    ],
76*c8dee2aaSAndroid Build Coastguard Worker)
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Workerplatform(
79*c8dee2aaSAndroid Build Coastguard Worker    name = "android_arm64",
80*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
81*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:android",
82*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:arm64",
83*c8dee2aaSAndroid Build Coastguard Worker    ],
84*c8dee2aaSAndroid Build Coastguard Worker)
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard Worker# This platform covers only the ios hardware which is arm64.
87*c8dee2aaSAndroid Build Coastguard Worker# Simulator support if any will be a separate platform.
88*c8dee2aaSAndroid Build Coastguard Workerplatform(
89*c8dee2aaSAndroid Build Coastguard Worker    name = "ios",
90*c8dee2aaSAndroid Build Coastguard Worker    constraint_values = [
91*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//os:ios",
92*c8dee2aaSAndroid Build Coastguard Worker        "@platforms//cpu:arm64",
93*c8dee2aaSAndroid Build Coastguard Worker    ],
94*c8dee2aaSAndroid Build Coastguard Worker)
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker# This constraint allows us to force Bazel to resolve our hermetic toolchain to build
97*c8dee2aaSAndroid Build Coastguard Worker# the target and not a default one (e.g. on the Linux RBE instance). We do this by
98*c8dee2aaSAndroid Build Coastguard Worker# adding the constraint to our platforms that describe the target we want Bazel to build for.
99*c8dee2aaSAndroid Build Coastguard Worker# https://bazel.build/reference/be/platform#constraint_setting
100*c8dee2aaSAndroid Build Coastguard Workerconstraint_setting(name = "skia_hermetic_toolchain")
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Workerconstraint_value(
103*c8dee2aaSAndroid Build Coastguard Worker    name = "use_hermetic_toolchain",
104*c8dee2aaSAndroid Build Coastguard Worker    constraint_setting = ":skia_hermetic_toolchain",
105*c8dee2aaSAndroid Build Coastguard Worker    visibility = ["//visibility:public"],
106*c8dee2aaSAndroid Build Coastguard Worker)
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker# When added to a Bazel platform, this constraint has the effect of disabling cgo, meaning that
109*c8dee2aaSAndroid Build Coastguard Worker# the C++ compiler will never be invoked when building Go binaries.
110*c8dee2aaSAndroid Build Coastguard Worker#
111*c8dee2aaSAndroid Build Coastguard Worker# For context, when cgo is enabled, the C++ compiler will be involved when building Go binaries,
112*c8dee2aaSAndroid Build Coastguard Worker# even for pure builds (e.g. "bazel build //some:target --@io_bazel_rules_go//go/config:pure").
113*c8dee2aaSAndroid Build Coastguard Worker# Presumably this is because some parts of the Go stdlib are written in C. It is unclear to
114*c8dee2aaSAndroid Build Coastguard Worker# lovisolo@ whether disabling cgo means some parts of the Go stdlib become unavailable.
115*c8dee2aaSAndroid Build Coastguard Worker#
116*c8dee2aaSAndroid Build Coastguard Worker# We want to disable cgo because, for some unknown reason, the directory structure under which
117*c8dee2aaSAndroid Build Coastguard Worker# clang_trampoline_linux.sh is executed is slightly different when building Go-related C/C++ code.
118*c8dee2aaSAndroid Build Coastguard Worker# We previously worked around this issue by adding a special case to clang_trampoline_linux.sh
119*c8dee2aaSAndroid Build Coastguard Worker# where clang is invoked using a different path (see
120*c8dee2aaSAndroid Build Coastguard Worker# https://skia-review.googlesource.com/c/skia/+/791499/11/toolchain/linux_trampolines/clang_trampoline_linux.sh).
121*c8dee2aaSAndroid Build Coastguard Worker# Unfortunately this does not work under macOS because clang is not found anywhere in the directory
122*c8dee2aaSAndroid Build Coastguard Worker# tree under which clang_trampoline_mac.sh is invoked. By disabling cgo, we get rid of this problem
123*c8dee2aaSAndroid Build Coastguard Worker# altogether. Fortunately all our Go code still compiles without cgo.
124*c8dee2aaSAndroid Build Coastguard Worker#
125*c8dee2aaSAndroid Build Coastguard Worker# It is unclear whether this is a rules_go bug, or if there's something specific about our hermetic
126*c8dee2aaSAndroid Build Coastguard Worker# C++ toolchains (Linux and macOS) that is causing the build to fail when cgo is enabled.
127*c8dee2aaSAndroid Build Coastguard Worker#
128*c8dee2aaSAndroid Build Coastguard Worker# Note that the @io_bazel_rules_go//go/toolchain:cgo_off constraint is not well documented.
129*c8dee2aaSAndroid Build Coastguard Worker# lovisolo@ discovered this constraint because it was mentioned on some issues and PRs in the
130*c8dee2aaSAndroid Build Coastguard Worker# rules_go repository and some other places, namely:
131*c8dee2aaSAndroid Build Coastguard Worker#
132*c8dee2aaSAndroid Build Coastguard Worker#  - https://github.com/bazelbuild/rules_go/issues/2115#issuecomment-507467744
133*c8dee2aaSAndroid Build Coastguard Worker#  - https://github.com/bazelbuild/rules_go/issues/2591#issuecomment-670527288
134*c8dee2aaSAndroid Build Coastguard Worker#  - https://github.com/aspect-build/bazel-lib/pull/289/files#diff-963e4331fa8afa39ffa09be04587bc2a66f8cbab3416842e1554a6825ee532ecR27
135*c8dee2aaSAndroid Build Coastguard Worker#
136*c8dee2aaSAndroid Build Coastguard Worker# Note also that there is an ongoing effort to make C++ toolchains optional in rules_go:
137*c8dee2aaSAndroid Build Coastguard Worker# https://github.com/bazelbuild/rules_go/pull/3390.
138*c8dee2aaSAndroid Build Coastguard Workeralias(
139*c8dee2aaSAndroid Build Coastguard Worker    name = "cgo_off",
140*c8dee2aaSAndroid Build Coastguard Worker    actual = "@io_bazel_rules_go//go/toolchain:cgo_off",
141*c8dee2aaSAndroid Build Coastguard Worker)
142