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