From 438368b58bdd080146af67f9ab3bbde3d86e5f46 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 18 Jul 2019 06:12:41 -0700 Subject: [PATCH] Automated rollback of commit a34fafd5f5e44a7a0992ef8c01415e766552ae90. *** Reason for rollback *** Rolling back. No time before 1.0. *** Original change description *** C++: Move tools/cpp from bazel_tools to rules_cc Here we are duplicating bazel_tools/tools/cpp. The goal is for the BUILD files in bazel_tools/tools/cpp to have an alias that point to rules_cc. Then later on with the incompatible flag these aliases will no longer be valid. Working towards #8743 RELNOTES:none PiperOrigin-RevId: 258756552 Change-Id: Ia44c0b5084ed9b28efbf9058e3dc29696db86fac --- WORKSPACE | 37 +- cc/BUILD | 32 +- cc/action_names.bzl | 122 -- cc/defs.bzl | 19 - cc/find_cc_toolchain.bzl | 3 +- cc/private/rules_impl/BUILD | 0 cc/private/rules_impl/cc_flags_supplier.bzl | 35 - .../rules_impl/cc_flags_supplier_lib.bzl | 71 - cc/private/rules_impl/compiler_flag.bzl | 29 - cc/private/toolchain/BUILD | 455 ----- cc/private/toolchain/BUILD.empty | 54 - cc/private/toolchain/BUILD.static.freebsd | 113 -- cc/private/toolchain/BUILD.toolchains.tpl | 20 - cc/private/toolchain/BUILD.tpl | 113 -- cc/private/toolchain/BUILD.windows.tpl | 232 --- .../toolchain/armeabi_cc_toolchain_config.bzl | 82 - cc/private/toolchain/build_interface_so | 8 - cc/private/toolchain/cc_configure.bzl | 173 -- cc/private/toolchain/cc_toolchain_config.bzl | 1493 ----------------- .../toolchain/cc_toolchain_config_lib.bzl | 542 ------ cc/private/toolchain/empty.cc | 15 - cc/private/toolchain/grep-includes.sh | 19 - cc/private/toolchain/lib_cc_configure.bzl | 219 --- cc/private/toolchain/link_dynamic_library.sh | 113 -- cc/private/toolchain/linux_cc_wrapper.sh.tpl | 25 - .../toolchain/msys_gcc_installation_error.bat | 23 - cc/private/toolchain/osx_cc_configure.bzl | 148 -- cc/private/toolchain/osx_cc_wrapper.sh | 104 -- cc/private/toolchain/osx_cc_wrapper.sh.tpl | 106 -- cc/private/toolchain/runfiles/BUILD | 94 -- cc/private/toolchain/runfiles/BUILD.tools | 6 - cc/private/toolchain/runfiles/runfiles_src.cc | 318 ---- cc/private/toolchain/runfiles/runfiles_src.h | 222 --- .../toolchain/runfiles/runfiles_test.cc | 583 ------- cc/private/toolchain/unix_cc_configure.bzl | 567 ------- .../toolchain/unix_cc_toolchain_config.bzl | 1133 ------------- .../toolchain/vc_installation_error.bat.tpl | 24 - cc/private/toolchain/windows_cc_configure.bzl | 583 ------- .../toolchain/windows_cc_toolchain_config.bzl | 1338 --------------- cc/toolchain_utils.bzl | 48 - 40 files changed, 13 insertions(+), 9308 deletions(-) delete mode 100644 cc/action_names.bzl delete mode 100644 cc/private/rules_impl/BUILD delete mode 100644 cc/private/rules_impl/cc_flags_supplier.bzl delete mode 100644 cc/private/rules_impl/cc_flags_supplier_lib.bzl delete mode 100644 cc/private/rules_impl/compiler_flag.bzl delete mode 100644 cc/private/toolchain/BUILD delete mode 100644 cc/private/toolchain/BUILD.empty delete mode 100644 cc/private/toolchain/BUILD.static.freebsd delete mode 100644 cc/private/toolchain/BUILD.toolchains.tpl delete mode 100644 cc/private/toolchain/BUILD.tpl delete mode 100644 cc/private/toolchain/BUILD.windows.tpl delete mode 100644 cc/private/toolchain/armeabi_cc_toolchain_config.bzl delete mode 100644 cc/private/toolchain/build_interface_so delete mode 100644 cc/private/toolchain/cc_configure.bzl delete mode 100644 cc/private/toolchain/cc_toolchain_config.bzl delete mode 100644 cc/private/toolchain/cc_toolchain_config_lib.bzl delete mode 100644 cc/private/toolchain/empty.cc delete mode 100755 cc/private/toolchain/grep-includes.sh delete mode 100644 cc/private/toolchain/lib_cc_configure.bzl delete mode 100755 cc/private/toolchain/link_dynamic_library.sh delete mode 100644 cc/private/toolchain/linux_cc_wrapper.sh.tpl delete mode 100644 cc/private/toolchain/msys_gcc_installation_error.bat delete mode 100644 cc/private/toolchain/osx_cc_configure.bzl delete mode 100755 cc/private/toolchain/osx_cc_wrapper.sh delete mode 100644 cc/private/toolchain/osx_cc_wrapper.sh.tpl delete mode 100644 cc/private/toolchain/runfiles/BUILD delete mode 100644 cc/private/toolchain/runfiles/BUILD.tools delete mode 100644 cc/private/toolchain/runfiles/runfiles_src.cc delete mode 100644 cc/private/toolchain/runfiles/runfiles_src.h delete mode 100644 cc/private/toolchain/runfiles/runfiles_test.cc delete mode 100644 cc/private/toolchain/unix_cc_configure.bzl delete mode 100644 cc/private/toolchain/unix_cc_toolchain_config.bzl delete mode 100644 cc/private/toolchain/vc_installation_error.bat.tpl delete mode 100644 cc/private/toolchain/windows_cc_configure.bzl delete mode 100644 cc/private/toolchain/windows_cc_toolchain_config.bzl delete mode 100644 cc/toolchain_utils.bzl diff --git a/WORKSPACE b/WORKSPACE index fe05b45..4641008 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -2,13 +2,13 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "six_archive", - build_file = "@//third_party:six.BUILD", - sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a", - strip_prefix = "six-1.10.0", urls = [ "https://mirror.bazel.build/pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz", "https://pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz", ], + sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a", + strip_prefix = "six-1.10.0", + build_file = "@//third_party:six.BUILD", ) bind( @@ -38,6 +38,12 @@ http_archive( http_archive( name = "py_mock", + sha256 = "b839dd2d9c117c701430c149956918a423a9863b48b09c90e30a6013e7d2f44f", + urls = [ + "https://mirror.bazel.build/pypi.python.org/packages/source/m/mock/mock-1.0.1.tar.gz", + "https://pypi.python.org/packages/source/m/mock/mock-1.0.1.tar.gz", + ], + strip_prefix = "mock-1.0.1", patch_cmds = [ "mkdir -p py/mock", "mv mock.py py/mock/__init__.py", @@ -45,12 +51,6 @@ http_archive( "touch py/BUILD", """echo 'py_library(name = "mock", srcs = ["__init__.py"], visibility = ["//visibility:public"],)' > py/mock/BUILD""", ], - sha256 = "b839dd2d9c117c701430c149956918a423a9863b48b09c90e30a6013e7d2f44f", - strip_prefix = "mock-1.0.1", - urls = [ - "https://mirror.bazel.build/pypi.python.org/packages/source/m/mock/mock-1.0.1.tar.gz", - "https://pypi.python.org/packages/source/m/mock/mock-1.0.1.tar.gz", - ], ) # TODO(https://github.com/protocolbuffers/protobuf/issues/5918: Remove when protobuf releases protobuf_deps.bzl) @@ -64,37 +64,22 @@ http_archive( bind( name = "zlib", - actual = "@net_zlib//:zlib", + actual = "@net_zlib//:zlib" ) # Go rules and proto support http_archive( name = "io_bazel_rules_go", - sha256 = "f04d2373bcaf8aa09bccb08a98a57e721306c8f6043a2a0ee610fd6853dcde3d", urls = [ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.tar.gz", "https://github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.tar.gz", ], -) - -# We're pinning to a commit because this project does not have a recent release. -# Nothing special about this commit, though. -http_archive( - name = "com_google_googletest", - sha256 = "0fb00ff413f6b9b80ccee44a374ca7a18af7315aea72a43c62f2acd1ca74e9b5", - strip_prefix = "googletest-f13bbe2992d188e834339abe6f715b2b2f840a77", - urls = [ - "https://mirror.bazel.build/github.com/google/googletest/archive/f13bbe2992d188e834339abe6f715b2b2f840a77.tar.gz", - "https://github.com/google/googletest/archive/f13bbe2992d188e834339abe6f715b2b2f840a77.tar.gz", - ], + sha256 = "f04d2373bcaf8aa09bccb08a98a57e721306c8f6043a2a0ee610fd6853dcde3d", ) load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains") - go_rules_dependencies() - go_register_toolchains() load("//cc:repositories.bzl", "rules_cc_dependencies") - rules_cc_dependencies() diff --git a/cc/BUILD b/cc/BUILD index 13e1353..145d2f9 100644 --- a/cc/BUILD +++ b/cc/BUILD @@ -1,38 +1,8 @@ -# Copyright 2018 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. - -package(default_visibility = ["//visibility:public"]) - licenses(["notice"]) # Apache 2.0 -exports_files([ - "defs.bzl", - "action_names.bzl", -]) - -# The toolchain type used to distinguish cc toolchains. alias( name = "toolchain_type", actual = "@bazel_tools//tools/cpp:toolchain_type", ) -filegroup( - name = "action_names_test_files", - testonly = True, - srcs = [ - "BUILD", - "action_names.bzl", - ], - visibility = ["//visibility:public"], -) +exports_files(["defs.bzl"]) diff --git a/cc/action_names.bzl b/cc/action_names.bzl deleted file mode 100644 index 60e8a5f..0000000 --- a/cc/action_names.bzl +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright 2018 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. -"""Constants for action names used for C++ rules.""" - -# Name for the C compilation action. -C_COMPILE_ACTION_NAME = "c-compile" - -# Name of the C++ compilation action. -CPP_COMPILE_ACTION_NAME = "c++-compile" - -# Name of the linkstamp-compile action. -LINKSTAMP_COMPILE_ACTION_NAME = "linkstamp-compile" - -# Name of the action used to compute CC_FLAGS make variable. -CC_FLAGS_MAKE_VARIABLE_ACTION_NAME = "cc-flags-make-variable" - -# Name of the C++ module codegen action. -CPP_MODULE_CODEGEN_ACTION_NAME = "c++-module-codegen" - -# Name of the C++ header parsing action. -CPP_HEADER_PARSING_ACTION_NAME = "c++-header-parsing" - -# Name of the C++ module compile action. -CPP_MODULE_COMPILE_ACTION_NAME = "c++-module-compile" - -# Name of the assembler action. -ASSEMBLE_ACTION_NAME = "assemble" - -# Name of the assembly preprocessing action. -PREPROCESS_ASSEMBLE_ACTION_NAME = "preprocess-assemble" - -# Name of the action producing ThinLto index. -LTO_INDEXING_ACTION_NAME = "lto-indexing" - -# Name of the action producing ThinLto index for executable. -LTO_INDEX_FOR_EXECUTABLE_ACTION_NAME = "lto-index-for-executable" - -# Name of the action producing ThinLto index for dynamic library. -LTO_INDEX_FOR_DYNAMIC_LIBRARY_ACTION_NAME = "lto-index-for-dynamic-library" - -# Name of the action producing ThinLto index for nodeps dynamic library. -LTO_INDEX_FOR_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME = "lto-index-for-nodeps-dynamic-library" - -# Name of the action compiling lto bitcodes into native objects. -LTO_BACKEND_ACTION_NAME = "lto-backend" - -# Name of the link action producing executable binary. -CPP_LINK_EXECUTABLE_ACTION_NAME = "c++-link-executable" - -# Name of the link action producing dynamic library. -CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME = "c++-link-dynamic-library" - -# Name of the link action producing dynamic library that doesn't include it's -# transitive dependencies. -CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME = "c++-link-nodeps-dynamic-library" - -# Name of the archiving action producing static library. -CPP_LINK_STATIC_LIBRARY_ACTION_NAME = "c++-link-static-library" - -# Name of the action stripping the binary. -STRIP_ACTION_NAME = "strip" - -# A string constant for the objc archive action. -OBJC_ARCHIVE_ACTION_NAME = "objc-archive" - -# A string constant for the objc compilation action. -OBJC_COMPILE_ACTION_NAME = "objc-compile" - -# A string constant for the objc++ compile action. -OBJCPP_COMPILE_ACTION_NAME = "objc++-compile" - -# A string constant for the objc executable link action. -OBJC_EXECUTABLE_ACTION_NAME = "objc-executable" - -# A string constant for the objc++ executable link action. -OBJCPP_EXECUTABLE_ACTION_NAME = "objc++-executable" - -# A string constant for the objc fully-link link action. -OBJC_FULLY_LINK_ACTION_NAME = "objc-fully-link" - -# A string constant for the clif actions. -CLIF_MATCH_ACTION_NAME = "clif-match" - -ACTION_NAMES = struct( - c_compile = C_COMPILE_ACTION_NAME, - cpp_compile = CPP_COMPILE_ACTION_NAME, - linkstamp_compile = LINKSTAMP_COMPILE_ACTION_NAME, - cc_flags_make_variable = CC_FLAGS_MAKE_VARIABLE_ACTION_NAME, - cpp_module_codegen = CPP_MODULE_CODEGEN_ACTION_NAME, - cpp_header_parsing = CPP_HEADER_PARSING_ACTION_NAME, - cpp_module_compile = CPP_MODULE_COMPILE_ACTION_NAME, - assemble = ASSEMBLE_ACTION_NAME, - preprocess_assemble = PREPROCESS_ASSEMBLE_ACTION_NAME, - lto_indexing = LTO_INDEXING_ACTION_NAME, - lto_backend = LTO_BACKEND_ACTION_NAME, - lto_index_for_executable = LTO_INDEX_FOR_EXECUTABLE_ACTION_NAME, - lto_index_for_dynamic_library = LTO_INDEX_FOR_DYNAMIC_LIBRARY_ACTION_NAME, - lto_index_for_nodeps_dynamic_library = LTO_INDEX_FOR_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME, - cpp_link_executable = CPP_LINK_EXECUTABLE_ACTION_NAME, - cpp_link_dynamic_library = CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME, - cpp_link_nodeps_dynamic_library = CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME, - cpp_link_static_library = CPP_LINK_STATIC_LIBRARY_ACTION_NAME, - strip = STRIP_ACTION_NAME, - objc_archive = OBJC_ARCHIVE_ACTION_NAME, - objc_compile = OBJC_COMPILE_ACTION_NAME, - objc_executable = OBJC_EXECUTABLE_ACTION_NAME, - objc_fully_link = OBJC_FULLY_LINK_ACTION_NAME, - objcpp_compile = OBJCPP_COMPILE_ACTION_NAME, - objcpp_executable = OBJCPP_EXECUTABLE_ACTION_NAME, - clif_match = CLIF_MATCH_ACTION_NAME, -) diff --git a/cc/defs.bzl b/cc/defs.bzl index 9c587b9..01378c5 100644 --- a/cc/defs.bzl +++ b/cc/defs.bzl @@ -14,9 +14,6 @@ """Starlark rules for building C++ projects.""" -load("//cc/private/rules_impl:cc_flags_supplier.bzl", _cc_flags_supplier = "cc_flags_supplier") -load("//cc/private/rules_impl:compiler_flag.bzl", _compiler_flag = "compiler_flag") - _MIGRATION_TAG = "__CC_RULES_MIGRATION_DO_NOT_USE_WILL_BREAK__" def _add_tags(attrs): @@ -135,19 +132,3 @@ def objc_import(**attrs): **attrs: Rule attributes """ native.objc_import(**_add_tags(attrs)) - -def cc_flags_supplier(**attrs): - """Bazel cc_flags_supplier rule. - - Args: - **attrs: Rule attributes - """ - _cc_flags_supplier(**_add_tags(attrs)) - -def compiler_flag(**attrs): - """Bazel compiler_flag rule. - - Args: - **attrs: Rule attributes - """ - _compiler_flag(**_add_tags(attrs)) diff --git a/cc/find_cc_toolchain.bzl b/cc/find_cc_toolchain.bzl index b7ec757..47940a2 100644 --- a/cc/find_cc_toolchain.bzl +++ b/cc/find_cc_toolchain.bzl @@ -24,8 +24,7 @@ Returns the current `CcToolchainInfo`. foo = rule( implementation = _foo_impl, attrs = { - "_cc_toolchain": attr.label( - default = Label("@rules_cc//cc/private/toolchain:current_cc_toolchain")), + "_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")), }, ) * When https://github.com/bazelbuild/bazel/issues/7260 **is** flipped, current diff --git a/cc/private/rules_impl/BUILD b/cc/private/rules_impl/BUILD deleted file mode 100644 index e69de29..0000000 diff --git a/cc/private/rules_impl/cc_flags_supplier.bzl b/cc/private/rules_impl/cc_flags_supplier.bzl deleted file mode 100644 index 7daadfb..0000000 --- a/cc/private/rules_impl/cc_flags_supplier.bzl +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2018 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. -"""Rule that provides the CC_FLAGS Make variable.""" - -load("//cc:action_names.bzl", "CC_FLAGS_MAKE_VARIABLE_ACTION_NAME") -load("//cc/private/rules_impl:cc_flags_supplier_lib.bzl", "build_cc_flags") -load("//cc:toolchain_utils.bzl", "find_cpp_toolchain") - -def _cc_flags_supplier_impl(ctx): - cc_toolchain = find_cpp_toolchain(ctx) - cc_flags = build_cc_flags(ctx, cc_toolchain, CC_FLAGS_MAKE_VARIABLE_ACTION_NAME) - variables = platform_common.TemplateVariableInfo({ - "CC_FLAGS": cc_flags, - }) - return [variables] - -cc_flags_supplier = rule( - implementation = _cc_flags_supplier_impl, - attrs = { - "_cc_toolchain": attr.label(default = Label("//cc/private/toolchain:current_cc_toolchain")), - }, - toolchains = ["//cc:toolchain_type"], - fragments = ["cpp"], -) diff --git a/cc/private/rules_impl/cc_flags_supplier_lib.bzl b/cc/private/rules_impl/cc_flags_supplier_lib.bzl deleted file mode 100644 index 042ecef..0000000 --- a/cc/private/rules_impl/cc_flags_supplier_lib.bzl +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2018 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. -"""Library of functions that provide the CC_FLAGS Make variable.""" - -# This should match the logic in CcCommon.computeCcFlags: -def build_cc_flags(ctx, cc_toolchain, action_name): - """Determine the value for CC_FLAGS based on the given toolchain.""" - - # Get default cc flags from toolchain's make_variables. - legacy_cc_flags = cc_common.legacy_cc_flags_make_variable_do_not_use( - cc_toolchain = cc_toolchain, - ) - - # Determine the sysroot flag. - sysroot_cc_flags = _from_sysroot(cc_toolchain) - - # Flags from feature config. - feature_config_cc_flags = _from_features(ctx, cc_toolchain, action_name) - - # Combine the different sources, but only add the sysroot flag if nothing - # else adds sysroot. - # If added, it must appear before the feature config flags. - cc_flags = [] - if legacy_cc_flags: - cc_flags.append(legacy_cc_flags) - if sysroot_cc_flags and not _contains_sysroot(feature_config_cc_flags): - cc_flags.append(sysroot_cc_flags) - cc_flags.extend(feature_config_cc_flags) - - return " ".join(cc_flags) - -def _contains_sysroot(flags): - for flag in flags: - if "--sysroot=" in flag: - return True - return False - -def _from_sysroot(cc_toolchain): - sysroot = cc_toolchain.sysroot - if sysroot: - return "--sysroot=%s" % sysroot - else: - return None - -def _from_features(ctx, cc_toolchain, action_name): - feature_configuration = cc_common.configure_features( - ctx = ctx, - cc_toolchain = cc_toolchain, - requested_features = ctx.features, - unsupported_features = ctx.disabled_features, - ) - - variables = cc_common.empty_variables() - - cc_flags = cc_common.get_memory_inefficient_command_line( - feature_configuration = feature_configuration, - action_name = action_name, - variables = variables, - ) - return cc_flags diff --git a/cc/private/rules_impl/compiler_flag.bzl b/cc/private/rules_impl/compiler_flag.bzl deleted file mode 100644 index 1b838b7..0000000 --- a/cc/private/rules_impl/compiler_flag.bzl +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2018 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. - -"""Rule that allows select() to differentiate between compilers.""" - -load("//cc:toolchain_utils.bzl", "find_cpp_toolchain") - -def _compiler_flag_impl(ctx): - toolchain = find_cpp_toolchain(ctx) - return [config_common.FeatureFlagInfo(value = toolchain.compiler)] - -compiler_flag = rule( - implementation = _compiler_flag_impl, - attrs = { - "_cc_toolchain": attr.label(default = Label("//cc/private/toolchain:current_cc_toolchain")), - }, - toolchains = ["//cc:toolchain_type"], -) diff --git a/cc/private/toolchain/BUILD b/cc/private/toolchain/BUILD deleted file mode 100644 index 0715cba..0000000 --- a/cc/private/toolchain/BUILD +++ /dev/null @@ -1,455 +0,0 @@ -# Copyright 2018 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. -# -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) # Apache 2.0 - -load(":cc_toolchain_config.bzl", "cc_toolchain_config") -load("//cc:defs.bzl", "cc_flags_supplier", "cc_library", "cc_toolchain", "cc_toolchain_suite", "compiler_flag") - -# It is frequently necessary to constrain platforms based on the cc compiler type. -constraint_setting(name = "cc_compiler") - -constraint_value( - name = "clang", - constraint_setting = ":cc_compiler", -) - -constraint_value( - name = "gcc", - constraint_setting = ":cc_compiler", -) - -constraint_value( - name = "msvc", - constraint_setting = ":cc_compiler", -) - -constraint_value( - name = "mingw", - constraint_setting = ":cc_compiler", -) - -constraint_value( - name = "msys", - constraint_setting = ":cc_compiler", -) - -cc_toolchain_alias(name = "current_cc_toolchain") - -cc_host_toolchain_alias(name = "current_cc_host_toolchain") - -cc_libc_top_alias(name = "current_libc_top") - -cc_library( - name = "malloc", -) - -filegroup( - name = "grep-includes", - srcs = ["grep-includes.sh"], -) - -filegroup( - name = "empty", - srcs = [], -) - -config_setting( - name = "disable_static_cc_toolchains", - values = { - "incompatible_disable_static_cc_toolchains": "true", - }, -) - -# This is the entry point for --crosstool_top. Toolchains are found -# by lopping off the name of --crosstool_top and searching for -# "cc-compiler-${CPU}" in this BUILD file, where CPU is the target CPU -# specified in --cpu. -# -# This file group should include -# * all cc_toolchain targets supported -# * all file groups that said cc_toolchain might refer to -alias( - name = "toolchain", - actual = "//external:cc_toolchain", -) - -# Hardcoded toolchain, legacy behaviour. -cc_toolchain_suite( - name = "default-toolchain", - toolchains = { - "armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a", - "darwin|compiler": ":cc-compiler-darwin", - "freebsd|compiler": ":cc-compiler-freebsd", - "local|compiler": ":cc-compiler-local", - "x64_windows|compiler": ":cc-compiler-x64_windows", - "x64_windows_msvc|compiler": ":cc-compiler-x64_windows_msvc", - "s390x|compiler": ":cc-compiler-s390x", - "ppc|compiler": ":cc-compiler-ppc", - "k8": ":cc-compiler-local", - "piii": ":cc-compiler-local", - "arm": ":cc-compiler-local", - "aarch64": ":cc-compiler-local", - "s390x": ":cc-compiler-local", - "ppc": ":cc-compiler-local", - "ppc64": ":cc-compiler-local", - "darwin": ":cc-compiler-darwin", - "freebsd": ":cc-compiler-freebsd", - "armeabi-v7a": ":cc-compiler-armeabi-v7a", - "x64_windows": ":cc-compiler-x64_windows", - "x64_windows_msvc": ":cc-compiler-x64_windows_msvc", - }, -) - -cc_toolchain( - name = "cc-compiler-local", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, - toolchain_config = ":local_linux", - toolchain_identifier = "local_linux", -) - -cc_toolchain_config( - name = "local_linux", - compiler = "compiler", - cpu = "local", - disable_static_cc_toolchains = select({ - ":disable_static_cc_toolchains": True, - "//conditions:default": False, - }), -) - -toolchain( - name = "cc-toolchain-local", - exec_compatible_with = [ - ], - target_compatible_with = [ - ], - toolchain = ":cc-compiler-local", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-ppc", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, - toolchain_config = ":local_linux", - toolchain_identifier = "local_linux", -) - -toolchain( - name = "cc-toolchain-ppc", - exec_compatible_with = [ - "@platforms//cpu:ppc", - ], - target_compatible_with = [ - "@platforms//cpu:ppc", - ], - toolchain = ":cc-compiler-ppc", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-s390x", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, - toolchain_config = ":local_linux", - toolchain_identifier = "local_linux", -) - -toolchain( - name = "cc-toolchain-s390x", - exec_compatible_with = [ - "@platforms//cpu:s390x", - ], - target_compatible_with = [ - "@platforms//cpu:s390x", - ], - toolchain = ":cc-compiler-s390x", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-armeabi-v7a", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, - toolchain_config = ":local_linux", - toolchain_identifier = "local_linux", -) - -toolchain( - name = "cc-toolchain-armeabi-v7a", - exec_compatible_with = [ - ], - target_compatible_with = [ - "@platforms//cpu:arm", - "@platforms//os:android", - ], - toolchain = ":cc-compiler-armeabi-v7a", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-k8", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, - toolchain_config = ":local_linux", - toolchain_identifier = "local_linux", -) - -toolchain( - name = "cc-toolchain-k8", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:linux", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:linux", - ], - toolchain = ":cc-compiler-k8", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-darwin", - all_files = ":osx_wrapper", - ar_files = ":empty", - as_files = ":osx_wrapper", - compiler_files = ":osx_wrapper", - dwp_files = ":empty", - linker_files = ":osx_wrapper", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, - toolchain_config = ":local_darwin", - toolchain_identifier = "local_darwin", -) - -cc_toolchain_config( - name = "local_darwin", - compiler = "compiler", - cpu = "darwin", - disable_static_cc_toolchains = select({ - ":disable_static_cc_toolchains": True, - "//conditions:default": False, - }), -) - -toolchain( - name = "cc-toolchain-darwin", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:osx", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:osx", - ], - toolchain = ":cc-compiler-darwin", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-freebsd", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, - toolchain_config = ":local_freebsd", - toolchain_identifier = "local_freebsd", -) - -cc_toolchain_config( - name = "local_freebsd", - compiler = "compiler", - cpu = "freebsd", - disable_static_cc_toolchains = select({ - ":disable_static_cc_toolchains": True, - "//conditions:default": False, - }), -) - -toolchain( - name = "cc-toolchain-freebsd", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:freebsd", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:freebsd", - ], - toolchain = ":cc-compiler-freebsd", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-x64_windows", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, - toolchain_config = ":local_windows_msys64", - toolchain_identifier = "local_windows_msys64", -) - -cc_toolchain_config( - name = "local_windows_msys64", - compiler = "windows_msys64", - cpu = "x64_windows", - disable_static_cc_toolchains = select({ - ":disable_static_cc_toolchains": True, - "//conditions:default": False, - }), -) - -toolchain( - name = "cc-toolchain-x64_windows", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - toolchain = ":cc-compiler-x64_windows", - toolchain_type = "//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-x64_windows_msvc", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, - toolchain_config = ":vc_14_0_x64", - toolchain_identifier = "vc_14_0_x64", -) - -cc_toolchain_config( - name = "vc_14_0_x64", - compiler = "cl", - cpu = "x64_windows_msvc", - disable_static_cc_toolchains = select({ - ":disable_static_cc_toolchains": True, - "//conditions:default": False, - }), -) - -toolchain( - name = "cc-toolchain-x64_windows_msvc", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ":msvc", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - toolchain = ":cc-compiler-x64_windows_msvc", - toolchain_type = "//cc:toolchain_type", -) - -filegroup( - name = "srcs", - srcs = glob(["**"]) + [ - "//cc/private/toolchain/runfiles:srcs", - ], -) - -filegroup( - name = "embedded_tools", - srcs = glob(["**"]) + [ - "//cc/private/toolchain/runfiles:embedded_tools", - ], -) - -filegroup( - name = "interface_library_builder", - srcs = ["build_interface_so"], -) - -filegroup( - name = "osx_wrapper", - srcs = ["osx_cc_wrapper.sh"], -) - -filegroup( - name = "link_dynamic_library", - srcs = ["link_dynamic_library.sh"], -) - -filegroup( - name = "lib_cc_configure", - srcs = ["lib_cc_configure.bzl"], -) - -compiler_flag(name = "compiler") - -cc_flags_supplier(name = "cc_flags") diff --git a/cc/private/toolchain/BUILD.empty b/cc/private/toolchain/BUILD.empty deleted file mode 100644 index be3c9f8..0000000 --- a/cc/private/toolchain/BUILD.empty +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2018 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. - -package(default_visibility = ["//visibility:public"]) - -load("@rules_cc//cc/private/toolchain:cc_toolchain_config.bzl", "cc_toolchain_config") - -cc_library( - name = "malloc", -) - -filegroup( - name = "empty", - srcs = [], -) - -cc_toolchain_suite( - name = "toolchain", - toolchains = { - "local|local": ":local", - "local": ":local", - }, -) - -cc_toolchain( - name = "local", - toolchain_identifier = "local", - toolchain_config = ":local_config", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", -) - -cc_toolchain_config( - name = "local_config", - cpu = "local", - compiler = "compiler", -) diff --git a/cc/private/toolchain/BUILD.static.freebsd b/cc/private/toolchain/BUILD.static.freebsd deleted file mode 100644 index a3efada..0000000 --- a/cc/private/toolchain/BUILD.static.freebsd +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright 2018 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. - -# This becomes the BUILD file for @local_config_cc// under FreeBSD. - -package(default_visibility = ["//visibility:public"]) - -load("@rules_cc//cc/private/toolchain:cc_toolchain_config.bzl", "cc_toolchain_config") - -cc_library( - name = "malloc", -) - -filegroup( - name = "empty", - srcs = [], -) - -# Hardcoded toolchain, legacy behaviour. -cc_toolchain_suite( - name = "toolchain", - toolchains = { - "armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a", - "freebsd|compiler": ":cc-compiler-freebsd", - "armeabi-v7a": ":cc-compiler-armeabi-v7a", - "freebsd": ":cc-compiler-freebsd", - }, -) - -cc_toolchain( - name = "cc-compiler-freebsd", - toolchain_identifier = "local_freebsd", - toolchain_config = ":local_freebsd", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, -) - -cc_toolchain_config( - name = "local_freebsd", - cpu = "freebsd", - compiler = "compiler", -) - -toolchain( - name = "cc-toolchain-freebsd", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:freebsd", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:freebsd", - ], - toolchain = ":cc-compiler-freebsd", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-armeabi-v7a", - toolchain_identifier = "stub_armeabi-v7a", - toolchain_config = ":stub_armeabi-v7a", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, -) - -cc_toolchain_config( - name = "stub_armeabi-v7a", - cpu = "armeabi-v7a", - compiler = "compiler", -) - -toolchain( - name = "cc-toolchain-armeabi-v7a", - exec_compatible_with = [ - "@platforms//cpu:arm", - ], - target_compatible_with = [ - "@platforms//cpu:arm", - "@platforms//os:android", - ], - toolchain = ":cc-compiler-armeabi-v7a", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -filegroup( - name = "link_dynamic_library", - srcs = ["link_dynamic_library.sh"], -) diff --git a/cc/private/toolchain/BUILD.toolchains.tpl b/cc/private/toolchain/BUILD.toolchains.tpl deleted file mode 100644 index e007309..0000000 --- a/cc/private/toolchain/BUILD.toolchains.tpl +++ /dev/null @@ -1,20 +0,0 @@ -load("@local_config_platform//:constraints.bzl", "HOST_CONSTRAINTS") -toolchain( - name = "cc-toolchain-%{name}", - exec_compatible_with = HOST_CONSTRAINTS, - target_compatible_with = HOST_CONSTRAINTS, - toolchain = "@local_config_cc//:cc-compiler-%{name}", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -toolchain( - name = "cc-toolchain-armeabi-v7a", - exec_compatible_with = HOST_CONSTRAINTS, - target_compatible_with = [ - "@platforms//cpu:arm", - "@platforms//os:android", - ], - toolchain = "@local_config_cc//:cc-compiler-armabi-v7a", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - diff --git a/cc/private/toolchain/BUILD.tpl b/cc/private/toolchain/BUILD.tpl deleted file mode 100644 index d40f7f5..0000000 --- a/cc/private/toolchain/BUILD.tpl +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright 2016 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. - -# This becomes the BUILD file for @local_config_cc// under non-FreeBSD unixes. - -package(default_visibility = ["//visibility:public"]) - -load(":cc_toolchain_config.bzl", "cc_toolchain_config") -load(":armeabi_cc_toolchain_config.bzl", "armeabi_cc_toolchain_config") -load("@rules_cc//cc:defs.bzl", "cc_toolchain", "cc_toolchain_suite") - -licenses(["notice"]) # Apache 2.0 - -cc_library( - name = "malloc", -) - -filegroup( - name = "empty", - srcs = [], -) - -filegroup( - name = "cc_wrapper", - srcs = ["cc_wrapper.sh"], -) - -filegroup( - name = "compiler_deps", - srcs = glob(["extra_tools/**"], allow_empty = True) + ["%{cc_compiler_deps}"], -) - -# This is the entry point for --crosstool_top. Toolchains are found -# by lopping off the name of --crosstool_top and searching for -# the "${CPU}" entry in the toolchains attribute. -cc_toolchain_suite( - name = "toolchain", - toolchains = { - "%{name}|%{compiler}": ":cc-compiler-%{name}", - "%{name}": ":cc-compiler-%{name}", - "armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a", - "armeabi-v7a": ":cc-compiler-armeabi-v7a", - }, -) - -cc_toolchain( - name = "cc-compiler-%{name}", - toolchain_identifier = "%{cc_toolchain_identifier}", - toolchain_config = ":%{cc_toolchain_identifier}", - all_files = ":compiler_deps", - ar_files = ":compiler_deps", - as_files = ":compiler_deps", - compiler_files = ":compiler_deps", - dwp_files = ":empty", - linker_files = ":compiler_deps", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = %{supports_param_files}, -) - -cc_toolchain_config( - name = "%{cc_toolchain_identifier}", - cpu = "%{target_cpu}", - compiler = "%{compiler}", - toolchain_identifier = "%{cc_toolchain_identifier}", - host_system_name = "%{host_system_name}", - 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}], - opt_compile_flags = [%{opt_compile_flags}], - dbg_compile_flags = [%{dbg_compile_flags}], - cxx_flags = [%{cxx_flags}], - link_flags = [%{link_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}, -) - -# Android tooling requires a default toolchain for the armeabi-v7a cpu. -cc_toolchain( - name = "cc-compiler-armeabi-v7a", - toolchain_identifier = "stub_armeabi-v7a", - toolchain_config = ":stub_armeabi-v7a", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, -) - -armeabi_cc_toolchain_config(name = "stub_armeabi-v7a") diff --git a/cc/private/toolchain/BUILD.windows.tpl b/cc/private/toolchain/BUILD.windows.tpl deleted file mode 100644 index 53076da..0000000 --- a/cc/private/toolchain/BUILD.windows.tpl +++ /dev/null @@ -1,232 +0,0 @@ -# Copyright 2018 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. - -# This becomes the BUILD file for @local_config_cc// under Windows. - -package(default_visibility = ["//visibility:public"]) - -load(":windows_cc_toolchain_config.bzl", "cc_toolchain_config") -load(":armeabi_cc_toolchain_config.bzl", "armeabi_cc_toolchain_config") -cc_library( - name = "malloc", -) - -filegroup( - name = "empty", - srcs = [], -) - -# Hardcoded toolchain, legacy behaviour. -cc_toolchain_suite( - name = "toolchain", - toolchains = { - "armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a", - "x64_windows|msvc-cl": ":cc-compiler-x64_windows", - "x64_windows|msys-gcc": ":cc-compiler-x64_windows_msys", - "x64_windows|mingw-gcc": ":cc-compiler-x64_windows_mingw", - "x64_windows_msys": ":cc-compiler-x64_windows_msys", - "x64_windows": ":cc-compiler-x64_windows", - "armeabi-v7a": ":cc-compiler-armeabi-v7a", - }, -) - -cc_toolchain( - name = "cc-compiler-x64_windows_msys", - toolchain_identifier = "msys_x64", - toolchain_config = ":msys_x64", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, -) - -cc_toolchain_config( - name = "msys_x64", - cpu = "x64_windows", - compiler = "msys-gcc", - host_system_name = "local", - target_system_name = "local", - target_libc = "msys", - abi_version = "local", - abi_libc_version = "local", - cxx_builtin_include_directories = [%{cxx_builtin_include_directories}], - tool_paths = {%{tool_paths}}, - tool_bin_path = "%{tool_bin_path}", - dbg_mode_debug_flag = "%{dbg_mode_debug_flag}", - fastbuild_mode_debug_flag = "%{fastbuild_mode_debug_flag}", -) - -toolchain( - name = "cc-toolchain-x64_windows_msys", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - "@rules_cc//cc/private/toolchain:msys", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - toolchain = ":cc-compiler-x64_windows_msys", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-x64_windows_mingw", - toolchain_identifier = "msys_x64_mingw", - toolchain_config = ":msys_x64_mingw", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, -) - -cc_toolchain_config( - name = "msys_x64_mingw", - cpu = "x64_windows", - compiler = "mingw-gcc", - host_system_name = "local", - target_system_name = "local", - target_libc = "mingw", - abi_version = "local", - abi_libc_version = "local", - tool_bin_path = "%{mingw_tool_bin_path}", - cxx_builtin_include_directories = [%{mingw_cxx_builtin_include_directories}], - tool_paths = {%{mingw_tool_paths}}, - dbg_mode_debug_flag = "%{dbg_mode_debug_flag}", - fastbuild_mode_debug_flag = "%{fastbuild_mode_debug_flag}", -) - -toolchain( - name = "cc-toolchain-x64_windows_mingw", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - "@rules_cc//cc/private/toolchain:mingw", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - toolchain = ":cc-compiler-x64_windows_mingw", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-x64_windows", - toolchain_identifier = "msvc_x64", - toolchain_config = ":msvc_x64", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, -) - -cc_toolchain_config( - name = "msvc_x64", - cpu = "x64_windows", - compiler = "msvc-cl", - host_system_name = "local", - target_system_name = "local", - target_libc = "msvcrt", - abi_version = "local", - abi_libc_version = "local", - toolchain_identifier = "msvc_x64", - msvc_env_tmp = "%{msvc_env_tmp}", - msvc_env_path = "%{msvc_env_path}", - msvc_env_include = "%{msvc_env_include}", - msvc_env_lib = "%{msvc_env_lib}", - msvc_cl_path = "%{msvc_cl_path}", - msvc_ml_path = "%{msvc_ml_path}", - msvc_link_path = "%{msvc_link_path}", - msvc_lib_path = "%{msvc_lib_path}", - cxx_builtin_include_directories = [%{msvc_cxx_builtin_include_directories}], - tool_paths = { - "ar": "%{msvc_lib_path}", - "ml": "%{msvc_ml_path}", - "cpp": "%{msvc_cl_path}", - "gcc": "%{msvc_cl_path}", - "gcov": "wrapper/bin/msvc_nop.bat", - "ld": "%{msvc_link_path}", - "nm": "wrapper/bin/msvc_nop.bat", - "objcopy": "wrapper/bin/msvc_nop.bat", - "objdump": "wrapper/bin/msvc_nop.bat", - "strip": "wrapper/bin/msvc_nop.bat", - }, - dbg_mode_debug_flag = "%{dbg_mode_debug_flag}", - fastbuild_mode_debug_flag = "%{fastbuild_mode_debug_flag}", -) - -toolchain( - name = "cc-toolchain-x64_windows", - exec_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:windows", - ], - toolchain = ":cc-compiler-x64_windows", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -cc_toolchain( - name = "cc-compiler-armeabi-v7a", - toolchain_identifier = "stub_armeabi-v7a", - toolchain_config = ":stub_armeabi-v7a", - all_files = ":empty", - ar_files = ":empty", - as_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 1, -) - -armeabi_cc_toolchain_config(name = "stub_armeabi-v7a") - -toolchain( - name = "cc-toolchain-armeabi-v7a", - exec_compatible_with = [ - ], - target_compatible_with = [ - "@platforms//cpu:arm", - "@platforms//os:android", - ], - toolchain = ":cc-compiler-armeabi-v7a", - toolchain_type = "@rules_cc//cc:toolchain_type", -) - -filegroup( - name = "link_dynamic_library", - srcs = ["link_dynamic_library.sh"], -) diff --git a/cc/private/toolchain/armeabi_cc_toolchain_config.bzl b/cc/private/toolchain/armeabi_cc_toolchain_config.bzl deleted file mode 100644 index c517c5d..0000000 --- a/cc/private/toolchain/armeabi_cc_toolchain_config.bzl +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2019 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. - -"""A Starlark cc_toolchain configuration rule""" - -load( - "//cc/private/toolchain:cc_toolchain_config_lib.bzl", - "feature", - "tool_path", -) - -def _impl(ctx): - toolchain_identifier = "stub_armeabi-v7a" - host_system_name = "armeabi-v7a" - target_system_name = "armeabi-v7a" - target_cpu = "armeabi-v7a" - target_libc = "armeabi-v7a" - compiler = "compiler" - abi_version = "armeabi-v7a" - abi_libc_version = "armeabi-v7a" - cc_target_os = None - builtin_sysroot = None - action_configs = [] - - supports_pic_feature = feature(name = "supports_pic", enabled = True) - supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True) - features = [supports_dynamic_linker_feature, supports_pic_feature] - - cxx_builtin_include_directories = [] - artifact_name_patterns = [] - make_variables = [] - - tool_paths = [ - tool_path(name = "ar", path = "/bin/false"), - tool_path(name = "compat-ld", path = "/bin/false"), - tool_path(name = "cpp", path = "/bin/false"), - tool_path(name = "dwp", path = "/bin/false"), - tool_path(name = "gcc", path = "/bin/false"), - tool_path(name = "gcov", path = "/bin/false"), - tool_path(name = "ld", path = "/bin/false"), - tool_path(name = "nm", path = "/bin/false"), - tool_path(name = "objcopy", path = "/bin/false"), - tool_path(name = "objdump", path = "/bin/false"), - tool_path(name = "strip", path = "/bin/false"), - ] - - return cc_common.create_cc_toolchain_config_info( - ctx = ctx, - features = features, - action_configs = action_configs, - artifact_name_patterns = artifact_name_patterns, - cxx_builtin_include_directories = cxx_builtin_include_directories, - toolchain_identifier = toolchain_identifier, - host_system_name = host_system_name, - target_system_name = target_system_name, - target_cpu = target_cpu, - target_libc = target_libc, - compiler = compiler, - abi_version = abi_version, - abi_libc_version = abi_libc_version, - tool_paths = tool_paths, - make_variables = make_variables, - builtin_sysroot = builtin_sysroot, - cc_target_os = cc_target_os, - ) - -armeabi_cc_toolchain_config = rule( - implementation = _impl, - attrs = {}, - provides = [CcToolchainConfigInfo], -) diff --git a/cc/private/toolchain/build_interface_so b/cc/private/toolchain/build_interface_so deleted file mode 100644 index 626e707..0000000 --- a/cc/private/toolchain/build_interface_so +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -if [[ $# != 2 ]]; then - echo "Usage: $0 " 1>&2 - exit 1 -fi - -exec cp $1 $2 diff --git a/cc/private/toolchain/cc_configure.bzl b/cc/private/toolchain/cc_configure.bzl deleted file mode 100644 index eb9c5a1..0000000 --- a/cc/private/toolchain/cc_configure.bzl +++ /dev/null @@ -1,173 +0,0 @@ -# Copyright 2016 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 for configuring the C++ toolchain (experimental).""" - -load("//cc/private/toolchain:windows_cc_configure.bzl", "configure_windows_toolchain") -load("//cc/private/toolchain:osx_cc_configure.bzl", "configure_osx_toolchain") -load("//cc/private/toolchain:unix_cc_configure.bzl", "configure_unix_toolchain") -load( - "//cc/private/toolchain:lib_cc_configure.bzl", - "get_cpu_value", - "resolve_labels", -) -load("@bazel_tools//tools/osx:xcode_configure.bzl", "run_xcode_locator") - -def _generate_cpp_only_build_file(repository_ctx, cpu_value, paths): - repository_ctx.template( - "BUILD", - paths["//cc/private/toolchain:BUILD.toolchains.tpl"], - {"%{name}": cpu_value}, - ) - -def cc_autoconf_toolchains_impl(repository_ctx): - """Generate BUILD file with 'toolchain' targets for the local host C++ toolchain. - - Args: - repository_ctx: repository context - """ - paths = resolve_labels(repository_ctx, [ - "//cc/private/toolchain:BUILD.toolchains.tpl", - "@bazel_tools//tools/osx/crosstool:BUILD.toolchains", - "@bazel_tools//tools/osx/crosstool:osx_archs.bzl", - "@bazel_tools//tools/osx:xcode_locator.m", - ]) - env = repository_ctx.os.environ - cpu_value = get_cpu_value(repository_ctx) - - # Should we try to find C++ toolchain at all? If not, we don't have to generate toolchains for C++ at all. - should_detect_cpp_toolchain = "BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN" not in env or env["BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN"] != "1" - - # Should we unconditionally *not* use xcode? If so, we don't have to run Xcode locator ever. - should_use_cpp_only_toolchain = "BAZEL_USE_CPP_ONLY_TOOLCHAIN" in env and env["BAZEL_USE_CPP_ONLY_TOOLCHAIN"] == "1" - - # Should we unconditionally use xcode? If so, we don't have to run Xcode locator now. - should_use_xcode = "BAZEL_USE_XCODE_TOOLCHAIN" in env and env["BAZEL_USE_XCODE_TOOLCHAIN"] == "1" - - if not should_detect_cpp_toolchain: - repository_ctx.file("BUILD", "# C++ toolchain autoconfiguration was disabled by BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN env variable.") - elif cpu_value == "darwin" and not should_use_cpp_only_toolchain: - xcode_toolchains = [] - - # Only detect xcode if the user didn't tell us it will be there. - if not should_use_xcode: - # TODO(#6926): Unify C++ and ObjC toolchains so we don't have to run xcode locator to generate toolchain targets. - # And also so we don't have to keep this code in sync with //cc/private/toolchain:osx_cc_configure.bzl. - (xcode_toolchains, _xcodeloc_err) = run_xcode_locator( - repository_ctx, - paths["@bazel_tools//tools/osx:xcode_locator.m"], - ) - - if should_use_xcode or xcode_toolchains: - repository_ctx.symlink(paths["@bazel_tools//tools/osx/crosstool:BUILD.toolchains"], "BUILD") - repository_ctx.symlink(paths["@bazel_tools//tools/osx/crosstool:osx_archs.bzl"], "osx_archs.bzl") - else: - _generate_cpp_only_build_file(repository_ctx, cpu_value, paths) - else: - _generate_cpp_only_build_file(repository_ctx, cpu_value, paths) - -cc_autoconf_toolchains = repository_rule( - environ = [ - "BAZEL_USE_CPP_ONLY_TOOLCHAIN", - "BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN", - ], - implementation = cc_autoconf_toolchains_impl, -) - -def cc_autoconf_impl(repository_ctx, overriden_tools = dict()): - """Generate BUILD file with 'cc_toolchain' targets for the local host C++ toolchain. - - Args: - repository_ctx: repository context - overriden_tools: dict of tool paths to use instead of autoconfigured tools - """ - paths = resolve_labels(repository_ctx, [ - "//cc/private/toolchain:BUILD.static.freebsd", - "//cc/private/toolchain:cc_toolchain_config.bzl", - ]) - - env = repository_ctx.os.environ - cpu_value = get_cpu_value(repository_ctx) - if "BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN" in env and env["BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN"] == "1": - repository_ctx.symlink(paths["//cc/private/toolchain:cc_toolchain_config.bzl"], "cc_toolchain_config.bzl") - repository_ctx.symlink(Label("//cc/private/toolchain:BUILD.empty"), "BUILD") - elif cpu_value == "freebsd": - # This is defaulting to the static crosstool, we should eventually - # autoconfigure this platform too. Theorically, FreeBSD should be - # straightforward to add but we cannot run it in a docker container so - # skipping until we have proper tests for FreeBSD. - repository_ctx.symlink(paths["//cc/private/toolchain:cc_toolchain_config.bzl"], "cc_toolchain_config.bzl") - repository_ctx.symlink(paths["//cc/private/toolchain:BUILD.static.freebsd"], "BUILD") - elif cpu_value == "x64_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) - elif (cpu_value == "darwin" and - ("BAZEL_USE_CPP_ONLY_TOOLCHAIN" not in env or env["BAZEL_USE_CPP_ONLY_TOOLCHAIN"] != "1")): - configure_osx_toolchain(repository_ctx, overriden_tools) - else: - configure_unix_toolchain(repository_ctx, cpu_value, overriden_tools) - -cc_autoconf = repository_rule( - environ = [ - "ABI_LIBC_VERSION", - "ABI_VERSION", - "BAZEL_COMPILER", - "BAZEL_HOST_SYSTEM", - "BAZEL_CXXOPTS", - "BAZEL_LINKOPTS", - "BAZEL_LINKLIBS", - "BAZEL_PYTHON", - "BAZEL_SH", - "BAZEL_TARGET_CPU", - "BAZEL_TARGET_LIBC", - "BAZEL_TARGET_SYSTEM", - "BAZEL_USE_CPP_ONLY_TOOLCHAIN", - "BAZEL_USE_XCODE_TOOLCHAIN", - "BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN", - "BAZEL_USE_LLVM_NATIVE_COVERAGE", - "BAZEL_VC", - "BAZEL_VC_FULL_VERSION", - "BAZEL_VS", - "BAZEL_WINSDK_FULL_VERSION", - "BAZEL_LLVM", - "USE_CLANG_CL", - "CC", - "CC_CONFIGURE_DEBUG", - "CC_TOOLCHAIN_NAME", - "CPLUS_INCLUDE_PATH", - "GCOV", - "HOMEBREW_RUBY_PATH", - "SYSTEMROOT", - "VS90COMNTOOLS", - "VS100COMNTOOLS", - "VS110COMNTOOLS", - "VS120COMNTOOLS", - "VS140COMNTOOLS", - "VS150COMNTOOLS", - "VS160COMNTOOLS", - "TMP", - "TEMP", - ], - implementation = cc_autoconf_impl, -) - -def cc_configure(): - """A C++ configuration rules that generate the crosstool file.""" - cc_autoconf_toolchains(name = "local_config_cc_toolchains") - cc_autoconf(name = "local_config_cc") - native.bind(name = "cc_toolchain", actual = "@local_config_cc//:toolchain") - native.register_toolchains( - # Use register_toolchain's target pattern expansion to register all toolchains in the package. - "@local_config_cc_toolchains//:all", - ) diff --git a/cc/private/toolchain/cc_toolchain_config.bzl b/cc/private/toolchain/cc_toolchain_config.bzl deleted file mode 100644 index f0a1fae..0000000 --- a/cc/private/toolchain/cc_toolchain_config.bzl +++ /dev/null @@ -1,1493 +0,0 @@ -# Copyright 2019 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. - -"""A Starlark cc_toolchain configuration rule""" - -load( - "//cc/private/toolchain:cc_toolchain_config_lib.bzl", - "action_config", - "artifact_name_pattern", - "env_entry", - "env_set", - "feature", - "feature_set", - "flag_group", - "flag_set", - "make_variable", - "tool", - "tool_path", - "variable_with_value", - "with_feature_set", -) -load( - "//cc:action_names.bzl", - _ASSEMBLE_ACTION_NAME = "ASSEMBLE_ACTION_NAME", - _CLIF_MATCH_ACTION_NAME = "CLIF_MATCH_ACTION_NAME", - _CPP_COMPILE_ACTION_NAME = "CPP_COMPILE_ACTION_NAME", - _CPP_HEADER_PARSING_ACTION_NAME = "CPP_HEADER_PARSING_ACTION_NAME", - _CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME = "CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME", - _CPP_LINK_EXECUTABLE_ACTION_NAME = "CPP_LINK_EXECUTABLE_ACTION_NAME", - _CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME = "CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME", - _CPP_LINK_STATIC_LIBRARY_ACTION_NAME = "CPP_LINK_STATIC_LIBRARY_ACTION_NAME", - _CPP_MODULE_CODEGEN_ACTION_NAME = "CPP_MODULE_CODEGEN_ACTION_NAME", - _CPP_MODULE_COMPILE_ACTION_NAME = "CPP_MODULE_COMPILE_ACTION_NAME", - _C_COMPILE_ACTION_NAME = "C_COMPILE_ACTION_NAME", - _LINKSTAMP_COMPILE_ACTION_NAME = "LINKSTAMP_COMPILE_ACTION_NAME", - _LTO_BACKEND_ACTION_NAME = "LTO_BACKEND_ACTION_NAME", - _LTO_INDEXING_ACTION_NAME = "LTO_INDEXING_ACTION_NAME", - _PREPROCESS_ASSEMBLE_ACTION_NAME = "PREPROCESS_ASSEMBLE_ACTION_NAME", - _STRIP_ACTION_NAME = "STRIP_ACTION_NAME", -) - -all_compile_actions = [ - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, -] - -all_cpp_compile_actions = [ - _CPP_COMPILE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, -] - -preprocessor_compile_actions = [ - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, -] - -codegen_compile_actions = [ - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, -] - -all_link_actions = [ - _CPP_LINK_EXECUTABLE_ACTION_NAME, - _CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME, - _CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME, -] - -def _impl(ctx): - if ctx.attr.disable_static_cc_toolchains: - fail("@rules_cc//cc/private/toolchain:default-toolchain, as well as the cc_toolchains it " + - "points to have been removed. See https://github.com/bazelbuild/bazel/issues/8546.") - - if (ctx.attr.cpu == "darwin"): - toolchain_identifier = "local_darwin" - elif (ctx.attr.cpu == "freebsd"): - toolchain_identifier = "local_freebsd" - elif (ctx.attr.cpu == "local"): - toolchain_identifier = "local_linux" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"): - toolchain_identifier = "local_windows_clang" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw"): - toolchain_identifier = "local_windows_mingw" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - toolchain_identifier = "local_windows_msys64" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - toolchain_identifier = "local_windows_msys64_mingw64" - elif (ctx.attr.cpu == "armeabi-v7a"): - toolchain_identifier = "stub_armeabi-v7a" - elif (ctx.attr.cpu == "x64_windows_msvc"): - toolchain_identifier = "vc_14_0_x64" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "armeabi-v7a"): - host_system_name = "armeabi-v7a" - elif (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows" or - ctx.attr.cpu == "x64_windows_msvc"): - host_system_name = "local" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "armeabi-v7a"): - target_system_name = "armeabi-v7a" - elif (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows" or - ctx.attr.cpu == "x64_windows_msvc"): - target_system_name = "local" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "armeabi-v7a"): - target_cpu = "armeabi-v7a" - elif (ctx.attr.cpu == "darwin"): - target_cpu = "darwin" - elif (ctx.attr.cpu == "freebsd"): - target_cpu = "freebsd" - elif (ctx.attr.cpu == "local"): - target_cpu = "local" - elif (ctx.attr.cpu == "x64_windows"): - target_cpu = "x64_windows" - elif (ctx.attr.cpu == "x64_windows_msvc"): - target_cpu = "x64_windows_msvc" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "armeabi-v7a"): - target_libc = "armeabi-v7a" - elif (ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows"): - target_libc = "local" - elif (ctx.attr.cpu == "darwin"): - target_libc = "macosx" - elif (ctx.attr.cpu == "x64_windows_msvc"): - target_libc = "msvcrt140" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "x64_windows_msvc"): - compiler = "cl" - elif (ctx.attr.cpu == "armeabi-v7a" or - ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local"): - compiler = "compiler" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"): - compiler = "windows_clang" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw"): - compiler = "windows_mingw" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - compiler = "windows_msys64" - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - compiler = "windows_msys64_mingw64" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "armeabi-v7a"): - abi_version = "armeabi-v7a" - elif (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows" or - ctx.attr.cpu == "x64_windows_msvc"): - abi_version = "local" - else: - fail("Unreachable") - - if (ctx.attr.cpu == "armeabi-v7a"): - abi_libc_version = "armeabi-v7a" - elif (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows" or - ctx.attr.cpu == "x64_windows_msvc"): - abi_libc_version = "local" - else: - fail("Unreachable") - - cc_target_os = None - - builtin_sysroot = None - - if (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local"): - objcopy_embed_data_action = action_config( - action_name = "objcopy_embed_data", - enabled = True, - tools = [tool(path = "/usr/bin/objcopy")], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"): - objcopy_embed_data_action = action_config( - action_name = "objcopy_embed_data", - enabled = True, - tools = [tool(path = "C:/Program Files (x86)/LLVM/bin/objcopy")], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw"): - objcopy_embed_data_action = action_config( - action_name = "objcopy_embed_data", - enabled = True, - tools = [tool(path = "C:/mingw/bin/objcopy")], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - objcopy_embed_data_action = action_config( - action_name = "objcopy_embed_data", - enabled = True, - tools = [tool(path = "C:/tools/msys64/mingw64/bin/objcopy")], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - objcopy_embed_data_action = action_config( - action_name = "objcopy_embed_data", - enabled = True, - tools = [tool(path = "C:/tools/msys64/usr/bin/objcopy")], - ) - - c_compile_action = action_config( - action_name = _C_COMPILE_ACTION_NAME, - implies = [ - "compiler_input_flags", - "compiler_output_flags", - "default_compile_flags", - "user_compile_flags", - "sysroot", - "unfiltered_compile_flags", - ], - tools = [tool(path = "wrapper/bin/msvc_cl.bat")], - ) - - cpp_compile_action = action_config( - action_name = _CPP_COMPILE_ACTION_NAME, - implies = [ - "compiler_input_flags", - "compiler_output_flags", - "default_compile_flags", - "user_compile_flags", - "sysroot", - "unfiltered_compile_flags", - ], - tools = [tool(path = "wrapper/bin/msvc_cl.bat")], - ) - - if (ctx.attr.cpu == "armeabi-v7a"): - action_configs = [] - elif (ctx.attr.cpu == "x64_windows_msvc"): - action_configs = [c_compile_action, cpp_compile_action] - elif (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows"): - action_configs = [objcopy_embed_data_action] - else: - fail("Unreachable") - - random_seed_feature = feature(name = "random_seed", enabled = True) - - compiler_output_flags_feature = feature( - name = "compiler_output_flags", - flag_sets = [ - flag_set( - actions = [_ASSEMBLE_ACTION_NAME], - flag_groups = [ - flag_group( - flags = ["/Fo%{output_file}", "/Zi"], - expand_if_available = "output_file", - expand_if_not_available = "output_assembly_file", - ), - ], - ), - flag_set( - actions = [ - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/Fo%{output_file}"], - expand_if_available = "output_file", - expand_if_not_available = "output_assembly_file", - ), - flag_group( - flags = ["/Fa%{output_file}"], - expand_if_available = "output_file", - ), - flag_group( - flags = ["/P", "/Fi%{output_file}"], - expand_if_available = "output_file", - ), - ], - ), - ], - ) - - if (ctx.attr.cpu == "local"): - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = [ - "-lstdc++", - "-Wl,-z,relro,-z,now", - "-no-canonical-prefixes", - "-pass-exit-codes", - ], - ), - ], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["-Wl,--gc-sections"])], - with_features = [with_feature_set(features = ["opt"])], - ), - ], - ) - elif (ctx.attr.cpu == "freebsd"): - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = [ - "-lstdc++", - "-Wl,-z,relro,-z,now", - "-no-canonical-prefixes", - ], - ), - ], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["-Wl,--gc-sections"])], - with_features = [with_feature_set(features = ["opt"])], - ), - ], - ) - elif (ctx.attr.cpu == "darwin"): - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = [ - "-lstdc++", - "-undefined", - "dynamic_lookup", - "-headerpad_max_install_names", - "-no-canonical-prefixes", - ], - ), - ], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["-lstdc++"])], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows_msvc"): - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["-m64"])], - ), - ], - ) - - if (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd"): - unfiltered_compile_flags_feature = feature( - name = "unfiltered_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-no-canonical-prefixes", - "-Wno-builtin-macro-redefined", - "-D__DATE__=\"redacted\"", - "-D__TIMESTAMP__=\"redacted\"", - "-D__TIME__=\"redacted\"", - ], - ), - ], - ), - ], - ) - elif (ctx.attr.cpu == "local"): - unfiltered_compile_flags_feature = feature( - name = "unfiltered_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-no-canonical-prefixes", - "-fno-canonical-system-headers", - "-Wno-builtin-macro-redefined", - "-D__DATE__=\"redacted\"", - "-D__TIMESTAMP__=\"redacted\"", - "-D__TIME__=\"redacted\"", - ], - ), - ], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows_msvc"): - unfiltered_compile_flags_feature = feature( - name = "unfiltered_compile_flags", - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["%{unfiltered_compile_flags}"], - iterate_over = "unfiltered_compile_flags", - expand_if_available = "unfiltered_compile_flags", - ), - ], - ), - ], - ) - - supports_pic_feature = feature(name = "supports_pic", enabled = True) - - if (ctx.attr.cpu == "darwin"): - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-D_FORTIFY_SOURCE=1", - "-fstack-protector", - "-fcolor-diagnostics", - "-Wall", - "-Wthread-safety", - "-Wself-assign", - "-fno-omit-frame-pointer", - ], - ), - ], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-g"])], - with_features = [with_feature_set(features = ["dbg"])], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-g0", - "-O2", - "-DNDEBUG", - "-ffunction-sections", - "-fdata-sections", - ], - ), - ], - with_features = [with_feature_set(features = ["opt"])], - ), - flag_set( - actions = [ - _LINKSTAMP_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-std=c++0x"])], - ), - ], - ) - elif (ctx.attr.cpu == "local"): - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-U_FORTIFY_SOURCE", - "-D_FORTIFY_SOURCE=1", - "-fstack-protector", - "-Wall", - "-Wunused-but-set-parameter", - "-Wno-free-nonheap-object", - "-fno-omit-frame-pointer", - ], - ), - ], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-g"])], - with_features = [with_feature_set(features = ["dbg"])], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-g0", - "-O2", - "-DNDEBUG", - "-ffunction-sections", - "-fdata-sections", - ], - ), - ], - with_features = [with_feature_set(features = ["opt"])], - ), - flag_set( - actions = [ - _LINKSTAMP_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-std=c++0x"])], - ), - ], - ) - elif (ctx.attr.cpu == "freebsd"): - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-U_FORTIFY_SOURCE", - "-D_FORTIFY_SOURCE=1", - "-fstack-protector", - "-Wall", - "-fno-omit-frame-pointer", - ], - ), - ], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-g"])], - with_features = [with_feature_set(features = ["dbg"])], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-g0", - "-O2", - "-DNDEBUG", - "-ffunction-sections", - "-fdata-sections", - ], - ), - ], - with_features = [with_feature_set(features = ["opt"])], - ), - flag_set( - actions = [ - _LINKSTAMP_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-std=c++0x"])], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows_msvc"): - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = [ - "-m64", - "/D__inline__=__inline", - "/DCOMPILER_MSVC", - "/DNOGDI", - "/DNOMINMAX", - "/DPRAGMA_SUPPORTED", - "/D_WIN32_WINNT=0x0601", - "/D_CRT_SECURE_NO_DEPRECATE", - "/D_CRT_SECURE_NO_WARNINGS", - "/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS", - "/D_USE_MATH_DEFINES", - "/nologo", - "/bigobj", - "/Zm500", - "/J", - "/Gy", - "/GF", - "/W3", - "/EHsc", - "/wd4351", - "/wd4291", - "/wd4250", - "/wd4996", - ], - ), - ], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/DDEBUG=1", "-g", "/Od", "-Xcompilation-mode=dbg"], - ), - ], - with_features = [with_feature_set(features = ["dbg"])], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/DNDEBUG", "/Od", "-Xcompilation-mode=fastbuild"], - ), - ], - with_features = [with_feature_set(features = ["fastbuild"])], - ), - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/DNDEBUG", "/O2", "-Xcompilation-mode=opt"], - ), - ], - with_features = [with_feature_set(features = ["opt"])], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang" or - ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw" or - ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _LINKSTAMP_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-std=c++0x"])], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _LINKSTAMP_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [flag_group(flags = ["-std=gnu++0x"])], - ), - ], - ) - - opt_feature = feature(name = "opt") - - supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True) - - objcopy_embed_flags_feature = feature( - name = "objcopy_embed_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = ["objcopy_embed_data"], - flag_groups = [flag_group(flags = ["-I", "binary"])], - ), - ], - ) - - dbg_feature = feature(name = "dbg") - - if (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local"): - user_compile_flags_feature = feature( - name = "user_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["%{user_compile_flags}"], - iterate_over = "user_compile_flags", - expand_if_available = "user_compile_flags", - ), - ], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows_msvc"): - user_compile_flags_feature = feature( - name = "user_compile_flags", - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["%{user_compile_flags}"], - iterate_over = "user_compile_flags", - expand_if_available = "user_compile_flags", - ), - ], - ), - ], - ) - - if (ctx.attr.cpu == "darwin" or - ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local"): - sysroot_feature = feature( - name = "sysroot", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _LINKSTAMP_COMPILE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _LTO_BACKEND_ACTION_NAME, - _CLIF_MATCH_ACTION_NAME, - _CPP_LINK_EXECUTABLE_ACTION_NAME, - _CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME, - _CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["--sysroot=%{sysroot}"], - expand_if_available = "sysroot", - ), - ], - ), - ], - ) - elif (ctx.attr.cpu == "x64_windows_msvc"): - sysroot_feature = feature( - name = "sysroot", - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - _CPP_LINK_EXECUTABLE_ACTION_NAME, - _CPP_LINK_DYNAMIC_LIBRARY_ACTION_NAME, - _CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["--sysroot=%{sysroot}"], - iterate_over = "sysroot", - expand_if_available = "sysroot", - ), - ], - ), - ], - ) - - include_paths_feature = feature( - name = "include_paths", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/I%{quote_include_paths}"], - iterate_over = "quote_include_paths", - ), - flag_group( - flags = ["/I%{include_paths}"], - iterate_over = "include_paths", - ), - flag_group( - flags = ["/I%{system_include_paths}"], - iterate_over = "system_include_paths", - ), - ], - ), - ], - ) - - dependency_file_feature = feature( - name = "dependency_file", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/DEPENDENCY_FILE", "%{dependency_file}"], - expand_if_available = "dependency_file", - ), - ], - ), - ], - ) - - compiler_input_flags_feature = feature( - name = "compiler_input_flags", - flag_sets = [ - flag_set( - actions = [ - _ASSEMBLE_ACTION_NAME, - _PREPROCESS_ASSEMBLE_ACTION_NAME, - _C_COMPILE_ACTION_NAME, - _CPP_COMPILE_ACTION_NAME, - _CPP_HEADER_PARSING_ACTION_NAME, - _CPP_MODULE_COMPILE_ACTION_NAME, - _CPP_MODULE_CODEGEN_ACTION_NAME, - ], - flag_groups = [ - flag_group( - flags = ["/c", "%{source_file}"], - expand_if_available = "source_file", - ), - ], - ), - ], - ) - - fastbuild_feature = feature(name = "fastbuild") - - if (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - features = [ - default_compile_flags_feature, - default_link_flags_feature, - supports_dynamic_linker_feature, - objcopy_embed_flags_feature, - ] - elif (ctx.attr.cpu == "darwin"): - features = [ - default_compile_flags_feature, - default_link_flags_feature, - supports_dynamic_linker_feature, - supports_pic_feature, - objcopy_embed_flags_feature, - dbg_feature, - opt_feature, - user_compile_flags_feature, - sysroot_feature, - unfiltered_compile_flags_feature, - ] - elif (ctx.attr.cpu == "freebsd" or - ctx.attr.cpu == "local"): - features = [ - default_compile_flags_feature, - default_link_flags_feature, - supports_dynamic_linker_feature, - supports_pic_feature, - objcopy_embed_flags_feature, - opt_feature, - dbg_feature, - user_compile_flags_feature, - sysroot_feature, - unfiltered_compile_flags_feature, - ] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang" or - ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw" or - ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - features = [ - default_compile_flags_feature, - supports_dynamic_linker_feature, - objcopy_embed_flags_feature, - ] - elif (ctx.attr.cpu == "x64_windows_msvc"): - features = [ - default_link_flags_feature, - random_seed_feature, - default_compile_flags_feature, - include_paths_feature, - dependency_file_feature, - user_compile_flags_feature, - sysroot_feature, - unfiltered_compile_flags_feature, - compiler_output_flags_feature, - compiler_input_flags_feature, - dbg_feature, - fastbuild_feature, - opt_feature, - ] - elif (ctx.attr.cpu == "armeabi-v7a"): - features = [supports_dynamic_linker_feature, supports_pic_feature] - - if (ctx.attr.cpu == "armeabi-v7a"): - cxx_builtin_include_directories = [] - elif (ctx.attr.cpu == "darwin"): - cxx_builtin_include_directories = ["/"] - elif (ctx.attr.cpu == "freebsd"): - cxx_builtin_include_directories = ["/usr/lib/clang", "/usr/local/include", "/usr/include"] - elif (ctx.attr.cpu == "local" or - ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"): - cxx_builtin_include_directories = ["/usr/lib/gcc/", "/usr/local/include", "/usr/include"] - elif (ctx.attr.cpu == "x64_windows_msvc"): - cxx_builtin_include_directories = [ - "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE", - "C:/Program Files (x86)/Windows Kits/10/include/", - "C:/Program Files (x86)/Windows Kits/8.1/include/", - "C:/Program Files (x86)/GnuWin32/include/", - "C:/python_27_amd64/files/include", - ] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw"): - cxx_builtin_include_directories = ["C:/mingw/include", "C:/mingw/lib/gcc"] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - cxx_builtin_include_directories = ["C:/tools/msys64/mingw64/x86_64-w64-mingw32/include"] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - cxx_builtin_include_directories = ["C:/tools/msys64/", "/usr/"] - else: - fail("Unreachable") - - artifact_name_patterns = [] - - make_variables = [] - - if (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64_mingw64"): - tool_paths = [ - tool_path( - name = "ar", - path = "C:/tools/msys64/mingw64/bin/ar", - ), - tool_path( - name = "compat-ld", - path = "C:/tools/msys64/mingw64/bin/ld", - ), - tool_path( - name = "cpp", - path = "C:/tools/msys64/mingw64/bin/cpp", - ), - tool_path( - name = "dwp", - path = "C:/tools/msys64/mingw64/bin/dwp", - ), - tool_path( - name = "gcc", - path = "C:/tools/msys64/mingw64/bin/gcc", - ), - tool_path( - name = "gcov", - path = "C:/tools/msys64/mingw64/bin/gcov", - ), - tool_path( - name = "ld", - path = "C:/tools/msys64/mingw64/bin/ld", - ), - tool_path( - name = "nm", - path = "C:/tools/msys64/mingw64/bin/nm", - ), - tool_path( - name = "objcopy", - path = "C:/tools/msys64/mingw64/bin/objcopy", - ), - tool_path( - name = "objdump", - path = "C:/tools/msys64/mingw64/bin/objdump", - ), - tool_path( - name = "strip", - path = "C:/tools/msys64/mingw64/bin/strip", - ), - ] - elif (ctx.attr.cpu == "armeabi-v7a"): - tool_paths = [ - tool_path(name = "ar", path = "/bin/false"), - tool_path(name = "compat-ld", path = "/bin/false"), - tool_path(name = "cpp", path = "/bin/false"), - tool_path(name = "dwp", path = "/bin/false"), - tool_path(name = "gcc", path = "/bin/false"), - tool_path(name = "gcov", path = "/bin/false"), - tool_path(name = "ld", path = "/bin/false"), - tool_path(name = "nm", path = "/bin/false"), - tool_path(name = "objcopy", path = "/bin/false"), - tool_path(name = "objdump", path = "/bin/false"), - tool_path(name = "strip", path = "/bin/false"), - ] - elif (ctx.attr.cpu == "freebsd"): - tool_paths = [ - tool_path(name = "ar", path = "/usr/bin/ar"), - tool_path(name = "compat-ld", path = "/usr/bin/ld"), - tool_path(name = "cpp", path = "/usr/bin/cpp"), - tool_path(name = "dwp", path = "/usr/bin/dwp"), - tool_path(name = "gcc", path = "/usr/bin/clang"), - tool_path(name = "gcov", path = "/usr/bin/gcov"), - tool_path(name = "ld", path = "/usr/bin/ld"), - tool_path(name = "nm", path = "/usr/bin/nm"), - tool_path(name = "objcopy", path = "/usr/bin/objcopy"), - tool_path(name = "objdump", path = "/usr/bin/objdump"), - tool_path(name = "strip", path = "/usr/bin/strip"), - ] - elif (ctx.attr.cpu == "local"): - tool_paths = [ - tool_path(name = "ar", path = "/usr/bin/ar"), - tool_path(name = "compat-ld", path = "/usr/bin/ld"), - tool_path(name = "cpp", path = "/usr/bin/cpp"), - tool_path(name = "dwp", path = "/usr/bin/dwp"), - tool_path(name = "gcc", path = "/usr/bin/gcc"), - tool_path(name = "gcov", path = "/usr/bin/gcov"), - tool_path(name = "ld", path = "/usr/bin/ld"), - tool_path(name = "nm", path = "/usr/bin/nm"), - tool_path(name = "objcopy", path = "/usr/bin/objcopy"), - tool_path(name = "objdump", path = "/usr/bin/objdump"), - tool_path(name = "strip", path = "/usr/bin/strip"), - ] - elif (ctx.attr.cpu == "darwin"): - tool_paths = [ - tool_path(name = "ar", path = "/usr/bin/libtool"), - tool_path(name = "compat-ld", path = "/usr/bin/ld"), - tool_path(name = "cpp", path = "/usr/bin/cpp"), - tool_path(name = "dwp", path = "/usr/bin/dwp"), - tool_path(name = "gcc", path = "osx_cc_wrapper.sh"), - tool_path(name = "gcov", path = "/usr/bin/gcov"), - tool_path(name = "ld", path = "/usr/bin/ld"), - tool_path(name = "nm", path = "/usr/bin/nm"), - tool_path(name = "objcopy", path = "/usr/bin/objcopy"), - tool_path(name = "objdump", path = "/usr/bin/objdump"), - tool_path(name = "strip", path = "/usr/bin/strip"), - ] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"): - tool_paths = [ - tool_path(name = "ar", path = "C:/mingw/bin/ar"), - tool_path( - name = "compat-ld", - path = "C:/Program Files (x86)/LLVM/bin/ld", - ), - tool_path( - name = "cpp", - path = "C:/Program Files (x86)/LLVM/bin/cpp", - ), - tool_path( - name = "dwp", - path = "C:/Program Files (x86)/LLVM/bin/dwp", - ), - tool_path( - name = "gcc", - path = "C:/Program Files (x86)/LLVM/bin/clang", - ), - tool_path( - name = "gcov", - path = "C:/Program Files (x86)/LLVM/bin/gcov", - ), - tool_path( - name = "ld", - path = "C:/Program Files (x86)/LLVM/bin/ld", - ), - tool_path( - name = "nm", - path = "C:/Program Files (x86)/LLVM/bin/nm", - ), - tool_path( - name = "objcopy", - path = "C:/Program Files (x86)/LLVM/bin/objcopy", - ), - tool_path( - name = "objdump", - path = "C:/Program Files (x86)/LLVM/bin/objdump", - ), - tool_path( - name = "strip", - path = "C:/Program Files (x86)/LLVM/bin/strip", - ), - ] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_mingw"): - tool_paths = [ - tool_path(name = "ar", path = "C:/mingw/bin/ar"), - tool_path(name = "compat-ld", path = "C:/mingw/bin/ld"), - tool_path(name = "cpp", path = "C:/mingw/bin/cpp"), - tool_path(name = "dwp", path = "C:/mingw/bin/dwp"), - tool_path(name = "gcc", path = "C:/mingw/bin/gcc"), - tool_path(name = "gcov", path = "C:/mingw/bin/gcov"), - tool_path(name = "ld", path = "C:/mingw/bin/ld"), - tool_path(name = "nm", path = "C:/mingw/bin/nm"), - tool_path(name = "objcopy", path = "C:/mingw/bin/objcopy"), - tool_path(name = "objdump", path = "C:/mingw/bin/objdump"), - tool_path(name = "strip", path = "C:/mingw/bin/strip"), - ] - elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_msys64"): - tool_paths = [ - tool_path(name = "ar", path = "C:/tools/msys64/usr/bin/ar"), - tool_path( - name = "compat-ld", - path = "C:/tools/msys64/usr/bin/ld", - ), - tool_path( - name = "cpp", - path = "C:/tools/msys64/usr/bin/cpp", - ), - tool_path( - name = "dwp", - path = "C:/tools/msys64/usr/bin/dwp", - ), - tool_path( - name = "gcc", - path = "C:/tools/msys64/usr/bin/gcc", - ), - tool_path( - name = "gcov", - path = "C:/tools/msys64/usr/bin/gcov", - ), - tool_path(name = "ld", path = "C:/tools/msys64/usr/bin/ld"), - tool_path(name = "nm", path = "C:/tools/msys64/usr/bin/nm"), - tool_path( - name = "objcopy", - path = "C:/tools/msys64/usr/bin/objcopy", - ), - tool_path( - name = "objdump", - path = "C:/tools/msys64/usr/bin/objdump", - ), - tool_path( - name = "strip", - path = "C:/tools/msys64/usr/bin/strip", - ), - ] - elif (ctx.attr.cpu == "x64_windows_msvc"): - tool_paths = [ - tool_path(name = "ar", path = "wrapper/bin/msvc_link.bat"), - tool_path(name = "cpp", path = "wrapper/bin/msvc_cl.bat"), - tool_path(name = "gcc", path = "wrapper/bin/msvc_cl.bat"), - tool_path(name = "gcov", path = "wrapper/bin/msvc_nop.bat"), - tool_path(name = "ld", path = "wrapper/bin/msvc_link.bat"), - 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") - - 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, - action_configs = action_configs, - artifact_name_patterns = artifact_name_patterns, - cxx_builtin_include_directories = cxx_builtin_include_directories, - toolchain_identifier = toolchain_identifier, - host_system_name = host_system_name, - target_system_name = target_system_name, - target_cpu = target_cpu, - target_libc = target_libc, - compiler = compiler, - abi_version = abi_version, - abi_libc_version = abi_libc_version, - tool_paths = tool_paths, - make_variables = make_variables, - builtin_sysroot = builtin_sysroot, - cc_target_os = cc_target_os, - ), - DefaultInfo( - executable = out, - ), - ] - -cc_toolchain_config = rule( - implementation = _impl, - attrs = { - "cpu": attr.string(mandatory = True), - "compiler": attr.string(), - "disable_static_cc_toolchains": attr.bool(), - }, - provides = [CcToolchainConfigInfo], - executable = True, -) diff --git a/cc/private/toolchain/cc_toolchain_config_lib.bzl b/cc/private/toolchain/cc_toolchain_config_lib.bzl deleted file mode 100644 index 48a855b..0000000 --- a/cc/private/toolchain/cc_toolchain_config_lib.bzl +++ /dev/null @@ -1,542 +0,0 @@ -# Copyright 2018 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. - -""" A library of functions creating structs for CcToolchainConfigInfo.""" - -def _check_is_none_or_right_type(obj, obj_of_right_type, parameter_name, method_name): - if obj != None: - _check_right_type(obj, obj_of_right_type, parameter_name, method_name) - -def _check_right_type(obj, obj_of_right_type, parameter_name, method_name): - if type(obj) != type(obj_of_right_type): - fail("{} parameter of {} should be a {}, found {}." - .format(parameter_name, method_name, type(obj_of_right_type), type(obj))) - -def _check_is_nonempty_string(obj, parameter_name, method_name): - _check_right_type(obj, "", parameter_name, method_name) - if obj == "": - fail("{} parameter of {} must be a nonempty string." - .format(parameter_name, method_name)) - -def _check_is_nonempty_list(obj, parameter_name, method_name): - _check_right_type(obj, [], parameter_name, method_name) - if len(obj) == 0: - fail("{} parameter of {} must be a nonempty list." - .format(parameter_name, method_name)) - -EnvEntryInfo = provider(fields = ["key", "value", "type_name"]) - -def env_entry(key, value): - """ A key/value pair to be added as an environment variable. - - The returned EnvEntry provider finds its use in EnvSet creation through - the env_entries parameter of env_set(); EnvSet groups environment variables - that need to be expanded for specific actions. - The value of this pair is expanded in the same way as is described in - flag_group. The key remains an unexpanded string literal. - - Args: - key: a string literal representing the name of the variable. - value: the value to be expanded. - - Returns: - An EnvEntryInfo provider. - """ - _check_is_nonempty_string(key, "key", "env_entry") - _check_is_nonempty_string(value, "value", "env_entry") - return EnvEntryInfo(key = key, value = value, type_name = "env_entry") - -VariableWithValueInfo = provider(fields = ["name", "value", "type_name"]) - -def variable_with_value(name, value): - """ Represents equality check between a variable and a certain value. - - The returned provider finds its use through flag_group.expand_if_equal, - making the expansion of the flag_group conditional on the value of the - variable. - - Args: - name: name of the variable. - value: the value the variable should be compared against. - - Returns: - A VariableWithValueInfo provider. - """ - _check_is_nonempty_string(name, "name", "variable_with_value") - _check_is_nonempty_string(value, "value", "variable_with_value") - return VariableWithValueInfo( - name = name, - value = value, - type_name = "variable_with_value", - ) - -MakeVariableInfo = provider(fields = ["name", "value", "type_name"]) - -def make_variable(name, value): - """ A make variable that is made accessible to rules.""" - _check_is_nonempty_string(name, "name", "make_variable") - _check_is_nonempty_string(value, "value", "make_variable") - return MakeVariableInfo( - name = name, - value = value, - type_name = "make_variable", - ) - -FeatureSetInfo = provider(fields = ["features", "type_name"]) - -def feature_set(features = []): - """ A set of features. - - Used to support logical 'and' when specifying feature requirements in a - feature. - - Args: - features: A list of unordered feature names. - - Returns: - A FeatureSetInfo provider. - """ - _check_right_type(features, [], "features", "feature_set") - return FeatureSetInfo(features = features, type_name = "feature_set") - -WithFeatureSetInfo = provider(fields = ["features", "not_features", "type_name"]) - -def with_feature_set(features = [], not_features = []): - """ A set of positive and negative features. - - This stanza will evaluate to true when every 'feature' is enabled, and - every 'not_feature' is not enabled. - - Args: - features: A list of feature names that need to be enabled. - not_features: A list of feature names that need to not be enabled. - - Returns: - A WithFeatureSetInfo provider. - """ - _check_right_type(features, [], "features", "with_feature_set") - _check_right_type(not_features, [], "not_features", "with_feature_set") - return WithFeatureSetInfo( - features = features, - not_features = not_features, - type_name = "with_feature_set", - ) - -EnvSetInfo = provider(fields = ["actions", "env_entries", "with_features", "type_name"]) - -def env_set(actions, env_entries = [], with_features = []): - """ Groups a set of environment variables to apply for certain actions. - - EnvSet providers are passed to feature() and action_config(), to be applied to - the actions they are specified for. - - Args: - actions: A list of actions this env set applies to; each env set must - specify at least one action. - env_entries: A list of EnvEntry - the environment variables applied - via this env set. - with_features: A list of feature sets defining when this env set gets - applied. The env set will be applied when any one of the feature - sets evaluate to true. (That is, when when every 'feature' is - enabled, and every 'not_feature' is not enabled.) - If 'with_features' is omitted, the env set will be applied - unconditionally for every action specified. - - Returns: - An EnvSetInfo provider. - """ - _check_is_nonempty_list(actions, "actions", "env_set") - _check_right_type(env_entries, [], "env_entries", "env_set") - _check_right_type(with_features, [], "with_features", "env_set") - return EnvSetInfo( - actions = actions, - env_entries = env_entries, - with_features = with_features, - type_name = "env_set", - ) - -FlagGroupInfo = provider(fields = [ - "flags", - "flag_groups", - "iterate_over", - "expand_if_available", - "expand_if_not_available", - "expand_if_true", - "expand_if_false", - "expand_if_equal", - "type_name", -]) - -def flag_group( - flags = [], - flag_groups = [], - iterate_over = None, - expand_if_available = None, - expand_if_not_available = None, - expand_if_true = None, - expand_if_false = None, - expand_if_equal = None): - """ A group of flags. Supports parametrization via variable expansion. - - To expand a variable of list type, flag_group has to be annotated with - `iterate_over` message. Then all nested flags or flag_groups will be - expanded repeatedly for each element of the list. - For example: - flag_group( - iterate_over = 'include_path', - flags = ['-I', '%{include_path}'], - ) - ... will get expanded to -I /to/path1 -I /to/path2 ... for each - include_path /to/pathN. - - To expand a variable of structure type, use dot-notation, e.g.: - flag_group( - iterate_over = "libraries_to_link", - flag_groups = [ - flag_group( - iterate_over = "libraries_to_link.libraries", - flags = ["-L%{libraries_to_link.libraries.directory}"], - ) - ] - ) - - Flag groups can be nested; if they are, the flag group must only contain - other flag groups (no flags) so the order is unambiguously specified. - In order to expand a variable of nested lists, 'iterate_over' can be used. - For example: - flag_group ( - iterate_over = 'object_files', - flag_groups = [ - flag_group ( - flags = ['--start-lib'], - ), - flag_group ( - iterate_over = 'object_files', - flags = ['%{object_files}'], - ), - flag_group ( - flags = ['--end-lib'], - ) - ] - ) - ... will get expanded to - --start-lib a1.o a2.o ... --end-lib --start-lib b1.o b2.o .. --end-lib - with %{object_files} being a variable of nested list type - [['a1.o', 'a2.o', ...], ['b1.o', 'b2.o', ...], ...]. - - Args: - flags: a string list, representing flags. Only one of flags and - flag_groups can be set, as to avoid ambiguity. - flag_groups: a list of FlagGroup entries. Only one of flags and - flag_groups can be set, as to avoid ambiguity. - iterate_over: a string, representing a variable of list type. - expand_if_available: A build variable that needs to be available - in order to expand the flag_group. - expand_if_not_available: A build variable that needs to be - unavailable in order for this flag_group to be expanded. - expand_if_true: if set, this variable needs to evaluate to True in - order for the flag_group to be expanded. - expand_if_false: if set, this variable needs to evalate to False in - order for the flag_group to be expanded. - expand_if_equal: a VariableWithValue, the flag_group is expanded in - case of equality. - - Returns: - A FlagGroupInfo provider. - """ - - _check_right_type(flags, [], "flags", "flag_group") - _check_right_type(flag_groups, [], "flag_groups", "flag_group") - if len(flags) > 0 and len(flag_groups) > 0: - fail("flag_group must not contain both a flag and another flag_group.") - if len(flags) == 0 and len(flag_groups) == 0: - fail("flag_group must contain either a list of flags or a list of flag_groups.") - _check_is_none_or_right_type(expand_if_true, "string", "expand_if_true", "flag_group") - _check_is_none_or_right_type(expand_if_false, "string", "expand_if_false", "flag_group") - _check_is_none_or_right_type(expand_if_available, "string", "expand_if_available", "flag_group") - _check_is_none_or_right_type( - expand_if_not_available, - "string", - "expand_if_not_available", - "flag_group", - ) - _check_is_none_or_right_type(iterate_over, "string", "iterate_over", "flag_group") - - return FlagGroupInfo( - flags = flags, - flag_groups = flag_groups, - iterate_over = iterate_over, - expand_if_available = expand_if_available, - expand_if_not_available = expand_if_not_available, - expand_if_true = expand_if_true, - expand_if_false = expand_if_false, - expand_if_equal = expand_if_equal, - type_name = "flag_group", - ) - -FlagSetInfo = provider(fields = [ - "actions", - "with_features", - "flag_groups", - "type_name", -]) - -def flag_set( - actions = [], - with_features = [], - flag_groups = []): - """ A set of flags to be expanded in the command line for specific actions. - - Args: - actions: The actions this flag set applies to; each flag set must - specify at least one action. - with_features: A list of feature sets defining when this flag set gets - applied. The flag set will be applied when any one of the feature - sets evaluate to true. (That is, when when every 'feature' is - enabled, and every 'not_feature' is not enabled.) - If 'with_feature' is omitted, the flag set will be applied - unconditionally for every action specified. - flag_groups: A FlagGroup list - the flags applied via this flag set. - - Returns: - A FlagSetInfo provider. - """ - _check_right_type(actions, [], "actions", "flag_set") - _check_right_type(with_features, [], "with_features", "flag_set") - _check_right_type(flag_groups, [], "flag_groups", "flag_set") - return FlagSetInfo( - actions = actions, - with_features = with_features, - flag_groups = flag_groups, - type_name = "flag_set", - ) - -FeatureInfo = provider(fields = [ - "name", - "enabled", - "flag_sets", - "env_sets", - "requires", - "implies", - "provides", - "type_name", -]) - -def feature( - name, - enabled = False, - flag_sets = [], - env_sets = [], - requires = [], - implies = [], - provides = []): - """ Contains all flag specifications for one feature. - - Args: - name: The feature's name. It is possible to introduce a feature without - a change to Bazel by adding a 'feature' section to the toolchain - and adding the corresponding string as feature in the BUILD file. - enabled: If 'True', this feature is enabled unless a rule type - explicitly marks it as unsupported. - flag_sets: A FlagSet list - If the given feature is enabled, the flag - sets will be applied for the actions are specified for. - env_sets: an EnvSet list - If the given feature is enabled, the env - sets will be applied for the actions they are specified for. - requires: A list of feature sets defining when this feature is - supported by the toolchain. The feature is supported if any of the - feature sets fully apply, that is, when all features of a feature - set are enabled. - If 'requires' is omitted, the feature is supported independently of - which other features are enabled. - Use this for example to filter flags depending on the build mode - enabled (opt / fastbuild / dbg). - implies: A string list of features or action configs that are - automatically enabled when this feature is enabled. If any of the - implied features or action configs cannot be enabled, this feature - will (silently) not be enabled either. - provides: A list of names this feature conflicts with. - A feature cannot be enabled if: - - 'provides' contains the name of a different feature or action - config that we want to enable. - - 'provides' contains the same value as a 'provides' in a - different feature or action config that we want to enable. - Use this in order to ensure that incompatible features cannot be - accidentally activated at the same time, leading to hard to - diagnose compiler errors. - - Returns: - A FeatureInfo provider. - """ - _check_right_type(enabled, True, "enabled", "feature") - _check_right_type(flag_sets, [], "flag_sets", "feature") - _check_right_type(env_sets, [], "env_sets", "feature") - _check_right_type(requires, [], "requires", "feature") - _check_right_type(provides, [], "provides", "feature") - _check_right_type(implies, [], "implies", "feature") - return FeatureInfo( - name = name, - enabled = enabled, - flag_sets = flag_sets, - env_sets = env_sets, - requires = requires, - implies = implies, - provides = provides, - type_name = "feature", - ) - -ToolPathInfo = provider(fields = ["name", "path", "type_name"]) - -def tool_path(name, path): - """ Tool locations. - - Args: - name: Name of the tool. - path: Location of the tool; Can be absolute path (in case of non hermetic - toolchain), or path relative to the cc_toolchain's package. - - Returns: - A ToolPathInfo provider. - - Deprecated: - Prefer specifying an ActionConfig for the action that needs the tool. - TODO(b/27903698) migrate to ActionConfig. - """ - _check_is_nonempty_string(name, "name", "tool_path") - _check_is_nonempty_string(path, "path", "tool_path") - return ToolPathInfo(name = name, path = path, type_name = "tool_path") - -ToolInfo = provider(fields = ["path", "with_features", "execution_requirements", "type_name"]) - -def tool(path, with_features = [], execution_requirements = []): - """ Describes a tool associated with a crosstool action config. - - Args: - path: Location of the tool; Can be absolute path (in case of non hermetic - toolchain), or path relative to the cc_toolchain's package. - with_features: A list of feature sets defining when this tool is - applicable. The tool will used when any one of the feature sets - evaluate to true. (That is, when when every 'feature' is enabled, - and every 'not_feature' is not enabled.) - If 'with_feature' is omitted, the tool will apply for any feature - configuration. - execution_requirements: Requirements on the execution environment for - the execution of this tool, to be passed as out-of-band "hints" to - the execution backend. - Ex. "requires-darwin" - - Returns: - A ToolInfo provider. - """ - _check_is_nonempty_string(path, "path", "tool") - _check_right_type(with_features, [], "with_features", "tool") - _check_right_type(execution_requirements, [], "execution_requirements", "tool") - return ToolInfo( - path = path, - with_features = with_features, - execution_requirements = execution_requirements, - type_name = "tool", - ) - -ActionConfigInfo = provider(fields = [ - "config_name", - "action_name", - "enabled", - "tools", - "flag_sets", - "implies", - "type_name", -]) - -def action_config( - action_name, - enabled = False, - tools = [], - flag_sets = [], - implies = []): - """ Configuration of a Bazel action. - - An action config corresponds to a Bazel action, and allows selection of - a tool based on activated features. - Action config activation occurs by the same semantics as features: a - feature can 'require' or 'imply' an action config in the same way that it - would another feature. - - Args: - action_name: The name of the Bazel action that this config applies to, - ex. 'c-compile' or 'c-module-compile'. - enabled: If 'True', this action is enabled unless a rule type - explicitly marks it as unsupported. - tools: The tool applied to the action will be the first Tool with a - feature set that matches the feature configuration. An error will - be thrown if no tool matches a provided feature configuration - for - that reason, it's a good idea to provide a default tool with an - empty feature set. - flag_sets: If the given action config is enabled, the flag sets will be - applied to the corresponding action. - implies: A list of features or action configs that are automatically - enabled when this action config is enabled. If any of the implied - features or action configs cannot be enabled, this action config - will (silently) not be enabled either. - - Returns: - An ActionConfigInfo provider. - """ - _check_is_nonempty_string(action_name, "name", "action_config") - _check_right_type(enabled, True, "enabled", "action_config") - _check_right_type(tools, [], "tools", "action_config") - _check_right_type(flag_sets, [], "flag_sets", "action_config") - _check_right_type(implies, [], "implies", "action_config") - return ActionConfigInfo( - action_name = action_name, - enabled = enabled, - tools = tools, - flag_sets = flag_sets, - implies = implies, - type_name = "action_config", - ) - -ArtifactNamePatternInfo = provider(fields = [ - "category_name", - "prefix", - "extension", - "type_name", -]) - -def artifact_name_pattern(category_name, prefix, extension): - """ The name for an artifact of a given category of input or output artifacts to an action. - - Args: - category_name: The category of artifacts that this selection applies - to. This field is compared against a list of categories defined - in bazel. Example categories include "linked_output" or - "debug_symbols". An error is thrown if no category is matched. - prefix: The prefix for creating the artifact for this selection. - Together with the extension it is used to create an artifact name - based on the target name. - extension: The extension for creating the artifact for this selection. - Together with the prefix it is used to create an artifact name - based on the target name. - - Returns: - An ArtifactNamePatternInfo provider - """ - _check_is_nonempty_string(category_name, "category_name", "artifact_name_pattern") - _check_is_none_or_right_type(prefix, "", "prefix", "artifact_name_pattern") - _check_is_none_or_right_type(extension, "", "extension", "artifact_name_pattern") - return ArtifactNamePatternInfo( - category_name = category_name, - prefix = prefix, - extension = extension, - type_name = "artifact_name_pattern", - ) diff --git a/cc/private/toolchain/empty.cc b/cc/private/toolchain/empty.cc deleted file mode 100644 index 4cda5c6..0000000 --- a/cc/private/toolchain/empty.cc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2017 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. - -int main() {} diff --git a/cc/private/toolchain/grep-includes.sh b/cc/private/toolchain/grep-includes.sh deleted file mode 100755 index ee51361..0000000 --- a/cc/private/toolchain/grep-includes.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# -# Copyright 2018 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. -# -# TODO(bazel-team): Support include scanning and grep-includes in Bazel -echo "grep-includes is not supported by Bazel" -exit 1 diff --git a/cc/private/toolchain/lib_cc_configure.bzl b/cc/private/toolchain/lib_cc_configure.bzl deleted file mode 100644 index 789018f..0000000 --- a/cc/private/toolchain/lib_cc_configure.bzl +++ /dev/null @@ -1,219 +0,0 @@ -# pylint: disable=g-bad-file-header -# Copyright 2016 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. -"""Base library for configuring the C++ toolchain.""" - -def resolve_labels(repository_ctx, labels): - """Resolves a collection of labels to their paths. - - Label resolution can cause the evaluation of Skylark functions to restart. - For functions with side-effects (like the auto-configuration functions, which - inspect the system and touch the file system), such restarts are costly. - We cannot avoid the restarts, but we can minimize their penalty by resolving - all labels upfront. - - Among other things, doing less work on restarts can cut analysis times by - several seconds and may also prevent tickling kernel conditions that cause - build failures. See https://github.com/bazelbuild/bazel/issues/5196 for - more details. - - Args: - repository_ctx: The context with which to resolve the labels. - labels: Labels to be resolved expressed as a list of strings. - - Returns: - A dictionary with the labels as keys and their paths as values. - """ - return dict([(label, repository_ctx.path(Label(label))) for label in labels]) - -def escape_string(arg): - """Escape percent sign (%) in the string so it can appear in the Crosstool.""" - if arg != None: - return str(arg).replace("%", "%%") - else: - return None - -def split_escaped(string, delimiter): - """Split string on the delimiter unless %-escaped. - - Examples: - Basic usage: - split_escaped("a:b:c", ":") -> [ "a", "b", "c" ] - - Delimeter that is not supposed to be splitten on has to be %-escaped: - split_escaped("a%:b", ":") -> [ "a:b" ] - - Literal % can be represented by escaping it as %%: - split_escaped("a%%b", ":") -> [ "a%b" ] - - Consecutive delimiters produce empty strings: - split_escaped("a::b", ":") -> [ "a", "", "", "b" ] - - Args: - string: The string to be split. - delimiter: Non-empty string not containing %-sign to be used as a - delimiter. - - Returns: - A list of substrings. - """ - if delimiter == "": - fail("Delimiter cannot be empty") - if delimiter.find("%") != -1: - fail("Delimiter cannot contain %-sign") - - i = 0 - result = [] - accumulator = [] - length = len(string) - delimiter_length = len(delimiter) - - if not string: - return [] - - # Iterate over the length of string since Skylark doesn't have while loops - for _ in range(length): - if i >= length: - break - if i + 2 <= length and string[i:i + 2] == "%%": - accumulator.append("%") - i += 2 - elif (i + 1 + delimiter_length <= length and - string[i:i + 1 + delimiter_length] == "%" + delimiter): - accumulator.append(delimiter) - i += 1 + delimiter_length - elif i + delimiter_length <= length and string[i:i + delimiter_length] == delimiter: - result.append("".join(accumulator)) - accumulator = [] - i += delimiter_length - else: - accumulator.append(string[i]) - i += 1 - - # Append the last group still in accumulator - result.append("".join(accumulator)) - return result - -def auto_configure_fail(msg): - """Output failure message when auto configuration fails.""" - red = "\033[0;31m" - no_color = "\033[0m" - fail("\n%sAuto-Configuration Error:%s %s\n" % (red, no_color, msg)) - -def auto_configure_warning(msg): - """Output warning message during auto configuration.""" - yellow = "\033[1;33m" - no_color = "\033[0m" - print("\n%sAuto-Configuration Warning:%s %s\n" % (yellow, no_color, msg)) - -def get_env_var(repository_ctx, name, default = None, enable_warning = True): - """Find an environment variable in system path. Doesn't %-escape the value!""" - if name in repository_ctx.os.environ: - return repository_ctx.os.environ[name] - if default != None: - if enable_warning: - auto_configure_warning("'%s' environment variable is not set, using '%s' as default" % (name, default)) - return default - auto_configure_fail("'%s' environment variable is not set" % name) - -def which(repository_ctx, cmd, default = None): - """A wrapper around repository_ctx.which() to provide a fallback value. Doesn't %-escape the value!""" - result = repository_ctx.which(cmd) - return default if result == None else str(result) - -def which_cmd(repository_ctx, cmd, default = None): - """Find cmd in PATH using repository_ctx.which() and fail if cannot find it. Doesn't %-escape the cmd!""" - result = repository_ctx.which(cmd) - if result != None: - return str(result) - path = get_env_var(repository_ctx, "PATH") - if default != None: - auto_configure_warning("Cannot find %s in PATH, using '%s' as default.\nPATH=%s" % (cmd, default, path)) - return default - auto_configure_fail("Cannot find %s in PATH, please make sure %s is installed and add its directory in PATH.\nPATH=%s" % (cmd, cmd, path)) - return str(result) - -def execute( - repository_ctx, - command, - environment = None, - expect_failure = False): - """Execute a command, return stdout if succeed and throw an error if it fails. Doesn't %-escape the result!""" - if environment: - result = repository_ctx.execute(command, environment = environment) - else: - result = repository_ctx.execute(command) - if expect_failure != (result.return_code != 0): - if expect_failure: - auto_configure_fail( - "expected failure, command %s, stderr: (%s)" % ( - command, - result.stderr, - ), - ) - else: - auto_configure_fail( - "non-zero exit code: %d, command %s, stderr: (%s)" % ( - result.return_code, - command, - result.stderr, - ), - ) - stripped_stdout = result.stdout.strip() - if not stripped_stdout: - auto_configure_fail( - "empty output from command %s, stderr: (%s)" % (command, result.stderr), - ) - return stripped_stdout - -def get_cpu_value(repository_ctx): - """Compute the cpu_value based on the OS name. Doesn't %-escape the result!""" - os_name = repository_ctx.os.name.lower() - if os_name.startswith("mac os"): - return "darwin" - if os_name.find("freebsd") != -1: - return "freebsd" - if os_name.find("windows") != -1: - return "x64_windows" - - # Use uname to figure out whether we are on x86_32 or x86_64 - result = repository_ctx.execute(["uname", "-m"]) - if result.stdout.strip() in ["power", "ppc64le", "ppc", "ppc64"]: - return "ppc" - if result.stdout.strip() in ["s390x"]: - return "s390x" - if result.stdout.strip() in ["arm", "armv7l"]: - return "arm" - if result.stdout.strip() in ["aarch64"]: - return "aarch64" - return "k8" if result.stdout.strip() in ["amd64", "x86_64", "x64"] else "piii" - -def is_cc_configure_debug(repository_ctx): - """Returns True if CC_CONFIGURE_DEBUG is set to 1.""" - env = repository_ctx.os.environ - return "CC_CONFIGURE_DEBUG" in env and env["CC_CONFIGURE_DEBUG"] == "1" - -def build_flags(flags): - """Convert `flags` to a string of flag fields.""" - return "\n".join([" flag: '" + flag + "'" for flag in flags]) - -def get_starlark_list(values): - if not values: - return "" - return "\"" + "\",\n \"".join(values) + "\"" - -def auto_configure_warning_maybe(repository_ctx, msg): - """Output warning message when CC_CONFIGURE_DEBUG is enabled.""" - if is_cc_configure_debug(repository_ctx): - auto_configure_warning(msg) diff --git a/cc/private/toolchain/link_dynamic_library.sh b/cc/private/toolchain/link_dynamic_library.sh deleted file mode 100755 index c71d498..0000000 --- a/cc/private/toolchain/link_dynamic_library.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 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. - -# This script handles interface library generation for dynamic library -# link action. -# -# Bazel can be configured to generate external interface library script -# to generate interface libraries in CppLinkAction for dynamic libraries. -# This is not needed on Windows (as the "interface" libraries are -# generated by default). This script therefore handles the cases when -# external script is provided, or when no script should be used. - -set -eu - -E_LINKER_COMMAND_NOT_FOUND=12 -E_INTERFACE_BUILDER_NOT_FOUND=13 - - -SUFFIX=".rewritten" - -other_args="" - -if [[ "$#" -eq 1 ]]; then - if [[ "$1" != @* ]]; then - echo "Parameter file must start with @" 1>&2; - exit "$E_LINKER_COMMAND_NOT_FOUND" - fi - - filename=$(echo "$1" | cut -c2-) - first_five_lines=$(head -n 5 $filename) - - # Should generate interface library switch (); if the value is "no", - # following 3 args are ignored (but must be present) - GENERATE_INTERFACE_LIBRARY=$(echo "$first_five_lines" | head -n1 | tail -n1) - # Tool which can generate interface library from dynamic library file - INTERFACE_LIBRARY_BUILDER=$(echo "$first_five_lines" | head -n2 | tail -n1) - # Dynamic library from which we want to generate interface library - DYNAMIC_LIBRARY=$(echo "$first_five_lines" | head -n3 | tail -n1) - # Resulting interface library - INTERFACE_LIBRARY=$(echo "$first_five_lines" | head -n4 | tail -n1) - # The command used to generate the dynamic library - LINKER_COMMAND=$(echo "$first_five_lines" | head -n5 | tail -n1) - - rest_of_lines=$(tail -n +6 $filename) - new_param_file="${filename}${SUFFIX}" - echo "$rest_of_lines" > $new_param_file - other_args="@$new_param_file" - - if [[ ! -e "$LINKER_COMMAND" ]]; then - echo "Linker command ($LINKER_COMMAND) not found." 1>&2; - exit "$E_LINKER_COMMAND_NOT_FOUND" - fi - - if [[ "no" == "$GENERATE_INTERFACE_LIBRARY" ]]; then - INTERFACE_GENERATION=: - else - if [[ ! -e "$INTERFACE_LIBRARY_BUILDER" ]]; then - echo "Interface library builder ($INTERFACE_LIBRARY_BUILDER) - not found." 1>&2; - exit "$E_INTERFACE_BUILDER_NOT_FOUND" - fi - INTERFACE_GENERATION="${INTERFACE_LIBRARY_BUILDER} ${DYNAMIC_LIBRARY} - ${INTERFACE_LIBRARY}" - fi - - ${LINKER_COMMAND} "$other_args" && ${INTERFACE_GENERATION} -else - # TODO(b/113358321): Remove this branch once projects are migrated to not - # splitting the linking command line. - # Should generate interface library switch (); if the value is "no", - # following 3 args are ignored (but must be present) - GENERATE_INTERFACE_LIBRARY="$1" - # Tool which can generate interface library from dynamic library file - INTERFACE_LIBRARY_BUILDER="$2" - # Dynamic library from which we want to generate interface library - DYNAMIC_LIBRARY="$3" - # Resulting interface library - INTERFACE_LIBRARY="$4" - # The command used to generate the dynamic library - LINKER_COMMAND="$5" - shift 5 - if [[ ! -e "$LINKER_COMMAND" ]]; then - echo "Linker command ($LINKER_COMMAND) not found." 1>&2; - exit "$E_LINKER_COMMAND_NOT_FOUND" - fi - - if [[ "no" == "$GENERATE_INTERFACE_LIBRARY" ]]; then - INTERFACE_GENERATION=: - else - if [[ ! -e "$INTERFACE_LIBRARY_BUILDER" ]]; then - echo "Interface library builder ($INTERFACE_LIBRARY_BUILDER) - not found." 1>&2; - exit "$E_INTERFACE_BUILDER_NOT_FOUND" - fi - INTERFACE_GENERATION="${INTERFACE_LIBRARY_BUILDER} ${DYNAMIC_LIBRARY} - ${INTERFACE_LIBRARY}" - fi - - ${LINKER_COMMAND} "$@" && ${INTERFACE_GENERATION} -fi diff --git a/cc/private/toolchain/linux_cc_wrapper.sh.tpl b/cc/private/toolchain/linux_cc_wrapper.sh.tpl deleted file mode 100644 index a83be50..0000000 --- a/cc/private/toolchain/linux_cc_wrapper.sh.tpl +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# -# Copyright 2015 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. -# -# Ship the environment to the C++ action -# -set -eu - -# Set-up the environment -%{env} - -# Call the C++ compiler -%{cc} "$@" diff --git a/cc/private/toolchain/msys_gcc_installation_error.bat b/cc/private/toolchain/msys_gcc_installation_error.bat deleted file mode 100644 index 25c3553..0000000 --- a/cc/private/toolchain/msys_gcc_installation_error.bat +++ /dev/null @@ -1,23 +0,0 @@ -:: Copyright 2018 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. - -@echo OFF - -echo. 1>&2 -echo The target you are compiling requires MSYS gcc / MINGW gcc. 1>&2 -echo Bazel couldn't find gcc installation on your machine. 1>&2 -echo Please install MSYS gcc / MINGW gcc and set BAZEL_SH environment variable 1>&2 -echo. 1>&2 - -exit /b 1 diff --git a/cc/private/toolchain/osx_cc_configure.bzl b/cc/private/toolchain/osx_cc_configure.bzl deleted file mode 100644 index 12ee3b1..0000000 --- a/cc/private/toolchain/osx_cc_configure.bzl +++ /dev/null @@ -1,148 +0,0 @@ -# pylint: disable=g-bad-file-header -# Copyright 2016 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. -"""Configuring the C++ toolchain on macOS.""" - -load("@bazel_tools//tools/osx:xcode_configure.bzl", "run_xcode_locator") -load( - "//cc/private/toolchain:lib_cc_configure.bzl", - "escape_string", - "resolve_labels", -) -load( - "//cc/private/toolchain:unix_cc_configure.bzl", - "configure_unix_toolchain", - "find_cc", - "get_env", - "get_escaped_cxx_inc_directories", -) - -def _get_escaped_xcode_cxx_inc_directories(repository_ctx, cc, xcode_toolchains): - """Compute the list of default C++ include paths on Xcode-enabled darwin. - - Args: - repository_ctx: The repository context. - cc: The default C++ compiler on the local system. - xcode_toolchains: A list containing the xcode toolchains available - Returns: - include_paths: A list of builtin include paths. - """ - - # TODO(cparsons): Falling back to the default C++ compiler builtin include - # paths shouldn't be unnecessary once all actions are using xcrun. - include_dirs = get_escaped_cxx_inc_directories(repository_ctx, cc, "-xc++") - for toolchain in xcode_toolchains: - include_dirs.append(escape_string(toolchain.developer_dir)) - - # Assume that all paths that point to /Applications/ are built in include paths - include_dirs.append("/Applications/") - return include_dirs - -def configure_osx_toolchain(repository_ctx, overriden_tools): - """Configure C++ toolchain on macOS.""" - paths = resolve_labels(repository_ctx, [ - "//cc/private/toolchain:osx_cc_wrapper.sh.tpl", - "@bazel_tools//tools/objc:libtool.sh", - "@bazel_tools//tools/objc:make_hashed_objlist.py", - "@bazel_tools//tools/objc:xcrunwrapper.sh", - "@bazel_tools//tools/osx/crosstool:BUILD.tpl", - "@bazel_tools//tools/osx/crosstool:cc_toolchain_config.bzl", - "@bazel_tools//tools/osx/crosstool:wrapped_ar.tpl", - "@bazel_tools//tools/osx/crosstool:wrapped_clang.cc", - "@bazel_tools//tools/osx:xcode_locator.m", - ]) - - env = repository_ctx.os.environ - should_use_xcode = "BAZEL_USE_XCODE_TOOLCHAIN" in env and env["BAZEL_USE_XCODE_TOOLCHAIN"] == "1" - xcode_toolchains = [] - - # Make the following logic in sync with //cc/private/toolchain:cc_configure.bzl#cc_autoconf_toolchains_impl - (xcode_toolchains, xcodeloc_err) = run_xcode_locator( - repository_ctx, - paths["@bazel_tools//tools/osx:xcode_locator.m"], - ) - if should_use_xcode and not xcode_toolchains: - fail("BAZEL_USE_XCODE_TOOLCHAIN is set to 1 but Bazel couldn't find Xcode installed on the " + - "system. Verify that 'xcode-select -p' is correct.") - if xcode_toolchains: - cc = find_cc(repository_ctx, overriden_tools = {}) - repository_ctx.template( - "cc_wrapper.sh", - paths["//cc/private/toolchain:osx_cc_wrapper.sh.tpl"], - { - "%{cc}": escape_string(str(cc)), - "%{env}": escape_string(get_env(repository_ctx)), - }, - ) - repository_ctx.symlink( - paths["@bazel_tools//tools/objc:xcrunwrapper.sh"], - "xcrunwrapper.sh", - ) - repository_ctx.symlink( - paths["@bazel_tools//tools/objc:libtool.sh"], - "libtool", - ) - repository_ctx.symlink( - paths["@bazel_tools//tools/objc:make_hashed_objlist.py"], - "make_hashed_objlist.py", - ) - repository_ctx.symlink( - paths["@bazel_tools//tools/osx/crosstool:wrapped_ar.tpl"], - "wrapped_ar", - ) - repository_ctx.symlink( - paths["@bazel_tools//tools/osx/crosstool:cc_toolchain_config.bzl"], - "cc_toolchain_config.bzl", - ) - wrapped_clang_src_path = str(repository_ctx.path( - paths["@bazel_tools//tools/osx/crosstool:wrapped_clang.cc"], - )) - xcrun_result = repository_ctx.execute([ - "env", - "-i", - "xcrun", - "clang", - "-std=c++11", - "-lc++", - "-o", - "wrapped_clang", - wrapped_clang_src_path, - ], 30) - if (xcrun_result.return_code == 0): - repository_ctx.symlink("wrapped_clang", "wrapped_clang_pp") - else: - error_msg = ( - "return code {code}, stderr: {err}, stdout: {out}" - ).format( - code = xcrun_result.return_code, - err = xcrun_result.stderr, - out = xcrun_result.stdout, - ) - fail("wrapped_clang failed to generate. Please file an issue at " + - "https://github.com/bazelbuild/bazel/issues with the following:\n" + - error_msg) - - escaped_include_paths = _get_escaped_xcode_cxx_inc_directories(repository_ctx, cc, xcode_toolchains) - escaped_cxx_include_directories = [] - for path in escaped_include_paths: - escaped_cxx_include_directories.append((" \"%s\"," % path)) - if xcodeloc_err: - escaped_cxx_include_directories.append("# Error: " + xcodeloc_err + "\n") - repository_ctx.template( - "BUILD", - paths["@bazel_tools//tools/osx/crosstool:BUILD.tpl"], - {"%{cxx_builtin_include_directories}": "\n".join(escaped_cxx_include_directories)}, - ) - else: - configure_unix_toolchain(repository_ctx, cpu_value = "darwin", overriden_tools = overriden_tools) diff --git a/cc/private/toolchain/osx_cc_wrapper.sh b/cc/private/toolchain/osx_cc_wrapper.sh deleted file mode 100755 index 207bcef..0000000 --- a/cc/private/toolchain/osx_cc_wrapper.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash -# -# Copyright 2015 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. -# -# OS X relpath is not really working. This is a wrapper script around gcc -# to simulate relpath behavior. -# -# This wrapper uses install_name_tool to replace all paths in the binary -# (bazel-out/.../path/to/original/library.so) by the paths relative to -# the binary. It parses the command line to behave as rpath is supposed -# to work. -# -# See https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac -# on how to set those paths for Mach-O binaries. -# -set -eu - -GCC=/usr/bin/gcc -INSTALL_NAME_TOOL="/usr/bin/install_name_tool" - -LIBS= -LIB_DIRS= -RPATHS= -OUTPUT= -# let parse the option list -for i in "$@"; do - if [[ "${OUTPUT}" = "1" ]]; then - OUTPUT=$i - elif [[ "$i" =~ ^-l(.*)$ ]]; then - LIBS="${BASH_REMATCH[1]} $LIBS" - elif [[ "$i" =~ ^-L(.*)$ ]]; then - LIB_DIRS="${BASH_REMATCH[1]} $LIB_DIRS" - elif [[ "$i" =~ ^-Wl,-rpath,\@loader_path/(.*)$ ]]; then - RPATHS="${BASH_REMATCH[1]} ${RPATHS}" - elif [[ "$i" = "-o" ]]; then - # output is coming - OUTPUT=1 - fi -done - -# Call gcc -${GCC} "$@" - -function get_library_path() { - for libdir in ${LIB_DIRS}; do - if [ -f ${libdir}/lib$1.so ]; then - echo "${libdir}/lib$1.so" - elif [ -f ${libdir}/lib$1.dylib ]; then - echo "${libdir}/lib$1.dylib" - fi - done -} - -# A convenient method to return the actual path even for non symlinks -# and multi-level symlinks. -function get_realpath() { - local previous="$1" - local next=$(readlink "${previous}") - while [ -n "${next}" ]; do - previous="${next}" - next=$(readlink "${previous}") - done - echo "${previous}" -} - -# Get the path of a lib inside a tool -function get_otool_path() { - # the lib path is the path of the original lib relative to the workspace - get_realpath $1 | sed 's|^.*/bazel-out/|bazel-out/|' -} - -# Do replacements in the output -for rpath in ${RPATHS}; do - for lib in ${LIBS}; do - unset libname - if [ -f "$(dirname ${OUTPUT})/${rpath}/lib${lib}.so" ]; then - libname="lib${lib}.so" - elif [ -f "$(dirname ${OUTPUT})/${rpath}/lib${lib}.dylib" ]; then - libname="lib${lib}.dylib" - fi - # ${libname-} --> return $libname if defined, or undefined otherwise. This is to make - # this set -e friendly - if [[ -n "${libname-}" ]]; then - libpath=$(get_library_path ${lib}) - if [ -n "${libpath}" ]; then - ${INSTALL_NAME_TOOL} -change $(get_otool_path "${libpath}") \ - "@loader_path/${rpath}/${libname}" "${OUTPUT}" - fi - fi - done -done - diff --git a/cc/private/toolchain/osx_cc_wrapper.sh.tpl b/cc/private/toolchain/osx_cc_wrapper.sh.tpl deleted file mode 100644 index 4c85cd9..0000000 --- a/cc/private/toolchain/osx_cc_wrapper.sh.tpl +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/bash -# -# Copyright 2015 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. -# -# OS X relpath is not really working. This is a wrapper script around gcc -# to simulate relpath behavior. -# -# This wrapper uses install_name_tool to replace all paths in the binary -# (bazel-out/.../path/to/original/library.so) by the paths relative to -# the binary. It parses the command line to behave as rpath is supposed -# to work. -# -# See https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac -# on how to set those paths for Mach-O binaries. -# -set -eu - -INSTALL_NAME_TOOL="/usr/bin/install_name_tool" - -LIBS= -LIB_DIRS= -RPATHS= -OUTPUT= -# let parse the option list -for i in "$@"; do - if [[ "${OUTPUT}" = "1" ]]; then - OUTPUT=$i - elif [[ "$i" =~ ^-l(.*)$ ]]; then - LIBS="${BASH_REMATCH[1]} $LIBS" - elif [[ "$i" =~ ^-L(.*)$ ]]; then - LIB_DIRS="${BASH_REMATCH[1]} $LIB_DIRS" - elif [[ "$i" =~ ^-Wl,-rpath,\@loader_path/(.*)$ ]]; then - RPATHS="${BASH_REMATCH[1]} ${RPATHS}" - elif [[ "$i" = "-o" ]]; then - # output is coming - OUTPUT=1 - fi -done - -# Set-up the environment -%{env} - -# Call the C++ compiler -%{cc} "$@" - -function get_library_path() { - for libdir in ${LIB_DIRS}; do - if [ -f ${libdir}/lib$1.so ]; then - echo "${libdir}/lib$1.so" - elif [ -f ${libdir}/lib$1.dylib ]; then - echo "${libdir}/lib$1.dylib" - fi - done -} - -# A convenient method to return the actual path even for non symlinks -# and multi-level symlinks. -function get_realpath() { - local previous="$1" - local next=$(readlink "${previous}") - while [ -n "${next}" ]; do - previous="${next}" - next=$(readlink "${previous}") - done - echo "${previous}" -} - -# Get the path of a lib inside a tool -function get_otool_path() { - # the lib path is the path of the original lib relative to the workspace - get_realpath $1 | sed 's|^.*/bazel-out/|bazel-out/|' -} - -# Do replacements in the output -for rpath in ${RPATHS}; do - for lib in ${LIBS}; do - unset libname - if [ -f "$(dirname ${OUTPUT})/${rpath}/lib${lib}.so" ]; then - libname="lib${lib}.so" - elif [ -f "$(dirname ${OUTPUT})/${rpath}/lib${lib}.dylib" ]; then - libname="lib${lib}.dylib" - fi - # ${libname-} --> return $libname if defined, or undefined otherwise. This is to make - # this set -e friendly - if [[ -n "${libname-}" ]]; then - libpath=$(get_library_path ${lib}) - if [ -n "${libpath}" ]; then - ${INSTALL_NAME_TOOL} -change $(get_otool_path "${libpath}") \ - "@loader_path/${rpath}/${libname}" "${OUTPUT}" - fi - fi - done -done - diff --git a/cc/private/toolchain/runfiles/BUILD b/cc/private/toolchain/runfiles/BUILD deleted file mode 100644 index 924322e..0000000 --- a/cc/private/toolchain/runfiles/BUILD +++ /dev/null @@ -1,94 +0,0 @@ -package(default_visibility = ["//visibility:private"]) - -load("//cc:defs.bzl", "cc_library", "cc_test") - -filegroup( - name = "srcs", - srcs = glob( - ["**"], - exclude = [ - ".*", - "*~", - ], - ), - visibility = ["//cc/private/toolchain:__pkg__"], -) - -filegroup( - name = "embedded_tools", - srcs = [ - "BUILD.tools", - ":srcs_for_embedded_tools", - ], - visibility = ["//cc/private/toolchain:__pkg__"], -) - -# Rewrite the include path for runfiles.h in runfiles_src.cc, and create -# "generated_runfiles.{h,cc}". These files are renamed to "runfiles.{h,cc}" as -# part of creating the embedded tools of Bazel. -# -# We cannot just check in runfiles_src.{h,cc} as runfiles.{h,cc}, because it'd -# cause a header check failure on Windows when building targets in the Bazel -# source tree, if those targets depend on //cc/private/toolchain/runfiles, -# because due to lack of sandboxing they would accidentally pick up runfiles.h -# from //cc/private/toolchain/runfiles. -genrule( - name = "srcs_for_embedded_tools", - srcs = [ - "runfiles_src.cc", - "runfiles_src.h", - ], - outs = [ - "runfiles.cc", - "runfiles.h", - ], - # Keep this transformation logic in sync with the - # //scripts/bootstrap/compile.sh - cmd = ("sed " + - " 's|^#include.*/runfiles_src.h.*|#include \"cc/private/toolchain" + - "/runfiles/runfiles.h\"|' " + - " $(location runfiles_src.cc) > $(location runfiles.cc) && " + - "cp $(location runfiles_src.h) $(location runfiles.h)"), -) - -cc_library( - name = "runfiles", - testonly = 1, - srcs = ["runfiles_src.cc"], - hdrs = ["runfiles_src.h"], -) - -cc_test( - name = "runfiles_test", - srcs = ["runfiles_test.cc"], - visibility = ["//visibility:public"], - deps = [ - ":runfiles", - "@com_google_googletest//:gtest_main", - ], -) - -test_suite( - name = "windows_tests", - tags = [ - "-no_windows", - "-slow", - ], -) - -test_suite( - name = "all_windows_tests", - tests = [ - ":windows_tests", - ], - visibility = ["//tools:__pkg__"], -) - -# This package will host the C++ runfiles library when it's finally released. - -cc_library( - name = "runfiles_release", - srcs = ["runfiles.cc"], - hdrs = ["runfiles.h"], - visibility = ["//visibility:public"], -) diff --git a/cc/private/toolchain/runfiles/BUILD.tools b/cc/private/toolchain/runfiles/BUILD.tools deleted file mode 100644 index 0ba99f0..0000000 --- a/cc/private/toolchain/runfiles/BUILD.tools +++ /dev/null @@ -1,6 +0,0 @@ -cc_library( - name = "runfiles", - srcs = ["runfiles.cc"], - hdrs = ["runfiles.h"], - visibility = ["//visibility:public"], -) diff --git a/cc/private/toolchain/runfiles/runfiles_src.cc b/cc/private/toolchain/runfiles/runfiles_src.cc deleted file mode 100644 index e1fb7f4..0000000 --- a/cc/private/toolchain/runfiles/runfiles_src.cc +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2018 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. - -// The "srcs_for_embedded_tools" rule in the same package sets the line below to -// include runfiles.h from the correct path. Do not modify the line below. -#include "cc/private/toolchain/runfiles/runfiles_src.h" - -#ifdef _WIN32 -#include -#else // not _WIN32 -#include -#include -#include -#include -#endif // _WIN32 - -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#endif // _WIN32 - -namespace bazel { -namespace tools { -namespace cpp { -namespace runfiles { - -using std::function; -using std::map; -using std::pair; -using std::string; -using std::vector; - -namespace { - -bool starts_with(const string& s, const char* prefix) { - if (!prefix || !*prefix) { - return true; - } - if (s.empty()) { - return false; - } - return s.find(prefix) == 0; -} - -bool contains(const string& s, const char* substr) { - if (!substr || !*substr) { - return true; - } - if (s.empty()) { - return false; - } - return s.find(substr) != string::npos; -} - -bool ends_with(const string& s, const string& suffix) { - if (suffix.empty()) { - return true; - } - if (s.empty()) { - return false; - } - return s.rfind(suffix) == s.size() - suffix.size(); -} - -bool IsReadableFile(const string& path) { - return std::ifstream(path).is_open(); -} - -bool IsDirectory(const string& path) { -#ifdef _WIN32 - DWORD attrs = GetFileAttributesA(path.c_str()); - return (attrs != INVALID_FILE_ATTRIBUTES) && - (attrs & FILE_ATTRIBUTE_DIRECTORY); -#else - struct stat buf; - return stat(path.c_str(), &buf) == 0 && S_ISDIR(buf.st_mode); -#endif -} - -bool PathsFrom(const std::string& argv0, std::string runfiles_manifest_file, - std::string runfiles_dir, std::string* out_manifest, - std::string* out_directory); - -bool PathsFrom(const std::string& argv0, std::string runfiles_manifest_file, - std::string runfiles_dir, - std::function is_runfiles_manifest, - std::function is_runfiles_directory, - std::string* out_manifest, std::string* out_directory); - -bool ParseManifest(const string& path, map* result, - string* error); - -} // namespace - -Runfiles* Runfiles::Create(const string& argv0, - const string& runfiles_manifest_file, - const string& runfiles_dir, string* error) { - string manifest, directory; - if (!PathsFrom(argv0, runfiles_manifest_file, runfiles_dir, &manifest, - &directory)) { - if (error) { - std::ostringstream err; - err << "ERROR: " << __FILE__ << "(" << __LINE__ - << "): cannot find runfiles (argv0=\"" << argv0 << "\")"; - *error = err.str(); - } - return nullptr; - } - - const vector > envvars = { - {"RUNFILES_MANIFEST_FILE", manifest}, - {"RUNFILES_DIR", directory}, - // TODO(laszlocsomor): remove JAVA_RUNFILES once the Java launcher can - // pick up RUNFILES_DIR. - {"JAVA_RUNFILES", directory}}; - - map runfiles; - if (!manifest.empty()) { - if (!ParseManifest(manifest, &runfiles, error)) { - return nullptr; - } - } - - return new Runfiles(std::move(runfiles), std::move(directory), - std::move(envvars)); -} - -bool IsAbsolute(const string& path) { - if (path.empty()) { - return false; - } - char c = path.front(); - return (c == '/' && (path.size() < 2 || path[1] != '/')) || - (path.size() >= 3 && - ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) && - path[1] == ':' && (path[2] == '\\' || path[2] == '/')); -} - -string GetEnv(const string& key) { -#ifdef _WIN32 - DWORD size = ::GetEnvironmentVariableA(key.c_str(), NULL, 0); - if (size == 0) { - return string(); // unset or empty envvar - } - std::unique_ptr value(new char[size]); - ::GetEnvironmentVariableA(key.c_str(), value.get(), size); - return value.get(); -#else - char* result = getenv(key.c_str()); - return (result == NULL) ? string() : string(result); -#endif -} - -string Runfiles::Rlocation(const string& path) const { - if (path.empty() || starts_with(path, "../") || contains(path, "/..") || - starts_with(path, "./") || contains(path, "/./") || - ends_with(path, "/.") || contains(path, "//")) { - return string(); - } - if (IsAbsolute(path)) { - return path; - } - const auto value = runfiles_map_.find(path); - if (value != runfiles_map_.end()) { - return value->second; - } - if (!directory_.empty()) { - return directory_ + "/" + path; - } - return ""; -} - -namespace { - -bool ParseManifest(const string& path, map* result, - string* error) { - std::ifstream stm(path); - if (!stm.is_open()) { - if (error) { - std::ostringstream err; - err << "ERROR: " << __FILE__ << "(" << __LINE__ - << "): cannot open runfiles manifest \"" << path << "\""; - *error = err.str(); - } - return false; - } - string line; - std::getline(stm, line); - size_t line_count = 1; - while (!line.empty()) { - string::size_type idx = line.find_first_of(' '); - if (idx == string::npos) { - if (error) { - std::ostringstream err; - err << "ERROR: " << __FILE__ << "(" << __LINE__ - << "): bad runfiles manifest entry in \"" << path << "\" line #" - << line_count << ": \"" << line << "\""; - *error = err.str(); - } - return false; - } - (*result)[line.substr(0, idx)] = line.substr(idx + 1); - std::getline(stm, line); - ++line_count; - } - return true; -} - -} // namespace - -namespace testing { - -bool TestOnly_PathsFrom(const string& argv0, string mf, string dir, - function is_runfiles_manifest, - function is_runfiles_directory, - string* out_manifest, string* out_directory) { - return PathsFrom(argv0, mf, dir, is_runfiles_manifest, is_runfiles_directory, - out_manifest, out_directory); -} - -bool TestOnly_IsAbsolute(const string& path) { return IsAbsolute(path); } - -} // namespace testing - -Runfiles* Runfiles::Create(const string& argv0, string* error) { - return Runfiles::Create(argv0, GetEnv("RUNFILES_MANIFEST_FILE"), - GetEnv("RUNFILES_DIR"), error); -} - -Runfiles* Runfiles::CreateForTest(std::string* error) { - return Runfiles::Create(std::string(), GetEnv("RUNFILES_MANIFEST_FILE"), - GetEnv("TEST_SRCDIR"), error); -} - -namespace { - -bool PathsFrom(const string& argv0, string mf, string dir, string* out_manifest, - string* out_directory) { - return PathsFrom( - argv0, mf, dir, [](const string& path) { return IsReadableFile(path); }, - [](const string& path) { return IsDirectory(path); }, out_manifest, - out_directory); -} - -bool PathsFrom(const string& argv0, string mf, string dir, - function is_runfiles_manifest, - function is_runfiles_directory, - string* out_manifest, string* out_directory) { - out_manifest->clear(); - out_directory->clear(); - - bool mfValid = is_runfiles_manifest(mf); - bool dirValid = is_runfiles_directory(dir); - - if (!argv0.empty() && !mfValid && !dirValid) { - mf = argv0 + ".runfiles/MANIFEST"; - dir = argv0 + ".runfiles"; - mfValid = is_runfiles_manifest(mf); - dirValid = is_runfiles_directory(dir); - if (!mfValid) { - mf = argv0 + ".runfiles_manifest"; - mfValid = is_runfiles_manifest(mf); - } - } - - if (!mfValid && !dirValid) { - return false; - } - - if (!mfValid) { - mf = dir + "/MANIFEST"; - mfValid = is_runfiles_manifest(mf); - if (!mfValid) { - mf = dir + "_manifest"; - mfValid = is_runfiles_manifest(mf); - } - } - - if (!dirValid && - (ends_with(mf, ".runfiles_manifest") || ends_with(mf, "/MANIFEST"))) { - static const size_t kSubstrLen = 9; // "_manifest" or "/MANIFEST" - dir = mf.substr(0, mf.size() - kSubstrLen); - dirValid = is_runfiles_directory(dir); - } - - if (mfValid) { - *out_manifest = mf; - } - - if (dirValid) { - *out_directory = dir; - } - - return true; -} - -} // namespace - -} // namespace runfiles -} // namespace cpp -} // namespace tools -} // namespace bazel diff --git a/cc/private/toolchain/runfiles/runfiles_src.h b/cc/private/toolchain/runfiles/runfiles_src.h deleted file mode 100644 index c561cf9..0000000 --- a/cc/private/toolchain/runfiles/runfiles_src.h +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2018 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. - -// Runfiles lookup library for Bazel-built C++ binaries and tests. -// -// USAGE: -// 1. Depend on this runfiles library from your build rule: -// -// cc_binary( -// name = "my_binary", -// ... -// deps = ["@rules_cc//cc/private/toolchain/runfiles"], -// ) -// -// 2. Include the runfiles library. -// -// #include "cc/private/toolchain/runfiles/runfiles.h" -// -// using bazel::tools::cpp::runfiles::Runfiles; -// -// 3. Create a Runfiles object and use rlocation to look up runfile paths: -// -// int main(int argc, char** argv) { -// std::string error; -// std::unique_ptr runfiles( -// Runfiles::Create(argv[0], &error)); -// -// // Important: -// // If this is a test, use Runfiles::CreateForTest(&error). -// // Otherwise, if you don't have the value for argv[0] for whatever -// // reason, then use Runfiles::Create(&error). -// -// if (runfiles == nullptr) { -// ... // error handling -// } -// std::string path = -// runfiles->Rlocation("my_workspace/path/to/my/data.txt"); -// ... -// -// The code above creates a Runfiles object and retrieves a runfile path. -// -// The Runfiles::Create function uses the runfiles manifest and the -// runfiles directory from the RUNFILES_MANIFEST_FILE and RUNFILES_DIR -// environment variables. If not present, the function looks for the -// manifest and directory near argv[0], the path of the main program. -// -// To start child processes that also need runfiles, you need to set the right -// environment variables for them: -// -// std::unique_ptr runfiles(Runfiles::Create(argv[0], &error)); -// -// std::string path = runfiles->Rlocation("path/to/binary")); -// if (!path.empty()) { -// ... // create "args" argument vector for execv -// const auto envvars = runfiles->EnvVars(); -// pid_t child = fork(); -// if (child) { -// int status; -// waitpid(child, &status, 0); -// } else { -// for (const auto i : envvars) { -// setenv(i.first.c_str(), i.second.c_str(), 1); -// } -// execv(args[0], args); -// } - -#ifndef TOOLS_CPP_RUNFILES_RUNFILES_H_ -#define TOOLS_CPP_RUNFILES_RUNFILES_H_ 1 - -#include -#include -#include -#include -#include - -namespace bazel { -namespace tools { -namespace cpp { -namespace runfiles { - -class Runfiles { - public: - virtual ~Runfiles() {} - - // Returns a new `Runfiles` instance. - // - // Use this from within `cc_test` rules. - // - // Returns nullptr on error. If `error` is provided, the method prints an - // error message into it. - // - // This method looks at the RUNFILES_MANIFEST_FILE and TEST_SRCDIR - // environment variables. - static Runfiles* CreateForTest(std::string* error = nullptr); - - // Returns a new `Runfiles` instance. - // - // Use this from `cc_binary` or `cc_library` rules. You may pass an empty - // `argv0` if `argv[0]` from the `main` method is unknown. - // - // Returns nullptr on error. If `error` is provided, the method prints an - // error message into it. - // - // This method looks at the RUNFILES_MANIFEST_FILE and RUNFILES_DIR - // environment variables. If either is empty, the method looks for the - // manifest or directory using the other environment variable, or using argv0 - // (unless it's empty). - static Runfiles* Create(const std::string& argv0, - std::string* error = nullptr); - - // Returns a new `Runfiles` instance. - // - // Use this from any `cc_*` rule if you want to manually specify the paths to - // the runfiles manifest and/or runfiles directory. You may pass an empty - // `argv0` if `argv[0]` from the `main` method is unknown. - // - // This method is the same as `Create(argv0, error)`, except it uses - // `runfiles_manifest_file` and `runfiles_dir` as the corresponding - // environment variable values, instead of looking up the actual environment - // variables. - static Runfiles* Create(const std::string& argv0, - const std::string& runfiles_manifest_file, - const std::string& runfiles_dir, - std::string* error = nullptr); - - // Returns the runtime path of a runfile. - // - // Runfiles are data-dependencies of Bazel-built binaries and tests. - // - // The returned path may not exist. The caller should verify the path's - // existence. - // - // The function may return an empty string if it cannot find a runfile. - // - // Args: - // path: runfiles-root-relative path of the runfile; must not be empty and - // must not contain uplevel references. - // Returns: - // the path to the runfile, which the caller should check for existence, or - // an empty string if the method doesn't know about this runfile - std::string Rlocation(const std::string& path) const; - - // Returns environment variables for subprocesses. - // - // The caller should set the returned key-value pairs in the environment of - // subprocesses, so that those subprocesses can also access runfiles (in case - // they are also Bazel-built binaries). - const std::vector >& EnvVars() const { - return envvars_; - } - - private: - Runfiles(const std::map&& runfiles_map, - const std::string&& directory, - const std::vector >&& envvars) - : runfiles_map_(std::move(runfiles_map)), - directory_(std::move(directory)), - envvars_(std::move(envvars)) {} - Runfiles(const Runfiles&) = delete; - Runfiles(Runfiles&&) = delete; - Runfiles& operator=(const Runfiles&) = delete; - Runfiles& operator=(Runfiles&&) = delete; - - const std::map runfiles_map_; - const std::string directory_; - const std::vector > envvars_; -}; - -// The "testing" namespace contains functions that allow unit testing the code. -// Do not use these outside of runfiles_test.cc, they are only part of the -// public API for the benefit of the tests. -// These functions and their interface may change without notice. -namespace testing { - -// For testing only. -// -// Computes the path of the runfiles manifest and the runfiles directory. -// -// If the method finds both a valid manifest and valid directory according to -// `is_runfiles_manifest` and `is_runfiles_directory`, then the method sets -// the corresponding values to `out_manifest` and `out_directory` and returns -// true. -// -// If the method only finds a valid manifest or a valid directory, but not -// both, then it sets the corresponding output variable (`out_manifest` or -// `out_directory`) to the value while clearing the other output variable. The -// method still returns true in this case. -// -// If the method cannot find either a valid manifest or valid directory, it -// clears both output variables and returns false. -bool TestOnly_PathsFrom( - const std::string& argv0, std::string runfiles_manifest_file, - std::string runfiles_dir, - std::function is_runfiles_manifest, - std::function is_runfiles_directory, - std::string* out_manifest, std::string* out_directory); - -// For testing only. -// Returns true if `path` is an absolute Unix or Windows path. -// For Windows paths, this function does not regard drive-less absolute paths -// (i.e. absolute-on-current-drive, e.g. "\foo\bar") as absolute and returns -// false for these. -bool TestOnly_IsAbsolute(const std::string& path); - -} // namespace testing -} // namespace runfiles -} // namespace cpp -} // namespace tools -} // namespace bazel - -#endif // TOOLS_CPP_RUNFILES_RUNFILES_H_ diff --git a/cc/private/toolchain/runfiles/runfiles_test.cc b/cc/private/toolchain/runfiles/runfiles_test.cc deleted file mode 100644 index fa85331..0000000 --- a/cc/private/toolchain/runfiles/runfiles_test.cc +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright 2018 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. - -#include "cc/private/toolchain/runfiles/runfiles_src.h" - -#ifdef _WIN32 -#include -#endif // _WIN32 - -#include -#include -#include -#include - -#include "gtest/gtest.h" - -#define RUNFILES_TEST_TOSTRING_HELPER(x) #x -#define RUNFILES_TEST_TOSTRING(x) RUNFILES_TEST_TOSTRING_HELPER(x) -#define LINE_AS_STRING() RUNFILES_TEST_TOSTRING(__LINE__) - -namespace bazel { -namespace tools { -namespace cpp { -namespace runfiles { -namespace { - -using bazel::tools::cpp::runfiles::testing::TestOnly_IsAbsolute; -using bazel::tools::cpp::runfiles::testing::TestOnly_PathsFrom; -using std::cerr; -using std::endl; -using std::function; -using std::pair; -using std::string; -using std::unique_ptr; -using std::vector; - -class RunfilesTest : public ::testing::Test { - protected: - // Create a temporary file that is deleted with the destructor. - class MockFile { - public: - // Create an empty file with the given name under $TEST_TMPDIR. - static MockFile* Create(const string& name); - - // Create a file with the given name and contents under $TEST_TMPDIR. - // The method ensures to create all parent directories, so `name` is allowed - // to contain directory components. - static MockFile* Create(const string& name, const vector& lines); - - ~MockFile(); - const string& Path() const { return path_; } - - string DirName() const { - string::size_type pos = path_.find_last_of('/'); - return pos == string::npos ? "" : path_.substr(0, pos); - } - - private: - MockFile(const string& path) : path_(path) {} - MockFile(const MockFile&) = delete; - MockFile(MockFile&&) = delete; - MockFile& operator=(const MockFile&) = delete; - MockFile& operator=(MockFile&&) = delete; - - const string path_; - }; - - void AssertEnvvars(const Runfiles& runfiles, - const string& expected_manifest_file, - const string& expected_directory); - - static string GetTemp(); -}; - -void RunfilesTest::AssertEnvvars(const Runfiles& runfiles, - const string& expected_manifest_file, - const string& expected_directory) { - vector > expected = { - {"RUNFILES_MANIFEST_FILE", expected_manifest_file}, - {"RUNFILES_DIR", expected_directory}, - {"JAVA_RUNFILES", expected_directory}}; - ASSERT_EQ(runfiles.EnvVars(), expected); -} - -string RunfilesTest::GetTemp() { -#ifdef _WIN32 - DWORD size = ::GetEnvironmentVariableA("TEST_TMPDIR", NULL, 0); - if (size == 0) { - return string(); // unset or empty envvar - } - unique_ptr value(new char[size]); - ::GetEnvironmentVariableA("TEST_TMPDIR", value.get(), size); - return value.get(); -#else - char* result = getenv("TEST_TMPDIR"); - return result != NULL ? string(result) : string(); -#endif -} - -RunfilesTest::MockFile* RunfilesTest::MockFile::Create(const string& name) { - return Create(name, vector()); -} - -RunfilesTest::MockFile* RunfilesTest::MockFile::Create( - const string& name, const vector& lines) { - if (name.find("..") != string::npos || TestOnly_IsAbsolute(name)) { - cerr << "WARNING: " << __FILE__ << "(" << __LINE__ << "): bad name: \"" - << name << "\"" << endl; - return nullptr; - } - - string tmp(RunfilesTest::GetTemp()); - if (tmp.empty()) { - cerr << "WARNING: " << __FILE__ << "(" << __LINE__ - << "): $TEST_TMPDIR is empty" << endl; - return nullptr; - } - string path(tmp + "/" + name); - - string::size_type i = 0; -#ifdef _WIN32 - while ((i = name.find_first_of("/\\", i + 1)) != string::npos) { - string d = tmp + "\\" + name.substr(0, i); - if (!CreateDirectoryA(d.c_str(), NULL)) { - cerr << "ERROR: " << __FILE__ << "(" << __LINE__ - << "): failed to create directory \"" << d << "\"" << endl; - return nullptr; - } - } -#else - while ((i = name.find_first_of('/', i + 1)) != string::npos) { - string d = tmp + "/" + name.substr(0, i); - if (mkdir(d.c_str(), 0777)) { - cerr << "ERROR: " << __FILE__ << "(" << __LINE__ - << "): failed to create directory \"" << d << "\"" << endl; - return nullptr; - } - } -#endif - - auto stm = std::ofstream(path); - for (auto i : lines) { - stm << i << std::endl; - } - return new MockFile(path); -} - -RunfilesTest::MockFile::~MockFile() { std::remove(path_.c_str()); } - -TEST_F(RunfilesTest, CreatesManifestBasedRunfilesFromManifestNextToBinary) { - unique_ptr mf(MockFile::Create( - "foo" LINE_AS_STRING() ".runfiles_manifest", {"a/b c/d"})); - EXPECT_TRUE(mf != nullptr); - string argv0(mf->Path().substr( - 0, mf->Path().size() - string(".runfiles_manifest").size())); - - string error; - unique_ptr r(Runfiles::Create(argv0, "", "", &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - EXPECT_EQ(r->Rlocation("a/b"), "c/d"); - // We know it's manifest-based because it returns empty string for unknown - // paths. - EXPECT_EQ(r->Rlocation("unknown"), ""); - AssertEnvvars(*r, mf->Path(), ""); -} - -TEST_F(RunfilesTest, - CreatesManifestBasedRunfilesFromManifestInRunfilesDirectory) { - unique_ptr mf(MockFile::Create( - "foo" LINE_AS_STRING() ".runfiles/MANIFEST", {"a/b c/d"})); - EXPECT_TRUE(mf != nullptr); - string argv0(mf->Path().substr( - 0, mf->Path().size() - string(".runfiles/MANIFEST").size())); - - string error; - unique_ptr r(Runfiles::Create(argv0, "", "", &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - EXPECT_EQ(r->Rlocation("a/b"), "c/d"); - EXPECT_EQ(r->Rlocation("foo"), argv0 + ".runfiles/foo"); - AssertEnvvars(*r, mf->Path(), argv0 + ".runfiles"); -} - -TEST_F(RunfilesTest, CreatesManifestBasedRunfilesFromEnvvar) { - unique_ptr mf(MockFile::Create( - "foo" LINE_AS_STRING() ".runfiles_manifest", {"a/b c/d"})); - EXPECT_TRUE(mf != nullptr); - - string error; - unique_ptr r(Runfiles::Create("ignore-argv0", mf->Path(), - "non-existent-runfiles_dir", &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - EXPECT_EQ(r->Rlocation("a/b"), "c/d"); - // We know it's manifest-based because it returns empty string for unknown - // paths. - EXPECT_EQ(r->Rlocation("unknown"), ""); - AssertEnvvars(*r, mf->Path(), ""); -} - -TEST_F(RunfilesTest, CannotCreateManifestBasedRunfilesDueToBadManifest) { - unique_ptr mf(MockFile::Create( - "foo" LINE_AS_STRING() ".runfiles_manifest", {"a b", "nospace"})); - EXPECT_TRUE(mf != nullptr); - - string error; - unique_ptr r( - Runfiles::Create("ignore-argv0", mf->Path(), "", &error)); - ASSERT_EQ(r, nullptr); - EXPECT_NE(error.find("bad runfiles manifest entry"), string::npos); - EXPECT_NE(error.find("line #2: \"nospace\""), string::npos); -} - -TEST_F(RunfilesTest, ManifestBasedRunfilesRlocationAndEnvVars) { - unique_ptr mf(MockFile::Create( - "foo" LINE_AS_STRING() ".runfiles_manifest", {"a/b c/d"})); - EXPECT_TRUE(mf != nullptr); - - string error; - unique_ptr r( - Runfiles::Create("ignore-argv0", mf->Path(), "", &error)); - - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - EXPECT_EQ(r->Rlocation("a/b"), "c/d"); - EXPECT_EQ(r->Rlocation("c/d"), ""); - EXPECT_EQ(r->Rlocation(""), ""); - EXPECT_EQ(r->Rlocation("foo"), ""); - EXPECT_EQ(r->Rlocation("foo/"), ""); - EXPECT_EQ(r->Rlocation("foo/bar"), ""); - EXPECT_EQ(r->Rlocation("../foo"), ""); - EXPECT_EQ(r->Rlocation("foo/.."), ""); - EXPECT_EQ(r->Rlocation("foo/../bar"), ""); - EXPECT_EQ(r->Rlocation("./foo"), ""); - EXPECT_EQ(r->Rlocation("foo/."), ""); - EXPECT_EQ(r->Rlocation("foo/./bar"), ""); - EXPECT_EQ(r->Rlocation("//foo"), ""); - EXPECT_EQ(r->Rlocation("foo//"), ""); - EXPECT_EQ(r->Rlocation("foo//bar"), ""); - EXPECT_EQ(r->Rlocation("/Foo"), "/Foo"); - EXPECT_EQ(r->Rlocation("c:/Foo"), "c:/Foo"); - EXPECT_EQ(r->Rlocation("c:\\Foo"), "c:\\Foo"); -} - -TEST_F(RunfilesTest, DirectoryBasedRunfilesRlocationAndEnvVars) { - unique_ptr dummy( - MockFile::Create("foo" LINE_AS_STRING() ".runfiles/dummy", {"a/b c/d"})); - EXPECT_TRUE(dummy != nullptr); - string dir = dummy->DirName(); - - string error; - unique_ptr r(Runfiles::Create("ignore-argv0", "", dir, &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - - EXPECT_EQ(r->Rlocation("a/b"), dir + "/a/b"); - EXPECT_EQ(r->Rlocation("c/d"), dir + "/c/d"); - EXPECT_EQ(r->Rlocation(""), ""); - EXPECT_EQ(r->Rlocation("foo"), dir + "/foo"); - EXPECT_EQ(r->Rlocation("foo/"), dir + "/foo/"); - EXPECT_EQ(r->Rlocation("foo/bar"), dir + "/foo/bar"); - EXPECT_EQ(r->Rlocation("../foo"), ""); - EXPECT_EQ(r->Rlocation("foo/.."), ""); - EXPECT_EQ(r->Rlocation("foo/../bar"), ""); - EXPECT_EQ(r->Rlocation("./foo"), ""); - EXPECT_EQ(r->Rlocation("foo/."), ""); - EXPECT_EQ(r->Rlocation("foo/./bar"), ""); - EXPECT_EQ(r->Rlocation("//foo"), ""); - EXPECT_EQ(r->Rlocation("foo//"), ""); - EXPECT_EQ(r->Rlocation("foo//bar"), ""); - EXPECT_EQ(r->Rlocation("/Foo"), "/Foo"); - EXPECT_EQ(r->Rlocation("c:/Foo"), "c:/Foo"); - EXPECT_EQ(r->Rlocation("c:\\Foo"), "c:\\Foo"); - AssertEnvvars(*r, "", dir); -} - -TEST_F(RunfilesTest, ManifestAndDirectoryBasedRunfilesRlocationAndEnvVars) { - unique_ptr mf(MockFile::Create( - "foo" LINE_AS_STRING() ".runfiles/MANIFEST", {"a/b c/d"})); - EXPECT_TRUE(mf != nullptr); - string dir = mf->DirName(); - - string error; - unique_ptr r( - Runfiles::Create("ignore-argv0", mf->Path(), "", &error)); - - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - EXPECT_EQ(r->Rlocation("a/b"), "c/d"); - EXPECT_EQ(r->Rlocation("c/d"), dir + "/c/d"); - EXPECT_EQ(r->Rlocation(""), ""); - EXPECT_EQ(r->Rlocation("foo"), dir + "/foo"); - EXPECT_EQ(r->Rlocation("foo/"), dir + "/foo/"); - EXPECT_EQ(r->Rlocation("foo/bar"), dir + "/foo/bar"); - EXPECT_EQ(r->Rlocation("../foo"), ""); - EXPECT_EQ(r->Rlocation("foo/.."), ""); - EXPECT_EQ(r->Rlocation("foo/../bar"), ""); - EXPECT_EQ(r->Rlocation("./foo"), ""); - EXPECT_EQ(r->Rlocation("foo/."), ""); - EXPECT_EQ(r->Rlocation("foo/./bar"), ""); - EXPECT_EQ(r->Rlocation("//foo"), ""); - EXPECT_EQ(r->Rlocation("foo//"), ""); - EXPECT_EQ(r->Rlocation("foo//bar"), ""); - EXPECT_EQ(r->Rlocation("/Foo"), "/Foo"); - EXPECT_EQ(r->Rlocation("c:/Foo"), "c:/Foo"); - EXPECT_EQ(r->Rlocation("c:\\Foo"), "c:\\Foo"); - AssertEnvvars(*r, mf->Path(), dir); -} - -TEST_F(RunfilesTest, ManifestBasedRunfilesEnvVars) { - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() ".runfiles_manifest"))); - EXPECT_TRUE(mf != nullptr); - - string error; - unique_ptr r( - Runfiles::Create("ignore-argv0", mf->Path(), "", &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - - AssertEnvvars(*r, mf->Path(), ""); -} - -TEST_F(RunfilesTest, CreatesDirectoryBasedRunfilesFromDirectoryNextToBinary) { - // We create a directory as a side-effect of creating a mock file. - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() ".runfiles/dummy"))); - string argv0(mf->Path().substr( - 0, mf->Path().size() - string(".runfiles/dummy").size())); - - string error; - unique_ptr r(Runfiles::Create(argv0, "", "", &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - - EXPECT_EQ(r->Rlocation("a/b"), argv0 + ".runfiles/a/b"); - // We know it's directory-based because it returns some result for unknown - // paths. - EXPECT_EQ(r->Rlocation("unknown"), argv0 + ".runfiles/unknown"); - AssertEnvvars(*r, "", argv0 + ".runfiles"); -} - -TEST_F(RunfilesTest, CreatesDirectoryBasedRunfilesFromEnvvar) { - // We create a directory as a side-effect of creating a mock file. - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() ".runfiles/dummy"))); - string dir = mf->DirName(); - - string error; - unique_ptr r(Runfiles::Create("ignore-argv0", "", dir, &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - - EXPECT_EQ(r->Rlocation("a/b"), dir + "/a/b"); - EXPECT_EQ(r->Rlocation("foo"), dir + "/foo"); - EXPECT_EQ(r->Rlocation("/Foo"), "/Foo"); - EXPECT_EQ(r->Rlocation("c:/Foo"), "c:/Foo"); - EXPECT_EQ(r->Rlocation("c:\\Foo"), "c:\\Foo"); - AssertEnvvars(*r, "", dir); -} - -TEST_F(RunfilesTest, FailsToCreateAnyRunfilesBecauseEnvvarsAreNotDefined) { - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() ".runfiles/MANIFEST"))); - EXPECT_TRUE(mf != nullptr); - - string error; - unique_ptr r( - Runfiles::Create("ignore-argv0", mf->Path(), "whatever", &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - - // We create a directory as a side-effect of creating a mock file. - mf.reset(MockFile::Create(string("foo" LINE_AS_STRING() ".runfiles/dummy"))); - r.reset(Runfiles::Create("ignore-argv0", "", mf->DirName(), &error)); - ASSERT_NE(r, nullptr); - EXPECT_TRUE(error.empty()); - - r.reset(Runfiles::Create("ignore-argv0", "", "", &error)); - ASSERT_EQ(r, nullptr); - EXPECT_NE(error.find("cannot find runfiles"), string::npos); -} - -TEST_F(RunfilesTest, MockFileTest) { - { - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() "/.."))); - EXPECT_TRUE(mf == nullptr); - } - - { - unique_ptr mf(MockFile::Create(string("/Foo" LINE_AS_STRING()))); - EXPECT_TRUE(mf == nullptr); - } - - { - unique_ptr mf( - MockFile::Create(string("C:/Foo" LINE_AS_STRING()))); - EXPECT_TRUE(mf == nullptr); - } - - string path; - { - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() "/bar1/qux"))); - EXPECT_TRUE(mf != nullptr); - path = mf->Path(); - - std::ifstream stm(path); - EXPECT_TRUE(stm.good()); - string actual; - stm >> actual; - EXPECT_TRUE(actual.empty()); - } - { - std::ifstream stm(path); - EXPECT_FALSE(stm.good()); - } - - { - unique_ptr mf(MockFile::Create( - string("foo" LINE_AS_STRING() "/bar2/qux"), vector())); - EXPECT_TRUE(mf != nullptr); - path = mf->Path(); - - std::ifstream stm(path); - EXPECT_TRUE(stm.good()); - string actual; - stm >> actual; - EXPECT_TRUE(actual.empty()); - } - { - std::ifstream stm(path); - EXPECT_FALSE(stm.good()); - } - - { - unique_ptr mf( - MockFile::Create(string("foo" LINE_AS_STRING() "/bar3/qux"), - {"hello world", "you are beautiful"})); - EXPECT_TRUE(mf != nullptr); - path = mf->Path(); - - std::ifstream stm(path); - EXPECT_TRUE(stm.good()); - string actual; - std::getline(stm, actual); - EXPECT_EQ("hello world", actual); - std::getline(stm, actual); - EXPECT_EQ("you are beautiful", actual); - std::getline(stm, actual); - EXPECT_EQ("", actual); - } - { - std::ifstream stm(path); - EXPECT_FALSE(stm.good()); - } -} - -TEST_F(RunfilesTest, IsAbsolute) { - EXPECT_FALSE(TestOnly_IsAbsolute("foo")); - EXPECT_FALSE(TestOnly_IsAbsolute("foo/bar")); - EXPECT_FALSE(TestOnly_IsAbsolute("\\foo")); - EXPECT_TRUE(TestOnly_IsAbsolute("c:\\foo")); - EXPECT_TRUE(TestOnly_IsAbsolute("c:/foo")); - EXPECT_TRUE(TestOnly_IsAbsolute("/foo")); - EXPECT_TRUE(TestOnly_IsAbsolute("x:\\foo")); - EXPECT_FALSE(TestOnly_IsAbsolute("::\\foo")); - EXPECT_FALSE(TestOnly_IsAbsolute("x\\foo")); - EXPECT_FALSE(TestOnly_IsAbsolute("x:")); - EXPECT_TRUE(TestOnly_IsAbsolute("x:\\")); -} - -TEST_F(RunfilesTest, PathsFromEnvVars) { - string mf, dir; - - // Both envvars have a valid value. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "mock1/MANIFEST"; }, - [](const string& path) { return path == "mock2"; }, &mf, &dir)); - EXPECT_EQ(mf, "mock1/MANIFEST"); - EXPECT_EQ(dir, "mock2"); - - // RUNFILES_MANIFEST_FILE is invalid but RUNFILES_DIR is good and there's a - // runfiles manifest in the runfiles directory. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "mock2/MANIFEST"; }, - [](const string& path) { return path == "mock2"; }, &mf, &dir)); - EXPECT_EQ(mf, "mock2/MANIFEST"); - EXPECT_EQ(dir, "mock2"); - - // RUNFILES_MANIFEST_FILE is invalid but RUNFILES_DIR is good, but there's no - // runfiles manifest in the runfiles directory. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return false; }, - [](const string& path) { return path == "mock2"; }, &mf, &dir)); - EXPECT_EQ(mf, ""); - EXPECT_EQ(dir, "mock2"); - - // RUNFILES_DIR is invalid but RUNFILES_MANIFEST_FILE is good, and it is in - // a valid-looking runfiles directory. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "mock1/MANIFEST"; }, - [](const string& path) { return path == "mock1"; }, &mf, &dir)); - EXPECT_EQ(mf, "mock1/MANIFEST"); - EXPECT_EQ(dir, "mock1"); - - // RUNFILES_DIR is invalid but RUNFILES_MANIFEST_FILE is good, but it is not - // in any valid-looking runfiles directory. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "mock1/MANIFEST"; }, - [](const string& path) { return false; }, &mf, &dir)); - EXPECT_EQ(mf, "mock1/MANIFEST"); - EXPECT_EQ(dir, ""); - - // Both envvars are invalid, but there's a manifest in a runfiles directory - // next to argv0, however there's no other content in the runfiles directory. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "argv0.runfiles/MANIFEST"; }, - [](const string& path) { return false; }, &mf, &dir)); - EXPECT_EQ(mf, "argv0.runfiles/MANIFEST"); - EXPECT_EQ(dir, ""); - - // Both envvars are invalid, but there's a manifest next to argv0. There's - // no runfiles tree anywhere. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "argv0.runfiles_manifest"; }, - [](const string& path) { return false; }, &mf, &dir)); - EXPECT_EQ(mf, "argv0.runfiles_manifest"); - EXPECT_EQ(dir, ""); - - // Both envvars are invalid, but there's a valid manifest next to argv0, and a - // valid runfiles directory (without a manifest in it). - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "argv0.runfiles_manifest"; }, - [](const string& path) { return path == "argv0.runfiles"; }, &mf, &dir)); - EXPECT_EQ(mf, "argv0.runfiles_manifest"); - EXPECT_EQ(dir, "argv0.runfiles"); - - // Both envvars are invalid, but there's a valid runfiles directory next to - // argv0, though no manifest in it. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return false; }, - [](const string& path) { return path == "argv0.runfiles"; }, &mf, &dir)); - EXPECT_EQ(mf, ""); - EXPECT_EQ(dir, "argv0.runfiles"); - - // Both envvars are invalid, but there's a valid runfiles directory next to - // argv0 with a valid manifest in it. - EXPECT_TRUE(TestOnly_PathsFrom( - "argv0", "mock1/MANIFEST", "mock2", - [](const string& path) { return path == "argv0.runfiles/MANIFEST"; }, - [](const string& path) { return path == "argv0.runfiles"; }, &mf, &dir)); - EXPECT_EQ(mf, "argv0.runfiles/MANIFEST"); - EXPECT_EQ(dir, "argv0.runfiles"); -} - -} // namespace -} // namespace runfiles -} // namespace cpp -} // namespace tools -} // namespace bazel diff --git a/cc/private/toolchain/unix_cc_configure.bzl b/cc/private/toolchain/unix_cc_configure.bzl deleted file mode 100644 index a7e4d7e..0000000 --- a/cc/private/toolchain/unix_cc_configure.bzl +++ /dev/null @@ -1,567 +0,0 @@ -# pylint: disable=g-bad-file-header -# Copyright 2016 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. -"""Configuring the C++ toolchain on Unix platforms.""" - -load( - "//cc/private/toolchain:lib_cc_configure.bzl", - "auto_configure_fail", - "auto_configure_warning", - "auto_configure_warning_maybe", - "escape_string", - "get_env_var", - "get_starlark_list", - "resolve_labels", - "split_escaped", - "which", -) - -def _field(name, value): - """Returns properly indented top level crosstool field.""" - if type(value) == "list": - return "\n".join([" " + name + ": '" + v + "'" for v in value]) - elif type(value) == "string": - return " " + name + ": '" + value + "'" - else: - auto_configure_fail("Unexpected field type: " + type(value)) - return "" - -def _uniq(iterable): - """Remove duplicates from a list.""" - - unique_elements = {element: None for element in iterable} - return unique_elements.keys() - -def _prepare_include_path(repo_ctx, path): - """Resolve and sanitize include path before outputting it into the crosstool. - - Args: - repo_ctx: repository_ctx object. - path: an include path to be sanitized. - - Returns: - Sanitized include path that can be written to the crosstoot. Resulting path - is absolute if it is outside the repository and relative otherwise. - """ - - repo_root = str(repo_ctx.path(".")) - - # We're on UNIX, so the path delimiter is '/'. - repo_root += "/" - path = str(repo_ctx.path(path)) - if path.startswith(repo_root): - return escape_string(path[len(repo_root):]) - return escape_string(path) - -def _get_value(it): - """Convert `it` in serialized protobuf format.""" - if type(it) == "int": - return str(it) - elif type(it) == "bool": - return "true" if it else "false" - else: - return "\"%s\"" % it - -def _find_tool(repository_ctx, tool, overriden_tools): - """Find a tool for repository, taking overriden tools into account.""" - if tool in overriden_tools: - return overriden_tools[tool] - return which(repository_ctx, tool, "/usr/bin/" + tool) - -def _get_tool_paths(repository_ctx, overriden_tools): - """Compute the %-escaped path to the various tools""" - return dict({ - k: escape_string(_find_tool(repository_ctx, k, overriden_tools)) - for k in [ - "ar", - "ld", - "cpp", - "gcc", - "dwp", - "gcov", - "nm", - "objcopy", - "objdump", - "strip", - ] - }.items()) - -def _escaped_cplus_include_paths(repository_ctx): - """Use ${CPLUS_INCLUDE_PATH} to compute the %-escaped list of flags for cxxflag.""" - if "CPLUS_INCLUDE_PATH" in repository_ctx.os.environ: - result = [] - for p in repository_ctx.os.environ["CPLUS_INCLUDE_PATH"].split(":"): - p = escape_string(str(repository_ctx.path(p))) # Normalize the path - result.append("-I" + p) - return result - else: - return [] - -_INC_DIR_MARKER_BEGIN = "#include <...>" - -# OSX add " (framework directory)" at the end of line, strip it. -_OSX_FRAMEWORK_SUFFIX = " (framework directory)" -_OSX_FRAMEWORK_SUFFIX_LEN = len(_OSX_FRAMEWORK_SUFFIX) - -def _cxx_inc_convert(path): - """Convert path returned by cc -E xc++ in a complete path. Doesn't %-escape the path!""" - path = path.strip() - if path.endswith(_OSX_FRAMEWORK_SUFFIX): - path = path[:-_OSX_FRAMEWORK_SUFFIX_LEN].strip() - return path - -def get_escaped_cxx_inc_directories(repository_ctx, cc, lang_flag, additional_flags = []): - """Compute the list of default %-escaped C++ include directories.""" - result = repository_ctx.execute([cc, "-E", lang_flag, "-", "-v"] + additional_flags) - index1 = result.stderr.find(_INC_DIR_MARKER_BEGIN) - if index1 == -1: - return [] - index1 = result.stderr.find("\n", index1) - if index1 == -1: - return [] - index2 = result.stderr.rfind("\n ") - if index2 == -1 or index2 < index1: - return [] - index2 = result.stderr.find("\n", index2 + 1) - if index2 == -1: - inc_dirs = result.stderr[index1 + 1:] - else: - inc_dirs = result.stderr[index1 + 1:index2].strip() - - return [ - _prepare_include_path(repository_ctx, _cxx_inc_convert(p)) - for p in inc_dirs.split("\n") - ] - -def _is_compiler_option_supported(repository_ctx, cc, option): - """Checks that `option` is supported by the C compiler. Doesn't %-escape the option.""" - result = repository_ctx.execute([ - cc, - option, - "-o", - "/dev/null", - "-c", - str(repository_ctx.path("cc/private/toolchain/empty.cc")), - ]) - return result.stderr.find(option) == -1 - -def _is_linker_option_supported(repository_ctx, cc, option, pattern): - """Checks that `option` is supported by the C linker. Doesn't %-escape the option.""" - result = repository_ctx.execute([ - cc, - option, - "-o", - "/dev/null", - str(repository_ctx.path("cc/private/toolchain/empty.cc")), - ]) - return result.stderr.find(pattern) == -1 - -def _find_gold_linker_path(repository_ctx, cc): - """Checks if `gold` is supported by the C compiler. - - Args: - repository_ctx: repository_ctx. - cc: path to the C compiler. - - Returns: - String to put as value to -fuse-ld= flag, or None if gold couldn't be found. - """ - result = repository_ctx.execute([ - cc, - str(repository_ctx.path("cc/private/toolchain/empty.cc")), - "-o", - "/dev/null", - # Some macos clang versions don't fail when setting -fuse-ld=gold, adding - # these lines to force it to. This also means that we will not detect - # gold when only a very old (year 2010 and older) is present. - "-Wl,--start-lib", - "-Wl,--end-lib", - "-fuse-ld=gold", - "-v", - ]) - if result.return_code != 0: - return None - - for line in result.stderr.splitlines(): - if line.find("gold") == -1: - continue - for flag in line.split(" "): - if flag.find("gold") == -1: - continue - - # flag is '-fuse-ld=gold' for GCC or "/usr/lib/ld.gold" for Clang - # strip space, single quote, and double quotes - flag = flag.strip(" \"'") - - # remove -fuse-ld= from GCC output so we have only the flag value part - flag = flag.replace("-fuse-ld=", "") - return flag - auto_configure_warning( - "CC with -fuse-ld=gold returned 0, but its -v output " + - "didn't contain 'gold', falling back to the default linker.", - ) - return None - -def _add_compiler_option_if_supported(repository_ctx, cc, option): - """Returns `[option]` if supported, `[]` otherwise. Doesn't %-escape the option.""" - return [option] if _is_compiler_option_supported(repository_ctx, cc, option) else [] - -def _add_linker_option_if_supported(repository_ctx, cc, option, pattern): - """Returns `[option]` if supported, `[]` otherwise. Doesn't %-escape the option.""" - return [option] if _is_linker_option_supported(repository_ctx, cc, option, pattern) else [] - -def _get_no_canonical_prefixes_opt(repository_ctx, cc): - # If the compiler sometimes rewrites paths in the .d files without symlinks - # (ie when they're shorter), it confuses Bazel's logic for verifying all - # #included header files are listed as inputs to the action. - - # The '-fno-canonical-system-headers' should be enough, but clang does not - # support it, so we also try '-no-canonical-prefixes' if first option does - # not work. - opt = _add_compiler_option_if_supported( - repository_ctx, - cc, - "-fno-canonical-system-headers", - ) - if len(opt) == 0: - return _add_compiler_option_if_supported( - repository_ctx, - cc, - "-no-canonical-prefixes", - ) - return opt - -def get_env(repository_ctx): - """Convert the environment in a list of export if in Homebrew. Doesn't %-escape the result!""" - env = repository_ctx.os.environ - if "HOMEBREW_RUBY_PATH" in env: - return "\n".join([ - "export %s='%s'" % (k, env[k].replace("'", "'\\''")) - for k in env - if k != "_" and k.find(".") == -1 - ]) - else: - return "" - -def _coverage_flags(repository_ctx, darwin): - use_llvm_cov = "1" == get_env_var( - repository_ctx, - "BAZEL_USE_LLVM_NATIVE_COVERAGE", - default = "0", - enable_warning = False, - ) - if darwin or use_llvm_cov: - compile_flags = '"-fprofile-instr-generate", "-fcoverage-mapping"' - link_flags = '"-fprofile-instr-generate"' - else: - # gcc requires --coverage being passed for compilation and linking - # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#Instrumentation-Options - compile_flags = '"--coverage"' - link_flags = '"--coverage"' - return compile_flags, link_flags - -def _find_generic(repository_ctx, name, env_name, overriden_tools, warn = False, silent = False): - """Find a generic C++ toolchain tool. Doesn't %-escape the result.""" - - if name in overriden_tools: - return overriden_tools[name] - - result = name - env_value = repository_ctx.os.environ.get(env_name) - env_value_with_paren = "" - if env_value != None: - env_value = env_value.strip() - if env_value: - result = env_value - env_value_with_paren = " (%s)" % env_value - if result.startswith("/"): - # Absolute path, maybe we should make this suported by our which function. - return result - result = repository_ctx.which(result) - if result == None: - msg = ("Cannot find %s or %s%s; either correct your path or set the %s" + - " environment variable") % (name, env_name, env_value_with_paren, env_name) - if warn: - if not silent: - auto_configure_warning(msg) - else: - auto_configure_fail(msg) - return result - -def find_cc(repository_ctx, overriden_tools): - return _find_generic(repository_ctx, "gcc", "CC", overriden_tools) - -def configure_unix_toolchain(repository_ctx, cpu_value, overriden_tools): - """Configure C++ toolchain on Unix platforms.""" - paths = resolve_labels(repository_ctx, [ - "//cc/private/toolchain:BUILD.tpl", - "//cc/private/toolchain:armeabi_cc_toolchain_config.bzl", - "//cc/private/toolchain:unix_cc_toolchain_config.bzl", - "//cc/private/toolchain:linux_cc_wrapper.sh.tpl", - "//cc/private/toolchain:osx_cc_wrapper.sh.tpl", - ]) - - repository_ctx.symlink( - paths["//cc/private/toolchain:unix_cc_toolchain_config.bzl"], - "cc_toolchain_config.bzl", - ) - - repository_ctx.symlink( - paths["//cc/private/toolchain:armeabi_cc_toolchain_config.bzl"], - "armeabi_cc_toolchain_config.bzl", - ) - - repository_ctx.file("cc/private/toolchain/empty.cc", "int main() {}") - darwin = cpu_value == "darwin" - - cc = _find_generic(repository_ctx, "gcc", "CC", overriden_tools) - overriden_tools = dict(overriden_tools) - overriden_tools["gcc"] = cc - overriden_tools["gcov"] = _find_generic( - repository_ctx, - "gcov", - "GCOV", - overriden_tools, - warn = True, - silent = True, - ) - if darwin: - overriden_tools["gcc"] = "cc_wrapper.sh" - overriden_tools["ar"] = "/usr/bin/libtool" - auto_configure_warning_maybe(repository_ctx, "CC used: " + str(cc)) - tool_paths = _get_tool_paths(repository_ctx, overriden_tools) - cc_toolchain_identifier = escape_string(get_env_var( - repository_ctx, - "CC_TOOLCHAIN_NAME", - "local", - False, - )) - - cc_wrapper_src = ( - "//cc/private/toolchain:osx_cc_wrapper.sh.tpl" if darwin else "//cc/private/toolchain:linux_cc_wrapper.sh.tpl" - ) - repository_ctx.template( - "cc_wrapper.sh", - paths[cc_wrapper_src], - { - "%{cc}": escape_string(str(cc)), - "%{env}": escape_string(get_env(repository_ctx)), - }, - ) - - cxx_opts = split_escaped(get_env_var( - repository_ctx, - "BAZEL_CXXOPTS", - "-std=c++0x", - False, - ), ":") - link_opts = split_escaped(get_env_var( - repository_ctx, - "BAZEL_LINKOPTS", - "-lstdc++:-lm", - False, - ), ":") - link_libs = split_escaped(get_env_var( - repository_ctx, - "BAZEL_LINKLIBS", - "", - False, - ), ":") - gold_linker_path = _find_gold_linker_path(repository_ctx, cc) - cc_path = repository_ctx.path(cc) - if not str(cc_path).startswith(str(repository_ctx.path(".")) + "/"): - # cc is outside the repository, set -B - bin_search_flag = ["-B" + escape_string(str(cc_path.dirname))] - else: - # cc is inside the repository, don't set -B. - bin_search_flag = [] - - coverage_compile_flags, coverage_link_flags = _coverage_flags(repository_ctx, darwin) - - repository_ctx.template( - "BUILD", - paths["//cc/private/toolchain:BUILD.tpl"], - { - "%{cc_toolchain_identifier}": cc_toolchain_identifier, - "%{name}": cpu_value, - "%{supports_param_files}": "0" if darwin else "1", - "%{cc_compiler_deps}": ":cc_wrapper" if darwin else ":empty", - "%{compiler}": escape_string(get_env_var( - repository_ctx, - "BAZEL_COMPILER", - "compiler", - False, - )), - "%{abi_version}": escape_string(get_env_var( - repository_ctx, - "ABI_VERSION", - "local", - False, - )), - "%{abi_libc_version}": escape_string(get_env_var( - repository_ctx, - "ABI_LIBC_VERSION", - "local", - False, - )), - "%{host_system_name}": escape_string(get_env_var( - repository_ctx, - "BAZEL_HOST_SYSTEM", - "local", - False, - )), - "%{target_libc}": "macosx" if darwin else escape_string(get_env_var( - repository_ctx, - "BAZEL_TARGET_LIBC", - "local", - False, - )), - "%{target_cpu}": escape_string(get_env_var( - repository_ctx, - "BAZEL_TARGET_CPU", - cpu_value, - False, - )), - "%{target_system_name}": escape_string(get_env_var( - repository_ctx, - "BAZEL_TARGET_SYSTEM", - "local", - False, - )), - "%{tool_paths}": ",\n ".join( - ['"%s": "%s"' % (k, v) for k, v in tool_paths.items()], - ), - "%{cxx_builtin_include_directories}": get_starlark_list( - _uniq( - get_escaped_cxx_inc_directories(repository_ctx, cc, "-xc") + - get_escaped_cxx_inc_directories(repository_ctx, cc, "-xc++", cxx_opts) + - get_escaped_cxx_inc_directories( - repository_ctx, - cc, - "-xc", - _get_no_canonical_prefixes_opt(repository_ctx, cc), - ) + - get_escaped_cxx_inc_directories( - repository_ctx, - cc, - "-xc++", - cxx_opts + _get_no_canonical_prefixes_opt(repository_ctx, cc), - ), - ), - ), - "%{compile_flags}": get_starlark_list( - [ - # Security hardening requires optimization. - # We need to undef it as some distributions now have it enabled by default. - "-U_FORTIFY_SOURCE", - "-fstack-protector", - # All warnings are enabled. Maybe enable -Werror as well? - "-Wall", - # Enable a few more warnings that aren't part of -Wall. - ] + (( - _add_compiler_option_if_supported(repository_ctx, cc, "-Wthread-safety") + - _add_compiler_option_if_supported(repository_ctx, cc, "-Wself-assign") - )) + ( - # Disable problematic warnings. - _add_compiler_option_if_supported(repository_ctx, cc, "-Wunused-but-set-parameter") + - # has false positives - _add_compiler_option_if_supported(repository_ctx, cc, "-Wno-free-nonheap-object") + - # Enable coloring even if there's no attached terminal. Bazel removes the - # escape sequences if --nocolor is specified. - _add_compiler_option_if_supported(repository_ctx, cc, "-fcolor-diagnostics") - ) + [ - # Keep stack frames for debugging, even in opt mode. - "-fno-omit-frame-pointer", - ], - ), - "%{cxx_flags}": get_starlark_list(cxx_opts + _escaped_cplus_include_paths(repository_ctx)), - "%{link_flags}": get_starlark_list(( - ["-fuse-ld=" + gold_linker_path] if gold_linker_path else [] - ) + _add_linker_option_if_supported( - repository_ctx, - cc, - "-Wl,-no-as-needed", - "-no-as-needed", - ) + _add_linker_option_if_supported( - repository_ctx, - cc, - "-Wl,-z,relro,-z,now", - "-z", - ) + ( - [ - "-undefined", - "dynamic_lookup", - "-headerpad_max_install_names", - ] if darwin else bin_search_flag + [ - # Gold linker only? Can we enable this by default? - # "-Wl,--warn-execstack", - # "-Wl,--detect-odr-violations" - ] + _add_compiler_option_if_supported( - # Have gcc return the exit code from ld. - repository_ctx, - cc, - "-pass-exit-codes", - ) - ) + link_opts), - "%{link_libs}": get_starlark_list(link_libs), - "%{opt_compile_flags}": get_starlark_list( - [ - # No debug symbols. - # Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt or - # even generally? However, that can't happen here, as it requires special - # handling in Bazel. - "-g0", - - # Conservative choice for -O - # -O3 can increase binary size and even slow down the resulting binaries. - # Profile first and / or use FDO if you need better performance than this. - "-O2", - - # Security hardening on by default. - # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases. - "-D_FORTIFY_SOURCE=1", - - # Disable assertions - "-DNDEBUG", - - # Removal of unused code and data at link time (can this increase binary - # size in some cases?). - "-ffunction-sections", - "-fdata-sections", - ], - ), - "%{opt_link_flags}": get_starlark_list( - [] if darwin else _add_linker_option_if_supported( - repository_ctx, - cc, - "-Wl,--gc-sections", - "-gc-sections", - ), - ), - "%{unfiltered_compile_flags}": get_starlark_list( - _get_no_canonical_prefixes_opt(repository_ctx, cc) + [ - # Make C++ compilation deterministic. Use linkstamping instead of these - # compiler symbols. - "-Wno-builtin-macro-redefined", - "-D__DATE__=\\\"redacted\\\"", - "-D__TIMESTAMP__=\\\"redacted\\\"", - "-D__TIME__=\\\"redacted\\\"", - ], - ), - "%{dbg_compile_flags}": get_starlark_list(["-g"]), - "%{coverage_compile_flags}": coverage_compile_flags, - "%{coverage_link_flags}": coverage_link_flags, - "%{supports_start_end_lib}": "True" if gold_linker_path else "False", - }, - ) diff --git a/cc/private/toolchain/unix_cc_toolchain_config.bzl b/cc/private/toolchain/unix_cc_toolchain_config.bzl deleted file mode 100644 index 1c7cd6b..0000000 --- a/cc/private/toolchain/unix_cc_toolchain_config.bzl +++ /dev/null @@ -1,1133 +0,0 @@ -# Copyright 2019 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. - -"""A Starlark cc_toolchain configuration rule""" - -load( - "//cc/private/toolchain:cc_toolchain_config_lib.bzl", - "feature", - "feature_set", - "flag_group", - "flag_set", - "tool_path", - "variable_with_value", - "with_feature_set", -) -load("//cc:action_names.bzl", "ACTION_NAMES") - -all_compile_actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.clif_match, - ACTION_NAMES.lto_backend, -] - -all_cpp_compile_actions = [ - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.clif_match, -] - -preprocessor_compile_actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.clif_match, -] - -codegen_compile_actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, -] - -all_link_actions = [ - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, -] - -lto_index_actions = [ - ACTION_NAMES.lto_index_for_executable, - ACTION_NAMES.lto_index_for_dynamic_library, - ACTION_NAMES.lto_index_for_nodeps_dynamic_library, -] - -def _impl(ctx): - tool_paths = [ - tool_path(name = name, path = path) - for name, path in ctx.attr.tool_paths.items() - ] - action_configs = [] - - supports_pic_feature = feature( - name = "supports_pic", - enabled = True, - ) - supports_start_end_lib_feature = feature( - name = "supports_start_end_lib", - enabled = True, - ) - - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_compile_actions, - flag_groups = ([ - flag_group( - flags = ctx.attr.compile_flags, - ), - ] if ctx.attr.compile_flags else []), - ), - flag_set( - actions = all_compile_actions, - flag_groups = ([ - flag_group( - flags = ctx.attr.dbg_compile_flags, - ), - ] if ctx.attr.dbg_compile_flags else []), - with_features = [with_feature_set(features = ["dbg"])], - ), - flag_set( - actions = all_compile_actions, - flag_groups = ([ - flag_group( - flags = ctx.attr.opt_compile_flags, - ), - ] if ctx.attr.opt_compile_flags else []), - with_features = [with_feature_set(features = ["opt"])], - ), - flag_set( - actions = all_cpp_compile_actions + [ACTION_NAMES.lto_backend], - flag_groups = ([ - flag_group( - flags = ctx.attr.cxx_flags, - ), - ] if ctx.attr.cxx_flags else []), - ), - ], - ) - - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = ([ - flag_group( - flags = ctx.attr.link_flags, - ), - ] if ctx.attr.link_flags else []), - ), - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = ([ - flag_group( - flags = ctx.attr.opt_link_flags, - ), - ] if ctx.attr.opt_link_flags else []), - with_features = [with_feature_set(features = ["opt"])], - ), - ], - ) - - dbg_feature = feature(name = "dbg") - - opt_feature = feature(name = "opt") - - sysroot_feature = feature( - name = "sysroot", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, - ACTION_NAMES.clif_match, - ] + all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["--sysroot=%{sysroot}"], - expand_if_available = "sysroot", - ), - ], - ), - ], - ) - - fdo_optimize_feature = feature( - name = "fdo_optimize", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [ - flag_group( - flags = [ - "-fprofile-use=%{fdo_profile_path}", - "-fprofile-correction", - ], - expand_if_available = "fdo_profile_path", - ), - ], - ), - ], - provides = ["profile"], - ) - - supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True) - - user_compile_flags_feature = feature( - name = "user_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_compile_actions, - flag_groups = [ - flag_group( - flags = ["%{user_compile_flags}"], - iterate_over = "user_compile_flags", - expand_if_available = "user_compile_flags", - ), - ], - ), - ], - ) - - unfiltered_compile_flags_feature = feature( - name = "unfiltered_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_compile_actions, - flag_groups = ([ - flag_group( - flags = ctx.attr.unfiltered_compile_flags, - ), - ] if ctx.attr.unfiltered_compile_flags else []), - ), - ], - ) - - library_search_directories_feature = feature( - name = "library_search_directories", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["-L%{library_search_directories}"], - iterate_over = "library_search_directories", - expand_if_available = "library_search_directories", - ), - ], - ), - ], - ) - - static_libgcc_feature = feature( - name = "static_libgcc", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.lto_index_for_executable, - ACTION_NAMES.lto_index_for_dynamic_library, - ], - flag_groups = [flag_group(flags = ["-static-libgcc"])], - with_features = [ - with_feature_set(features = ["static_link_cpp_runtimes"]), - ], - ), - ], - ) - - pic_feature = feature( - name = "pic", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_module_compile, - ], - flag_groups = [ - flag_group(flags = ["-fPIC"], expand_if_available = "pic"), - ], - ), - ], - ) - - per_object_debug_info_feature = feature( - name = "per_object_debug_info", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_codegen, - ], - flag_groups = [ - flag_group( - flags = ["-gsplit-dwarf"], - expand_if_available = "per_object_debug_info_file", - ), - ], - ), - ], - ) - - preprocessor_defines_feature = feature( - name = "preprocessor_defines", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.clif_match, - ], - flag_groups = [ - flag_group( - flags = ["-D%{preprocessor_defines}"], - iterate_over = "preprocessor_defines", - ), - ], - ), - ], - ) - - cs_fdo_optimize_feature = feature( - name = "cs_fdo_optimize", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.lto_backend], - flag_groups = [ - flag_group( - flags = [ - "-fprofile-use=%{fdo_profile_path}", - "-Xclang-only=-Wno-profile-instr-unprofiled", - "-Xclang-only=-Wno-profile-instr-out-of-date", - "-fprofile-correction", - ], - expand_if_available = "fdo_profile_path", - ), - ], - ), - ], - provides = ["csprofile"], - ) - - autofdo_feature = feature( - name = "autofdo", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [ - flag_group( - flags = [ - "-fauto-profile=%{fdo_profile_path}", - "-fprofile-correction", - ], - expand_if_available = "fdo_profile_path", - ), - ], - ), - ], - provides = ["profile"], - ) - - runtime_library_search_directories_feature = feature( - name = "runtime_library_search_directories", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - iterate_over = "runtime_library_search_directories", - flag_groups = [ - flag_group( - flags = [ - "-Wl,-rpath,$EXEC_ORIGIN/%{runtime_library_search_directories}", - ], - expand_if_true = "is_cc_test", - ), - flag_group( - flags = [ - "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}", - ], - expand_if_false = "is_cc_test", - ), - ], - expand_if_available = - "runtime_library_search_directories", - ), - ], - with_features = [ - with_feature_set(features = ["static_link_cpp_runtimes"]), - ], - ), - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - iterate_over = "runtime_library_search_directories", - flag_groups = [ - flag_group( - flags = [ - "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}", - ], - ), - ], - expand_if_available = - "runtime_library_search_directories", - ), - ], - with_features = [ - with_feature_set( - not_features = ["static_link_cpp_runtimes"], - ), - ], - ), - ], - ) - - fission_support_feature = feature( - name = "fission_support", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["-Wl,--gdb-index"], - expand_if_available = "is_using_fission", - ), - ], - ), - ], - ) - - shared_flag_feature = feature( - name = "shared_flag", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.lto_index_for_dynamic_library, - ACTION_NAMES.lto_index_for_nodeps_dynamic_library, - ], - flag_groups = [flag_group(flags = ["-shared"])], - ), - ], - ) - - random_seed_feature = feature( - name = "random_seed", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_module_compile, - ], - flag_groups = [ - flag_group( - flags = ["-frandom-seed=%{output_file}"], - expand_if_available = "output_file", - ), - ], - ), - ], - ) - - includes_feature = feature( - name = "includes", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.clif_match, - ACTION_NAMES.objc_compile, - ACTION_NAMES.objcpp_compile, - ], - flag_groups = [ - flag_group( - flags = ["-include", "%{includes}"], - iterate_over = "includes", - expand_if_available = "includes", - ), - ], - ), - ], - ) - - fdo_instrument_feature = feature( - name = "fdo_instrument", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ] + all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = [ - "-fprofile-generate=%{fdo_instrument_path}", - "-fno-data-sections", - ], - expand_if_available = "fdo_instrument_path", - ), - ], - ), - ], - provides = ["profile"], - ) - - cs_fdo_instrument_feature = feature( - name = "cs_fdo_instrument", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.lto_backend, - ] + all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = [ - "-fcs-profile-generate=%{cs_fdo_instrument_path}", - ], - expand_if_available = "cs_fdo_instrument_path", - ), - ], - ), - ], - provides = ["csprofile"], - ) - - include_paths_feature = feature( - name = "include_paths", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.clif_match, - ACTION_NAMES.objc_compile, - ACTION_NAMES.objcpp_compile, - ], - flag_groups = [ - flag_group( - flags = ["-iquote", "%{quote_include_paths}"], - iterate_over = "quote_include_paths", - ), - flag_group( - flags = ["-I%{include_paths}"], - iterate_over = "include_paths", - ), - flag_group( - flags = ["-isystem", "%{system_include_paths}"], - iterate_over = "system_include_paths", - ), - ], - ), - ], - ) - - symbol_counts_feature = feature( - name = "symbol_counts", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = [ - "-Wl,--print-symbol-counts=%{symbol_counts_output}", - ], - expand_if_available = "symbol_counts_output", - ), - ], - ), - ], - ) - - llvm_coverage_map_format_feature = feature( - name = "llvm_coverage_map_format", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.objc_compile, - ACTION_NAMES.objcpp_compile, - ], - flag_groups = [ - flag_group( - flags = [ - "-fprofile-instr-generate", - "-fcoverage-mapping", - ], - ), - ], - ), - flag_set( - actions = all_link_actions + lto_index_actions + [ - "objc-executable", - "objc++-executable", - ], - flag_groups = [ - flag_group(flags = ["-fprofile-instr-generate"]), - ], - ), - ], - requires = [feature_set(features = ["coverage"])], - provides = ["profile"], - ) - - strip_debug_symbols_feature = feature( - name = "strip_debug_symbols", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["-Wl,-S"], - expand_if_available = "strip_debug_symbols", - ), - ], - ), - ], - ) - - build_interface_libraries_feature = feature( - name = "build_interface_libraries", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.lto_index_for_dynamic_library, - ACTION_NAMES.lto_index_for_nodeps_dynamic_library, - ], - flag_groups = [ - flag_group( - flags = [ - "%{generate_interface_library}", - "%{interface_library_builder_path}", - "%{interface_library_input_path}", - "%{interface_library_output_path}", - ], - expand_if_available = "generate_interface_library", - ), - ], - with_features = [ - with_feature_set( - features = ["supports_interface_shared_libraries"], - ), - ], - ), - ], - ) - - libraries_to_link_feature = feature( - name = "libraries_to_link", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - 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", - ), - ), - flag_group( - flags = ["-Wl,-whole-archive"], - expand_if_true = - "libraries_to_link.is_whole_archive", - ), - 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", - ), - ), - 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.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "interface_library", - ), - ), - flag_group( - flags = ["%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "static_library", - ), - ), - flag_group( - flags = ["-l%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "dynamic_library", - ), - ), - flag_group( - flags = ["-l:%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "versioned_dynamic_library", - ), - ), - flag_group( - flags = ["-Wl,-no-whole-archive"], - expand_if_true = "libraries_to_link.is_whole_archive", - ), - flag_group( - flags = ["-Wl,--end-lib"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "object_file_group", - ), - ), - ], - expand_if_available = "libraries_to_link", - ), - flag_group( - flags = ["-Wl,@%{thinlto_param_file}"], - expand_if_true = "thinlto_param_file", - ), - ], - ), - ], - ) - - user_link_flags_feature = feature( - name = "user_link_flags", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["%{user_link_flags}"], - iterate_over = "user_link_flags", - expand_if_available = "user_link_flags", - ), - ] + ([flag_group(flags = ctx.attr.link_libs)] if ctx.attr.link_libs else []), - ), - ], - ) - - fdo_prefetch_hints_feature = feature( - name = "fdo_prefetch_hints", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.lto_backend, - ], - flag_groups = [ - flag_group( - flags = [ - "-Xclang-only=-mllvm", - "-Xclang-only=-prefetch-hints-file=%{fdo_prefetch_hints_path}", - ], - expand_if_available = "fdo_prefetch_hints_path", - ), - ], - ), - ], - ) - - linkstamps_feature = feature( - name = "linkstamps", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["%{linkstamp_paths}"], - iterate_over = "linkstamp_paths", - expand_if_available = "linkstamp_paths", - ), - ], - ), - ], - ) - - gcc_coverage_map_format_feature = feature( - name = "gcc_coverage_map_format", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.objc_compile, - ACTION_NAMES.objcpp_compile, - "objc-executable", - "objc++-executable", - ], - flag_groups = [ - flag_group( - flags = ["-fprofile-arcs", "-ftest-coverage"], - expand_if_available = "gcov_gcno_file", - ), - ], - ), - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [flag_group(flags = ["--coverage"])], - ), - ], - requires = [feature_set(features = ["coverage"])], - provides = ["profile"], - ) - - archiver_flags_feature = feature( - name = "archiver_flags", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.cpp_link_static_library], - flag_groups = [ - flag_group(flags = ["rcsD"]), - flag_group( - flags = ["%{output_execpath}"], - expand_if_available = "output_execpath", - ), - ], - ), - flag_set( - actions = [ACTION_NAMES.cpp_link_static_library], - flag_groups = [ - 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", - ), - ], - ), - ], - ) - - force_pic_flags_feature = feature( - name = "force_pic_flags", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.lto_index_for_executable, - ], - flag_groups = [ - flag_group( - flags = ["-pie"], - expand_if_available = "force_pic", - ), - ], - ), - ], - ) - - dependency_file_feature = feature( - name = "dependency_file", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.objc_compile, - ACTION_NAMES.objcpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.clif_match, - ], - flag_groups = [ - flag_group( - flags = ["-MD", "-MF", "%{dependency_file}"], - expand_if_available = "dependency_file", - ), - ], - ), - ], - ) - - dynamic_library_linker_tool_path = tool_paths - dynamic_library_linker_tool_feature = feature( - name = "dynamic_library_linker_tool", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.lto_index_for_dynamic_library, - ACTION_NAMES.lto_index_for_nodeps_dynamic_library, - ], - flag_groups = [ - flag_group( - flags = [" + cppLinkDynamicLibraryToolPath + "], - expand_if_available = "generate_interface_library", - ), - ], - with_features = [ - with_feature_set( - features = ["supports_interface_shared_libraries"], - ), - ], - ), - ], - ) - - output_execpath_flags_feature = feature( - name = "output_execpath_flags", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - flags = ["-o", "%{output_execpath}"], - expand_if_available = "output_execpath", - ), - ], - ), - ], - ) - - # Note that we also set --coverage for c++-link-nodeps-dynamic-library. The - # generated code contains references to gcov symbols, and the dynamic linker - # can't resolve them unless the library is linked against gcov. - coverage_feature = feature( - name = "coverage", - provides = ["profile"], - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ], - flag_groups = ([ - flag_group(flags = ctx.attr.coverage_compile_flags), - ] if ctx.attr.coverage_compile_flags else []), - ), - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = ([ - flag_group(flags = ctx.attr.coverage_link_flags), - ] if ctx.attr.coverage_link_flags else []), - ), - ], - ) - - is_linux = ctx.attr.target_libc != "macosx" - - # TODO(#8303): Mac crosstool should also declare every feature. - if is_linux: - features = [ - dependency_file_feature, - random_seed_feature, - pic_feature, - per_object_debug_info_feature, - preprocessor_defines_feature, - includes_feature, - include_paths_feature, - fdo_instrument_feature, - cs_fdo_instrument_feature, - cs_fdo_optimize_feature, - fdo_prefetch_hints_feature, - autofdo_feature, - build_interface_libraries_feature, - dynamic_library_linker_tool_feature, - symbol_counts_feature, - shared_flag_feature, - linkstamps_feature, - output_execpath_flags_feature, - runtime_library_search_directories_feature, - library_search_directories_feature, - archiver_flags_feature, - force_pic_flags_feature, - fission_support_feature, - strip_debug_symbols_feature, - coverage_feature, - supports_pic_feature, - ] + ( - [ - supports_start_end_lib_feature, - ] if ctx.attr.supports_start_end_lib else [] - ) + [ - default_compile_flags_feature, - default_link_flags_feature, - libraries_to_link_feature, - user_link_flags_feature, - static_libgcc_feature, - fdo_optimize_feature, - supports_dynamic_linker_feature, - dbg_feature, - opt_feature, - user_compile_flags_feature, - sysroot_feature, - unfiltered_compile_flags_feature, - ] - else: - features = [ - supports_pic_feature, - ] + ( - [ - supports_start_end_lib_feature, - ] if ctx.attr.supports_start_end_lib else [] - ) + [ - coverage_feature, - default_compile_flags_feature, - default_link_flags_feature, - fdo_optimize_feature, - supports_dynamic_linker_feature, - dbg_feature, - opt_feature, - user_compile_flags_feature, - sysroot_feature, - unfiltered_compile_flags_feature, - ] - - return cc_common.create_cc_toolchain_config_info( - ctx = ctx, - features = features, - action_configs = action_configs, - cxx_builtin_include_directories = ctx.attr.cxx_builtin_include_directories, - toolchain_identifier = ctx.attr.toolchain_identifier, - host_system_name = ctx.attr.host_system_name, - target_system_name = ctx.attr.target_system_name, - target_cpu = ctx.attr.cpu, - target_libc = ctx.attr.target_libc, - compiler = ctx.attr.compiler, - abi_version = ctx.attr.abi_version, - abi_libc_version = ctx.attr.abi_libc_version, - tool_paths = tool_paths, - ) - -cc_toolchain_config = rule( - implementation = _impl, - attrs = { - "cpu": attr.string(mandatory = True), - "compiler": attr.string(mandatory = True), - "toolchain_identifier": attr.string(mandatory = True), - "host_system_name": attr.string(mandatory = True), - "target_system_name": attr.string(mandatory = True), - "target_libc": attr.string(mandatory = True), - "abi_version": attr.string(mandatory = True), - "abi_libc_version": attr.string(mandatory = True), - "cxx_builtin_include_directories": attr.string_list(), - "tool_paths": attr.string_dict(), - "compile_flags": attr.string_list(), - "dbg_compile_flags": attr.string_list(), - "opt_compile_flags": attr.string_list(), - "cxx_flags": attr.string_list(), - "link_flags": attr.string_list(), - "link_libs": attr.string_list(), - "opt_link_flags": attr.string_list(), - "unfiltered_compile_flags": attr.string_list(), - "coverage_compile_flags": attr.string_list(), - "coverage_link_flags": attr.string_list(), - "supports_start_end_lib": attr.bool(), - }, - provides = [CcToolchainConfigInfo], -) diff --git a/cc/private/toolchain/vc_installation_error.bat.tpl b/cc/private/toolchain/vc_installation_error.bat.tpl deleted file mode 100644 index b796585..0000000 --- a/cc/private/toolchain/vc_installation_error.bat.tpl +++ /dev/null @@ -1,24 +0,0 @@ -:: Copyright 2017 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. - -@echo OFF - -echo. 1>&2 -echo The target you are compiling requires Visual C++ build tools. 1>&2 -echo Bazel couldn't find a valid Visual C++ build tools installation on your machine. 1>&2 -%{vc_error_message} -echo Please check your installation following https://docs.bazel.build/versions/master/windows.html#using 1>&2 -echo. 1>&2 - -exit /b 1 diff --git a/cc/private/toolchain/windows_cc_configure.bzl b/cc/private/toolchain/windows_cc_configure.bzl deleted file mode 100644 index fc3c015..0000000 --- a/cc/private/toolchain/windows_cc_configure.bzl +++ /dev/null @@ -1,583 +0,0 @@ -# pylint: disable=g-bad-file-header -# Copyright 2016 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. -"""Configuring the C++ toolchain on Windows.""" - -load( - "//cc/private/toolchain:lib_cc_configure.bzl", - "auto_configure_fail", - "auto_configure_warning", - "auto_configure_warning_maybe", - "escape_string", - "execute", - "resolve_labels", -) - -def _get_path_env_var(repository_ctx, name): - """Returns a path from an environment variable. - - Removes quotes, replaces '/' with '\', and strips trailing '\'s.""" - if name in repository_ctx.os.environ: - value = repository_ctx.os.environ[name] - if value[0] == "\"": - if len(value) == 1 or value[-1] != "\"": - auto_configure_fail("'%s' environment variable has no trailing quote" % name) - value = value[1:-1] - if "/" in value: - value = value.replace("/", "\\") - if value[-1] == "\\": - value = value.rstrip("\\") - return value - else: - return None - -def _get_temp_env(repository_ctx): - """Returns the value of TMP, or TEMP, or if both undefined then C:\\Windows.""" - tmp = _get_path_env_var(repository_ctx, "TMP") - if not tmp: - tmp = _get_path_env_var(repository_ctx, "TEMP") - if not tmp: - tmp = "C:\\Windows\\Temp" - auto_configure_warning( - "neither 'TMP' nor 'TEMP' environment variables are set, using '%s' as default" % tmp, - ) - return tmp - -def _get_escaped_windows_msys_starlark_content(repository_ctx, use_mingw = False): - """Return the content of msys cc toolchain rule.""" - msys_root = "" - bazel_sh = _get_path_env_var(repository_ctx, "BAZEL_SH") - if bazel_sh: - bazel_sh = bazel_sh.replace("\\", "/").lower() - tokens = bazel_sh.rsplit("/", 1) - if tokens[0].endswith("/usr/bin"): - msys_root = tokens[0][:len(tokens[0]) - len("usr/bin")] - elif tokens[0].endswith("/bin"): - msys_root = tokens[0][:len(tokens[0]) - len("bin")] - - prefix = "mingw64" if use_mingw else "usr" - tool_path_prefix = escape_string(msys_root) + prefix - tool_bin_path = tool_path_prefix + "/bin" - tool_path = {} - - for tool in ["ar", "compat-ld", "cpp", "dwp", "gcc", "gcov", "ld", "nm", "objcopy", "objdump", "strip"]: - if msys_root: - tool_path[tool] = tool_bin_path + "/" + tool - else: - tool_path[tool] = "msys_gcc_installation_error.bat" - tool_paths = ",\n ".join(['"%s": "%s"' % (k, v) for k, v in tool_path.items()]) - include_directories = (' "%s/",\n ' % tool_path_prefix) if msys_root else "" - return tool_paths, tool_bin_path, include_directories - -def _get_system_root(repository_ctx): - """Get System root path on Windows, default is C:\\Windows. Doesn't %-escape the result.""" - systemroot = _get_path_env_var(repository_ctx, "SYSTEMROOT") - if not systemroot: - systemroot = "C:\\Windows" - auto_configure_warning_maybe( - repository_ctx, - "SYSTEMROOT is not set, using default SYSTEMROOT=C:\\Windows", - ) - return escape_string(systemroot) - -def _add_system_root(repository_ctx, env): - """Running VCVARSALL.BAT and VCVARSQUERYREGISTRY.BAT need %SYSTEMROOT%\\\\system32 in PATH.""" - if "PATH" not in env: - env["PATH"] = "" - env["PATH"] = env["PATH"] + ";" + _get_system_root(repository_ctx) + "\\system32" - return env - -def find_vc_path(repository_ctx): - """Find Visual C++ build tools install path. Doesn't %-escape the result.""" - - # 1. Check if BAZEL_VC or BAZEL_VS is already set by user. - bazel_vc = _get_path_env_var(repository_ctx, "BAZEL_VC") - if bazel_vc: - if repository_ctx.path(bazel_vc).exists: - return bazel_vc - else: - auto_configure_warning_maybe( - repository_ctx, - "%BAZEL_VC% is set to non-existent path, ignoring.", - ) - - bazel_vs = _get_path_env_var(repository_ctx, "BAZEL_VS") - if bazel_vs: - if repository_ctx.path(bazel_vs).exists: - bazel_vc = bazel_vs + "\\VC" - if repository_ctx.path(bazel_vc).exists: - return bazel_vc - else: - auto_configure_warning_maybe( - repository_ctx, - "No 'VC' directory found under %BAZEL_VS%, ignoring.", - ) - else: - auto_configure_warning_maybe( - repository_ctx, - "%BAZEL_VS% is set to non-existent path, ignoring.", - ) - - auto_configure_warning_maybe( - repository_ctx, - "Neither %BAZEL_VC% nor %BAZEL_VS% are set, start looking for the latest Visual C++" + - " installed.", - ) - - # 2. Check if VS%VS_VERSION%COMNTOOLS is set, if true then try to find and use - # vcvarsqueryregistry.bat / VsDevCmd.bat to detect VC++. - auto_configure_warning_maybe(repository_ctx, "Looking for VS%VERSION%COMNTOOLS environment variables, " + - "eg. VS140COMNTOOLS") - for vscommontools_env, script in [ - ("VS160COMNTOOLS", "VsDevCmd.bat"), - ("VS150COMNTOOLS", "VsDevCmd.bat"), - ("VS140COMNTOOLS", "vcvarsqueryregistry.bat"), - ("VS120COMNTOOLS", "vcvarsqueryregistry.bat"), - ("VS110COMNTOOLS", "vcvarsqueryregistry.bat"), - ("VS100COMNTOOLS", "vcvarsqueryregistry.bat"), - ("VS90COMNTOOLS", "vcvarsqueryregistry.bat"), - ]: - if vscommontools_env not in repository_ctx.os.environ: - continue - script = _get_path_env_var(repository_ctx, vscommontools_env) + "\\" + script - if not repository_ctx.path(script).exists: - continue - repository_ctx.file( - "get_vc_dir.bat", - "@echo off\n" + - "call \"" + script + "\"\n" + - "echo %VCINSTALLDIR%", - True, - ) - env = _add_system_root(repository_ctx, repository_ctx.os.environ) - vc_dir = execute(repository_ctx, ["./get_vc_dir.bat"], environment = env) - - auto_configure_warning_maybe(repository_ctx, "Visual C++ build tools found at %s" % vc_dir) - return vc_dir - - # 3. User might have purged all environment variables. If so, look for Visual C++ in registry. - # Works for Visual Studio 2017 and older. (Does not work for Visual Studio 2019 Preview.) - # TODO(laszlocsomor): check if "16.0" also has this registry key, after VS 2019 is released. - auto_configure_warning_maybe(repository_ctx, "Looking for Visual C++ through registry") - reg_binary = _get_system_root(repository_ctx) + "\\system32\\reg.exe" - vc_dir = None - for key, suffix in (("VC7", ""), ("VS7", "\\VC")): - for version in ["15.0", "14.0", "12.0", "11.0", "10.0", "9.0", "8.0"]: - if vc_dir: - break - result = repository_ctx.execute([reg_binary, "query", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\" + key, "/v", version]) - auto_configure_warning_maybe(repository_ctx, "registry query result for VC %s:\n\nSTDOUT(start)\n%s\nSTDOUT(end)\nSTDERR(start):\n%s\nSTDERR(end)\n" % - (version, result.stdout, result.stderr)) - if not result.stderr: - for line in result.stdout.split("\n"): - line = line.strip() - if line.startswith(version) and line.find("REG_SZ") != -1: - vc_dir = line[line.find("REG_SZ") + len("REG_SZ"):].strip() + suffix - if vc_dir: - auto_configure_warning_maybe(repository_ctx, "Visual C++ build tools found at %s" % vc_dir) - return vc_dir - - # 4. Check default directories for VC installation - auto_configure_warning_maybe(repository_ctx, "Looking for default Visual C++ installation directory") - program_files_dir = _get_path_env_var(repository_ctx, "PROGRAMFILES(X86)") - if not program_files_dir: - program_files_dir = "C:\\Program Files (x86)" - auto_configure_warning_maybe( - repository_ctx, - "'PROGRAMFILES(X86)' environment variable is not set, using '%s' as default" % program_files_dir, - ) - for path in [ - "Microsoft Visual Studio\\2019\\Preview\\VC", - "Microsoft Visual Studio\\2019\\BuildTools\\VC", - "Microsoft Visual Studio\\2019\\Community\\VC", - "Microsoft Visual Studio\\2019\\Professional\\VC", - "Microsoft Visual Studio\\2019\\Enterprise\\VC", - "Microsoft Visual Studio\\2017\\BuildTools\\VC", - "Microsoft Visual Studio\\2017\\Community\\VC", - "Microsoft Visual Studio\\2017\\Professional\\VC", - "Microsoft Visual Studio\\2017\\Enterprise\\VC", - "Microsoft Visual Studio 14.0\\VC", - ]: - path = program_files_dir + "\\" + path - if repository_ctx.path(path).exists: - vc_dir = path - break - - if not vc_dir: - auto_configure_warning_maybe(repository_ctx, "Visual C++ build tools not found.") - return None - auto_configure_warning_maybe(repository_ctx, "Visual C++ build tools found at %s" % vc_dir) - return vc_dir - -def _is_vs_2017_or_2019(vc_path): - """Check if the installed VS version is Visual Studio 2017.""" - - # In VS 2017 and 2019, the location of VC is like: - # C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\ - # In VS 2015 or older version, it is like: - # C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ - return vc_path.find("2017") != -1 or vc_path.find("2019") != -1 - -def _find_vcvars_bat_script(repository_ctx, vc_path): - """Find batch script to set up environment variables for VC. Doesn't %-escape the result.""" - if _is_vs_2017_or_2019(vc_path): - vcvars_script = vc_path + "\\Auxiliary\\Build\\VCVARSALL.BAT" - else: - vcvars_script = vc_path + "\\VCVARSALL.BAT" - - if not repository_ctx.path(vcvars_script).exists: - return None - - return vcvars_script - -def _is_support_winsdk_selection(repository_ctx, vc_path): - """Windows SDK selection is supported with VC 2017 / 2019 or with full VS 2015 installation.""" - if _is_vs_2017_or_2019(vc_path): - return True - - # By checking the source code of VCVARSALL.BAT in VC 2015, we know that - # when devenv.exe or wdexpress.exe exists, VCVARSALL.BAT supports Windows SDK selection. - vc_common_ide = repository_ctx.path(vc_path).dirname.get_child("Common7").get_child("IDE") - for tool in ["devenv.exe", "wdexpress.exe"]: - if vc_common_ide.get_child(tool).exists: - return True - return False - -def setup_vc_env_vars(repository_ctx, vc_path): - """Get environment variables set by VCVARSALL.BAT script. Doesn't %-escape the result!""" - vcvars_script = _find_vcvars_bat_script(repository_ctx, vc_path) - if not vcvars_script: - auto_configure_fail("Cannot find VCVARSALL.BAT script under %s" % vc_path) - - # Getting Windows SDK version set by user. - # Only supports VC 2017 & 2019 and VC 2015 with full VS installation. - winsdk_version = _get_winsdk_full_version(repository_ctx) - if winsdk_version and not _is_support_winsdk_selection(repository_ctx, vc_path): - auto_configure_warning(("BAZEL_WINSDK_FULL_VERSION=%s is ignored, " + - "because standalone Visual C++ Build Tools 2015 doesn't support specifying Windows " + - "SDK version, please install the full VS 2015 or use VC 2017/2019.") % winsdk_version) - winsdk_version = "" - - # Get VC version set by user. Only supports VC 2017 & 2019. - vcvars_ver = "" - if _is_vs_2017_or_2019(vc_path): - full_version = _get_vc_full_version(repository_ctx, vc_path) - if full_version: - vcvars_ver = "-vcvars_ver=" + full_version - - cmd = "\"%s\" amd64 %s %s" % (vcvars_script, winsdk_version, vcvars_ver) - repository_ctx.file( - "get_env.bat", - "@echo off\n" + - ("call %s > NUL \n" % cmd) + - "echo PATH=%PATH%,INCLUDE=%INCLUDE%,LIB=%LIB%,WINDOWSSDKDIR=%WINDOWSSDKDIR% \n", - True, - ) - env = _add_system_root( - repository_ctx, - {"PATH": "", "INCLUDE": "", "LIB": "", "WINDOWSSDKDIR": ""}, - ) - envs = execute(repository_ctx, ["./get_env.bat"], environment = env).split(",") - env_map = {} - for env in envs: - key, value = env.split("=", 1) - env_map[key] = escape_string(value.replace("\\", "\\\\")) - _check_env_vars(env_map, cmd) - return env_map - -def _check_env_vars(env_map, cmd): - envs = ["PATH", "INCLUDE", "LIB", "WINDOWSSDKDIR"] - for env in envs: - if not env_map.get(env): - auto_configure_fail( - "Setting up VC environment variables failed, %s is not set by the following command:\n %s" % (env, cmd), - ) - -def _get_latest_subversion(repository_ctx, vc_path): - """Get the latest subversion of a VS 2017/2019 installation. - - For VS 2017 & 2019, there could be multiple versions of VC build tools. - The directories are like: - \\Tools\\MSVC\\14.10.24930\\bin\\HostX64\\x64 - \\Tools\\MSVC\\14.16.27023\\bin\\HostX64\\x64 - This function should return 14.16.27023 in this case.""" - versions = [path.basename for path in repository_ctx.path(vc_path + "\\Tools\\MSVC").readdir()] - if len(versions) < 1: - auto_configure_warning_maybe(repository_ctx, "Cannot find any VC installation under BAZEL_VC(%s)" % vc_path) - return None - - # Parse the version string into integers, then sort the integers to prevent textual sorting. - version_list = [] - for version in versions: - parts = [int(i) for i in version.split(".")] - version_list.append((parts, version)) - - version_list = sorted(version_list) - latest_version = version_list[-1][1] - - auto_configure_warning_maybe(repository_ctx, "Found the following VC verisons:\n%s\n\nChoosing the latest version = %s" % ("\n".join(versions), latest_version)) - return latest_version - -def _get_vc_full_version(repository_ctx, vc_path): - """Return the value of BAZEL_VC_FULL_VERSION if defined, otherwise the latest version.""" - if "BAZEL_VC_FULL_VERSION" in repository_ctx.os.environ: - return repository_ctx.os.environ["BAZEL_VC_FULL_VERSION"] - return _get_latest_subversion(repository_ctx, vc_path) - -def _get_winsdk_full_version(repository_ctx): - """Return the value of BAZEL_WINSDK_FULL_VERSION if defined, otherwise an empty string.""" - return repository_ctx.os.environ.get("BAZEL_WINSDK_FULL_VERSION", default = "") - -def find_msvc_tool(repository_ctx, vc_path, tool): - """Find the exact path of a specific build tool in MSVC. Doesn't %-escape the result.""" - tool_path = None - if _is_vs_2017_or_2019(vc_path): - full_version = _get_vc_full_version(repository_ctx, vc_path) - if full_version: - tool_path = "%s\\Tools\\MSVC\\%s\\bin\\HostX64\\x64\\%s" % (vc_path, full_version, tool) - else: - # For VS 2015 and older version, the tools are under: - # C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64 - tool_path = vc_path + "\\bin\\amd64\\" + tool - - if not tool_path or not repository_ctx.path(tool_path).exists: - return None - - return tool_path.replace("\\", "/") - -def _find_missing_vc_tools(repository_ctx, vc_path): - """Check if any required tool is missing under given VC path.""" - missing_tools = [] - if not _find_vcvars_bat_script(repository_ctx, vc_path): - missing_tools.append("VCVARSALL.BAT") - - for tool in ["cl.exe", "link.exe", "lib.exe", "ml64.exe"]: - if not find_msvc_tool(repository_ctx, vc_path, tool): - missing_tools.append(tool) - - return missing_tools - -def _is_support_debug_fastlink(repository_ctx, linker): - """Run linker alone to see if it supports /DEBUG:FASTLINK.""" - if _use_clang_cl(repository_ctx): - # LLVM's lld-link.exe doesn't support /DEBUG:FASTLINK. - return False - result = execute(repository_ctx, [linker], expect_failure = True) - return result.find("/DEBUG[:{FASTLINK|FULL|NONE}]") != -1 - -def find_llvm_path(repository_ctx): - """Find LLVM install path.""" - - # 1. Check if BAZEL_LLVM is already set by user. - bazel_llvm = _get_path_env_var(repository_ctx, "BAZEL_LLVM") - if bazel_llvm: - return bazel_llvm - - auto_configure_warning_maybe(repository_ctx, "'BAZEL_LLVM' is not set, " + - "start looking for LLVM installation on machine.") - - # 2. Look for LLVM installation through registry. - auto_configure_warning_maybe(repository_ctx, "Looking for LLVM installation through registry") - reg_binary = _get_system_root(repository_ctx) + "\\system32\\reg.exe" - llvm_dir = None - result = repository_ctx.execute([reg_binary, "query", "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM"]) - auto_configure_warning_maybe(repository_ctx, "registry query result for LLVM:\n\nSTDOUT(start)\n%s\nSTDOUT(end)\nSTDERR(start):\n%s\nSTDERR(end)\n" % - (result.stdout, result.stderr)) - if not result.stderr: - for line in result.stdout.split("\n"): - line = line.strip() - if line.startswith("(Default)") and line.find("REG_SZ") != -1: - llvm_dir = line[line.find("REG_SZ") + len("REG_SZ"):].strip() - if llvm_dir: - auto_configure_warning_maybe(repository_ctx, "LLVM installation found at %s" % llvm_dir) - return llvm_dir - - # 3. Check default directories for LLVM installation - auto_configure_warning_maybe(repository_ctx, "Looking for default LLVM installation directory") - program_files_dir = _get_path_env_var(repository_ctx, "PROGRAMFILES") - if not program_files_dir: - program_files_dir = "C:\\Program Files" - auto_configure_warning_maybe( - repository_ctx, - "'PROGRAMFILES' environment variable is not set, using '%s' as default" % program_files_dir, - ) - path = program_files_dir + "\\LLVM" - if repository_ctx.path(path).exists: - llvm_dir = path - - if not llvm_dir: - auto_configure_warning_maybe(repository_ctx, "LLVM installation not found.") - return None - auto_configure_warning_maybe(repository_ctx, "LLVM installation found at %s" % llvm_dir) - return llvm_dir - -def find_llvm_tool(repository_ctx, llvm_path, tool): - """Find the exact path of a specific build tool in LLVM. Doesn't %-escape the result.""" - tool_path = llvm_path + "\\bin\\" + tool - - if not repository_ctx.path(tool_path).exists: - return None - - return tool_path.replace("\\", "/") - -def _use_clang_cl(repository_ctx): - """Returns True if USE_CLANG_CL is set to 1.""" - return repository_ctx.os.environ.get("USE_CLANG_CL", default = "0") == "1" - -def _get_clang_version(repository_ctx, clang_cl): - result = repository_ctx.execute([clang_cl, "-v"]) - if result.return_code != 0: - auto_configure_fail("Failed to get clang version by running \"%s -v\"" % clang_cl) - - # Stderr should look like "clang version X.X.X ..." - return result.stderr.strip().split(" ")[2] - -def configure_windows_toolchain(repository_ctx): - """Configure C++ toolchain on Windows.""" - paths = resolve_labels(repository_ctx, [ - "//cc/private/toolchain:BUILD.windows.tpl", - "//cc/private/toolchain:windows_cc_toolchain_config.bzl", - "//cc/private/toolchain:armeabi_cc_toolchain_config.bzl", - "//cc/private/toolchain:vc_installation_error.bat.tpl", - "//cc/private/toolchain:msys_gcc_installation_error.bat", - ]) - - repository_ctx.symlink( - paths["//cc/private/toolchain:windows_cc_toolchain_config.bzl"], - "windows_cc_toolchain_config.bzl", - ) - repository_ctx.symlink( - paths["//cc/private/toolchain:armeabi_cc_toolchain_config.bzl"], - "armeabi_cc_toolchain_config.bzl", - ) - repository_ctx.symlink( - paths["//cc/private/toolchain:msys_gcc_installation_error.bat"], - "msys_gcc_installation_error.bat", - ) - - vc_path = find_vc_path(repository_ctx) - missing_tools = None - if not vc_path: - repository_ctx.template( - "vc_installation_error.bat", - paths["//cc/private/toolchain:vc_installation_error.bat.tpl"], - {"%{vc_error_message}": ""}, - ) - else: - missing_tools = _find_missing_vc_tools(repository_ctx, vc_path) - if missing_tools: - message = "\r\n".join([ - "echo. 1>&2", - "echo Visual C++ build tools seems to be installed at %s 1>&2" % vc_path, - "echo But Bazel can't find the following tools: 1>&2", - "echo %s 1>&2" % ", ".join(missing_tools), - "echo. 1>&2", - ]) - repository_ctx.template( - "vc_installation_error.bat", - paths["//cc/private/toolchain:vc_installation_error.bat.tpl"], - {"%{vc_error_message}": message}, - ) - - tool_paths_mingw, tool_bin_path_mingw, inc_dir_mingw = _get_escaped_windows_msys_starlark_content(repository_ctx, use_mingw = True) - tool_paths, tool_bin_path, inc_dir_msys = _get_escaped_windows_msys_starlark_content(repository_ctx) - if not vc_path or missing_tools: - repository_ctx.template( - "BUILD", - paths["//cc/private/toolchain:BUILD.windows.tpl"], - { - "%{msvc_env_tmp}": "msvc_not_found", - "%{msvc_env_path}": "msvc_not_found", - "%{msvc_env_include}": "msvc_not_found", - "%{msvc_env_lib}": "msvc_not_found", - "%{msvc_cl_path}": "vc_installation_error.bat", - "%{msvc_ml_path}": "vc_installation_error.bat", - "%{msvc_link_path}": "vc_installation_error.bat", - "%{msvc_lib_path}": "vc_installation_error.bat", - "%{dbg_mode_debug_flag}": "/DEBUG", - "%{fastbuild_mode_debug_flag}": "/DEBUG", - "%{cxx_builtin_include_directories}": inc_dir_msys, - "%{mingw_cxx_builtin_include_directories}": inc_dir_mingw, - "%{msvc_cxx_builtin_include_directories}": "", - "%{tool_paths}": tool_paths, - "%{mingw_tool_paths}": tool_paths_mingw, - "%{tool_bin_path}": tool_bin_path, - "%{mingw_tool_bin_path}": tool_bin_path_mingw, - }, - ) - return - - env = setup_vc_env_vars(repository_ctx, vc_path) - escaped_paths = escape_string(env["PATH"]) - escaped_include_paths = escape_string(env["INCLUDE"]) - escaped_lib_paths = escape_string(env["LIB"]) - escaped_tmp_dir = escape_string(_get_temp_env(repository_ctx).replace("\\", "\\\\")) - - llvm_path = "" - if _use_clang_cl(repository_ctx): - llvm_path = find_llvm_path(repository_ctx) - if not llvm_path: - auto_configure_fail("\nUSE_CLANG_CL is set to 1, but Bazel cannot find Clang installation on your system.\n" + - "Please install Clang via http://releases.llvm.org/download.html\n") - cl_path = find_llvm_tool(repository_ctx, llvm_path, "clang-cl.exe") - link_path = find_llvm_tool(repository_ctx, llvm_path, "lld-link.exe") - if not link_path: - link_path = find_msvc_tool(repository_ctx, vc_path, "link.exe") - lib_path = find_llvm_tool(repository_ctx, llvm_path, "llvm-lib.exe") - if not lib_path: - lib_path = find_msvc_tool(repository_ctx, vc_path, "lib.exe") - else: - cl_path = find_msvc_tool(repository_ctx, vc_path, "cl.exe") - link_path = find_msvc_tool(repository_ctx, vc_path, "link.exe") - lib_path = find_msvc_tool(repository_ctx, vc_path, "lib.exe") - - msvc_ml_path = find_msvc_tool(repository_ctx, vc_path, "ml64.exe") - escaped_cxx_include_directories = [] - - for path in escaped_include_paths.split(";"): - if path: - escaped_cxx_include_directories.append("\"%s\"" % path) - if llvm_path: - clang_version = _get_clang_version(repository_ctx, cl_path) - clang_dir = llvm_path + "\\lib\\clang\\" + clang_version - clang_include_path = (clang_dir + "\\include").replace("\\", "\\\\") - escaped_cxx_include_directories.append("\"%s\"" % clang_include_path) - clang_lib_path = (clang_dir + "\\lib\\windows").replace("\\", "\\\\") - escaped_lib_paths = escaped_lib_paths + ";" + clang_lib_path - - support_debug_fastlink = _is_support_debug_fastlink(repository_ctx, link_path) - - repository_ctx.template( - "BUILD", - paths["//cc/private/toolchain:BUILD.windows.tpl"], - { - "%{msvc_env_tmp}": escaped_tmp_dir, - "%{msvc_env_path}": escaped_paths, - "%{msvc_env_include}": escaped_include_paths, - "%{msvc_env_lib}": escaped_lib_paths, - "%{msvc_cl_path}": cl_path, - "%{msvc_ml_path}": msvc_ml_path, - "%{msvc_link_path}": link_path, - "%{msvc_lib_path}": lib_path, - "%{dbg_mode_debug_flag}": "/DEBUG:FULL" if support_debug_fastlink else "/DEBUG", - "%{fastbuild_mode_debug_flag}": "/DEBUG:FASTLINK" if support_debug_fastlink else "/DEBUG", - "%{cxx_builtin_include_directories}": inc_dir_msys + ",\n ".join(escaped_cxx_include_directories), - "%{msvc_cxx_builtin_include_directories}": " " + ",\n ".join(escaped_cxx_include_directories), - "%{mingw_cxx_builtin_include_directories}": inc_dir_mingw + ",\n ".join(escaped_cxx_include_directories), - "%{tool_paths}": tool_paths, - "%{mingw_tool_paths}": tool_paths_mingw, - "%{tool_bin_path}": tool_bin_path, - "%{mingw_tool_bin_path}": tool_bin_path_mingw, - }, - ) diff --git a/cc/private/toolchain/windows_cc_toolchain_config.bzl b/cc/private/toolchain/windows_cc_toolchain_config.bzl deleted file mode 100644 index bb344a6..0000000 --- a/cc/private/toolchain/windows_cc_toolchain_config.bzl +++ /dev/null @@ -1,1338 +0,0 @@ -# Copyright 2019 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. - -"""A Starlark cc_toolchain configuration rule for Windows""" - -load( - "//cc/private/toolchain: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("//cc:action_names.bzl", "ACTION_NAMES") - -all_compile_actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.clif_match, - ACTION_NAMES.lto_backend, -] - -all_cpp_compile_actions = [ - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.clif_match, -] - -preprocessor_compile_actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.clif_match, -] - -codegen_compile_actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, -] - -all_link_actions = [ - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, -] - -def _impl(ctx): - if ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "msvc-cl": - 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: - artifact_name_patterns = [ - artifact_name_pattern( - category_name = "executable", - prefix = "", - extension = ".exe", - ), - ] - - if ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "msvc-cl": - cpp_link_nodeps_dynamic_library_action = action_config( - action_name = ACTION_NAMES.cpp_link_nodeps_dynamic_library, - implies = [ - "nologo", - "shared_flag", - "linkstamps", - "output_execpath_flags", - "input_param_flags", - "user_link_flags", - "default_link_flags", - "linker_subsystem_flag", - "linker_param_file", - "msvc_env", - "no_stripping", - "has_configured_linker_path", - "def_file", - ], - tools = [tool(path = ctx.attr.msvc_link_path)], - ) - - cpp_link_static_library_action = action_config( - action_name = ACTION_NAMES.cpp_link_static_library, - implies = [ - "nologo", - "archiver_flags", - "input_param_flags", - "linker_param_file", - "msvc_env", - ], - tools = [tool(path = ctx.attr.msvc_lib_path)], - ) - - assemble_action = action_config( - action_name = ACTION_NAMES.assemble, - implies = [ - "compiler_input_flags", - "compiler_output_flags", - "nologo", - "msvc_env", - "sysroot", - ], - tools = [tool(path = ctx.attr.msvc_ml_path)], - ) - - preprocess_assemble_action = action_config( - action_name = ACTION_NAMES.preprocess_assemble, - implies = [ - "compiler_input_flags", - "compiler_output_flags", - "nologo", - "msvc_env", - "sysroot", - ], - tools = [tool(path = ctx.attr.msvc_ml_path)], - ) - - c_compile_action = action_config( - action_name = ACTION_NAMES.c_compile, - implies = [ - "compiler_input_flags", - "compiler_output_flags", - "default_compile_flags", - "nologo", - "msvc_env", - "parse_showincludes", - "user_compile_flags", - "sysroot", - "unfiltered_compile_flags", - ], - tools = [tool(path = ctx.attr.msvc_cl_path)], - ) - - cpp_compile_action = action_config( - action_name = ACTION_NAMES.cpp_compile, - implies = [ - "compiler_input_flags", - "compiler_output_flags", - "default_compile_flags", - "nologo", - "msvc_env", - "parse_showincludes", - "user_compile_flags", - "sysroot", - "unfiltered_compile_flags", - ], - tools = [tool(path = ctx.attr.msvc_cl_path)], - ) - - cpp_link_executable_action = action_config( - action_name = ACTION_NAMES.cpp_link_executable, - implies = [ - "nologo", - "linkstamps", - "output_execpath_flags", - "input_param_flags", - "user_link_flags", - "default_link_flags", - "linker_subsystem_flag", - "linker_param_file", - "msvc_env", - "no_stripping", - ], - tools = [tool(path = ctx.attr.msvc_link_path)], - ) - - cpp_link_dynamic_library_action = action_config( - action_name = ACTION_NAMES.cpp_link_dynamic_library, - implies = [ - "nologo", - "shared_flag", - "linkstamps", - "output_execpath_flags", - "input_param_flags", - "user_link_flags", - "default_link_flags", - "linker_subsystem_flag", - "linker_param_file", - "msvc_env", - "no_stripping", - "has_configured_linker_path", - "def_file", - ], - tools = [tool(path = ctx.attr.msvc_link_path)], - ) - - action_configs = [ - assemble_action, - preprocess_assemble_action, - c_compile_action, - cpp_compile_action, - cpp_link_executable_action, - cpp_link_dynamic_library_action, - cpp_link_nodeps_dynamic_library_action, - cpp_link_static_library_action, - ] - else: - action_configs = [] - - if ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "msvc-cl": - msvc_link_env_feature = feature( - name = "msvc_link_env", - env_sets = [ - env_set( - actions = all_link_actions + - [ACTION_NAMES.cpp_link_static_library], - env_entries = [env_entry(key = "LIB", value = ctx.attr.msvc_env_lib)], - ), - ], - ) - - shared_flag_feature = feature( - name = "shared_flag", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ], - flag_groups = [flag_group(flags = ["/DLL"])], - ), - ], - ) - - determinism_feature = feature( - name = "determinism", - enabled = True, - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [ - flag_group( - flags = [ - "/wd4117", - "-D__DATE__=\"redacted\"", - "-D__TIMESTAMP__=\"redacted\"", - "-D__TIME__=\"redacted\"", - ], - ), - ], - ), - ], - ) - - sysroot_feature = feature( - name = "sysroot", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ], - flag_groups = [ - flag_group( - flags = ["--sysroot=%{sysroot}"], - iterate_over = "sysroot", - expand_if_available = "sysroot", - ), - ], - ), - ], - ) - - unfiltered_compile_flags_feature = feature( - name = "unfiltered_compile_flags", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ], - flag_groups = [ - flag_group( - flags = ["%{unfiltered_compile_flags}"], - iterate_over = "unfiltered_compile_flags", - expand_if_available = "unfiltered_compile_flags", - ), - ], - ), - ], - ) - - compiler_param_file_feature = feature( - name = "compiler_param_file", - ) - - copy_dynamic_libraries_to_binary_feature = feature( - name = "copy_dynamic_libraries_to_binary", - ) - - input_param_flags_feature = feature( - name = "input_param_flags", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ], - flag_groups = [ - flag_group( - flags = ["/IMPLIB:%{interface_library_output_path}"], - expand_if_available = "interface_library_output_path", - ), - ], - ), - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = ["%{libopts}"], - iterate_over = "libopts", - expand_if_available = "libopts", - ), - ], - ), - flag_set( - actions = all_link_actions + - [ACTION_NAMES.cpp_link_static_library], - flag_groups = [ - flag_group( - iterate_over = "libraries_to_link", - flag_groups = [ - flag_group( - iterate_over = "libraries_to_link.object_files", - flag_groups = [flag_group(flags = ["%{libraries_to_link.object_files}"])], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "object_file_group", - ), - ), - flag_group( - 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( - flag_groups = [flag_group(flags = ["%{libraries_to_link.name}"])], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "interface_library", - ), - ), - flag_group( - flag_groups = [ - flag_group( - flags = ["%{libraries_to_link.name}"], - expand_if_false = "libraries_to_link.is_whole_archive", - ), - flag_group( - flags = ["/WHOLEARCHIVE:%{libraries_to_link.name}"], - expand_if_true = "libraries_to_link.is_whole_archive", - ), - ], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "static_library", - ), - ), - ], - expand_if_available = "libraries_to_link", - ), - ], - ), - ], - ) - - fastbuild_feature = feature( - name = "fastbuild", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/Od", "/Z7"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = [ctx.attr.fastbuild_mode_debug_flag, "/INCREMENTAL:NO"], - ), - ], - ), - ], - implies = ["generate_pdb_file"], - ) - - user_compile_flags_feature = feature( - name = "user_compile_flags", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ], - flag_groups = [ - flag_group( - flags = ["%{user_compile_flags}"], - iterate_over = "user_compile_flags", - expand_if_available = "user_compile_flags", - ), - ], - ), - ], - ) - - archiver_flags_feature = feature( - name = "archiver_flags", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.cpp_link_static_library], - flag_groups = [ - flag_group( - flags = ["/OUT:%{output_execpath}"], - expand_if_available = "output_execpath", - ), - flag_group( - flags = ["/MACHINE:X64"], - ), - ], - ), - ], - ) - - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/MACHINE:X64"])], - ), - ], - ) - - static_link_msvcrt_feature = feature(name = "static_link_msvcrt") - - dynamic_link_msvcrt_debug_feature = feature( - name = "dynamic_link_msvcrt_debug", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/MDd"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrtd.lib"])], - ), - ], - requires = [feature_set(features = ["dbg"])], - ) - - dbg_feature = feature( - name = "dbg", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/Od", "/Z7"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = [ctx.attr.dbg_mode_debug_flag, "/INCREMENTAL:NO"], - ), - ], - ), - ], - implies = ["generate_pdb_file"], - ) - - opt_feature = feature( - name = "opt", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/O2"])], - ), - ], - implies = ["frame_pointer"], - ) - - supports_interface_shared_libraries_feature = feature( - name = "supports_interface_shared_libraries", - enabled = True, - ) - - user_link_flags_feature = feature( - name = "user_link_flags", - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = ["%{user_link_flags}"], - iterate_over = "user_link_flags", - expand_if_available = "user_link_flags", - ), - ], - ), - ], - ) - - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, - ACTION_NAMES.clif_match, - ], - flag_groups = [ - flag_group( - flags = [ - "/DCOMPILER_MSVC", - "/DNOMINMAX", - "/D_WIN32_WINNT=0x0601", - "/D_CRT_SECURE_NO_DEPRECATE", - "/D_CRT_SECURE_NO_WARNINGS", - "/bigobj", - "/Zm500", - "/EHsc", - "/wd4351", - "/wd4291", - "/wd4250", - "/wd4996", - ], - ), - ], - ), - ], - ) - - msvc_compile_env_feature = feature( - name = "msvc_compile_env", - env_sets = [ - env_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ], - env_entries = [env_entry(key = "INCLUDE", value = ctx.attr.msvc_env_include)], - ), - ], - ) - - preprocessor_defines_feature = feature( - name = "preprocessor_defines", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ], - flag_groups = [ - flag_group( - flags = ["/D%{preprocessor_defines}"], - iterate_over = "preprocessor_defines", - ), - ], - ), - ], - ) - - generate_pdb_file_feature = feature( - name = "generate_pdb_file", - requires = [ - feature_set(features = ["dbg"]), - feature_set(features = ["fastbuild"]), - ], - ) - - output_execpath_flags_feature = feature( - name = "output_execpath_flags", - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = ["/OUT:%{output_execpath}"], - expand_if_available = "output_execpath", - ), - ], - ), - ], - ) - - dynamic_link_msvcrt_no_debug_feature = feature( - name = "dynamic_link_msvcrt_no_debug", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/MD"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrt.lib"])], - ), - ], - requires = [ - feature_set(features = ["fastbuild"]), - feature_set(features = ["opt"]), - ], - ) - - disable_assertions_feature = feature( - name = "disable_assertions", - enabled = True, - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/DNDEBUG"])], - with_features = [with_feature_set(features = ["opt"])], - ), - ], - ) - - has_configured_linker_path_feature = feature(name = "has_configured_linker_path") - - supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True) - - no_stripping_feature = feature(name = "no_stripping") - - linker_param_file_feature = feature( - name = "linker_param_file", - flag_sets = [ - flag_set( - actions = all_link_actions + - [ACTION_NAMES.cpp_link_static_library], - flag_groups = [ - flag_group( - flags = ["@%{linker_param_file}"], - expand_if_available = "linker_param_file", - ), - ], - ), - ], - ) - - ignore_noisy_warnings_feature = feature( - name = "ignore_noisy_warnings", - enabled = True, - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.cpp_link_static_library], - flag_groups = [flag_group(flags = ["/ignore:4221"])], - ), - ], - ) - - no_legacy_features_feature = feature(name = "no_legacy_features") - - parse_showincludes_feature = feature( - name = "parse_showincludes", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_header_parsing, - ], - flag_groups = [flag_group(flags = ["/showIncludes"])], - ), - ], - ) - - static_link_msvcrt_no_debug_feature = feature( - name = "static_link_msvcrt_no_debug", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/MT"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmt.lib"])], - ), - ], - requires = [ - feature_set(features = ["fastbuild"]), - feature_set(features = ["opt"]), - ], - ) - - treat_warnings_as_errors_feature = feature( - name = "treat_warnings_as_errors", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/WX"])], - ), - ], - ) - - windows_export_all_symbols_feature = feature(name = "windows_export_all_symbols") - - no_windows_export_all_symbols_feature = feature(name = "no_windows_export_all_symbols") - - include_paths_feature = feature( - name = "include_paths", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ], - flag_groups = [ - flag_group( - flags = ["/I%{quote_include_paths}"], - iterate_over = "quote_include_paths", - ), - flag_group( - flags = ["/I%{include_paths}"], - iterate_over = "include_paths", - ), - flag_group( - flags = ["/I%{system_include_paths}"], - iterate_over = "system_include_paths", - ), - ], - ), - ], - ) - - linkstamps_feature = feature( - name = "linkstamps", - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = ["%{linkstamp_paths}"], - iterate_over = "linkstamp_paths", - expand_if_available = "linkstamp_paths", - ), - ], - ), - ], - ) - - targets_windows_feature = feature( - name = "targets_windows", - enabled = True, - implies = ["copy_dynamic_libraries_to_binary"], - ) - - linker_subsystem_flag_feature = feature( - name = "linker_subsystem_flag", - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/SUBSYSTEM:CONSOLE"])], - ), - ], - ) - - static_link_msvcrt_debug_feature = feature( - name = "static_link_msvcrt_debug", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/MTd"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmtd.lib"])], - ), - ], - requires = [feature_set(features = ["dbg"])], - ) - - frame_pointer_feature = feature( - name = "frame_pointer", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/Oy-"])], - ), - ], - ) - - compiler_output_flags_feature = feature( - name = "compiler_output_flags", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.assemble], - flag_groups = [ - flag_group( - flag_groups = [ - flag_group( - flags = ["/Fo%{output_file}", "/Zi"], - expand_if_available = "output_file", - expand_if_not_available = "output_assembly_file", - ), - ], - expand_if_not_available = "output_preprocess_file", - ), - ], - ), - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ], - 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", - ), - ], - ), - ], - ) - - nologo_feature = feature( - name = "nologo", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.cpp_link_static_library, - ], - flag_groups = [flag_group(flags = ["/nologo"])], - ), - ], - ) - - smaller_binary_feature = feature( - name = "smaller_binary", - enabled = True, - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [flag_group(flags = ["/Gy", "/Gw"])], - with_features = [with_feature_set(features = ["opt"])], - ), - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["/OPT:ICF", "/OPT:REF"])], - with_features = [with_feature_set(features = ["opt"])], - ), - ], - ) - - compiler_input_flags_feature = feature( - name = "compiler_input_flags", - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ], - flag_groups = [ - flag_group( - flags = ["/c", "%{source_file}"], - expand_if_available = "source_file", - ), - ], - ), - ], - ) - - def_file_feature = feature( - name = "def_file", - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [ - flag_group( - flags = ["/DEF:%{def_file_path}", "/ignore:4070"], - expand_if_available = "def_file_path", - ), - ], - ), - ], - ) - - msvc_env_feature = feature( - name = "msvc_env", - env_sets = [ - env_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.cpp_link_static_library, - ], - env_entries = [ - env_entry(key = "PATH", value = ctx.attr.msvc_env_path), - env_entry(key = "TMP", value = ctx.attr.msvc_env_tmp), - env_entry(key = "TEMP", value = ctx.attr.msvc_env_tmp), - ], - ), - ], - implies = ["msvc_compile_env", "msvc_link_env"], - ) - features = [ - no_legacy_features_feature, - nologo_feature, - has_configured_linker_path_feature, - no_stripping_feature, - targets_windows_feature, - copy_dynamic_libraries_to_binary_feature, - default_compile_flags_feature, - msvc_env_feature, - msvc_compile_env_feature, - msvc_link_env_feature, - include_paths_feature, - preprocessor_defines_feature, - parse_showincludes_feature, - generate_pdb_file_feature, - shared_flag_feature, - linkstamps_feature, - output_execpath_flags_feature, - archiver_flags_feature, - input_param_flags_feature, - linker_subsystem_flag_feature, - user_link_flags_feature, - default_link_flags_feature, - linker_param_file_feature, - static_link_msvcrt_feature, - static_link_msvcrt_no_debug_feature, - dynamic_link_msvcrt_no_debug_feature, - static_link_msvcrt_debug_feature, - dynamic_link_msvcrt_debug_feature, - dbg_feature, - fastbuild_feature, - opt_feature, - frame_pointer_feature, - disable_assertions_feature, - determinism_feature, - treat_warnings_as_errors_feature, - smaller_binary_feature, - ignore_noisy_warnings_feature, - user_compile_flags_feature, - sysroot_feature, - unfiltered_compile_flags_feature, - compiler_param_file_feature, - compiler_output_flags_feature, - compiler_input_flags_feature, - def_file_feature, - windows_export_all_symbols_feature, - no_windows_export_all_symbols_feature, - supports_dynamic_linker_feature, - supports_interface_shared_libraries_feature, - ] - else: - targets_windows_feature = feature( - name = "targets_windows", - implies = ["copy_dynamic_libraries_to_binary"], - enabled = True, - ) - - copy_dynamic_libraries_to_binary_feature = feature(name = "copy_dynamic_libraries_to_binary") - - gcc_env_feature = feature( - name = "gcc_env", - enabled = True, - env_sets = [ - env_set( - actions = [ - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.cpp_link_static_library, - ], - env_entries = [ - env_entry(key = "PATH", value = ctx.attr.tool_bin_path), - ], - ), - ], - ) - - default_compile_flags_feature = feature( - name = "default_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, - ACTION_NAMES.clif_match, - ], - flag_groups = [flag_group(flags = ["-std=gnu++0x"])], - ), - ], - ) - - default_link_flags_feature = feature( - name = "default_link_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = [flag_group(flags = ["-lstdc++"])], - ), - ], - ) - - supports_dynamic_linker_feature = feature( - name = "supports_dynamic_linker", - enabled = True, - ) - - if ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "mingw-gcc": - compiler_param_file_feature = feature( - name = "compiler_param_file", - ) - - features = [ - targets_windows_feature, - copy_dynamic_libraries_to_binary_feature, - gcc_env_feature, - default_compile_flags_feature, - compiler_param_file_feature, - default_link_flags_feature, - supports_dynamic_linker_feature, - ] - else: - supports_pic_feature = feature( - name = "supports_pic", - enabled = True, - ) - supports_start_end_lib_feature = feature( - name = "supports_start_end_lib", - enabled = True, - ) - - dbg_feature = feature(name = "dbg") - - opt_feature = feature(name = "opt") - - sysroot_feature = feature( - name = "sysroot", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, - ACTION_NAMES.clif_match, - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ], - flag_groups = [ - flag_group( - flags = ["--sysroot=%{sysroot}"], - expand_if_available = "sysroot", - ), - ], - ), - ], - ) - - fdo_optimize_feature = feature( - name = "fdo_optimize", - flag_sets = [ - flag_set( - actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile], - flag_groups = [ - flag_group( - flags = [ - "-fprofile-use=%{fdo_profile_path}", - "-fprofile-correction", - ], - expand_if_available = "fdo_profile_path", - ), - ], - ), - ], - provides = ["profile"], - ) - - user_compile_flags_feature = feature( - name = "user_compile_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = [ - ACTION_NAMES.assemble, - ACTION_NAMES.preprocess_assemble, - ACTION_NAMES.linkstamp_compile, - ACTION_NAMES.c_compile, - ACTION_NAMES.cpp_compile, - ACTION_NAMES.cpp_header_parsing, - ACTION_NAMES.cpp_module_compile, - ACTION_NAMES.cpp_module_codegen, - ACTION_NAMES.lto_backend, - ACTION_NAMES.clif_match, - ], - flag_groups = [ - flag_group( - flags = ["%{user_compile_flags}"], - iterate_over = "user_compile_flags", - expand_if_available = "user_compile_flags", - ), - ], - ), - ], - ) - - features = [ - targets_windows_feature, - copy_dynamic_libraries_to_binary_feature, - gcc_env_feature, - supports_pic_feature, - default_compile_flags_feature, - default_link_flags_feature, - fdo_optimize_feature, - supports_dynamic_linker_feature, - dbg_feature, - opt_feature, - user_compile_flags_feature, - sysroot_feature, - ] - - tool_paths = [ - tool_path(name = name, path = path) - for name, path in ctx.attr.tool_paths.items() - ] - - return cc_common.create_cc_toolchain_config_info( - ctx = ctx, - features = features, - action_configs = action_configs, - artifact_name_patterns = artifact_name_patterns, - cxx_builtin_include_directories = ctx.attr.cxx_builtin_include_directories, - toolchain_identifier = ctx.attr.toolchain_identifier, - host_system_name = ctx.attr.host_system_name, - target_system_name = ctx.attr.target_system_name, - target_cpu = ctx.attr.cpu, - target_libc = ctx.attr.target_libc, - compiler = ctx.attr.compiler, - abi_version = ctx.attr.abi_version, - abi_libc_version = ctx.attr.abi_libc_version, - tool_paths = tool_paths, - ) - -cc_toolchain_config = rule( - implementation = _impl, - attrs = { - "cpu": attr.string(mandatory = True), - "compiler": attr.string(), - "toolchain_identifier": attr.string(), - "host_system_name": attr.string(), - "target_system_name": attr.string(), - "target_libc": attr.string(), - "abi_version": attr.string(), - "abi_libc_version": attr.string(), - "tool_paths": attr.string_dict(), - "cxx_builtin_include_directories": attr.string_list(), - "msvc_env_tmp": attr.string(default = "msvc_not_found"), - "msvc_env_path": attr.string(default = "msvc_not_found"), - "msvc_env_include": attr.string(default = "msvc_not_found"), - "msvc_env_lib": attr.string(default = "msvc_not_found"), - "msvc_cl_path": attr.string(default = "vc_installation_error.bat"), - "msvc_ml_path": attr.string(default = "vc_installation_error.bat"), - "msvc_link_path": attr.string(default = "vc_installation_error.bat"), - "msvc_lib_path": attr.string(default = "vc_installation_error.bat"), - "dbg_mode_debug_flag": attr.string(), - "fastbuild_mode_debug_flag": attr.string(), - "tool_bin_path": attr.string(default = "not_found"), - }, - provides = [CcToolchainConfigInfo], -) diff --git a/cc/toolchain_utils.bzl b/cc/toolchain_utils.bzl deleted file mode 100644 index 1d2a750..0000000 --- a/cc/toolchain_utils.bzl +++ /dev/null @@ -1,48 +0,0 @@ -# pylint: disable=g-bad-file-header -# Copyright 2016 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. - -""" -Finds the c++ toolchain. - -Returns the toolchain if enabled, and falls back to a toolchain constructed from -the CppConfiguration. -""" - -def find_cpp_toolchain(ctx): - """ - Finds the c++ toolchain. - - If the c++ toolchain is in use, returns it. Otherwise, returns a c++ - toolchain derived from legacy toolchain selection. - - Args: - ctx: The rule context for which to find a toolchain. - - Returns: - A CcToolchainProvider. - """ - - # Check the incompatible flag for toolchain resolution. - if hasattr(cc_common, "is_cc_toolchain_resolution_enabled_do_not_use") and cc_common.is_cc_toolchain_resolution_enabled_do_not_use(ctx = ctx): - if "//cc:toolchain_type" in ctx.toolchains: - return ctx.toolchains["//cc:toolchain_type"] - fail("In order to use find_cpp_toolchain, you must include the '@rules_cc//cc:toolchain_type' in the toolchains argument to your rule.") - - # Fall back to the legacy implicit attribute lookup. - if hasattr(ctx.attr, "_cc_toolchain"): - return ctx.attr._cc_toolchain[cc_common.CcToolchainInfo] - - # We didn't find anything. - fail("In order to use find_cpp_toolchain, you must define the '_cc_toolchain' attribute on your rule or aspect.")