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