From 5bf327ff82087cb932883731144ed32f4e0f214a Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Wed, 23 Sep 2020 10:21:27 -0700 Subject: [PATCH 1/2] Sync osx_cc_configure Fixes https://github.com/bazelbuild/rules_cc/issues/80 --- cc/private/toolchain/osx_cc_configure.bzl | 72 ++++++++++++----------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/cc/private/toolchain/osx_cc_configure.bzl b/cc/private/toolchain/osx_cc_configure.bzl index 29c95e5..88c6b3a 100644 --- a/cc/private/toolchain/osx_cc_configure.bzl +++ b/cc/private/toolchain/osx_cc_configure.bzl @@ -49,16 +49,39 @@ def _get_escaped_xcode_cxx_inc_directories(repository_ctx, cc, xcode_toolchains) include_dirs.append("/Applications/") return include_dirs -def configure_osx_toolchain(repository_ctx, overriden_tools): - """Configure C++ toolchain on macOS. +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) - Args: - repository_ctx: The repository context. - overriden_tools: dictionary of overriden tools. - """ +def configure_osx_toolchain(repository_ctx, overriden_tools): + """Configure C++ toolchain on macOS.""" paths = resolve_labels(repository_ctx, [ "@rules_cc//cc/private/toolchain:osx_cc_wrapper.sh.tpl", "@bazel_tools//tools/objc:libtool.sh", + "@bazel_tools//tools/objc:libtool_check_unique.cc", "@bazel_tools//tools/objc:make_hashed_objlist.py", "@bazel_tools//tools/objc:xcrunwrapper.sh", "@bazel_tools//tools/osx/crosstool:BUILD.tpl", @@ -87,11 +110,13 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): # 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(str(cc)), + "%{cc}": escape_string(cc_path), "%{env}": escape_string(get_env(repository_ctx)), }, ) @@ -111,36 +136,15 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): paths["@bazel_tools//tools/osx/crosstool:cc_toolchain_config.bzl"], "cc_toolchain_config.bzl", ) + libtool_check_unique_src_path = str(repository_ctx.path( + paths["@bazel_tools//tools/objc: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"], )) - xcrun_result = repository_ctx.execute([ - "env", - "-i", - "xcrun", - "--sdk", - "macosx", - "clang", - "-mmacosx-version-min=10.9", - "-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) + 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") From c5a9b6d32fc4695480d3b3edc2feecbbf0ea55ac Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 28 Sep 2020 08:28:52 -0700 Subject: [PATCH 2/2] Duplicate libtool_check_unique.cc This is temporarily required to support old and new versions of bazel --- cc/private/toolchain/libtool_check_unique.cc | 74 ++++++++++++++++++++ cc/private/toolchain/osx_cc_configure.bzl | 11 ++- 2 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 cc/private/toolchain/libtool_check_unique.cc diff --git a/cc/private/toolchain/libtool_check_unique.cc b/cc/private/toolchain/libtool_check_unique.cc new file mode 100644 index 0000000..b90aa59 --- /dev/null +++ b/cc/private/toolchain/libtool_check_unique.cc @@ -0,0 +1,74 @@ +// 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; + +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); +} + +// Returns 0 if there are no duplicate basenames in the object files (both via +// -filelist as well as shell args), 1 otherwise +int main(int argc, const char *argv[]) { + unordered_set basenames; + 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"); + // Set i to 1 to skip executable path + for (int i = 1; argv[i] != nullptr; i++) { + const string arg = argv[i]; + if (arg == "-filelist") { + ifstream list(argv[i + 1]); + for (string line; getline(list, line);) { + const string basename = getBasename(line); + const auto pair = basenames.insert(basename); + if (!pair.second) { + return EXIT_FAILURE; + } + } + list.close(); + i++; + } else if (regex_match(arg, noArgFlags)) { + } else if (regex_match(arg, singleArgFlags)) { + i++; + } else if (arg[0] == '-') { + return EXIT_FAILURE; + // Unrecognized flag, let the wrapper deal with it + } 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) { + return EXIT_FAILURE; + } + } + } + return EXIT_SUCCESS; +} diff --git a/cc/private/toolchain/osx_cc_configure.bzl b/cc/private/toolchain/osx_cc_configure.bzl index 88c6b3a..845a1f2 100644 --- a/cc/private/toolchain/osx_cc_configure.bzl +++ b/cc/private/toolchain/osx_cc_configure.bzl @@ -77,11 +77,16 @@ def compile_cc_file(repository_ctx, src_name, out_name): error_msg) def configure_osx_toolchain(repository_ctx, overriden_tools): - """Configure C++ toolchain on macOS.""" + """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:osx_cc_wrapper.sh.tpl", + "@rules_cc//cc/private/toolchain:libtool_check_unique.cc", "@bazel_tools//tools/objc:libtool.sh", - "@bazel_tools//tools/objc:libtool_check_unique.cc", "@bazel_tools//tools/objc:make_hashed_objlist.py", "@bazel_tools//tools/objc:xcrunwrapper.sh", "@bazel_tools//tools/osx/crosstool:BUILD.tpl", @@ -137,7 +142,7 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): "cc_toolchain_config.bzl", ) libtool_check_unique_src_path = str(repository_ctx.path( - paths["@bazel_tools//tools/objc:libtool_check_unique.cc"], + 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(