diff --git a/.bazelci/build_bazel_binaries.yml b/.bazelci/build_bazel_binaries.yml index 17d49f042740ab..b42defbf20a301 100644 --- a/.bazelci/build_bazel_binaries.yml +++ b/.bazelci/build_bazel_binaries.yml @@ -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" + - "--cpu=x64_arm64_windows" + build_targets: + - "//src:bazel.exe" + - "//src:bazel_nojdk.exe" diff --git a/WORKSPACE b/WORKSPACE index f31ef45b3fd089..a4175c3818e151 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -254,6 +254,13 @@ 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.zip"], ) +http_file( + name = "openjdk_win_arm64_vanilla", + downloaded_file_path = "zulu-win-arm64.zip", + sha256 = "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877", + urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip"], +) + http_file( name = "openjdk_win_minimal", downloaded_file_path = "zulu-win-minimal.zip", diff --git a/distdir_deps.bzl b/distdir_deps.bzl index 82ae7fcd478431..724bb2c5eb45e0 100644 --- a/distdir_deps.bzl +++ b/distdir_deps.bzl @@ -136,6 +136,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", diff --git a/site/docs/windows.md b/site/docs/windows.md index df6009219b84bb..2356b4fb8055a0 100644 --- a/site/docs/windows.md +++ b/site/docs/windows.md @@ -203,7 +203,9 @@ target architecture, set the `--cpu` build option for your target architecture: * x64 (default): `--cpu=x64_windows` or no option * x86: `--cpu=x64_x86_windows` * ARM: `--cpu=x64_arm_windows` -* ARM64: `--cpu=x64_arm64_windows` +* ARM64: `--cpu=arm64_windows` + +Note: `--cpu=x64_arm64_windows` to target ARM64 architecture is deprecated. Please use `--cpu=arm64_windows` For example, to build targets for ARM architecture, run: diff --git a/src/BUILD b/src/BUILD index 791aa39efa778d..3a48ec70a782c3 100644 --- a/src/BUILD +++ b/src/BUILD @@ -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": [ @@ -169,7 +172,10 @@ filegroup( "//src/conditions:darwin_arm64": [ "@openjdk_macos_aarch64_minimal//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_minimal//file", ], "//src/conditions:linux_aarch64": [ diff --git a/src/conditions/BUILD b/src/conditions/BUILD index 073f8475ab45db..b15552187b4f0e 100644 --- a/src/conditions/BUILD +++ b/src/conditions/BUILD @@ -167,6 +167,45 @@ 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", + ], +) + +# TODO(https://github.com/bazelbuild/bazel/issues/7260) +# Remove the flag after toolchain cc resolution is fixed +config_setting( + name = "windows_x64_arm64_flag", + values = {"cpu": "x64_arm64_windows"}, +) + +config_setting( + name = "windows_arm64_flag", + values = {"cpu": "arm64_windows"}, +) + +selects.config_setting_group( + name = "windows_arm64", + match_any = [ + ":windows_arm64_constraint", + ":windows_arm64_flag", + ":windows_x64_arm64_flag" + ], + visibility = ["//visibility:public"], +) + config_setting( name = "arm", constraint_values = ["@platforms//cpu:arm"], diff --git a/src/conditions/BUILD.tools b/src/conditions/BUILD.tools index e2b54e675d150a..aafdb4fb34786f 100644 --- a/src/conditions/BUILD.tools +++ b/src/conditions/BUILD.tools @@ -1,3 +1,5 @@ +load("//tools/windows:windows_config.bzl", "create_windows_host_config") + config_setting( name = "freebsd", constraint_values = ["@platforms//os:freebsd"], @@ -118,20 +120,30 @@ config_setting( visibility = ["//visibility:public"], ) -# TODO: figure out how to base this selection on constraints config_setting( - name = "windows_msvc", - values = {"cpu": "x64_windows_msvc"}, - visibility = ["//visibility:public"], + name = "windows_x64", + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], +) +config_setting( + name = "windows_arm64", + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:arm64", + ], ) # TODO: figure out how to base this selection on constraints config_setting( - name = "host_windows", - values = {"host_cpu": "x64_windows"}, + name = "windows_msvc", + values = {"cpu": "x64_windows_msvc"}, visibility = ["//visibility:public"], ) +create_windows_host_config() + config_setting( name = "remote", values = {"define": "EXECUTOR=remote"}, diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java b/src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java index d39620c50eb1d7..07b1352088c3e8 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java @@ -50,8 +50,10 @@ public String convert(String input) throws OptionsParsingException { switch (CPU.getCurrent()) { case X86_64: return "x64_windows"; + case AARCH64: + return "arm64_windows"; default: - // We only support x64 Windows for now. + // We only support x64 and arm64 Windows for now. return "unknown"; } case LINUX: diff --git a/src/test/py/bazel/bazel_windows_cpp_test.py b/src/test/py/bazel/bazel_windows_cpp_test.py index ce4c806ccce4cf..95f1280cfa9f7a 100644 --- a/src/test/py/bazel/bazel_windows_cpp_test.py +++ b/src/test/py/bazel/bazel_windows_cpp_test.py @@ -920,7 +920,7 @@ def testBuildArmCppBinaryWithMsvcCL(self): self.AssertExitCode(exit_code, 0, stderr) self.assertIn('arm\\cl.exe', '\n'.join(stderr)) - def testBuildArm64CppBinaryWithMsvcCL(self): + def testBuildArm64CppBinaryWithMsvcCLAndCpuX64Arm64Windows(self): self.CreateWorkspaceWithDefaultRepos('WORKSPACE') self.ScratchFile('BUILD', [ 'cc_binary(', @@ -1033,6 +1033,24 @@ def testBuildCppBinaryWithMsysGCC(self): self.AssertFileContentContains( os.path.join(bazel_output, paramfile % 'opt'), '-Wl,--gc-sections') + def testBuildArm64CppBinaryWithMsvcCLAndCpuArm64Windows(self): + self.CreateWorkspaceWithDefaultRepos('WORKSPACE') + self.ScratchFile('BUILD', [ + 'cc_binary(', + ' name = "main",', + ' srcs = ["main.cc"],', + ')', + ]) + self.ScratchFile('main.cc', [ + 'int main() {', + ' return 0;', + '}', + ]) + exit_code, _, stderr = self.RunBazel( + ['build', '-s', '--cpu=arm64_windows', '//:main']) + self.AssertExitCode(exit_code, 0, stderr) + self.assertIn('arm64\\cl.exe', ''.join(stderr)) + if __name__ == '__main__': unittest.main() diff --git a/tools/BUILD b/tools/BUILD index 2f7b6743a8cd92..124038319d7dee 100644 --- a/tools/BUILD +++ b/tools/BUILD @@ -24,6 +24,7 @@ filegroup( "//tools/objc:srcs", "//tools/osx:srcs", "//tools/osx/crosstool:srcs", + "//tools/windows:srcs", "//tools/test:srcs", "//tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator:srcs", "//tools/test/CoverageOutputGenerator/javatests/com/google/devtools/coverageoutputgenerator:srcs", @@ -55,6 +56,7 @@ filegroup( "//tools/jdk:srcs", "//tools/launcher:srcs", "//tools/def_parser:srcs", + "//tools/windows:srcs", "//tools/platforms:srcs", "//tools/objc:srcs", "//tools/python:embedded_tools", @@ -80,6 +82,7 @@ filegroup( "//tools/cpp:bzl_srcs", "//tools/jdk:bzl_srcs", "//tools/osx:bzl_srcs", + "//tools/windows:bzl_srcs", "//tools/python:bzl_srcs", "//tools/sh:bzl_srcs", ], diff --git a/tools/cpp/BUILD.windows.tpl b/tools/cpp/BUILD.windows.tpl index 9a249cef366ad8..4e4e50c4c4cc57 100644 --- a/tools/cpp/BUILD.windows.tpl +++ b/tools/cpp/BUILD.windows.tpl @@ -52,7 +52,8 @@ cc_toolchain_suite( "x64_windows|msvc-cl": ":cc-compiler-x64_windows", "x64_x86_windows|msvc-cl": ":cc-compiler-x64_x86_windows", "x64_arm_windows|msvc-cl": ":cc-compiler-x64_arm_windows", - "x64_arm64_windows|msvc-cl": ":cc-compiler-x64_arm64_windows", + "x64_arm64_windows|msvc-cl": ":cc-compiler-arm64_windows", + "arm64_windows|msvc-cl": ":cc-compiler-arm64_windows", "x64_windows|msys-gcc": ":cc-compiler-x64_windows_msys", "x64_windows|mingw-gcc": ":cc-compiler-x64_windows_mingw", "x64_windows|clang-cl": ":cc-compiler-x64_windows-clang-cl", @@ -60,7 +61,10 @@ cc_toolchain_suite( "x64_windows": ":cc-compiler-x64_windows", "x64_x86_windows": ":cc-compiler-x64_x86_windows", "x64_arm_windows": ":cc-compiler-x64_arm_windows", - "x64_arm64_windows": ":cc-compiler-x64_arm64_windows", + "x64_arm64_windows": ":cc-compiler-arm64_windows", + "arm64_windows": ":cc-compiler-arm64_windows", + "x64_arm64_windows|clang-cl": ":cc-compiler-arm64_windows-clang-cl", + "arm64_windows|clang-cl": ":cc-compiler-arm64_windows-clang-cl", "armeabi-v7a": ":cc-compiler-armeabi-v7a", }, ) @@ -356,9 +360,9 @@ toolchain( ) cc_toolchain( - name = "cc-compiler-x64_arm64_windows", - toolchain_identifier = "msvc_x64_arm64", - toolchain_config = ":msvc_x64_arm64", + name = "cc-compiler-arm64_windows", + toolchain_identifier = "msvc_arm64", + toolchain_config = ":msvc_arm64", all_files = ":empty", ar_files = ":empty", as_files = ":msvc_compiler_files", @@ -371,7 +375,7 @@ cc_toolchain( ) cc_toolchain_config( - name = "msvc_x64_arm64", + name = "msvc_arm64", cpu = "x64_windows", compiler = "msvc-cl", host_system_name = "local", @@ -379,7 +383,7 @@ cc_toolchain_config( target_libc = "msvcrt", abi_version = "local", abi_libc_version = "local", - toolchain_identifier = "msvc_x64_arm64", + toolchain_identifier = "msvc_arm64", msvc_env_tmp = "%{msvc_env_tmp_arm64}", msvc_env_path = "%{msvc_env_path_arm64}", msvc_env_include = "%{msvc_env_include_arm64}", @@ -408,16 +412,15 @@ cc_toolchain_config( ) toolchain( - name = "cc-toolchain-x64_arm64_windows", + name = "cc-toolchain-arm64_windows", exec_compatible_with = [ - "@platforms//cpu:x86_64", "@platforms//os:windows", ], target_compatible_with = [ "@platforms//cpu:arm64", "@platforms//os:windows", ], - toolchain = ":cc-compiler-x64_arm64_windows", + toolchain = ":cc-compiler-arm64_windows", toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", ) @@ -447,22 +450,22 @@ cc_toolchain_config( abi_version = "local", abi_libc_version = "local", toolchain_identifier = "clang_cl_x64", - msvc_env_tmp = "%{clang_cl_env_tmp}", - msvc_env_path = "%{clang_cl_env_path}", - msvc_env_include = "%{clang_cl_env_include}", - msvc_env_lib = "%{clang_cl_env_lib}", - msvc_cl_path = "%{clang_cl_cl_path}", - msvc_ml_path = "%{clang_cl_ml_path}", - msvc_link_path = "%{clang_cl_link_path}", - msvc_lib_path = "%{clang_cl_lib_path}", - cxx_builtin_include_directories = [%{clang_cl_cxx_builtin_include_directories}], + msvc_env_tmp = "%{clang_cl_env_tmp_x64}", + msvc_env_path = "%{clang_cl_env_path_x64}", + msvc_env_include = "%{clang_cl_env_include_x64}", + msvc_env_lib = "%{clang_cl_env_lib_x64}", + msvc_cl_path = "%{clang_cl_cl_path_x64}", + msvc_ml_path = "%{clang_cl_ml_path_x64}", + msvc_link_path = "%{clang_cl_link_path_x64}", + msvc_lib_path = "%{clang_cl_lib_path_x64}", + cxx_builtin_include_directories = [%{clang_cl_cxx_builtin_include_directories_x64}], tool_paths = { - "ar": "%{clang_cl_lib_path}", - "ml": "%{clang_cl_ml_path}", - "cpp": "%{clang_cl_cl_path}", - "gcc": "%{clang_cl_cl_path}", + "ar": "%{clang_cl_lib_path_x64}", + "ml": "%{clang_cl_ml_path_x64}", + "cpp": "%{clang_cl_cl_path_x64}", + "gcc": "%{clang_cl_cl_path_x64}", "gcov": "wrapper/bin/msvc_nop.bat", - "ld": "%{clang_cl_link_path}", + "ld": "%{clang_cl_link_path_x64}", "nm": "wrapper/bin/msvc_nop.bat", "objcopy": "wrapper/bin/msvc_nop.bat", "objdump": "wrapper/bin/msvc_nop.bat", @@ -470,8 +473,8 @@ cc_toolchain_config( }, archiver_flags = ["/MACHINE:X64"], default_link_flags = ["/MACHINE:X64", "/DEFAULTLIB:clang_rt.builtins-x86_64.lib"], - dbg_mode_debug_flag = "%{clang_cl_dbg_mode_debug_flag}", - fastbuild_mode_debug_flag = "%{clang_cl_fastbuild_mode_debug_flag}", + dbg_mode_debug_flag = "%{clang_cl_dbg_mode_debug_flag_x64}", + fastbuild_mode_debug_flag = "%{clang_cl_fastbuild_mode_debug_flag_x64}", ) toolchain( @@ -489,6 +492,72 @@ toolchain( toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", ) +cc_toolchain( + name = "cc-compiler-arm64_windows-clang-cl", + toolchain_identifier = "clang_cl_arm64", + toolchain_config = ":clang_cl_arm64", + all_files = ":empty", + ar_files = ":empty", + as_files = ":clangcl_compiler_files", + compiler_files = ":clangcl_compiler_files", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 1, +) + +cc_toolchain_config( + name = "clang_cl_arm64", + cpu = "arm64_windows", + compiler = "clang-cl", + host_system_name = "local", + target_system_name = "aarch64-pc-windows-msvc", + target_libc = "msvcrt", + abi_version = "local", + abi_libc_version = "local", + toolchain_identifier = "clang_cl_arm64", + msvc_env_tmp = "%{clang_cl_env_tmp_arm64}", + msvc_env_path = "%{clang_cl_env_path_arm64}", + msvc_env_include = "%{clang_cl_env_include_arm64}", + msvc_env_lib = "%{clang_cl_env_lib_arm64}", + msvc_cl_path = "%{clang_cl_cl_path_arm64}", + msvc_ml_path = "%{clang_cl_ml_path_arm64}", + msvc_link_path = "%{clang_cl_link_path_arm64}", + msvc_lib_path = "%{clang_cl_lib_path_arm64}", + cxx_builtin_include_directories = [%{clang_cl_cxx_builtin_include_directories_arm64}], + tool_paths = { + "ar": "%{clang_cl_lib_path_arm64}", + "ml": "%{clang_cl_ml_path_arm64}", + "cpp": "%{clang_cl_cl_path_arm64}", + "gcc": "%{clang_cl_cl_path_arm64}", + "gcov": "wrapper/bin/msvc_nop.bat", + "ld": "%{clang_cl_link_path_arm64}", + "nm": "wrapper/bin/msvc_nop.bat", + "objcopy": "wrapper/bin/msvc_nop.bat", + "objdump": "wrapper/bin/msvc_nop.bat", + "strip": "wrapper/bin/msvc_nop.bat", + }, + archiver_flags = ["/MACHINE:ARM64"], + default_link_flags = ["/MACHINE:ARM64"], + dbg_mode_debug_flag = "%{clang_cl_dbg_mode_debug_flag_arm64}", + fastbuild_mode_debug_flag = "%{clang_cl_fastbuild_mode_debug_flag_arm64}", +) + +toolchain( + name = "cc-toolchain-arm64_windows-clang-cl", + exec_compatible_with = [ + "@platforms//os:windows", + "@bazel_tools//tools/cpp:clang-cl", + ], + target_compatible_with = [ + "@platforms//cpu:arm64", + "@platforms//os:windows", + ], + toolchain = ":cc-compiler-arm64_windows-clang-cl", + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", +) + cc_toolchain( name = "cc-compiler-armeabi-v7a", toolchain_identifier = "stub_armeabi-v7a", diff --git a/tools/cpp/cc_configure.bzl b/tools/cpp/cc_configure.bzl index 80b97dfb03aa82..26155c8bab6971 100644 --- a/tools/cpp/cc_configure.bzl +++ b/tools/cpp/cc_configure.bzl @@ -114,7 +114,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", "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) diff --git a/tools/cpp/lib_cc_configure.bzl b/tools/cpp/lib_cc_configure.bzl index 9508eb78f7e9e5..cf602ab1b0cb76 100644 --- a/tools/cpp/lib_cc_configure.bzl +++ b/tools/cpp/lib_cc_configure.bzl @@ -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", "", False) or + get_env_var(repository_ctx, "PROCESSOR_ARCHITEW6432", "", False)) + if arch == "ARM64": + return "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"]) diff --git a/tools/cpp/windows_cc_configure.bzl b/tools/cpp/windows_cc_configure.bzl index d0c16c48b93b43..2658ac6c156873 100644 --- a/tools/cpp/windows_cc_configure.bzl +++ b/tools/cpp/windows_cc_configure.bzl @@ -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(10) on arm64 builds host toolchain runs in an emulated x86 environment + if not repository_ctx.path(tools_path).exists: + tools_path = "%s\\Tools\\MSVC\\%s\\bin\\HostX86\\%s" % (vc_path, full_version, target_arch) 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] @@ -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(10) on arm64 builds host toolchain runs in an emulated x86 environment + if not repository_ctx.path(tool_path).exists: + tool_path = "%s\\Tools\\MSVC\\%s\\bin\\HostX86\\%s\\%s" % (vc_path, full_version, target_arch, tool) else: # For VS 2015 and older version, the tools are under: # C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64 @@ -685,12 +691,12 @@ def _get_msvc_vars(repository_ctx, paths, target_arch = "x64", msvc_vars_x64 = N } return msvc_vars -def _get_clang_cl_vars(repository_ctx, paths, msvc_vars): +def _get_clang_cl_vars(repository_ctx, paths, msvc_vars, target_arch): """Get the variables we need to populate the clang-cl toolchains.""" llvm_path = find_llvm_path(repository_ctx) error_script = None - if msvc_vars["%{msvc_cl_path_x64}"] == "vc_installation_error_x64.bat": - error_script = "vc_installation_error_x64.bat" + if msvc_vars["%{msvc_cl_path_"+target_arch+"}"] == "vc_installation_error_{}.bat".format(target_arch): + error_script = "vc_installation_error_{}.bat".format(target_arch) elif not llvm_path: repository_ctx.template( "clang_installation_error.bat", @@ -718,17 +724,17 @@ def _get_clang_cl_vars(repository_ctx, paths, msvc_vars): if error_script: write_builtin_include_directory_paths(repository_ctx, "clang-cl", [], file_suffix = "_clangcl") clang_cl_vars = { - "%{clang_cl_env_tmp}": "clang_cl_not_found", - "%{clang_cl_env_path}": "clang_cl_not_found", - "%{clang_cl_env_include}": "clang_cl_not_found", - "%{clang_cl_env_lib}": "clang_cl_not_found", - "%{clang_cl_cl_path}": error_script, - "%{clang_cl_link_path}": error_script, - "%{clang_cl_lib_path}": error_script, - "%{clang_cl_ml_path}": error_script, - "%{clang_cl_dbg_mode_debug_flag}": "/DEBUG", - "%{clang_cl_fastbuild_mode_debug_flag}": "/DEBUG", - "%{clang_cl_cxx_builtin_include_directories}": "", + "%{clang_cl_env_tmp_" + target_arch+ "}": "clang_cl_not_found", + "%{clang_cl_env_path_" + target_arch+ "}": "clang_cl_not_found", + "%{clang_cl_env_include_" + target_arch+ "}": "clang_cl_not_found", + "%{clang_cl_env_lib_" + target_arch+ "}": "clang_cl_not_found", + "%{clang_cl_cl_path_" + target_arch+ "}": error_script, + "%{clang_cl_link_path_" + target_arch+ "}": error_script, + "%{clang_cl_lib_path_" + target_arch+ "}": error_script, + "%{clang_cl_ml_path_" + target_arch+ "}": error_script, + "%{clang_cl_dbg_mode_debug_flag_" + target_arch+ "}": "/DEBUG", + "%{clang_cl_fastbuild_mode_debug_flag_" + target_arch+ "}": "/DEBUG", + "%{clang_cl_cxx_builtin_include_directories_" + target_arch+ "}": "", } return clang_cl_vars @@ -741,21 +747,21 @@ def _get_clang_cl_vars(repository_ctx, paths, msvc_vars): clang_include_path = (clang_dir + "\\include").replace("\\", "\\\\") clang_lib_path = (clang_dir + "\\lib\\windows").replace("\\", "\\\\") - clang_cl_include_directories = msvc_vars["%{msvc_cxx_builtin_include_directories_x64}"] + (",\n \"%s\"" % clang_include_path) + clang_cl_include_directories = msvc_vars["%{msvc_cxx_builtin_include_directories_"+target_arch+"}"] + (",\n \"%s\"" % clang_include_path) write_builtin_include_directory_paths(repository_ctx, "clang-cl", [clang_cl_include_directories], file_suffix = "_clangcl") clang_cl_vars = { - "%{clang_cl_env_tmp}": msvc_vars["%{msvc_env_tmp_x64}"], - "%{clang_cl_env_path}": msvc_vars["%{msvc_env_path_x64}"], - "%{clang_cl_env_include}": msvc_vars["%{msvc_env_include_x64}"] + ";" + clang_include_path, - "%{clang_cl_env_lib}": msvc_vars["%{msvc_env_lib_x64}"] + ";" + clang_lib_path, - "%{clang_cl_cxx_builtin_include_directories}": clang_cl_include_directories, - "%{clang_cl_cl_path}": clang_cl_path, - "%{clang_cl_link_path}": lld_link_path, - "%{clang_cl_lib_path}": llvm_lib_path, - "%{clang_cl_ml_path}": msvc_vars["%{msvc_ml_path_x64}"], + "%{clang_cl_env_tmp_" + target_arch+ "}": msvc_vars["%{msvc_env_tmp_"+target_arch+"}"], + "%{clang_cl_env_path_" + target_arch+ "}": msvc_vars["%{msvc_env_path_"+target_arch+"}"], + "%{clang_cl_env_include_" + target_arch+ "}": msvc_vars["%{msvc_env_include_"+target_arch+"}"] + ";" + clang_include_path, + "%{clang_cl_env_lib_" + target_arch+ "}": msvc_vars["%{msvc_env_lib_"+target_arch+"}"] + ";" + clang_lib_path, + "%{clang_cl_cxx_builtin_include_directories_" + target_arch+ "}": clang_cl_include_directories, + "%{clang_cl_cl_path_" + target_arch+ "}": clang_cl_path, + "%{clang_cl_link_path_" + target_arch+ "}": lld_link_path, + "%{clang_cl_lib_path_" + target_arch+ "}": llvm_lib_path, + "%{clang_cl_ml_path_" + target_arch+ "}": clang_cl_path, # LLVM's lld-link.exe doesn't support /DEBUG:FASTLINK. - "%{clang_cl_dbg_mode_debug_flag}": "/DEBUG", - "%{clang_cl_fastbuild_mode_debug_flag}": "/DEBUG", + "%{clang_cl_dbg_mode_debug_flag_" + target_arch+ "}": "/DEBUG", + "%{clang_cl_fastbuild_mode_debug_flag_" + target_arch+ "}": "/DEBUG", } return clang_cl_vars @@ -786,11 +792,13 @@ def configure_windows_toolchain(repository_ctx): template_vars = dict() msvc_vars_x64 = _get_msvc_vars(repository_ctx, paths, "x64") template_vars.update(msvc_vars_x64) - template_vars.update(_get_clang_cl_vars(repository_ctx, paths, msvc_vars_x64)) + template_vars.update(_get_clang_cl_vars(repository_ctx, paths, msvc_vars_x64, "x64")) template_vars.update(_get_msys_mingw_vars(repository_ctx)) template_vars.update(_get_msvc_vars(repository_ctx, paths, "x86", msvc_vars_x64)) template_vars.update(_get_msvc_vars(repository_ctx, paths, "arm", msvc_vars_x64)) - template_vars.update(_get_msvc_vars(repository_ctx, paths, "arm64", msvc_vars_x64)) + msvc_vars_arm64 = _get_msvc_vars(repository_ctx, paths, "arm64", msvc_vars_x64) + template_vars.update(msvc_vars_arm64) + template_vars.update(_get_clang_cl_vars(repository_ctx, paths, msvc_vars_arm64, "arm64")) repository_ctx.template( "BUILD", diff --git a/tools/cpp/windows_cc_toolchain_config.bzl b/tools/cpp/windows_cc_toolchain_config.bzl index 0804eebc5919dd..99b2d4ecb51fc6 100644 --- a/tools/cpp/windows_cc_toolchain_config.bzl +++ b/tools/cpp/windows_cc_toolchain_config.bzl @@ -80,7 +80,7 @@ all_link_actions = [ ] def _use_msvc_toolchain(ctx): - return ctx.attr.cpu == "x64_windows" and (ctx.attr.compiler == "msvc-cl" or ctx.attr.compiler == "clang-cl") + return ctx.attr.cpu in ["x64_windows", "arm64_windows"] and (ctx.attr.compiler == "msvc-cl" or ctx.attr.compiler == "clang-cl") def _impl(ctx): if _use_msvc_toolchain(ctx): diff --git a/tools/windows/BUILD b/tools/windows/BUILD new file mode 100644 index 00000000000000..c71554c023330c --- /dev/null +++ b/tools/windows/BUILD @@ -0,0 +1,11 @@ +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "srcs", + srcs = glob(["**"]), +) + +filegroup( + name = "bzl_srcs", + srcs = glob(["*.bzl"]), +) diff --git a/tools/windows/windows_config.bzl b/tools/windows/windows_config.bzl new file mode 100644 index 00000000000000..7469d9104a15df --- /dev/null +++ b/tools/windows/windows_config.bzl @@ -0,0 +1,35 @@ + +# Copyright 2022 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Rules to create windows configurations""" + +def create_windows_host_config(): + + native.config_setting( + name = "host_windows_x64_constraint", + values = {"host_cpu": "x64_windows" }, + ) + + native.config_setting( + name = "host_windows_arm64_constraint", + values = {"host_cpu": "arm64_windows" }, + ) + + conditions = select({ + "host_windows_arm64_constraint" : "host_windows_arm64_constraint", + "//conditions:default": "host_windows_x64_constraint" + }); + + native.alias(name = "host_windows", actual = conditions, visibility = ["//visibility:public"])