blob: fddc5632ebffe3eaca09df17c4d8a32447cf53ed [file] [log] [blame]
"""
This file assembles a toolchain for a Windows host using the Clang Compiler.
It downloads the necessary executables and creates symlinks in the external subfolder of the Bazel
cache (the same place third party deps are downloaded with http_archive or similar functions in
WORKSPACE.bazel). These will be able to be used via our
custom c++ toolchain configuration (see //toolchain/windows_toolchain_config.bzl)
The destination folder for these files and symlinks are:
[outputRoot (aka Bazel cache)]/[outputUserRoot]/[outputBase]/external/clang_windows_amd64
(See https://bazel.build/docs/output_directories#layout-diagram)
"""
load("//bazel:cipd_install.bzl", "cipd_download_urls")
load(":utils.bzl", "gcs_mirror_url")
# From https://github.com/llvm/llvm-project/releases/tag/llvmorg-18.1.8
# When updating this, don't forget to use //bazel/gcs_mirror to upload a new version.
# go run bazel/gcs_mirror/gcs_mirror.go --url [clang_url] --sha256 [clang_sha256]
# We're using a newer version on Windows than Linux or Mac because major version 18 is the earliest
# version to include pre-builts for Windows.
clang_prefix = "clang+llvm-18.1.8-x86_64-pc-windows-msvc"
clang_sha256 = "22c5907db053026cc2a8ff96d21c0f642a90d24d66c23c6d28ee7b1d572b82e8"
clang_url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/clang+llvm-18.1.8-x86_64-pc-windows-msvc.tar.xz"
win_toolchain_pkg = "skia/bots/win_toolchain"
win_toolchain_tag = "version:15"
win_toolchain_sha256 = "f3dfb040052661124470d959faf8350aef4c2da9b396ad191a2c922d7a01c43f"
def _download_windows_amd64_toolchain_impl(ctx):
# Download the clang toolchain (the extraction can take a while)
# https://bazel.build/rules/lib/repository_ctx#download_and_extract
ctx.download_and_extract(
url = gcs_mirror_url(clang_url, clang_sha256),
output = "",
stripPrefix = clang_prefix,
sha256 = clang_sha256,
)
# Create a BUILD.bazel file that makes the files necessary for compiling,
# linking and creating archive files visible to Bazel.
# The smaller the globs are, the more performant the sandboxed builds will be.
# Additionally, globs that are too wide can pick up infinite symlink loops,
# and be difficult to quash: https://github.com/bazelbuild/bazel/issues/13950
# https://bazel.build/rules/lib/repository_ctx#file
ctx.file(
"BUILD.bazel",
content = """
# DO NOT EDIT THIS BAZEL FILE DIRECTLY
# Generated from ctx.file action in download_windows_amd64_toolchain.bzl
load(":vars.bzl", "MSVC_INCLUDE", "MSVC_LIB", "WIN_SDK_INCLUDE", "WIN_SDK_LIB")
filegroup(
name = "archive_files",
srcs = [
"bin/llvm-ar.exe",
],
visibility = ["//visibility:public"],
)
filegroup(
name = "compile_files",
srcs = [
"bin/clang.exe",
] + glob(
include = [
"lib/clang/18/include/**",
MSVC_INCLUDE + "/**",
WIN_SDK_INCLUDE + "/**",
],
allow_empty = False,
),
visibility = ["//visibility:public"],
)
filegroup(
name = "link_files",
srcs = [
"bin/clang.exe",
"bin/ld.lld.exe",
"bin/lld.exe",
] + glob(
[
MSVC_LIB + "/**",
WIN_SDK_LIB + "/**",
],
allow_empty = False,
),
visibility = ["//visibility:public"],
)
""",
executable = False,
)
# Download the win_toolchain CIPD package (the extraction can take a while).
ctx.download_and_extract(
url = cipd_download_urls(win_toolchain_pkg, win_toolchain_sha256, win_toolchain_tag),
output = "",
sha256 = win_toolchain_sha256,
type = "zip",
)
# Find the correct version of MSVC and the Windows SDK.
if ctx.os.name.lower().find("windows") != -1:
msvc_version = ctx.execute(["powershell.exe", "/c", "(Get-ChildItem -Path VC/Tools/MSVC | sort Name | select -Last 1).BaseName"]).stdout.rstrip()
win_sdk_version = ctx.execute(["powershell.exe", "/c", "(Get-ChildItem -Path win_sdk/Include | sort Name | select -Last 1).BaseName"]).stdout.rstrip()
else:
msvc_version = ctx.execute(["bash", "-c", "ls VC/Tools/MSVC | sort | tail -1"]).stdout.rstrip()
win_sdk_version = ctx.execute(["bash", "-c", "ls win_sdk/Include | sort | tail -1"]).stdout.rstrip()
# Write vars.bzl.
ctx.file(
"vars.bzl",
content = """
MSVC_VERSION = "%s"
MSVC_INCLUDE = "VC/Tools/MSVC/" + MSVC_VERSION + "/include"
MSVC_LIB = "VC/Tools/MSVC/" + MSVC_VERSION + "/lib"
WIN_SDK_VERSION = "%s"
WIN_SDK_INCLUDE = "win_sdk/Include/" + WIN_SDK_VERSION
WIN_SDK_LIB = "win_sdk/Lib/" + WIN_SDK_VERSION
""" % (msvc_version, win_sdk_version),
executable = False,
)
# https://bazel.build/rules/repository_rules
download_windows_amd64_toolchain = repository_rule(
implementation = _download_windows_amd64_toolchain_impl,
attrs = {},
doc = "Downloads clang to build Skia with." +
" Assumes you have msvc located on your device and have" +
" VCToolsInstallDir, WindowsSdkDir, and WindowsSDKVersion in your" +
" environment, or have MSVC and Windows SDK installed in a" +
" predictable location.",
)