xref: /aosp_15_r20/external/skia/toolchain/download_ios_toolchain.bzl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker"""
2*c8dee2aaSAndroid Build Coastguard WorkerThis file assembles a toolchain for cross compiling on a Mac host for iOS using the Clang Compiler
3*c8dee2aaSAndroid Build Coastguard Workerand a locally-installed XCode.
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard WorkerIt downloads the necessary executables and creates symlinks in the external subfolder of the Bazel
6*c8dee2aaSAndroid Build Coastguard Workercache (the same place third party deps are downloaded with http_archive or similar functions in
7*c8dee2aaSAndroid Build Coastguard WorkerWORKSPACE.bazel). These will be able to be used via our
8*c8dee2aaSAndroid Build Coastguard Workercustom c++ toolchain configuration (see //toolchain/ios_toolchain_config.bzl)
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard WorkerThe destination folder for these files and symlinks are:
11*c8dee2aaSAndroid Build Coastguard Worker  [outputRoot (aka Bazel cache)]/[outputUserRoot]/[outputBase]/external/clang_ios
12*c8dee2aaSAndroid Build Coastguard Worker  (See https://bazel.build/docs/output_directories#layout-diagram)
13*c8dee2aaSAndroid Build Coastguard Worker"""
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard Workerload(":clang_layering_check.bzl", "generate_system_module_map")
16*c8dee2aaSAndroid Build Coastguard Workerload(":utils.bzl", "gcs_mirror_url")
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker# From https://github.com/llvm/llvm-project/releases/tag/llvmorg-15.0.1
19*c8dee2aaSAndroid Build Coastguard Worker# When updating this, don't forget to use //bazel/gcs_mirror to upload a new version.
20*c8dee2aaSAndroid Build Coastguard Worker# go run bazel/gcs_mirror/gcs_mirror.go --url [clang_url] --sha256 [clang_sha256]
21*c8dee2aaSAndroid Build Coastguard Workerclang_prefix_arm64 = "clang+llvm-15.0.1-arm64-apple-darwin21.0"
22*c8dee2aaSAndroid Build Coastguard Workerclang_sha256_arm64 = "858f86d96b5e4880f69f7a583daddbf97ee94e7cffce0d53aa05cba6967f13b8"
23*c8dee2aaSAndroid Build Coastguard Workerclang_url_arm64 = "https://github.com/llvm/llvm-project/releases/download/llvmorg-15.0.1/clang+llvm-15.0.1-arm64-apple-darwin21.0.tar.xz"
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Workerios_sdk_root = "/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/"
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Workerdef _get_system_xcode_path(ctx):
28*c8dee2aaSAndroid Build Coastguard Worker    # https://developer.apple.com/library/archive/technotes/tn2339/_index.html
29*c8dee2aaSAndroid Build Coastguard Worker    res = ctx.execute(["xcode-select", "--print-path"])
30*c8dee2aaSAndroid Build Coastguard Worker    if res.return_code != 0:
31*c8dee2aaSAndroid Build Coastguard Worker        fail("Error Getting XCode path: " + res.stderr)
32*c8dee2aaSAndroid Build Coastguard Worker    return res.stdout.rstrip()
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Workerdef _delete_ios_sdk_symlinks(ctx):
35*c8dee2aaSAndroid Build Coastguard Worker    ctx.delete("./symlinks/xcode/iOSSDK/usr")
36*c8dee2aaSAndroid Build Coastguard Worker    ctx.delete("./symlinks/xcode/iOSSDK/System/Library/Frameworks")
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Workerdef _create_ios_sdk_symlinks(ctx):
39*c8dee2aaSAndroid Build Coastguard Worker    system_xcode_path = _get_system_xcode_path(ctx)
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/rules/lib/actions#symlink
42*c8dee2aaSAndroid Build Coastguard Worker    ctx.symlink(
43*c8dee2aaSAndroid Build Coastguard Worker        # from =
44*c8dee2aaSAndroid Build Coastguard Worker        system_xcode_path + ios_sdk_root + "usr",
45*c8dee2aaSAndroid Build Coastguard Worker        # to =
46*c8dee2aaSAndroid Build Coastguard Worker        "./symlinks/xcode/iOSSDK/usr",
47*c8dee2aaSAndroid Build Coastguard Worker    )
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker    # It is very important to symlink the frameworks directory to [sysroot]/System/Library/Frameworks
50*c8dee2aaSAndroid Build Coastguard Worker    # because some Frameworks "re-export" other frameworks. These framework paths are relative to
51*c8dee2aaSAndroid Build Coastguard Worker    # the sysroot (which on a typical machine is /), and it is difficult to change these paths.
52*c8dee2aaSAndroid Build Coastguard Worker    # By making the symlinks emulate the original path structure, we can keep those re-exports
53*c8dee2aaSAndroid Build Coastguard Worker    # from breaking.
54*c8dee2aaSAndroid Build Coastguard Worker    ctx.symlink(
55*c8dee2aaSAndroid Build Coastguard Worker        # from =
56*c8dee2aaSAndroid Build Coastguard Worker        system_xcode_path + ios_sdk_root + "System/Library/Frameworks",
57*c8dee2aaSAndroid Build Coastguard Worker        # to =
58*c8dee2aaSAndroid Build Coastguard Worker        "./symlinks/xcode/iOSSDK/System/Library/Frameworks",
59*c8dee2aaSAndroid Build Coastguard Worker    )
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Workerdef _download_ios_toolchain_impl(ctx):
62*c8dee2aaSAndroid Build Coastguard Worker    # Download the clang toolchain (the extraction can take a while)
63*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/rules/lib/repository_ctx#download_and_extract
64*c8dee2aaSAndroid Build Coastguard Worker    ctx.download_and_extract(
65*c8dee2aaSAndroid Build Coastguard Worker        url = gcs_mirror_url(clang_url_arm64, clang_sha256_arm64),
66*c8dee2aaSAndroid Build Coastguard Worker        output = "",
67*c8dee2aaSAndroid Build Coastguard Worker        stripPrefix = clang_prefix_arm64,
68*c8dee2aaSAndroid Build Coastguard Worker        sha256 = clang_sha256_arm64,
69*c8dee2aaSAndroid Build Coastguard Worker    )
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker    # Some std library headers use #include_next to include system specific headers, and
72*c8dee2aaSAndroid Build Coastguard Worker    # some skia source files require Xcode headers when compiling, (see SkTypes.h and look
73*c8dee2aaSAndroid Build Coastguard Worker    # for TargetedConditionals.h)) All of these are located in Xcode, stopping the Mac
74*c8dee2aaSAndroid Build Coastguard Worker    # builds from being purely hermetic.
75*c8dee2aaSAndroid Build Coastguard Worker    # For now, we can grab the user's Xcode path by calling xcode-select and create a symlink in
76*c8dee2aaSAndroid Build Coastguard Worker    # our toolchain directory to refer to during compilation.
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker    _delete_ios_sdk_symlinks(ctx)
79*c8dee2aaSAndroid Build Coastguard Worker    _create_ios_sdk_symlinks(ctx)
80*c8dee2aaSAndroid Build Coastguard Worker
81*c8dee2aaSAndroid Build Coastguard Worker    # This list of files lines up with _make_default_flags() in ios_toolchain_config.bzl
82*c8dee2aaSAndroid Build Coastguard Worker    # It is all locations that our toolchain could find a system header.
83*c8dee2aaSAndroid Build Coastguard Worker    builtin_include_directories = [
84*c8dee2aaSAndroid Build Coastguard Worker        "include/c++/v1",
85*c8dee2aaSAndroid Build Coastguard Worker        "lib/clang/15.0.1/include",
86*c8dee2aaSAndroid Build Coastguard Worker        "symlinks/xcode/iOSSDK/System/Library/Frameworks",
87*c8dee2aaSAndroid Build Coastguard Worker        "symlinks/xcode/iOSSDK/usr/include",
88*c8dee2aaSAndroid Build Coastguard Worker    ]
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker    generate_system_module_map(
91*c8dee2aaSAndroid Build Coastguard Worker        ctx,
92*c8dee2aaSAndroid Build Coastguard Worker        module_file = "toolchain_system_headers.modulemap",
93*c8dee2aaSAndroid Build Coastguard Worker        folders = builtin_include_directories,
94*c8dee2aaSAndroid Build Coastguard Worker    )
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker    # Create a BUILD.bazel file that makes the files necessary for compiling,
97*c8dee2aaSAndroid Build Coastguard Worker    # linking and creating archive files visible to Bazel.
98*c8dee2aaSAndroid Build Coastguard Worker    # The smaller the globs are, the more performant the sandboxed builds will be.
99*c8dee2aaSAndroid Build Coastguard Worker    # Additionally, globs that are too wide can pick up infinite symlink loops,
100*c8dee2aaSAndroid Build Coastguard Worker    # and be difficult to quash: https://github.com/bazelbuild/bazel/issues/13950
101*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/rules/lib/repository_ctx#file
102*c8dee2aaSAndroid Build Coastguard Worker    ctx.file(
103*c8dee2aaSAndroid Build Coastguard Worker        "BUILD.bazel",
104*c8dee2aaSAndroid Build Coastguard Worker        content = """
105*c8dee2aaSAndroid Build Coastguard Worker# DO NOT EDIT THIS BAZEL FILE DIRECTLY
106*c8dee2aaSAndroid Build Coastguard Worker# Generated from ctx.file action in download_ios_toolchain.bzl
107*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
108*c8dee2aaSAndroid Build Coastguard Worker    name = "generated_module_map",
109*c8dee2aaSAndroid Build Coastguard Worker    srcs = ["toolchain_system_headers.modulemap"],
110*c8dee2aaSAndroid Build Coastguard Worker    visibility = ["//visibility:public"],
111*c8dee2aaSAndroid Build Coastguard Worker)
112*c8dee2aaSAndroid Build Coastguard Worker
113*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
114*c8dee2aaSAndroid Build Coastguard Worker    name = "archive_files",
115*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
116*c8dee2aaSAndroid Build Coastguard Worker        "bin/llvm-ar",
117*c8dee2aaSAndroid Build Coastguard Worker    ],
118*c8dee2aaSAndroid Build Coastguard Worker    visibility = ["//visibility:public"],
119*c8dee2aaSAndroid Build Coastguard Worker)
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker# Any framework that Skia depends on directly or indirectly needs to be listed here.
122*c8dee2aaSAndroid Build Coastguard WorkerFRAMEWORK_GLOB = [
123*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CFNetwork.Framework/**",
124*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CloudKit.Framework/**",
125*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/ColorSync.Framework/**",
126*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreData.Framework/**",
127*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreFoundation.Framework/**",
128*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreGraphics.Framework/**",
129*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreImage.Framework/**",
130*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreLocation.Framework/**",
131*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreServices.Framework/**",
132*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreText.Framework/**",
133*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/CoreVideo.Framework/**",
134*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/Foundation.Framework/**",
135*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/ImageIO.Framework/**",
136*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/IOKit.Framework/**",
137*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/IOSurface.Framework/**",
138*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/Metal.Framework/**",
139*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/MetalKit.Framework/**",
140*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/MobileCoreServices.Framework/**",
141*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/ModelIO.Framework/**",
142*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/OpenGLES.Framework/**",
143*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/QuartzCore.Framework/**",
144*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/Security.Framework/**",
145*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/Symbols.Framework/**",
146*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/UIKit.Framework/**",
147*c8dee2aaSAndroid Build Coastguard Worker    "symlinks/xcode/iOSSDK/System/Library/Frameworks/UserNotifications.Framework/**",
148*c8dee2aaSAndroid Build Coastguard Worker]
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
151*c8dee2aaSAndroid Build Coastguard Worker    name = "compile_files",
152*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
153*c8dee2aaSAndroid Build Coastguard Worker        "bin/clang",
154*c8dee2aaSAndroid Build Coastguard Worker    ] + glob(
155*c8dee2aaSAndroid Build Coastguard Worker        include = [
156*c8dee2aaSAndroid Build Coastguard Worker            "include/c++/v1/**",
157*c8dee2aaSAndroid Build Coastguard Worker            "lib/clang/15.0.1/include/**",
158*c8dee2aaSAndroid Build Coastguard Worker            "symlinks/xcode/iOSSDK/usr/include/**",
159*c8dee2aaSAndroid Build Coastguard Worker        ] + FRAMEWORK_GLOB,
160*c8dee2aaSAndroid Build Coastguard Worker        allow_empty = False,
161*c8dee2aaSAndroid Build Coastguard Worker    ),
162*c8dee2aaSAndroid Build Coastguard Worker    visibility = ["//visibility:public"],
163*c8dee2aaSAndroid Build Coastguard Worker)
164*c8dee2aaSAndroid Build Coastguard Worker
165*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
166*c8dee2aaSAndroid Build Coastguard Worker    name = "link_files",
167*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
168*c8dee2aaSAndroid Build Coastguard Worker        "bin/clang",
169*c8dee2aaSAndroid Build Coastguard Worker        "bin/ld.lld",
170*c8dee2aaSAndroid Build Coastguard Worker        "bin/lld",
171*c8dee2aaSAndroid Build Coastguard Worker        "lib/libc++.a",
172*c8dee2aaSAndroid Build Coastguard Worker        "lib/libc++abi.a",
173*c8dee2aaSAndroid Build Coastguard Worker        "lib/libunwind.a",
174*c8dee2aaSAndroid Build Coastguard Worker    ] + glob(
175*c8dee2aaSAndroid Build Coastguard Worker        include = [
176*c8dee2aaSAndroid Build Coastguard Worker            # libc++.tbd and libSystem.tbd live here.
177*c8dee2aaSAndroid Build Coastguard Worker            "symlinks/xcode/iOSSDK/usr/lib/*",
178*c8dee2aaSAndroid Build Coastguard Worker        ] + FRAMEWORK_GLOB,
179*c8dee2aaSAndroid Build Coastguard Worker        allow_empty = False,
180*c8dee2aaSAndroid Build Coastguard Worker    ),
181*c8dee2aaSAndroid Build Coastguard Worker    visibility = ["//visibility:public"],
182*c8dee2aaSAndroid Build Coastguard Worker)
183*c8dee2aaSAndroid Build Coastguard Worker""",
184*c8dee2aaSAndroid Build Coastguard Worker        executable = False,
185*c8dee2aaSAndroid Build Coastguard Worker    )
186*c8dee2aaSAndroid Build Coastguard Worker
187*c8dee2aaSAndroid Build Coastguard Worker# https://bazel.build/rules/repository_rules
188*c8dee2aaSAndroid Build Coastguard Workerdownload_ios_toolchain = repository_rule(
189*c8dee2aaSAndroid Build Coastguard Worker    implementation = _download_ios_toolchain_impl,
190*c8dee2aaSAndroid Build Coastguard Worker    attrs = {},
191*c8dee2aaSAndroid Build Coastguard Worker    doc = "Downloads clang to build Skia with." +
192*c8dee2aaSAndroid Build Coastguard Worker          "Assumes you have xcode located on your device and have" +
193*c8dee2aaSAndroid Build Coastguard Worker          "xcode-select in your $PATH.",
194*c8dee2aaSAndroid Build Coastguard Worker)
195