Files
openide/build/toolchains_llvm-windows_support.patch
Filip Zybała 7dae21f77f TBX-15645 Update patch for toolchains_llvm with typo fix
GitOrigin-RevId: 066e57960b3caa82a7589247b04370a9682913cf
2026-02-12 15:10:46 +00:00

1074 lines
35 KiB
Diff

Subject: [PATCH] Add TODO
Do not set `-no-canonical-prefixes` when cross-compiling to Windows
Fix typo in passed Windows compiler args
Fix cross-compilation from Linux to Windows and macOS
Refactor tool path string building
Sanitize reproducer
Reason using abi instead of os target for `gcc_tool` to reflect reality
Drop `lib/clang/{LLVM_VERSION}/lib` libraries
Fix cross-compilation to MSVC and clarify branches
Reason about `linker` in `cc_toolchain_config` instead of compiler in specific places where it made no sense
Remove redundant `--target` flag (not understood by `lld-link` linker
Fix missing `.pdb` generation required by cc_rules in `debug` and `fastbuild` compilation
Drop support for `lib_legacy` on Windows hosts
Fix backward compatibility with eventual custom LLVM toolchains
Fix cross-compilation `gcc` tool call on Windows
Fix comments
Remove Windows libclang, never relevant
Remove UNIX specific libraires from Windows repo toolchain (review comment)
Use a more idiomatic key mutation (review comment)
Ensure backward compatibility with custom-build LLVM toolchains
Clarify TODOs
Clean TODOs
Disable `cxx_builtin_include_directories` temporarily for Windows target
Add support for Windows target and host
---
Index: platforms/BUILD.bazel
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/platforms/BUILD.bazel b/platforms/BUILD.bazel
--- a/platforms/BUILD.bazel (revision ace6215bbfe8a76884646b2458b42380e2201607)
+++ b/platforms/BUILD.bazel (revision b2f7dd342ccc0a9063f78251dd415a461ea1e839)
@@ -93,3 +93,19 @@
"@platforms//cpu:wasm64",
],
)
+
+platform(
+ name = "windows-x86_64",
+ constraint_values = [
+ "@platforms//os:windows",
+ "@platforms//cpu:x86_64",
+ ],
+)
+
+platform(
+ name = "windows-aarch64",
+ constraint_values = [
+ "@platforms//os:windows",
+ "@platforms//cpu:aarch64",
+ ],
+)
Index: toolchain/BUILD.llvm_repo.tpl
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/toolchain/BUILD.llvm_repo.tpl b/toolchain/BUILD.llvm_repo.tpl
--- a/toolchain/BUILD.llvm_repo.tpl (revision ace6215bbfe8a76884646b2458b42380e2201607)
+++ b/toolchain/BUILD.llvm_repo.tpl (revision 96cdedd9f4be889ddd63bd7fc77df5f7a29cb568)
@@ -30,10 +30,13 @@
filegroup(
name = "clang",
srcs = [
- "bin/clang",
- "bin/clang++",
- "bin/clang-cpp",
- ],
+ "bin/clang",
+ "bin/clang++",
+ "bin/clang-cpp",
+ ] + glob([
+ "bin/clang-cl",
+ "bin/lld-link",
+ ], allow_empty = True),
)
filegroup(
@@ -42,7 +45,10 @@
srcs = [
"bin/ld.lld",
"bin/ld64.lld",
- ] + glob(["bin/wasm-ld"], allow_empty = True),
+ ] + glob([
+ "bin/wasm-ld",
+ "bin/lld-link",
+ ], allow_empty = True),
)
filegroup(
Index: toolchain/BUILD.llvm_repo_windows.tpl
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/toolchain/BUILD.llvm_repo_windows.tpl b/toolchain/BUILD.llvm_repo_windows.tpl
new file mode 100644
--- /dev/null (revision 186793fd0824d0950240f790343184899e205171)
+++ b/toolchain/BUILD.llvm_repo_windows.tpl (revision 186793fd0824d0950240f790343184899e205171)
@@ -0,0 +1,209 @@
+# Copyright 2021 The Bazel Authors.
+#
+# 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.
+
+package(default_visibility = ["//visibility:public"])
+
+# Some targets may need to directly depend on these files.
+exports_files(glob(
+ [
+ "bin/*",
+ "lib/**",
+ "include/**",
+ "share/clang/*",
+ ],
+ allow_empty = True,
+))
+
+## LLVM toolchain files
+
+ALL_DLLS = glob(["bin/*.dll"], allow_empty=True)
+
+filegroup(
+ name = "clang",
+ srcs = [
+ "bin/clang.exe",
+ "bin/clang++.exe",
+ "bin/clang-cpp.exe",
+ "bin/clang-cl.exe",
+ "bin/lld-link.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "ld",
+ # Not all distributions contain wasm-ld.
+ srcs = [
+ "bin/ld.lld.exe",
+ "bin/ld64.lld.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "include",
+ srcs = glob(
+ [
+ "include/**/c++/**",
+ "lib/clang/*/include/**",
+ ],
+ ),
+)
+
+filegroup(
+ name = "all_includes",
+ srcs = glob(
+ ["include/**"],
+ allow_empty = True,
+ ),
+)
+
+# This filegroup should only have source directories, not individual files.
+# We rely on this assumption in system_module_map.bzl.
+filegroup(
+ name = "cxx_builtin_include",
+ srcs = [
+ "include/c++",
+ "lib/clang/{LLVM_VERSION}/include",
+ ],
+)
+
+filegroup(
+ name = "extra_config_site",
+ srcs = glob(["include/*/c++/v1/__config_site"], allow_empty = True)
+)
+
+filegroup(
+ name = "bin",
+ srcs = glob(["bin/**"]),
+)
+
+filegroup(
+ name = "lib",
+ srcs = [],
+)
+
+filegroup(
+ name = "lib_legacy",
+ srcs = [], # no reported Windows exec usage on older version of Bazel
+)
+
+filegroup(
+ name = "ar",
+ srcs = [
+ "bin/llvm-ar.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "as",
+ srcs = [
+ "bin/clang.exe",
+ "bin/llvm-as.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "nm",
+ srcs = [
+ "bin/llvm-nm.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "llvm-lib",
+ srcs = [
+ "bin/llvm-lib.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "objcopy",
+ srcs = [
+ "bin/llvm-objcopy.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "objdump",
+ srcs = [
+ "bin/llvm-objdump.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "profdata",
+ srcs = [
+ "bin/llvm-profdata.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "dwp",
+ srcs = [
+ "bin/llvm-dwp.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "ranlib",
+ srcs = [
+ "bin/llvm-ranlib.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "readelf",
+ srcs = [
+ "bin/llvm-readelf.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "strip",
+ srcs = [
+ "bin/llvm-strip.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "symbolizer",
+ srcs = [
+ "bin/llvm-symbolizer.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "clang-tidy",
+ srcs = [
+ "bin/clang-tidy.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "clang-format",
+ srcs = [
+ "bin/clang-format.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "git-clang-format",
+ srcs = [
+ "bin/git-clang-format.exe",
+ ] + ALL_DLLS,
+)
+
+filegroup(
+ name = "libclang",
+ srcs = ["lib/libclang.lib"],
+)
Index: toolchain/cc_toolchain_config.bzl
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/toolchain/cc_toolchain_config.bzl b/toolchain/cc_toolchain_config.bzl
--- a/toolchain/cc_toolchain_config.bzl (revision ace6215bbfe8a76884646b2458b42380e2201607)
+++ b/toolchain/cc_toolchain_config.bzl (revision 27c0bc7378a3f0bce997f582b5d94ec84af606c7)
@@ -17,6 +17,10 @@
"@rules_cc//cc/private/toolchain:unix_cc_toolchain_config.bzl",
unix_cc_toolchain_config = "cc_toolchain_config",
)
+load(
+ "@rules_cc//cc/private/toolchain:windows_cc_toolchain_config.bzl",
+ windows_cc_toolchain_config = "cc_toolchain_config",
+)
load(
"//toolchain/internal:common.bzl",
_check_os_arch_keys = "check_os_arch_keys",
@@ -28,6 +32,14 @@
def _fmt_flags(flags, toolchain_path_prefix):
return [f.format(toolchain_path_prefix = toolchain_path_prefix) for f in flags]
+def _machine_arch(target_arch):
+ if target_arch == "x86_64":
+ return "X64"
+ elif target_arch == "aarch64":
+ return "ARM64"
+ else:
+ fail("Unsupported target architecture: {}".format(target_arch))
+
# Macro for calling cc_toolchain_config from @bazel_tools with setting the
# right paths and flags for the tools.
def cc_toolchain_config(
@@ -55,6 +67,7 @@
target_cpu,
target_libc,
compiler,
+ linker,
abi_version,
abi_libc_version,
) = {
@@ -63,6 +76,7 @@
"darwin",
"macosx",
"clang",
+ "ld.lld",
"darwin_x86_64",
"darwin_x86_64",
),
@@ -71,6 +85,7 @@
"darwin",
"macosx",
"clang",
+ "ld.lld",
"darwin_aarch64",
"darwin_aarch64",
),
@@ -79,6 +94,7 @@
"aarch64",
"glibc_unknown",
"clang",
+ "ld.lld",
"clang",
"glibc_unknown",
),
@@ -87,6 +103,7 @@
"armv7",
"glibc_unknown",
"clang",
+ "ld.lld",
"clang",
"glibc_unknown",
),
@@ -95,6 +112,7 @@
"k8",
"glibc_unknown",
"clang",
+ "ld.lld",
"clang",
"glibc_unknown",
),
@@ -103,6 +121,7 @@
"riscv32",
"unknown",
"clang",
+ "ld.lld",
"unknown",
"unknown",
),
@@ -111,6 +130,7 @@
"k8",
"unknown",
"clang",
+ "ld.lld",
"unknown",
"unknown",
),
@@ -119,6 +139,7 @@
"wasm32",
"unknown",
"clang",
+ "ld.lld",
"unknown",
"unknown",
),
@@ -127,6 +148,7 @@
"wasm64",
"unknown",
"clang",
+ "ld.lld",
"unknown",
"unknown",
),
@@ -135,6 +157,7 @@
"wasm32",
"unknown",
"clang",
+ "ld.lld",
"unknown",
"unknown",
),
@@ -143,6 +166,25 @@
"wasm64",
"unknown",
"clang",
+ "ld.lld",
+ "unknown",
+ "unknown",
+ ),
+ "windows-x86_64": (
+ "clang-x86_64-windows",
+ "x64_windows",
+ "msvc",
+ "clang-cl",
+ "lld-link",
+ "unknown",
+ "unknown",
+ ),
+ "windows-aarch64": (
+ "clang-aarch64-windows",
+ "arm64_windows",
+ "msvc",
+ "clang-cl",
+ "lld-link",
"unknown",
"unknown",
),
@@ -152,32 +194,61 @@
# line, so take precendence over any user supplied flags through --copts or
# such.
unfiltered_compile_flags = [
- # Do not resolve our symlinked resource prefixes to real paths.
- "-no-canonical-prefixes",
# Reproducibility
"-Wno-builtin-macro-redefined",
"-D__DATE__=\"redacted\"",
"-D__TIMESTAMP__=\"redacted\"",
"-D__TIME__=\"redacted\"",
]
+ # TODO: investigate the underlying bug of that failure, we should probably also have `-no-canonical-prefixes` set for Windows targets
+ if exec_os == "windows" or target_os != "windows": # disabled as we observed some neon compilation failures (`lld-link: error: undefined symbol: neon_sriiq8`) on macOS and Linux when cross-compiling to Windows targets
+ unfiltered_compile_flags = [
+ # Do not resolve our symlinked resource prefixes to real paths.
+ "-no-canonical-prefixes",
+ ]
+
+ sysroot_path = compiler_configuration["sysroot_path"]
# Default compiler flags:
compile_flags = [
"--target=" + target_system_name,
- # Security
- "-U_FORTIFY_SOURCE", # https://github.com/google/sanitizers/issues/247
- "-fstack-protector",
- "-fno-omit-frame-pointer",
- # Diagnostics
- "-fcolor-diagnostics",
- "-Wall",
- "-Wthread-safety",
- "-Wself-assign",
- ]
+ # Diagnostics
+ "-fcolor-diagnostics",
+ ]
+ if compiler == "clang-cl":
+ compile_flags.extend([
+ "/Wall",
+ "/MT",
+ "/Brepro",
+ "/DWIN32",
+ "/D_WIN32",
+ "/D_WINDOWS",
+ "/clang:-fdebug-prefix-map={}=__bazel_toolchain_llvm_repo__/".format(toolchain_path_prefix),
+ "/clang:-I{}/include".format(sysroot_path),
+ ])
+ else:
+ compile_flags.extend([
+ # Security
+ "-U_FORTIFY_SOURCE", # https://github.com/google/sanitizers/issues/247
+ "-fstack-protector",
+ "-fno-omit-frame-pointer",
+ # Diagnostics
+ "-Wall",
+ "-Wthread-safety",
+ "-Wself-assign",
+ ])
- dbg_compile_flags = ["-g", "-fstandalone-debug"]
+ clangcl_debug_flags = ["/DEBUG"] # ensures `.pdb` file is generated in `cc_rules` linking action when targeting Windows
+ dbg_compile_flags = [
+ "-g",
+ "-fstandalone-debug",
+ ]
+ if compiler == "clang-cl":
+ dbg_compile_flags.extend(clangcl_debug_flags)
fastbuild_compile_flags = []
+ if compiler == "clang-cl":
+ fastbuild_compile_flags.extend(clangcl_debug_flags)
opt_compile_flags = [
"-g0",
@@ -188,18 +259,24 @@
"-fdata-sections",
]
- link_flags = [
- "--target=" + target_system_name,
- "-no-canonical-prefixes",
- "-fuse-ld=lld",
- ]
+ if linker == "lld-link":
+ link_flags = [
+ "/MACHINE:{}".format(_machine_arch(target_arch)),
+ "/LIBPATH:{}/lib".format(sysroot_path),
+ ]
+ else:
+ link_flags = [
+ "--target=" + target_system_name,
+ "-no-canonical-prefixes",
+ "-fuse-ld=lld",
+ ]
- if exec_os == "darwin":
+ if exec_os == "darwin" and linker == "ld.lld":
# These will get expanded by osx_cc_wrapper's `sanitize_option`
link_flags.append("--ld-path=ld64.lld" if target_os == "darwin" else "--ld-path=ld.lld")
stdlib = compiler_configuration["stdlib"]
- if stdlib != "none":
+ if stdlib != "none" and linker == "ld.lld":
link_flags.extend([
"-lm",
])
@@ -225,33 +302,53 @@
# lld is invoked as wasm-ld for WebAssembly targets.
use_libtool = False
else:
- link_flags.extend([
- "-Wl,--build-id=md5",
- "-Wl,--hash-style=gnu",
- "-Wl,-z,relro,-z,now",
- ])
+ if target_os == "linux": # TODO: must reason in terms of ld64
+ link_flags.extend([
+ "-Wl,--build-id=md5",
+ "-Wl,--hash-style=gnu",
+ "-Wl,-z,relro,-z,now",
+ ])
use_libtool = False
# Pre-installed libtool on macOS has -static as default, but llvm-libtool-darwin needs it
# explicitly. cc_common.create_link_variables does not automatically add this either if
# output_file arg to it is None.
- archive_flags = ["-static"] if is_darwin_exec_and_target else []
+ if is_darwin_exec_and_target:
+ archive_flags = ["-static"]
+ elif compiler == "clang-cl":
+ archive_flags = ["/MACHINE:{}".format(_machine_arch(target_arch))]
+ else:
+ archive_flags = []
# Flags related to C++ standard.
# The linker has no way of knowing if there are C++ objects; so we
# always link C++ libraries.
cxx_standard = compiler_configuration["cxx_standard"]
conly_flags = compiler_configuration["conly_flags"]
- sysroot_path = compiler_configuration["sysroot_path"]
is_xcompile = not (exec_os == target_os and exec_arch == target_arch)
# Darwin has a universal sysroot so the builtin can compile cross-arch.
if stdlib == "builtin-libc++" and is_xcompile and not is_darwin_exec_and_target:
stdlib = "stdc++"
- if stdlib == "builtin-libc++":
+
+ if compiler == "clang-cl":
+ std_flag = "/std:"
+ else:
+ std_flag = "-std="
+
+ if target_libc == "msvc": # there is no alternative stdlib support in MSVC
+ if compiler != "clang-cl":
+ fail("Compiling to MSVC requires `clang-cl` compiler")
+
+ cxx_flags = [
+ std_flag + cxx_standard,
+ "-fms-compatibility",
+ "-fms-extensions",
+ ]
+ elif stdlib == "builtin-libc++":
cxx_flags = [
- "-std=" + cxx_standard,
+ std_flag + cxx_standard,
"-stdlib=libc++",
]
@@ -287,10 +384,9 @@
"-lpthread",
"-ldl",
]
-
elif stdlib == "libc++":
cxx_flags = [
- "-std=" + cxx_standard,
+ std_flag + cxx_standard,
"-stdlib=libc++",
]
@@ -300,7 +396,7 @@
])
elif stdlib == "dynamic-stdc++":
cxx_flags = [
- "-std=" + cxx_standard,
+ std_flag + cxx_standard,
"-stdlib=libstdc++",
]
@@ -309,16 +405,17 @@
])
elif stdlib == "stdc++":
cxx_flags = [
- "-std=" + cxx_standard,
+ std_flag + cxx_standard,
"-stdlib=libstdc++",
]
- link_flags.extend([
- "-l:libstdc++.a",
- ])
+ if target_os == "linux":
+ link_flags.extend([
+ "-l:libstdc++.a",
+ ])
elif stdlib == "libc":
cxx_flags = [
- "-std=" + cxx_standard,
+ std_flag + cxx_standard,
]
elif stdlib == "none":
cxx_flags = [
@@ -353,6 +450,25 @@
## NOTE: make variables are missing here; unix_cc_toolchain_config doesn't
## pass these to `create_cc_toolchain_config_info`.
+ def _tool(tool_name):
+ if exec_os == "windows":
+ binary_ext = ".exe"
+ else:
+ binary_ext = ""
+ return tools_path_prefix + tool_name + binary_ext
+
+ cc_wrapper_unix = wrapper_bin_prefix + "cc_wrapper.sh"
+ if target_libc == "msvc":
+ gcc_tool = _tool("clang-cl")
+ elif exec_os == "windows":
+ # TODO: we avoid the usage of a wrapper in Windows, it may not be an issue due to our
+ # `use_absolute_paths_llvm=True` hack but that may need to be reconsider when we remove it.
+ # Note: building a wrapper is tricky on Windows, we had many string interpretation issues when we tried
+ # especially on escapes e.g. `\"`.
+ gcc_tool = _tool("clang")
+ else:
+ gcc_tool = cc_wrapper_unix
+
# The requirements here come from
# https://cs.opensource.google/bazel/bazel/+/master:src/main/starlark/builtins_bzl/common/cc/cc_toolchain_provider_helper.bzl;l=75;drc=f0150efd1cca473640269caaf92b5a23c288089d
# https://cs.opensource.google/bazel/bazel/+/master:src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java;l=1257;drc=6743d76f9ecde726d592e88d8914b9db007b1c43
@@ -360,19 +476,20 @@
# https://github.com/bazelbuild/rules_cc/blob/fe41fc4ea219c9d3680ee536bba6681f3baf838e/cc/private/toolchain/unix_cc_toolchain_config.bzl#L1887
# NOTE: Ensure these are listed in toolchain_tools in toolchain/internal/common.bzl.
tool_paths = {
- "ar": tools_path_prefix + ("llvm-ar" if not use_libtool else "libtool"),
- "cpp": tools_path_prefix + "clang-cpp",
- "dwp": tools_path_prefix + "llvm-dwp",
- "gcc": wrapper_bin_prefix + "cc_wrapper.sh",
- "gcov": tools_path_prefix + "llvm-profdata",
- "ld": tools_path_prefix + "ld.lld",
- "llvm-cov": tools_path_prefix + "llvm-cov",
- "llvm-profdata": tools_path_prefix + "llvm-profdata",
- "nm": tools_path_prefix + "llvm-nm",
- "objcopy": tools_path_prefix + "llvm-objcopy",
- "objdump": tools_path_prefix + "llvm-objdump",
- "strip": tools_path_prefix + "llvm-strip",
- "parse_headers": wrapper_bin_prefix + "cc_wrapper.sh",
+ "ar": _tool("llvm-ar" if not use_libtool else "libtool"),
+ "cpp": _tool("clang-cpp"),
+ "dwp": _tool("llvm-dwp"),
+ "gcc": gcc_tool,
+ "gcov": _tool("llvm-profdata"),
+ "ld": _tool(linker),
+ "llvm-lib": _tool("llvm-lib"),
+ "llvm-cov": _tool("llvm-cov"),
+ "llvm-profdata": _tool("llvm-profdata"),
+ "nm": _tool("llvm-nm"),
+ "objcopy": _tool("llvm-objcopy"),
+ "objdump": _tool("llvm-objdump"),
+ "strip": _tool("llvm-strip"),
+ "parse_headers": cc_wrapper_unix,
}
# Start-end group linker support:
@@ -431,33 +548,74 @@
if compiler_configuration["extra_unfiltered_compile_flags"] != None:
unfiltered_compile_flags.extend(_fmt_flags(compiler_configuration["extra_unfiltered_compile_flags"], toolchain_path_prefix))
- # Source: https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/unix_cc_toolchain_config.bzl
- unix_cc_toolchain_config(
- name = name,
- cpu = target_cpu,
- compiler = compiler,
- toolchain_identifier = toolchain_identifier,
- host_system_name = exec_arch,
- target_system_name = target_system_name,
- target_libc = target_libc,
- abi_version = abi_version,
- abi_libc_version = abi_libc_version,
- cxx_builtin_include_directories = cxx_builtin_include_directories,
- tool_paths = tool_paths,
- compile_flags = compile_flags,
- fastbuild_compile_flags = fastbuild_compile_flags,
- dbg_compile_flags = dbg_compile_flags,
- opt_compile_flags = opt_compile_flags,
- conly_flags = conly_flags,
- cxx_flags = cxx_flags,
- link_flags = link_flags + select({str(Label("@toolchains_llvm//toolchain/config:use_libunwind")): libunwind_link_flags, "//conditions:default": []}) +
- select({str(Label("@toolchains_llvm//toolchain/config:use_compiler_rt")): compiler_rt_link_flags, "//conditions:default": []}),
- archive_flags = archive_flags,
- link_libs = link_libs,
- opt_link_flags = opt_link_flags,
- unfiltered_compile_flags = unfiltered_compile_flags,
- coverage_compile_flags = coverage_compile_flags,
- coverage_link_flags = coverage_link_flags,
- supports_start_end_lib = supports_start_end_lib,
- builtin_sysroot = sysroot_path,
- )
+ if target_os == "windows":
+ windows_cc_toolchain_config(
+ name = name,
+ cpu = target_cpu,
+ compiler = compiler,
+ toolchain_identifier = toolchain_identifier,
+ host_system_name = exec_arch,
+ target_system_name = target_system_name,
+ target_libc = target_libc,
+ abi_version = abi_version,
+ abi_libc_version = abi_libc_version,
+ msvc_env_include = ";".join([
+ "{}/include".format(sysroot_path),
+ ]),
+ # msvc_env_lib = ";".join([
+ # "{}/lib".format(sysroot_path),
+ # ]),
+ msvc_cl_path = tool_paths["gcc"],
+ msvc_link_path = tool_paths["ld"],
+ msvc_lib_path = tool_paths["llvm-lib"],
+ cxx_builtin_include_directories = cxx_builtin_include_directories,
+ tool_paths = tool_paths,
+ archiver_flags = archive_flags,
+ default_link_flags = link_flags,
+ default_compile_flags = compile_flags + unfiltered_compile_flags,
+ dbg_mode_debug_flag = " ".join(dbg_compile_flags),
+ fastbuild_mode_debug_flag = " ".join(fastbuild_compile_flags),
+ supports_parse_showincludes = False,
+
+ # The following attributes are not yet supported (we had no need for it):
+ # msvc_env_tmp =
+ # msvc_env_path =
+ # msvc_ml_path =
+ #
+ # The following variables are not used on Windows toolchains:
+ # - opt_compile_flags
+ # - conly_flags
+ # - cxx_flags
+ # - link_libs
+ )
+ else:
+ # Source: https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/unix_cc_toolchain_config.bzl
+ unix_cc_toolchain_config(
+ name = name,
+ cpu = target_cpu,
+ compiler = compiler,
+ toolchain_identifier = toolchain_identifier,
+ host_system_name = exec_arch,
+ target_system_name = target_system_name,
+ target_libc = target_libc,
+ abi_version = abi_version,
+ abi_libc_version = abi_libc_version,
+ cxx_builtin_include_directories = cxx_builtin_include_directories,
+ tool_paths = tool_paths,
+ compile_flags = compile_flags,
+ fastbuild_compile_flags = fastbuild_compile_flags,
+ dbg_compile_flags = dbg_compile_flags,
+ opt_compile_flags = opt_compile_flags,
+ conly_flags = conly_flags,
+ cxx_flags = cxx_flags,
+ link_flags = link_flags + select({str(Label("@toolchains_llvm//toolchain/config:use_libunwind")): libunwind_link_flags, "//conditions:default": []}) +
+ select({str(Label("@toolchains_llvm//toolchain/config:use_compiler_rt")): compiler_rt_link_flags, "//conditions:default": []}),
+ archive_flags = archive_flags,
+ link_libs = link_libs,
+ opt_link_flags = opt_link_flags,
+ unfiltered_compile_flags = unfiltered_compile_flags,
+ coverage_compile_flags = coverage_compile_flags,
+ coverage_link_flags = coverage_link_flags,
+ supports_start_end_lib = supports_start_end_lib,
+ builtin_sysroot = sysroot_path,
+ )
Index: toolchain/internal/common.bzl
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/toolchain/internal/common.bzl b/toolchain/internal/common.bzl
--- a/toolchain/internal/common.bzl (revision ace6215bbfe8a76884646b2458b42380e2201607)
+++ b/toolchain/internal/common.bzl (revision c16ca8a7cdfe796165f6ed0039f4f560738a848e)
@@ -24,6 +24,8 @@
("none", "x86_64"),
("wasip1", "wasm32"),
("wasip1", "wasm64"),
+ ("windows", "x86_64"),
+ ("windows", "aarch64"),
]
# These are targets that can build without a sysroot.
@@ -38,6 +40,8 @@
name: name
for name in [
"clang-cpp",
+ "clang-cl",
+ "lld-link",
"clang-format",
"clang-tidy",
"clangd",
@@ -46,6 +50,7 @@
"llvm-dwp",
"llvm-profdata",
"llvm-cov",
+ "llvm-lib",
"llvm-nm",
"llvm-objcopy",
"llvm-objdump",
@@ -134,7 +139,7 @@
name = rctx.attr.exec_os
if name:
- if name in ("linux", "darwin", "none"):
+ if name in ("linux", "darwin", "windows", "none"):
return name
else:
fail("Unsupported value for exec_os: %s" % name)
@@ -152,7 +157,7 @@
def os_bzl(os):
# Return the OS string as used in bazel platform constraints.
- return {"darwin": "osx", "linux": "linux", "none": "none", "wasip1": "wasi"}[os]
+ return {"darwin": "osx", "linux": "linux", "windows": "windows", "none": "none", "wasip1": "wasi"}[os]
def arch(rctx):
arch = rctx.attr.exec_arch
@@ -267,7 +272,15 @@
return dict(tuples)
def toolchain_tools(os):
- tools = dict(_toolchain_tools)
- if os == "darwin":
+ if os == "windows":
+ tools = dict()
+ binary_ext = ".exe"
+ for bin, symlink in _toolchain_tools.items():
+ tools[bin + binary_ext] = symlink + binary_ext
+ elif os == "darwin":
+ tools = dict(_toolchain_tools)
tools.update(_toolchain_tools_darwin)
+ else:
+ tools = dict(_toolchain_tools)
+
return tools
Index: toolchain/internal/configure.bzl
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/toolchain/internal/configure.bzl b/toolchain/internal/configure.bzl
--- a/toolchain/internal/configure.bzl (revision ace6215bbfe8a76884646b2458b42380e2201607)
+++ b/toolchain/internal/configure.bzl (revision ef8695db09d3e6e027ca064a4abaf522453a7b96)
@@ -72,9 +72,6 @@
_check_os_arch_keys(rctx.attr.extra_target_compatible_with)
os = _os(rctx)
- if os == "windows":
- _empty_repository(rctx)
- return None
arch = _arch(rctx)
if not rctx.attr.toolchain_roots:
@@ -92,6 +89,23 @@
use_absolute_paths_llvm = rctx.attr.absolute_paths
use_absolute_paths_sysroot = use_absolute_paths_llvm
+ if os == "windows":
+ # TODO: Windows has an issue resolving symlinks in the execroot, so for now we force `absolute_paths = True` as a hack
+ #
+ # Here is an example of failure:
+ # ERROR: <path>/BUILD.bazel:10:12: Compiling Rust bin somebinary (15 files) failed: error reading file '@@toolchains_llvm++llvm+llvm_toolchain//:bin/llvm-nm.exe':
+ #
+ # Command to reproduce:
+ # $ bazel.exe clean --expunge
+ # $ bazel.exe build //some/rust:somebinary # FAILS with the above error
+ # $ dir C:/temp/k7ozco62/external/toolchains_llvm++llvm+llvm_toolchain/bin # shows `d----l` file modes on binaries
+ # $ bazel.exe query --output build //some/rust:somebinary # WORKS
+ # $ dir C:/temp/k7ozco62/external/toolchains_llvm++llvm+llvm_toolchain/bin # shows `d----l` file modes on binaries
+ # $ bazel.exe build //some/rust:somebinary # WORKS
+ # $ dir C:/temp/k7ozco62/external/toolchains_llvm++llvm+llvm_toolchain/bin # shows `-a----` file modes on binaries
+ #
+ use_absolute_paths_llvm = True
+
# Check if the toolchain root is a system path.
system_llvm = False
if _is_absolute_path(toolchain_root):
@@ -193,7 +207,6 @@
extra_coverage_link_flags_dict = rctx.attr.extra_coverage_link_flags,
extra_unfiltered_compile_flags_dict = rctx.attr.extra_unfiltered_compile_flags,
)
- exec_dl_ext = "dylib" if os == "darwin" else "so"
cc_toolchains_str, toolchain_labels_str = _cc_toolchains_str(
rctx,
workspace_name,
@@ -206,7 +219,6 @@
use_absolute_paths_llvm,
llvm_dist_rel_path,
llvm_dist_label_prefix,
- exec_dl_ext,
)
# Convenience macro to register all generated toolchains.
@@ -354,6 +366,8 @@
"wasm64": "wasm64-unknown-unknown",
"wasip1-wasm32": "wasm32-wasip1",
"wasip1-wasm64": "wasm64-wasip1",
+ "windows-x86_64": "x86_64-pc-windows-msvc",
+ "windows-aarch64": "aarch64-pc-windows-msvc",
}[target_pair]
cxx_builtin_include_directories = [
@@ -387,6 +401,17 @@
_join(sysroot_prefix, "/usr/include"),
_join(sysroot_prefix, "/System/Library/Frameworks"),
])
+ elif target_os == "windows":
+ # TODO: when uncommented, we are getting:
+ #
+ # Error in fail: A %sysroot% prefix is only allowed if the default_sysroot option is set
+ # ERROR: C:/temp/k7ozco62/external/toolchains_llvm++llvm+llvm_toolchain/BUILD.bazel:764:13: Analysis of target '@@toolchains_llvm++llvm+llvm_toolchain//:cc-clang-aarch64-windows' (config: 40e6e70) failed
+ #
+ # if sysroot_prefix:
+ # cxx_builtin_include_directories.extend([
+ # _join(sysroot_prefix, "/Include"),
+ # ])
+ pass
elif target_os == "none" or target_os == "wasip1":
if sysroot_prefix:
cxx_builtin_include_directories.extend([
@@ -643,7 +668,18 @@
def _is_remote(rctx, exec_os, exec_arch):
return not (_os_from_rctx(rctx) == exec_os and _arch_from_rctx(rctx) == exec_arch)
-def _convenience_targets_str(rctx, use_absolute_paths, llvm_dist_rel_path, llvm_dist_label_prefix, exec_dl_ext):
+def _convenience_targets_str(rctx, use_absolute_paths, llvm_dist_rel_path, llvm_dist_label_prefix):
+ ext = ""
+ exec_dl_ext = ""
+ os = _os(rctx)
+ if os == "windows":
+ ext = ".exe"
+ exec_dl_ext = "lib"
+ elif os == "darwin":
+ exec_dl_ext = "dylib"
+ else:
+ exec_dl_ext = "so"
+
if use_absolute_paths:
llvm_dist_label_prefix = ":"
filenames = []
@@ -651,7 +687,7 @@
filename = "lib/{}.{}".format(libname, exec_dl_ext)
filenames.append(filename)
for toolname in _aliased_tools:
- filename = "bin/{}".format(toolname)
+ filename = "bin/{}{}".format(toolname, ext)
filenames.append(filename)
for filename in filenames:
@@ -671,9 +707,9 @@
template = """
native_binary(
name = "{name}",
- out = "{name}",
- src = "{{llvm_dist_label_prefix}}bin/{name}",
-)""".format(name = name)
+ out = "{bin_name}",
+ src = "{{llvm_dist_label_prefix}}bin/{bin_name}",
+)""".format(name = name, bin_name = name + ext)
tool_target_strs.append(template)
return "\n".join(lib_target_strs + tool_target_strs).format(
Index: toolchain/internal/repo.bzl
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/toolchain/internal/repo.bzl b/toolchain/internal/repo.bzl
--- a/toolchain/internal/repo.bzl (revision ace6215bbfe8a76884646b2458b42380e2201607)
+++ b/toolchain/internal/repo.bzl (revision b2f7dd342ccc0a9063f78251dd415a461ea1e839)
@@ -14,7 +14,6 @@
load(
"//toolchain/internal:common.bzl",
_attr_dict = "attr_dict",
- _os = "os",
_supported_os_arch_keys = "supported_os_arch_keys",
)
load(
@@ -418,17 +417,16 @@
})
def llvm_repo_impl(rctx):
- os = _os(rctx)
- if os == "windows":
- rctx.file("BUILD.bazel", executable = False)
- return None
-
llvm_version = _required_llvm_version_rctx(rctx)
major_llvm_version = int(llvm_version.split(".")[0])
+ if rctx.os.name.startswith("windows"):
+ template_file_label = "//toolchain:BUILD.llvm_repo_windows.tpl"
+ else:
+ template_file_label = "//toolchain:BUILD.llvm_repo.tpl"
rctx.file(
"BUILD.bazel",
- content = rctx.read(Label("//toolchain:BUILD.llvm_repo.tpl")).format(
+ content = rctx.read(Label(template_file_label)).format(
# The versioning changed.
LLVM_VERSION = major_llvm_version if major_llvm_version >= 16 else llvm_version,
),