diff --git a/cc/private/toolchain/BUILD b/cc/private/toolchain/BUILD index 6915d5b..557a6a7 100644 --- a/cc/private/toolchain/BUILD +++ b/cc/private/toolchain/BUILD @@ -80,11 +80,6 @@ filegroup( srcs = ["build_interface_so"], ) -filegroup( - name = "osx_wrapper", - srcs = ["osx_cc_wrapper.sh"], -) - filegroup( name = "link_dynamic_library", srcs = ["link_dynamic_library.sh"], diff --git a/cc/private/toolchain/cc_configure.bzl b/cc/private/toolchain/cc_configure.bzl index 4f9d137..c7b19de 100644 --- a/cc/private/toolchain/cc_configure.bzl +++ b/cc/private/toolchain/cc_configure.bzl @@ -18,7 +18,6 @@ load( "get_cpu_value", "resolve_labels", ) -load(":osx_cc_configure.bzl", "configure_osx_toolchain") load(":unix_cc_configure.bzl", "configure_unix_toolchain") load(":windows_cc_configure.bzl", "configure_windows_toolchain") @@ -87,9 +86,6 @@ def cc_autoconf_impl(repository_ctx, overriden_tools = dict()): # 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) diff --git a/cc/private/toolchain/libtool_check_unique.cc b/cc/private/toolchain/libtool_check_unique.cc deleted file mode 100644 index 340e9a3..0000000 --- a/cc/private/toolchain/libtool_check_unique.cc +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2020 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 -#include -#include -#include // NOLINT -#include - -using std::ifstream; -using std::regex; -using std::string; -using std::unordered_set; -using std::vector; - -const regex libRegex = regex(".*\\.a$"); -const regex noArgFlags = - regex("-static|-s|-a|-c|-L|-T|-D|-no_warning_for_no_symbols"); -const regex singleArgFlags = regex("-arch_only|-syslibroot|-o"); - -string getBasename(const string &path) { - // Assumes we're on an OS with "/" as the path separator - auto idx = path.find_last_of("/"); - if (idx == string::npos) { - return path; - } - return path.substr(idx + 1); -} - -vector readFile(const string path) { - vector lines; - ifstream file(path); - string line; - while (std::getline(file, line)) { - if (!line.empty()) { - lines.push_back(line); - } - } - - return lines; -} - -unordered_set parseArgs(vector args) { - unordered_set basenames; - for (auto it = args.begin(); it != args.end(); ++it) { - const string arg = *it; - if (arg == "-filelist") { - ++it; - ifstream list(*it); - for (string line; getline(list, line);) { - const string basename = getBasename(line); - const auto pair = basenames.insert(basename); - if (!pair.second) { - exit(EXIT_FAILURE); - } - } - list.close(); - } else if (arg[0] == '@') { - string paramsFilePath(arg.substr(1)); - auto newBasenames = parseArgs(readFile(paramsFilePath)); - for (auto newBasename : newBasenames) { - const auto pair = basenames.insert(newBasename); - if (!pair.second) { - exit(EXIT_FAILURE); - } - } - } else if (regex_match(arg, noArgFlags)) { - } else if (regex_match(arg, singleArgFlags)) { - ++it; - } else if (arg[0] == '-') { - exit(EXIT_FAILURE); - // Unrecognized flag, let the wrapper deal with it, any flags added to - // libtool.sh should also be added here. - } else if (regex_match(arg, libRegex)) { - // Archive inputs can remain untouched, as they come from other targets. - } else { - const string basename = getBasename(arg); - const auto pair = basenames.insert(basename); - if (!pair.second) { - exit(EXIT_FAILURE); - } - } - } - - return basenames; -} - -// Returns 0 if there are no duplicate basenames in the object files (via -// -filelist, params files, and shell args), 1 otherwise -int main(int argc, const char *argv[]) { - vector args; - // Set i to 1 to skip executable path - for (int i = 1; argv[i] != nullptr; i++) { - args.push_back(argv[i]); - } - parseArgs(args); - return EXIT_SUCCESS; -} diff --git a/cc/private/toolchain/osx_cc_configure.bzl b/cc/private/toolchain/osx_cc_configure.bzl deleted file mode 100644 index 6d45e04..0000000 --- a/cc/private/toolchain/osx_cc_configure.bzl +++ /dev/null @@ -1,184 +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( - ":lib_cc_configure.bzl", - "escape_string", - "resolve_labels", - "write_builtin_include_directory_paths", -) -load( - ":unix_cc_configure.bzl", - "configure_unix_toolchain", - "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 compile_cc_file(repository_ctx, src_name, out_name): - xcrun_result = repository_ctx.execute([ - "env", - "-i", - "xcrun", - "--sdk", - "macosx", - "clang", - "-mmacosx-version-min=10.9", - "-std=c++11", - "-lc++", - "-o", - out_name, - src_name, - ], 30) - if (xcrun_result.return_code != 0): - error_msg = ( - "return code {code}, stderr: {err}, stdout: {out}" - ).format( - code = xcrun_result.return_code, - err = xcrun_result.stderr, - out = xcrun_result.stdout, - ) - fail(out_name + " failed to generate. Please file an issue at " + - "https://github.com/bazelbuild/bazel/issues with the following:\n" + - error_msg) - -def configure_osx_toolchain(repository_ctx, overriden_tools): - """Configure C++ toolchain on macOS. - - Args: - repository_ctx: The repository context. - overriden_tools: dictionary of overriden tools. - """ - paths = resolve_labels(repository_ctx, [ - "@rules_cc//cc/private/toolchain:armeabi_cc_toolchain_config.bzl", - "@rules_cc//cc/private/toolchain:osx_cc_wrapper.sh.tpl", - "@rules_cc//cc/private/toolchain:libtool_check_unique.cc", - "@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_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 @rules_cc//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: - # For Xcode toolchains, there's no reason to use anything other than - # wrapped_clang, so that we still get the Bazel Xcode placeholder - # substitution and other behavior for actions that invoke this - # cc_wrapper.sh script. The wrapped_clang binary is already hardcoded - # into the Objective-C crosstool actions, anyway, so this ensures that - # the C++ actions behave consistently. - cc = repository_ctx.path("wrapped_clang") - - cc_path = '"$(/usr/bin/dirname "$0")"/wrapped_clang' - repository_ctx.template( - "cc_wrapper.sh", - paths["@rules_cc//cc/private/toolchain:osx_cc_wrapper.sh.tpl"], - { - "%{cc}": escape_string(cc_path), - "%{env}": escape_string(get_env(repository_ctx)), - }, - ) - repository_ctx.symlink( - paths["@rules_cc//cc/private/toolchain:armeabi_cc_toolchain_config.bzl"], - "armeabi_cc_toolchain_config.bzl", - ) - 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:cc_toolchain_config.bzl"], - "cc_toolchain_config.bzl", - ) - libtool_check_unique_src_path = str(repository_ctx.path( - paths["@rules_cc//cc/private/toolchain:libtool_check_unique.cc"], - )) - compile_cc_file(repository_ctx, libtool_check_unique_src_path, "libtool_check_unique") - wrapped_clang_src_path = str(repository_ctx.path( - paths["@bazel_tools//tools/osx/crosstool:wrapped_clang.cc"], - )) - compile_cc_file(repository_ctx, wrapped_clang_src_path, "wrapped_clang") - repository_ctx.symlink("wrapped_clang", "wrapped_clang_pp") - - tool_paths = {} - gcov_path = repository_ctx.os.environ.get("GCOV") - if gcov_path != None: - if not gcov_path.startswith("/"): - gcov_path = repository_ctx.which(gcov_path) - tool_paths["gcov"] = gcov_path - - escaped_include_paths = _get_escaped_xcode_cxx_inc_directories(repository_ctx, cc, xcode_toolchains) - write_builtin_include_directory_paths(repository_ctx, cc, escaped_include_paths) - 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), - "%{tool_paths_overrides}": ",\n ".join( - ['"%s": "%s"' % (k, v) for k, v in tool_paths.items()], - ), - }, - ) - 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 8c9c111..0000000 --- a/cc/private/toolchain/osx_cc_wrapper.sh +++ /dev/null @@ -1,116 +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= - -function parse_option() { - local -r opt="$1" - if [[ "${OUTPUT}" = "1" ]]; then - OUTPUT=$opt - elif [[ "$opt" =~ ^-l(.*)$ ]]; then - LIBS="${BASH_REMATCH[1]} $LIBS" - elif [[ "$opt" =~ ^-L(.*)$ ]]; then - LIB_DIRS="${BASH_REMATCH[1]} $LIB_DIRS" - elif [[ "$opt" =~ ^-Wl,-rpath,\@loader_path/(.*)$ ]]; then - RPATHS="${BASH_REMATCH[1]} ${RPATHS}" - elif [[ "$opt" = "-o" ]]; then - # output is coming - OUTPUT=1 - fi -} - -# let parse the option list -for i in "$@"; do - if [[ "$i" = @* ]]; then - while IFS= read -r opt - do - parse_option "$opt" - done < "${i:1}" || exit 1 - else - parse_option "$i" - 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