Skip to content

Commit

Permalink
Enable native support for Windows on arm64
Browse files Browse the repository at this point in the history
Following changes are included

- Fix AutoCpuConverter.java to identify win/arm64 CPU
- Add win/arm64 JDK 17
- Add grpc patch to workaround build issues
- Extend build_bazel_binaries.yml to cross-compile for win/arm64
- Fix msvc toolchain to look for tools in HostX86 directory as well

Fixes: bazelbuild#14339
  • Loading branch information
niyas-sait committed Nov 27, 2021
1 parent ae0a6c9 commit 3ac59ac
Show file tree
Hide file tree
Showing 15 changed files with 195 additions and 5 deletions.
10 changes: 10 additions & 0 deletions .bazelci/build_bazel_binaries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,13 @@ platforms:
build_targets:
- "//src:bazel.exe"
- "//src:bazel_nojdk.exe"
windows_arm64:
build_flags:
- "--copt=-w"
- "--host_copt=-w"
- "-c"
- "opt"
build_targets:
- "//src:bazel.exe"
- "//src:bazel_nojdk.exe"
- "--cpu=x64_arm64_windows"
39 changes: 39 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,15 @@ http_file(
urls = ["https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64-minimal-b23d4e05466f2aa1fdcd72d3d3a8e962206b64bf-1581689080.zip"],
)

http_file(
name = "openjdk_win_arm64_vanilla",
downloaded_file_path = "zulu-win-arm64.zip",
sha256 = "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877",
urls = ["https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip"],
)

# TODO(#14339): Upload missing JDK packages for win/arm64 to bazel mirror and add rules

dist_http_archive(
name = "bazelci_rules",
patch_cmds = EXPORT_WORKSPACE_IN_BUILD_FILE,
Expand Down Expand Up @@ -379,6 +388,7 @@ distdir_tar(
"zulu11.50.19-ca-jdk11.0.12-macosx_x64.tar.gz",
"zulu11.50.19-ca-jdk11.0.12-macosx_aarch64.tar.gz",
"zulu11.50.19-ca-jdk11.0.12-win_x64.tar.gz",
"zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip",
"android_tools_pkg-0.23.0.tar.gz",
],
dirname = "test_WORKSPACE/distdir",
Expand All @@ -389,6 +399,7 @@ distdir_tar(
"zulu11.50.19-ca-jdk11.0.12-macosx_x64.tar.gz": "0b8c8b7cf89c7c55b7e2239b47201d704e8d2170884875b00f3103cf0662d6d7",
"zulu11.50.19-ca-jdk11.0.12-macosx_aarch64.tar.gz": "e908a0b4c0da08d41c3e19230f819b364ff2e5f1dafd62d2cf991a85a34d3a17",
"zulu11.50.19-ca-jdk11.0.12-win_x64.tar.gz": "42ae65e75d615a3f06a674978e1fa85fdf078cad94e553fee3e779b2b42bb015",
"zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip": "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877",
"android_tools_pkg-0.23.0.tar.gz": "ed5290594244c2eeab41f0104519bcef51e27c699ff4b379fcbd25215270513e",
},
urls = {
Expand All @@ -397,6 +408,7 @@ distdir_tar(
"zulu11.50.19-ca-jdk11.0.12-macosx_x64.tar.gz": ["https://mirror.bazel.build/openjdk/azul-zulu11.50.19-ca-jdk11.0.12/zulu11.50.19-ca-jdk11.0.12-macosx_x64.tar.gz"],
"zulu11.50.19-ca-jdk11.0.12-macosx_aarch64.tar.gz": ["https://mirror.bazel.build/openjdk/azul-zulu11.50.19-ca-jdk11.0.12/zulu11.50.19-ca-jdk11.0.12-macosx_aarch64.tar.gz"],
"zulu11.50.19-ca-jdk11.0.12-win_x64.tar.gz": ["https://mirror.bazel.build/openjdk/azul-zulu11.50.19-ca-jdk11.0.12/zulu11.50.19-ca-jdk11.0.12-win_x64.zip"],
"zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip": ["https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip"],
"android_tools_pkg-0.23.0.tar.gz": [
"https://mirror.bazel.build/bazel_android_tools/android_tools_pkg-0.23.0.tar.gz",
],
Expand Down Expand Up @@ -726,6 +738,19 @@ http_archive(
],
)

# This must be kept in sync with src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.
http_archive(
name = "remotejdk17_win_arm64_for_testing",
build_file = "@local_jdk//:BUILD.bazel",
patch_cmds = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE,
patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE_WIN,
sha256 = "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877",
strip_prefix = "zulu17.30.15-ca-jdk17.0.1-win_aarch64",
urls = [
"https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip",
],
)

# Used in src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.
dist_http_archive(
name = "remote_java_tools_for_testing",
Expand Down Expand Up @@ -1013,6 +1038,20 @@ exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
],
)

# This must be kept in sync with src/test/shell/bazel/testdata/jdk_http_archives.
http_archive(
name = "openjdk17_windows_arm64_archive",
build_file_content = """
java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
sha256 = "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877",
strip_prefix = "zulu17.30.15-ca-jdk17.0.1-win_aarch64",
urls = [
"https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip",
],
)

load("@io_bazel_skydoc//:setup.bzl", "stardoc_repositories")

stardoc_repositories()
Expand Down
1 change: 1 addition & 0 deletions distdir_deps.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ DIST_DEPS = {
"patch_args": ["-p1"],
"patches": [
"//third_party/grpc:grpc_1.41.0.patch",
"//third_party/grpc:grpc_1.41.0.win_arm64.patch",
],
"used_in": [
"additional_distfiles",
Expand Down
17 changes: 14 additions & 3 deletions src/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,10 @@ filegroup(
"//src/conditions:darwin_arm64": [
"@openjdk_macos_aarch64//file",
],
"//src/conditions:windows": [
"//src/conditions:windows_arm64": [
"@openjdk_win_arm64_vanilla//file", # TODO(#14339): replace with openjdk_win_arm64 when packages are uploaded to bazel mirror server
],
"//src/conditions:windows_x86_64": [
"@openjdk_win//file",
],
"//src/conditions:linux_aarch64": [
Expand All @@ -169,9 +172,12 @@ filegroup(
"//src/conditions:darwin_arm64": [
"@openjdk_macos_aarch64_minimal//file",
],
"//src/conditions:windows": [
"//src/conditions:windows_x86_64": [
"@openjdk_win_minimal//file",
],
"//src/conditions:windows_arm64": [
"@openjdk_win_arm64_vanilla//file", # TODO(#14339): replace with openjdk_win_arm64 when packages are uploaded to bazel mirror server
],
"//src/conditions:linux_aarch64": [
"@openjdk_linux_aarch64_minimal//file",
],
Expand All @@ -191,9 +197,12 @@ filegroup(
"//src/conditions:darwin_arm64": [
"@openjdk_macos_aarch64_vanilla//file",
],
"//src/conditions:windows": [
"//src/conditions:windows_x86_64": [
"@openjdk_win_vanilla//file",
],
"//src/conditions:windows_arm64": [
"@openjdk_win_arm64_vanilla//file",
],
"//src/conditions:linux_aarch64": [
"@openjdk_linux_aarch64_vanilla//file",
],
Expand Down Expand Up @@ -660,6 +669,7 @@ filegroup(
"@openjdk17_darwin_archive//:WORKSPACE",
"@openjdk17_linux_archive//:WORKSPACE",
"@openjdk17_windows_archive//:WORKSPACE",
"@openjdk17_windows_arm64_archive//:WORKSPACE",
"@openjdk_linux_aarch64_minimal//file",
"@openjdk_linux_minimal//file",
"@openjdk_macos_aarch64_minimal//file",
Expand Down Expand Up @@ -693,6 +703,7 @@ filegroup(
"@remotejdk17_macos_aarch64_for_testing//:WORKSPACE",
"@remotejdk17_macos_for_testing//:WORKSPACE",
"@remotejdk17_win_for_testing//:WORKSPACE",
"@remotejdk17_win_arm64_for_testing//:WORKSPACE",
"@rules_cc//:WORKSPACE",
"@rules_java//:WORKSPACE",
"@rules_pkg//:WORKSPACE",
Expand Down
31 changes: 31 additions & 0 deletions src/conditions/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,37 @@ config_setting(
visibility = ["//visibility:public"],
)

config_setting(
name = "windows_x86_64",
constraint_values = [
"@platforms//os:windows",
"@platforms//cpu:x86_64",
],
visibility = ["//visibility:public"],
)

config_setting(
name = "windows_arm64_constraint",
constraint_values = [
"@platforms//os:windows",
"@platforms//cpu:arm64",
],
)

config_setting(
name = "windows_arm64_flag",
values = {"cpu": "x64_arm64_windows"},
)

selects.config_setting_group(
name = "windows_arm64",
match_any = [
":windows_arm64_constraint",
":windows_arm64_flag",
],
visibility = ["//visibility:public"],
)

config_setting(
name = "arm",
constraint_values = ["@platforms//cpu:arm"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public String convert(String input) throws OptionsParsingException {
switch (CPU.getCurrent()) {
case X86_64:
return "x64_windows";
case AARCH64:
return "x64_arm64_windows";
default:
// We only support x64 Windows for now.
return "unknown";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,22 @@ maybe(
version = "17",
)

# This must be kept in sync with the top-level WORKSPACE file.
maybe(
remote_java_repository,
name = "remotejdk17_win_arm64",
exec_compatible_with = [
"@platforms//os:windows",
"@platforms//cpu:aarch64",
],
sha256 = "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877",
strip_prefix = "zulu17.30.15-ca-jdk17.0.1-win_aarch64",
urls = [
"https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip",
],
version = "17",
)

{remote_java_tools}
{remote_java_tools_linux}
{remote_java_tools_windows}
Expand Down
1 change: 1 addition & 0 deletions src/test/py/bazel/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ class TestBase(unittest.TestCase):
'remotejdk17_macos_for_testing',
'remotejdk17_macos_aarch64_for_testing',
'remotejdk17_win_for_testing',
'remotejdk17_win_arm64_for_testing',
'remote_java_tools_for_testing',
'remote_java_tools_darwin_for_testing',
'remote_java_tools_linux_for_testing',
Expand Down
14 changes: 14 additions & 0 deletions src/test/shell/bazel/testdata/jdk_http_archives.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -226,3 +226,17 @@ exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
"https://cdn.azul.com/zulu/bin/zulu17.28.13-ca-jdk17.0.0-win_x64.zip",
],
)

# This must be kept in sync with src/test/shell/bazel/testdata/jdk_http_archives.
http_archive(
name = "openjdk17_windows_arm64_archive",
build_file_content = """
java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
sha256 = "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877",
strip_prefix = "zulu17.30.15-ca-jdk17.0.1-win_aarch64",
urls = [
"https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip"
],
)
2 changes: 2 additions & 0 deletions src/test/shell/testenv.sh.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ EOF
"openjdk17_darwin_aarch64_archive"
"openjdk17_linux_archive"
"openjdk17_windows_archive"
"openjdk17_windows_arm64_archive"
"openjdk_linux_aarch64_minimal"
"openjdk_linux_minimal"
"openjdk_macos_x86_64_minimal"
Expand Down Expand Up @@ -334,6 +335,7 @@ EOF
"remotejdk17_macos_for_testing"
"remotejdk17_macos_aarch64_for_testing"
"remotejdk17_win_for_testing"
"remotejdk17_win_arm64_for_testing"
"rules_cc"
"rules_java"
"rules_proto"
Expand Down
1 change: 1 addition & 0 deletions third_party/grpc/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ licenses(["notice"]) # Apache v2
exports_files([
"grpc_1.31.1.patch",
"grpc_1.41.0.patch",
"grpc_1.41.0.win_arm64.patch"
])

package(default_visibility = ["//visibility:public"])
Expand Down
51 changes: 51 additions & 0 deletions third_party/grpc/grpc_1.41.0.win_arm64.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
From 6ce08c3da545358074eb66dc4202e0474fa5be1b Mon Sep 17 00:00:00 2001
From: Niyas Sait <niyas.sait@linaro.org>
Date: Fri, 26 Nov 2021 02:43:37 -0800
Subject: [PATCH] add workarounds to compile for win/arm64

---
src/core/lib/transport/transport.cc | 8 ++++----
third_party/cares/cares.BUILD | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/core/lib/transport/transport.cc b/src/core/lib/transport/transport.cc
index 36060a6bd9..db847d53d2 100644
--- a/src/core/lib/transport/transport.cc
+++ b/src/core/lib/transport/transport.cc
@@ -99,16 +99,16 @@ void grpc_stream_ref_init(grpc_stream_refcount* refcount, int /*initial_refs*/,
refcount, &refcount->slice_refcount);
}

-static void move64(uint64_t* from, uint64_t* to) {
+static void move64bits(uint64_t* from, uint64_t* to) {
*to += *from;
*from = 0;
}

void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from,
grpc_transport_one_way_stats* to) {
- move64(&from->framing_bytes, &to->framing_bytes);
- move64(&from->data_bytes, &to->data_bytes);
- move64(&from->header_bytes, &to->header_bytes);
+ move64bits(&from->framing_bytes, &to->framing_bytes);
+ move64bits(&from->data_bytes, &to->data_bytes);
+ move64bits(&from->header_bytes, &to->header_bytes);
}

void grpc_transport_move_stats(grpc_transport_stream_stats* from,
diff --git a/third_party/cares/cares.BUILD b/third_party/cares/cares.BUILD
index 7939021a25..430791aa8d 100644
--- a/third_party/cares/cares.BUILD
+++ b/third_party/cares/cares.BUILD
@@ -22,7 +22,7 @@ config_setting(

config_setting(
name = "windows",
- values = {"cpu": "x64_windows"},
+ constraint_values = ["@platforms//os:windows"],
)

# Android is not officially supported through C++.
--
2.33.0.windows.2

2 changes: 1 addition & 1 deletion tools/cpp/cc_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ def cc_autoconf_impl(repository_ctx, overriden_tools = dict()):
# container so skipping until we have proper tests for these platforms.
repository_ctx.symlink(paths["@bazel_tools//tools/cpp:bsd_cc_toolchain_config.bzl"], "cc_toolchain_config.bzl")
repository_ctx.symlink(paths["@bazel_tools//tools/cpp:BUILD.static.bsd"], "BUILD")
elif cpu_value == "x64_windows":
elif cpu_value in ["x64_windows", "x64_arm64_windows"]:
# TODO(ibiryukov): overriden_tools are only supported in configure_unix_toolchain.
# We might want to add that to Windows too(at least for msys toolchain).
configure_windows_toolchain(repository_ctx)
Expand Down
7 changes: 6 additions & 1 deletion tools/cpp/lib_cc_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,12 @@ def get_cpu_value(repository_ctx):
if os_name.find("openbsd") != -1:
return "openbsd"
if os_name.find("windows") != -1:
return "x64_windows"
arch = (get_env_var(repository_ctx, "PROCESSOR_ARCHITECTURE", None, False) or
get_env_var(repository_ctx, "PROCESSOR_ARCHITEW6432", None, False))
if arch == "ARM64":
return "x64_arm64_windows"
else:
return "x64_windows"

# Use uname to figure out whether we are on x86_32 or x86_64
result = repository_ctx.execute(["uname", "-m"])
Expand Down
6 changes: 6 additions & 0 deletions tools/cpp/windows_cc_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,9 @@ def _get_vc_env_vars(repository_ctx, vc_path, msvc_vars_x64, target_arch):
lib = msvc_vars_x64["%{msvc_env_lib_x64}"]
full_version = _get_vc_full_version(repository_ctx, vc_path)
tools_path = "%s\\Tools\\MSVC\\%s\\bin\\HostX64\\%s" % (vc_path, full_version, target_arch)
# For native windows on arm64 builds host toolchain runs in an emulated x86 environment
if not repository_ctx.path(tools_path).exists:
tools_path = tools_path.replace("HostX64", "HostX86")
else:
lib = msvc_vars_x64["%{msvc_env_lib_x64}"].replace("amd64", _targets_lib_folder[target_arch])
tools_path = vc_path + "\\bin\\" + _targets_archs[target_arch]
Expand Down Expand Up @@ -448,6 +451,9 @@ def find_msvc_tool(repository_ctx, vc_path, tool, target_arch = "x64"):
full_version = _get_vc_full_version(repository_ctx, vc_path)
if full_version:
tool_path = "%s\\Tools\\MSVC\\%s\\bin\\HostX64\\%s\\%s" % (vc_path, full_version, target_arch, tool)
# For native windows on arm64 builds host toolchain runs in an emulated x86 environment
if not repository_ctx.path(tool_path).exists:
tool_path = tool_path.replace("HostX64", "HostX86")
else:
# For VS 2015 and older version, the tools are under:
# C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64
Expand Down

0 comments on commit 3ac59ac

Please sign in to comment.