From 31e940088352713b6d85fbfbb240e4b14d26ef8c Mon Sep 17 00:00:00 2001 From: Yicheng Luo Date: Sun, 22 Oct 2023 22:00:43 +0100 Subject: [PATCH] Add clang toolchain for building manylinux2014 wheels TensorFlow > 2.13.0 starts using clang for building the release wheels. Update the Reverb to use clang as well. --- .bazelrc | 3 +- docker/release.dockerfile | 20 +- third_party/toolchains/clang_toolchain/BUILD | 0 .../toolchains/clang_toolchain/WORKSPACE | 2 + .../clang_toolchain/crosstool/BUILD | 153 +++ .../crosstool/cc_toolchain_config.bzl | 1085 +++++++++++++++++ 6 files changed, 1252 insertions(+), 11 deletions(-) create mode 100644 third_party/toolchains/clang_toolchain/BUILD create mode 100644 third_party/toolchains/clang_toolchain/WORKSPACE create mode 100755 third_party/toolchains/clang_toolchain/crosstool/BUILD create mode 100755 third_party/toolchains/clang_toolchain/crosstool/cc_toolchain_config.bzl diff --git a/.bazelrc b/.bazelrc index 0123bdae..f9419d37 100644 --- a/.bazelrc +++ b/.bazelrc @@ -9,7 +9,8 @@ build --action_env=PYTHON_BIN_PATH=python3 build --repo_env=PYTHON_BIN_PATH=python3 build --python_path=python3 -build:manylinux2014 --crosstool_top=//third_party/toolchains/preconfig/ubuntu16.04/gcc7_manylinux2014:toolchain +build:manylinux2014 --crosstool_top=//third_party/toolchains/clang_toolchain/crosstool:toolchain +build:manylinux2014 --copt="-w" build -c opt build --cxxopt="-std=c++17" diff --git a/docker/release.dockerfile b/docker/release.dockerfile index 358a1fcd..17d55bc6 100644 --- a/docker/release.dockerfile +++ b/docker/release.dockerfile @@ -92,17 +92,17 @@ RUN ln -s "/usr/include/x86_64-linux-gnu/python3.11" "/dt9/usr/include/x86_64-li # bazel build -c opt --copt=-mavx --config=manylinux2014 --test_output=errors //... # Update binutils to avoid linker(gold) issue. See b/227299577#comment9 -RUN \ - wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/binutils_2.35.1-1ubuntu1_amd64.deb \ - && wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/binutils-x86-64-linux-gnu_2.35.1-1ubuntu1_amd64.deb \ - && wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/binutils-common_2.35.1-1ubuntu1_amd64.deb \ - && wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/libbinutils_2.35.1-1ubuntu1_amd64.deb +# RUN \ +# wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/binutils_2.35.1-1ubuntu1_amd64.deb \ +# && wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/binutils-x86-64-linux-gnu_2.35.1-1ubuntu1_amd64.deb \ +# && wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/binutils-common_2.35.1-1ubuntu1_amd64.deb \ +# && wget http://old-releases.ubuntu.com/ubuntu/pool/main/b/binutils/libbinutils_2.35.1-1ubuntu1_amd64.deb -RUN \ - dpkg -i binutils_2.35.1-1ubuntu1_amd64.deb \ - binutils-x86-64-linux-gnu_2.35.1-1ubuntu1_amd64.deb \ - binutils-common_2.35.1-1ubuntu1_amd64.deb \ - libbinutils_2.35.1-1ubuntu1_amd64.deb +# RUN \ +# dpkg -i binutils_2.35.1-1ubuntu1_amd64.deb \ +# binutils-x86-64-linux-gnu_2.35.1-1ubuntu1_amd64.deb \ +# binutils-common_2.35.1-1ubuntu1_amd64.deb \ +# libbinutils_2.35.1-1ubuntu1_amd64.deb WORKDIR "/tmp/reverb" diff --git a/third_party/toolchains/clang_toolchain/BUILD b/third_party/toolchains/clang_toolchain/BUILD new file mode 100644 index 00000000..e69de29b diff --git a/third_party/toolchains/clang_toolchain/WORKSPACE b/third_party/toolchains/clang_toolchain/WORKSPACE new file mode 100644 index 00000000..22141c32 --- /dev/null +++ b/third_party/toolchains/clang_toolchain/WORKSPACE @@ -0,0 +1,2 @@ +# DO NOT EDIT: automatically generated WORKSPACE file for remote_cuda_configure rule +workspace(name = "sigbuild-r2.14-clang_config_cuda") diff --git a/third_party/toolchains/clang_toolchain/crosstool/BUILD b/third_party/toolchains/clang_toolchain/crosstool/BUILD new file mode 100755 index 00000000..9cb0aa4f --- /dev/null +++ b/third_party/toolchains/clang_toolchain/crosstool/BUILD @@ -0,0 +1,153 @@ +# This file is expanded from a template by cuda_configure.bzl +# Update cuda_configure.bzl#verify_build_defines when adding new variables. + +load(":cc_toolchain_config.bzl", "cc_toolchain_config") + +licenses(["restricted"]) + +package(default_visibility = ["//visibility:public"]) + +toolchain( + name = "toolchain-linux-x86_64", + exec_compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + target_compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + toolchain = ":cc-compiler-local", + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", +) + +cc_toolchain_suite( + name = "toolchain", + toolchains = { + "local|compiler": ":cc-compiler-local", + "darwin|compiler": ":cc-compiler-darwin", + "x64_windows|msvc-cl": ":cc-compiler-windows", + "x64_windows": ":cc-compiler-windows", + "arm": ":cc-compiler-local", + "aarch64": ":cc-compiler-local", + "k8": ":cc-compiler-local", + "piii": ":cc-compiler-local", + "ppc": ":cc-compiler-local", + "darwin": ":cc-compiler-darwin", + }, +) + +cc_toolchain( + name = "cc-compiler-local", + all_files = ":empty", + compiler_files = ":empty", + ar_files = ":empty", + as_files = ":empty", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + # To support linker flags that need to go to the start of command line + # we need the toolchain to support parameter files. Parameter files are + # last on the command line and contain all shared libraries to link, so all + # regular options will be left of them. + supports_param_files = 1, + toolchain_identifier = "local_linux", + toolchain_config = ":cc-compiler-local-config", +) + +cc_toolchain_config( + name = "cc-compiler-local-config", + cpu = "local", + builtin_include_directories = ["/dt9/usr/include/c++/9", "/dt9/usr/include/c++/9/x86_64-pc-linux-gnu", "/dt9/usr/include/c++/9/backward", "/usr/lib/llvm-17/lib/clang/17/include", "/dt9/usr/include/x86_64-linux-gnu", "/dt9/usr/include", "/usr/lib/llvm-17/lib/clang/17/share"], + extra_no_canonical_prefixes_flags = [], + host_compiler_path = "/usr/lib/llvm-17/bin/clang", + host_compiler_prefix = "/usr/bin", + host_compiler_warnings = [ + # Some parts of the codebase set -Werror and hit this warning, so + # switch it off for now. + "-Wno-invalid-partial-specialization" + ], + host_unfiltered_compile_flags = [], + linker_bin_path = "/usr/bin", + builtin_sysroot = "/dt9", + # cuda_path = "/usr/local/cuda-12.2", + compiler = "clang", +) + +cc_toolchain( + name = "cc-compiler-darwin", + all_files = ":empty", + compiler_files = ":empty", + ar_files = ":empty", + as_files = ":empty", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 0, + toolchain_identifier = "local_darwin", + toolchain_config = ":cc-compiler-local-darwin", +) + +cc_toolchain_config( + name = "cc-compiler-local-darwin", + cpu = "darwin", + builtin_include_directories = ["/dt9/usr/include/c++/9", "/dt9/usr/include/c++/9/x86_64-pc-linux-gnu", "/dt9/usr/include/c++/9/backward", "/usr/lib/llvm-17/lib/clang/17/include", "/dt9/usr/include/x86_64-linux-gnu", "/dt9/usr/include", "/usr/lib/llvm-17/lib/clang/17/share"], + extra_no_canonical_prefixes_flags = [], + host_compiler_path = "/usr/lib/llvm-17/bin/clang", + host_compiler_prefix = "/usr/bin", + host_compiler_warnings = [ + # Some parts of the codebase set -Werror and hit this warning, so + # switch it off for now. + "-Wno-gnu-offsetof-extensions", + "-Wno-invalid-partial-specialization" + ], + host_unfiltered_compile_flags = [], + linker_bin_path = "/usr/bin", +) + +cc_toolchain( + name = "cc-compiler-windows", + all_files = "%{win_compiler_deps}", + compiler_files = "%{win_compiler_deps}", + ar_files = "%{win_compiler_deps}", + as_files = "%{win_compiler_deps}", + dwp_files = ":empty", + linker_files = "%{win_compiler_deps}", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 1, + toolchain_identifier = "local_windows", + toolchain_config = ":cc-compiler-windows-config", +) + +cc_toolchain_config( + name = "cc-compiler-windows-config", + cpu = "x64_windows", + builtin_include_directories = ["/dt9/usr/include/c++/9", "/dt9/usr/include/c++/9/x86_64-pc-linux-gnu", "/dt9/usr/include/c++/9/backward", "/usr/lib/llvm-17/lib/clang/17/include", "/dt9/usr/include/x86_64-linux-gnu", "/dt9/usr/include", "/usr/lib/llvm-17/lib/clang/17/share"], + msvc_cl_path = "%{msvc_cl_path}", + msvc_env_include = "%{msvc_env_include}", + msvc_env_lib = "%{msvc_env_lib}", + msvc_env_path = "%{msvc_env_path}", + msvc_env_tmp = "%{msvc_env_tmp}", + msvc_lib_path = "%{msvc_lib_path}", + msvc_link_path = "%{msvc_link_path}", + msvc_ml_path = "%{msvc_ml_path}", + compiler = "msvc", +) + +filegroup( + name = "empty", + srcs = [], +) + +filegroup( + name = "crosstool_wrapper_driver_is_not_gcc", + srcs = ["clang/bin/crosstool_wrapper_driver_is_not_gcc"], +) + +filegroup( + name = "windows_msvc_wrapper_files", + srcs = glob(["windows/msvc_*"]), +) diff --git a/third_party/toolchains/clang_toolchain/crosstool/cc_toolchain_config.bzl b/third_party/toolchains/clang_toolchain/crosstool/cc_toolchain_config.bzl new file mode 100755 index 00000000..ffa305c7 --- /dev/null +++ b/third_party/toolchains/clang_toolchain/crosstool/cc_toolchain_config.bzl @@ -0,0 +1,1085 @@ +"""cc_toolchain_config rule for configuring CUDA toolchains on Linux, Mac, and Windows.""" + +load( + "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", + "action_config", + "artifact_name_pattern", + "env_entry", + "env_set", + "feature", + "feature_set", + "flag_group", + "flag_set", + "tool", + "tool_path", + "variable_with_value", + "with_feature_set", +) +load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") + +def all_assembly_actions(): + return [ + ACTION_NAMES.assemble, + ACTION_NAMES.preprocess_assemble, + ] + +def all_compile_actions(): + return [ + ACTION_NAMES.assemble, + ACTION_NAMES.c_compile, + ACTION_NAMES.cpp_compile, + ACTION_NAMES.cpp_header_parsing, + ACTION_NAMES.cpp_module_codegen, + ACTION_NAMES.cpp_module_compile, + ACTION_NAMES.linkstamp_compile, + ACTION_NAMES.preprocess_assemble, + ] + +def all_c_compile_actions(): + return [ + ACTION_NAMES.c_compile, + ] + +def all_cpp_compile_actions(): + return [ + ACTION_NAMES.cpp_compile, + ACTION_NAMES.cpp_header_parsing, + ACTION_NAMES.cpp_module_codegen, + ACTION_NAMES.cpp_module_compile, + ACTION_NAMES.linkstamp_compile, + ] + +def all_preprocessed_actions(): + return [ + ACTION_NAMES.c_compile, + ACTION_NAMES.cpp_compile, + ACTION_NAMES.cpp_header_parsing, + ACTION_NAMES.cpp_module_codegen, + ACTION_NAMES.cpp_module_compile, + ACTION_NAMES.linkstamp_compile, + ACTION_NAMES.preprocess_assemble, + ] + +def all_link_actions(): + return [ + ACTION_NAMES.cpp_link_executable, + ACTION_NAMES.cpp_link_dynamic_library, + ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ] + +def all_executable_link_actions(): + return [ + ACTION_NAMES.cpp_link_executable, + ] + +def all_shared_library_link_actions(): + return [ + ACTION_NAMES.cpp_link_dynamic_library, + ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ] + +def all_archive_actions(): + return [ACTION_NAMES.cpp_link_static_library] + +def all_strip_actions(): + return [ACTION_NAMES.strip] + +def _library_to_link(flag_prefix, value, iterate = None): + return flag_group( + flags = [ + "{}%{{libraries_to_link.{}}}".format( + flag_prefix, + iterate if iterate else "name", + ), + ], + iterate_over = ("libraries_to_link." + iterate if iterate else None), + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = value, + ), + ) + +def _surround_static_library(prefix, suffix): + return [ + flag_group( + flags = [prefix, "%{libraries_to_link.name}", suffix], + expand_if_true = "libraries_to_link.is_whole_archive", + ), + flag_group( + flags = ["%{libraries_to_link.name}"], + expand_if_false = "libraries_to_link.is_whole_archive", + ), + ] + +def _prefix_static_library(prefix): + return [ + flag_group( + flags = ["%{libraries_to_link.name}"], + expand_if_false = "libraries_to_link.is_whole_archive", + ), + flag_group( + flags = [prefix + "%{libraries_to_link.name}"], + expand_if_true = "libraries_to_link.is_whole_archive", + ), + ] + +def _static_library_to_link(alwayslink_prefix, alwayslink_suffix = None): + if alwayslink_suffix: + flag_groups = _surround_static_library(alwayslink_prefix, alwayslink_suffix) + else: + flag_groups = _prefix_static_library(alwayslink_prefix) + return flag_group( + flag_groups = flag_groups, + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "static_library", + ), + ) + +def _iterate_flag_group(iterate_over, flags = [], flag_groups = []): + return flag_group( + iterate_over = iterate_over, + expand_if_available = iterate_over, + flag_groups = flag_groups, + flags = flags, + ) + +def _libraries_to_link_group(flavour): + if flavour == "linux": + return _iterate_flag_group( + iterate_over = "libraries_to_link", + flag_groups = [ + flag_group( + flags = ["-Wl,--start-lib"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "object_file_group", + ), + ), + _library_to_link("", "object_file_group", "object_files"), + flag_group( + flags = ["-Wl,--end-lib"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "object_file_group", + ), + ), + _library_to_link("", "object_file"), + _library_to_link("", "interface_library"), + _static_library_to_link("-Wl,-whole-archive", "-Wl,-no-whole-archive"), + _library_to_link("-l", "dynamic_library"), + _library_to_link("-l:", "versioned_dynamic_library"), + ], + ) + elif flavour == "darwin": + return _iterate_flag_group( + iterate_over = "libraries_to_link", + flag_groups = [ + _library_to_link("", "object_file_group", "object_files"), + _library_to_link("", "object_file"), + _library_to_link("", "interface_library"), + _static_library_to_link("-Wl,-force_load,"), + _library_to_link("-l", "dynamic_library"), + _library_to_link("-l:", "versioned_dynamic_library"), + ], + ) + elif flavour == "msvc": + return _iterate_flag_group( + iterate_over = "libraries_to_link", + flag_groups = [ + _library_to_link("", "object_file_group", "object_files"), + _library_to_link("", "object_file"), + _library_to_link("", "interface_library"), + _static_library_to_link("/WHOLEARCHIVE:"), + ], + ) + +def _action_configs_with_tool(path, actions): + return [ + action_config( + action_name = name, + enabled = True, + tools = [tool(path = path)], + ) + for name in actions + ] + +def _action_configs(assembly_path, c_compiler_path, cc_compiler_path, archiver_path, linker_path, strip_path): + return _action_configs_with_tool( + assembly_path, + all_assembly_actions(), + ) + _action_configs_with_tool( + c_compiler_path, + all_c_compile_actions(), + ) + _action_configs_with_tool( + cc_compiler_path, + all_cpp_compile_actions(), + ) + _action_configs_with_tool( + archiver_path, + all_archive_actions(), + ) + _action_configs_with_tool( + linker_path, + all_link_actions(), + ) + _action_configs_with_tool( + strip_path, + all_strip_actions(), + ) + +def _tool_paths(cpu, ctx): + if cpu in ["local", "darwin"]: + return [ + tool_path(name = "gcc", path = ctx.attr.host_compiler_path), + tool_path(name = "ar", path = ctx.attr.host_compiler_prefix + ( + "/ar" if cpu == "local" else "/libtool" + )), + tool_path(name = "compat-ld", path = ctx.attr.host_compiler_prefix + "/ld"), + tool_path(name = "cpp", path = ctx.attr.host_compiler_prefix + "/cpp"), + tool_path(name = "dwp", path = ctx.attr.host_compiler_prefix + "/dwp"), + tool_path(name = "gcov", path = ctx.attr.host_compiler_prefix + "/gcov"), + tool_path(name = "ld", path = ctx.attr.host_compiler_prefix + "/ld"), + tool_path(name = "nm", path = ctx.attr.host_compiler_prefix + "/nm"), + tool_path(name = "objcopy", path = ctx.attr.host_compiler_prefix + "/objcopy"), + tool_path(name = "objdump", path = ctx.attr.host_compiler_prefix + "/objdump"), + tool_path(name = "strip", path = ctx.attr.host_compiler_prefix + "/strip"), + ] + elif cpu == "x64_windows": + return [ + tool_path(name = "ar", path = ctx.attr.msvc_lib_path), + tool_path(name = "ml", path = ctx.attr.msvc_ml_path), + tool_path(name = "cpp", path = ctx.attr.msvc_cl_path), + tool_path(name = "gcc", path = ctx.attr.msvc_cl_path), + tool_path(name = "gcov", path = "wrapper/bin/msvc_nop.bat"), + tool_path(name = "ld", path = ctx.attr.msvc_link_path), + tool_path(name = "nm", path = "wrapper/bin/msvc_nop.bat"), + tool_path( + name = "objcopy", + path = "wrapper/bin/msvc_nop.bat", + ), + tool_path( + name = "objdump", + path = "wrapper/bin/msvc_nop.bat", + ), + tool_path( + name = "strip", + path = "wrapper/bin/msvc_nop.bat", + ), + ] + else: + fail("Unreachable") + +def _sysroot_group(): + return flag_group( + flags = ["--sysroot=%{sysroot}"], + expand_if_available = "sysroot", + ) + +def _no_canonical_prefixes_group(extra_flags): + return flag_group( + flags = [ + "-no-canonical-prefixes", + ] + extra_flags, + ) + +def _cuda_set(cuda_path, actions): + if cuda_path: + return [flag_set( + actions = actions, + flag_groups = [ + flag_group( + flags = ["--cuda-path=" + cuda_path], + ), + ], + )] + else: + return [] + +def _nologo(): + return flag_group(flags = ["/nologo"]) + +def _features(cpu, compiler, ctx): + if cpu in ["local", "darwin"]: + return [ + feature(name = "no_legacy_features"), + feature( + name = "all_compile_flags", + enabled = True, + flag_sets = [ + flag_set( + actions = all_compile_actions(), + flag_groups = [ + flag_group( + flags = ["-MD", "-MF", "%{dependency_file}"], + expand_if_available = "dependency_file", + ), + flag_group( + flags = ["-gsplit-dwarf"], + expand_if_available = "per_object_debug_info_file", + ), + ], + ), + flag_set( + actions = all_preprocessed_actions(), + flag_groups = [ + flag_group( + flags = ["-frandom-seed=%{output_file}"], + expand_if_available = "output_file", + ), + _iterate_flag_group( + flags = ["-D%{preprocessor_defines}"], + iterate_over = "preprocessor_defines", + ), + _iterate_flag_group( + flags = ["-include", "%{includes}"], + iterate_over = "includes", + ), + _iterate_flag_group( + flags = ["-iquote", "%{quote_include_paths}"], + iterate_over = "quote_include_paths", + ), + _iterate_flag_group( + flags = ["-I%{include_paths}"], + iterate_over = "include_paths", + ), + _iterate_flag_group( + flags = ["-isystem", "%{system_include_paths}"], + iterate_over = "system_include_paths", + ), + _iterate_flag_group( + flags = ["-F", "%{framework_include_paths}"], + iterate_over = "framework_include_paths", + ), + ], + ), + flag_set( + actions = all_cpp_compile_actions(), + flag_groups = [ + flag_group(flags = [ + "-fmerge-all-constants", + ]), + ] if compiler == "clang" else [], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [ + flag_group( + flags = [ + "-Wno-builtin-macro-redefined", + "-D__DATE__=\"redacted\"", + "-D__TIMESTAMP__=\"redacted\"", + "-D__TIME__=\"redacted\"", + ], + ), + flag_group( + flags = ["-fPIC"], + expand_if_available = "pic", + ), + flag_group( + flags = ["-fPIE"], + expand_if_not_available = "pic", + ), + flag_group( + flags = [ + "-U_FORTIFY_SOURCE", + "-D_FORTIFY_SOURCE=1", + "-fstack-protector", + "-Wall", + ] + ctx.attr.host_compiler_warnings + [ + "-fno-omit-frame-pointer", + ], + ), + _no_canonical_prefixes_group( + ctx.attr.extra_no_canonical_prefixes_flags, + ), + ], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["-DNDEBUG"])], + with_features = [with_feature_set(features = ["disable-assertions"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [ + flag_group( + flags = [ + "-g0", + "-O2", + "-ffunction-sections", + "-fdata-sections", + ], + ), + ], + with_features = [with_feature_set(features = ["opt"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["-g"])], + with_features = [with_feature_set(features = ["dbg"])], + ), + ] + _cuda_set( + ctx.attr.cuda_path, + all_compile_actions(), + ) + [ + flag_set( + actions = all_compile_actions(), + flag_groups = [ + _iterate_flag_group( + flags = ["%{user_compile_flags}"], + iterate_over = "user_compile_flags", + ), + _sysroot_group(), + flag_group( + expand_if_available = "source_file", + flags = ["-c", "%{source_file}"], + ), + flag_group( + expand_if_available = "output_assembly_file", + flags = ["-S"], + ), + flag_group( + expand_if_available = "output_preprocess_file", + flags = ["-E"], + ), + flag_group( + expand_if_available = "output_file", + flags = ["-o", "%{output_file}"], + ), + ], + ), + ], + ), + feature( + name = "all_archive_flags", + enabled = True, + flag_sets = [ + flag_set( + actions = all_archive_actions(), + flag_groups = [ + flag_group( + expand_if_available = "linker_param_file", + flags = ["@%{linker_param_file}"], + ), + flag_group(flags = ["rcsD"]), + flag_group( + flags = ["%{output_execpath}"], + expand_if_available = "output_execpath", + ), + flag_group( + iterate_over = "libraries_to_link", + flag_groups = [ + flag_group( + flags = ["%{libraries_to_link.name}"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "object_file", + ), + ), + flag_group( + flags = ["%{libraries_to_link.object_files}"], + iterate_over = "libraries_to_link.object_files", + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "object_file_group", + ), + ), + ], + expand_if_available = "libraries_to_link", + ), + ], + ), + ], + ), + feature( + name = "all_link_flags", + enabled = True, + flag_sets = [ + flag_set( + actions = all_shared_library_link_actions(), + flag_groups = [flag_group(flags = ["-shared"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = ([ + flag_group(flags = ["-Wl,-no-as-needed"]) + ] if cpu == "local" else []) + ([ + flag_group(flags = ["-B" + ctx.attr.linker_bin_path]) + ] if ctx.attr.linker_bin_path else []) + [ + flag_group( + flags = ["@%{linker_param_file}"], + expand_if_available = "linker_param_file", + ), + _iterate_flag_group( + flags = ["%{linkstamp_paths}"], + iterate_over = "linkstamp_paths", + ), + flag_group( + flags = ["-o", "%{output_execpath}"], + expand_if_available = "output_execpath", + ), + _iterate_flag_group( + flags = ["-L%{library_search_directories}"], + iterate_over = "library_search_directories", + ), + _iterate_flag_group( + iterate_over = "runtime_library_search_directories", + flags = [ + "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}", + ] if cpu == "local" else [ + "-Wl,-rpath,@loader_path/%{runtime_library_search_directories}", + ], + ), + _libraries_to_link_group("darwin" if cpu == "darwin" else "linux"), + _iterate_flag_group( + flags = ["%{user_link_flags}"], + iterate_over = "user_link_flags", + ), + flag_group( + flags = ["-Wl,--gdb-index"], + expand_if_available = "is_using_fission", + ), + flag_group( + flags = ["-Wl,-S"], + expand_if_available = "strip_debug_symbols", + ), + flag_group(flags = ["-lc++" if cpu == "darwin" else "-lstdc++"]), + _no_canonical_prefixes_group( + ctx.attr.extra_no_canonical_prefixes_flags, + ), + ], + ), + flag_set( + actions = all_executable_link_actions(), + flag_groups = [flag_group(flags = ["-pie"])], + ), + ] + ([ + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = [ + "-Wl,-z,relro,-z,now", + ])], + ), + ] if cpu == "local" else []) + ([ + flag_set( + actions = all_link_actions(), + flag_groups = [ + flag_group(flags = ["-Wl,--gc-sections"]), + flag_group( + flags = ["-Wl,--build-id=md5", "-Wl,--hash-style=gnu"], + ), + ], + ), + ] if cpu == "local" else []) + ([ + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = ["-undefined", "dynamic_lookup"])], + ), + ] if cpu == "darwin" else []) + _cuda_set( + ctx.attr.cuda_path, + all_link_actions(), + ) + [ + flag_set( + actions = all_link_actions(), + flag_groups = [ + _sysroot_group(), + ], + ), + ], + ), + feature(name = "disable-assertions"), + feature( + name = "opt", + implies = ["disable-assertions"], + ), + feature(name = "fastbuild"), + feature(name = "dbg"), + feature(name = "supports_dynamic_linker", enabled = True), + feature(name = "pic", enabled = True), + feature(name = "supports_pic", enabled = True), + feature(name = "has_configured_linker_path", enabled = True), + ] + elif cpu == "x64_windows": + return [ + feature(name = "compiler_param_file"), + feature(name = "no_legacy_features"), + feature( + name = "common_flags", + enabled = True, + env_sets = [ + env_set( + actions = all_compile_actions() + all_link_actions() + all_archive_actions(), + env_entries = [ + env_entry(key = "PATH", value = ctx.attr.msvc_env_path), + env_entry(key = "INCLUDE", value = ctx.attr.msvc_env_include), + env_entry(key = "LIB", value = ctx.attr.msvc_env_lib), + env_entry(key = "TMP", value = ctx.attr.msvc_env_tmp), + env_entry(key = "TEMP", value = ctx.attr.msvc_env_tmp), + ], + ), + ], + ), + feature( + name = "all_compile_flags", + enabled = True, + flag_sets = [ + flag_set( + actions = all_compile_actions(), + flag_groups = [ + _nologo(), + flag_group( + flags = [ + "/DCOMPILER_MSVC", + "/DNOMINMAX", + "/D_WIN32_WINNT=0x0600", + "/D_CRT_SECURE_NO_DEPRECATE", + "/D_CRT_SECURE_NO_WARNINGS", + "/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS", + "/bigobj", + "/Zm500", + "/J", + "/Gy", + "/GF", + "/EHsc", + "/wd4351", + "/wd4291", + "/wd4250", + "/wd4996", + ], + ), + _iterate_flag_group( + flags = ["/I%{quote_include_paths}"], + iterate_over = "quote_include_paths", + ), + _iterate_flag_group( + flags = ["/I%{include_paths}"], + iterate_over = "include_paths", + ), + _iterate_flag_group( + flags = ["/I%{system_include_paths}"], + iterate_over = "system_include_paths", + ), + _iterate_flag_group( + flags = ["/D%{preprocessor_defines}"], + iterate_over = "preprocessor_defines", + ), + ], + ), + flag_set( + actions = all_preprocessed_actions(), + flag_groups = [flag_group(flags = ["/showIncludes"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/MT"])], + with_features = [with_feature_set(features = ["static_link_msvcrt_no_debug"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/MD"])], + with_features = [with_feature_set(features = ["dynamic_link_msvcrt_no_debug"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/MTd"])], + with_features = [with_feature_set(features = ["static_link_msvcrt_debug"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/MDd"])], + with_features = [with_feature_set(features = ["dynamic_link_msvcrt_debug"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/Od", "/Z7", "/DDEBUG"])], + with_features = [with_feature_set(features = ["dbg"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/Od", "/Z7", "/DDEBUG"])], + with_features = [with_feature_set(features = ["fastbuild"])], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [flag_group(flags = ["/O2", "/DNDEBUG"])], + with_features = [with_feature_set(features = ["opt"])], + ), + flag_set( + actions = all_preprocessed_actions(), + flag_groups = [ + _iterate_flag_group( + flags = ["%{user_compile_flags}"], + iterate_over = "user_compile_flags", + ), + ] + ([ + flag_group(flags = ctx.attr.host_unfiltered_compile_flags), + ] if ctx.attr.host_unfiltered_compile_flags else []), + ), + flag_set( + actions = [ACTION_NAMES.assemble], + flag_groups = [ + flag_group( + flag_groups = [ + flag_group( + flags = ["/Fo%{output_file}", "/Zi"], + expand_if_not_available = "output_preprocess_file", + ), + ], + expand_if_available = "output_file", + expand_if_not_available = "output_assembly_file", + ), + ], + ), + flag_set( + actions = all_preprocessed_actions(), + flag_groups = [ + flag_group( + flag_groups = [ + flag_group( + flags = ["/Fo%{output_file}"], + expand_if_not_available = "output_preprocess_file", + ), + ], + expand_if_available = "output_file", + expand_if_not_available = "output_assembly_file", + ), + flag_group( + flag_groups = [ + flag_group( + flags = ["/Fa%{output_file}"], + expand_if_available = "output_assembly_file", + ), + ], + expand_if_available = "output_file", + ), + flag_group( + flag_groups = [ + flag_group( + flags = ["/P", "/Fi%{output_file}"], + expand_if_available = "output_preprocess_file", + ), + ], + expand_if_available = "output_file", + ), + ], + ), + flag_set( + actions = all_compile_actions(), + flag_groups = [ + flag_group( + flags = ["/c", "%{source_file}"], + expand_if_available = "source_file", + ), + ], + ), + ], + ), + feature( + name = "all_archive_flags", + enabled = True, + flag_sets = [ + flag_set( + actions = all_archive_actions(), + flag_groups = [ + _nologo(), + flag_group( + flags = ["/OUT:%{output_execpath}"], + expand_if_available = "output_execpath", + ), + ], + ), + ], + ), + feature( + name = "all_link_flags", + enabled = True, + flag_sets = [ + flag_set( + actions = all_shared_library_link_actions(), + flag_groups = [flag_group(flags = ["/DLL"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [ + _nologo(), + _iterate_flag_group( + flags = ["%{linkstamp_paths}"], + iterate_over = "linkstamp_paths", + ), + flag_group( + flags = ["/OUT:%{output_execpath}"], + expand_if_available = "output_execpath", + ), + ], + ), + flag_set( + actions = all_shared_library_link_actions(), + flag_groups = [ + flag_group( + flags = ["/IMPLIB:%{interface_library_output_path}"], + expand_if_available = "interface_library_output_path", + ), + ], + ), + flag_set( + actions = all_link_actions() + + all_archive_actions(), + flag_groups = [ + _libraries_to_link_group("msvc"), + ], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [ + flag_group(flags = ["/SUBSYSTEM:CONSOLE"]), + _iterate_flag_group( + flags = ["%{user_link_flags}"], + iterate_over = "user_link_flags", + ), + flag_group(flags = ["/MACHINE:X64"]), + ], + ), + flag_set( + actions = all_link_actions() + + all_archive_actions(), + flag_groups = [ + flag_group( + flags = ["@%{linker_param_file}"], + expand_if_available = "linker_param_file", + ), + ], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmt.lib"])], + with_features = [with_feature_set(features = ["static_link_msvcrt_no_debug"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrt.lib"])], + with_features = [with_feature_set(features = ["dynamic_link_msvcrt_no_debug"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmtd.lib"])], + with_features = [with_feature_set(features = ["static_link_msvcrt_debug"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrtd.lib"])], + with_features = [with_feature_set(features = ["dynamic_link_msvcrt_debug"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [flag_group(flags = ["/DEBUG:FULL", "/INCREMENTAL:NO"])], + with_features = [with_feature_set(features = ["dbg"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [ + flag_group(flags = ["/DEBUG:FASTLINK", "/INCREMENTAL:NO"]), + ], + with_features = [with_feature_set(features = ["fastbuild"])], + ), + flag_set( + actions = all_link_actions(), + flag_groups = [ + flag_group( + flags = ["/DEF:%{def_file_path}", "/ignore:4070"], + expand_if_available = "def_file_path", + ), + ], + ), + ], + ), + feature(name = "parse_showincludes", enabled = True), + feature(name = "no_stripping", enabled = True), + feature( + name = "targets_windows", + enabled = True, + implies = ["copy_dynamic_libraries_to_binary"], + ), + feature(name = "copy_dynamic_libraries_to_binary"), + feature( + name = "generate_pdb_file", + requires = [ + feature_set(features = ["dbg"]), + feature_set(features = ["fastbuild"]), + ], + ), + feature(name = "static_link_msvcrt"), + feature( + name = "static_link_msvcrt_no_debug", + requires = [ + feature_set(features = ["fastbuild"]), + feature_set(features = ["opt"]), + ], + ), + feature( + name = "dynamic_link_msvcrt_no_debug", + requires = [ + feature_set(features = ["fastbuild"]), + feature_set(features = ["opt"]), + ], + ), + feature( + name = "static_link_msvcrt_debug", + requires = [feature_set(features = ["dbg"])], + ), + feature( + name = "dynamic_link_msvcrt_debug", + requires = [feature_set(features = ["dbg"])], + ), + feature( + name = "dbg", + implies = ["generate_pdb_file"], + ), + feature( + name = "fastbuild", + implies = ["generate_pdb_file"], + ), + feature( + name = "opt", + ), + feature(name = "windows_export_all_symbols"), + feature(name = "no_windows_export_all_symbols"), + feature(name = "supports_dynamic_linker", enabled = True), + feature( + name = "supports_interface_shared_libraries", + enabled = True, + ), + feature(name = "has_configured_linker_path", enabled = True), + ] + else: + fail("Unreachable") + +def _impl(ctx): + cpu = ctx.attr.cpu + compiler = ctx.attr.compiler + + if (cpu == "darwin"): + toolchain_identifier = "local_darwin" + target_cpu = "darwin" + target_libc = "macosx" + compiler = "compiler" + action_configs = _action_configs( + assembly_path = ctx.attr.host_compiler_path, + c_compiler_path = ctx.attr.host_compiler_path, + cc_compiler_path = ctx.attr.host_compiler_path, + archiver_path = ctx.attr.host_compiler_prefix + "/libtool", + linker_path = ctx.attr.host_compiler_path, + strip_path = ctx.attr.host_compiler_prefix + "/strip", + ) + artifact_name_patterns = [] + elif (cpu == "local"): + toolchain_identifier = "local_linux" + target_cpu = "local" + target_libc = "local" + action_configs = _action_configs( + assembly_path = ctx.attr.host_compiler_path, + c_compiler_path = ctx.attr.host_compiler_path, + cc_compiler_path = ctx.attr.host_compiler_path, + archiver_path = ctx.attr.host_compiler_prefix + "/ar", + linker_path = ctx.attr.host_compiler_path, + strip_path = ctx.attr.host_compiler_prefix + "/strip", + ) + artifact_name_patterns = [] + elif (cpu == "x64_windows"): + toolchain_identifier = "local_windows" + target_cpu = "x64_windows" + target_libc = "msvcrt" + compiler = "msvc-cl" + action_configs = _action_configs( + assembly_path = ctx.attr.msvc_ml_path, + c_compiler_path = ctx.attr.msvc_cl_path, + cc_compiler_path = ctx.attr.msvc_cl_path, + archiver_path = ctx.attr.msvc_lib_path, + linker_path = ctx.attr.msvc_link_path, + strip_path = "fake_tool_strip_not_supported", + ) + artifact_name_patterns = [ + artifact_name_pattern( + category_name = "object_file", + prefix = "", + extension = ".obj", + ), + artifact_name_pattern( + category_name = "static_library", + prefix = "", + extension = ".lib", + ), + artifact_name_pattern( + category_name = "alwayslink_static_library", + prefix = "", + extension = ".lo.lib", + ), + artifact_name_pattern( + category_name = "executable", + prefix = "", + extension = ".exe", + ), + artifact_name_pattern( + category_name = "dynamic_library", + prefix = "", + extension = ".dll", + ), + artifact_name_pattern( + category_name = "interface_library", + prefix = "", + extension = ".if.lib", + ), + ] + else: + fail("Unreachable") + + out = ctx.actions.declare_file(ctx.label.name) + ctx.actions.write(out, "Fake executable") + return [ + cc_common.create_cc_toolchain_config_info( + ctx = ctx, + features = _features(cpu, compiler, ctx), + action_configs = action_configs, + artifact_name_patterns = artifact_name_patterns, + cxx_builtin_include_directories = ctx.attr.builtin_include_directories, + toolchain_identifier = toolchain_identifier, + host_system_name = "local", + target_system_name = "local", + target_cpu = target_cpu, + target_libc = target_libc, + compiler = compiler, + abi_version = "local", + abi_libc_version = "local", + tool_paths = _tool_paths(cpu, ctx), + make_variables = [], + builtin_sysroot = ctx.attr.builtin_sysroot, + cc_target_os = None, + ), + DefaultInfo( + executable = out, + ), + ] + +cc_toolchain_config = rule( + implementation = _impl, + attrs = { + "cpu": attr.string(mandatory = True, values = ["darwin", "local", "x64_windows"]), + "compiler": attr.string(values = ["clang", "msvc", "unknown"], default = "unknown"), + "builtin_include_directories": attr.string_list(), + "extra_no_canonical_prefixes_flags": attr.string_list(), + "host_compiler_path": attr.string(), + "host_compiler_prefix": attr.string(), + "host_compiler_warnings": attr.string_list(), + "host_unfiltered_compile_flags": attr.string_list(), + "linker_bin_path": attr.string(), + "builtin_sysroot": attr.string(), + "cuda_path": attr.string(), + "msvc_cl_path": attr.string(default = "msvc_not_used"), + "msvc_env_include": attr.string(default = "msvc_not_used"), + "msvc_env_lib": attr.string(default = "msvc_not_used"), + "msvc_env_path": attr.string(default = "msvc_not_used"), + "msvc_env_tmp": attr.string(default = "msvc_not_used"), + "msvc_lib_path": attr.string(default = "msvc_not_used"), + "msvc_link_path": attr.string(default = "msvc_not_used"), + "msvc_ml_path": attr.string(default = "msvc_not_used"), + }, + provides = [CcToolchainConfigInfo], + executable = True, +)