From 0fda2cbac4f46e468d96caf0625d47f3e8bba391 Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Mon, 17 Aug 2020 08:58:12 -0400 Subject: [PATCH 01/11] Faster libtool --- tools/objc/libtool.sh | 19 +++++++----- tools/objc/libtool_fast_path | Bin 0 -> 171072 bytes tools/objc/libtool_fast_path.cpp | 50 +++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 8 deletions(-) create mode 100755 tools/objc/libtool_fast_path create mode 100644 tools/objc/libtool_fast_path.cpp diff --git a/tools/objc/libtool.sh b/tools/objc/libtool.sh index 42b6ff71fdb663..5b7cb3310b2204 100755 --- a/tools/objc/libtool.sh +++ b/tools/objc/libtool.sh @@ -34,6 +34,16 @@ fi WRAPPER="${MY_LOCATION}/xcrunwrapper.sh" +# Ensure 0 timestamping for hermetic results. +export ZERO_AR_DATE=1 + +if `dirname "$0"`/libtool_fast_path "$@"; then + "${WRAPPER}" libtool "$@" + exit +fi + +echo "Duplicate .o basenames detected, taking slow path" + TEMPDIR="$(mktemp -d "${TMPDIR:-/tmp}/libtool.XXXXXXXX")" trap "rm -rf \"${TEMPDIR}\"" EXIT @@ -111,11 +121,4 @@ while [[ $# -gt 0 ]]; do esac done -# Ensure 0 timestamping for hermetic results. -export ZERO_AR_DATE=1 - -"${WRAPPER}" libtool "${ARGS[@]}" - -# Prevents a pre-Xcode-8 bug in which passing zero-date archive files to ld -# would cause ld to error. -touch "$OUTPUTFILE" +"${WRAPPER}" libtool "$@" "${ARGS[@]}" diff --git a/tools/objc/libtool_fast_path b/tools/objc/libtool_fast_path new file mode 100755 index 0000000000000000000000000000000000000000..907d6e740e3f7988acf3dcc82b4d3c17599a3108 GIT binary patch literal 171072 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 +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace std; + +static unordered_set sBasenames; + +// Returns 0 if there are no duplicate basenames in the object files (both via -filelist as well as shell args), +// 1 otherwise. If there are no duplicates, we can use /usr/bin/libtool directly with no symlinking +int main(int argc, const char * argv[]) { + regex no_arg_flags = regex("-static|-s|-a|-c|-L|-T|-no_warning_for_no_symbols"); + regex single_arg_flags = regex("-arch_only|-syslibroot|-o"); + // Set i to 1 to skip executable path + for (int i = 1; argv[i] != nullptr; i++) { + string arg = argv[i]; + if (arg == "-filelist") { + ifstream list(argv[i + 1]); + for (string line; getline(list, line); ) { + string basename = fs::path(line).filename(); + auto pair = sBasenames.insert(basename); + if (!pair.second) { + return 1; + } + } + list.close(); + i++; + } else if (regex_match(arg, no_arg_flags)) { + // No arg flags + } else if (regex_match(arg, single_arg_flags)) { + // Single-arg flags + i++; + } else if (arg[0] == '-') { + return 1; + // Unrecognized flag, let the wrapper deal with it + } else if (regex_match(arg, regex(".*\\.a$"))) { + // Archive inputs can remain untouched, as they come from other targets. + } else { + string basename = fs::path(arg).filename(); + auto pair = sBasenames.insert(basename); + if (!pair.second) { + return 1; + } + } + } + return 0; +} From ef6c5e898951aa4021ede5dd304e95685267ae2e Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Mon, 17 Aug 2020 09:51:52 -0400 Subject: [PATCH 02/11] Faster libtool --- tools/objc/BUILD | 9 +++++++++ tools/objc/libtool.sh | 3 ++- ...l_fast_path.cpp => libtool_check_unique.cc} | 16 +++++++++++----- tools/objc/libtool_fast_path | Bin 171072 -> 0 bytes 4 files changed, 22 insertions(+), 6 deletions(-) rename tools/objc/{libtool_fast_path.cpp => libtool_check_unique.cc} (84%) delete mode 100755 tools/objc/libtool_fast_path diff --git a/tools/objc/BUILD b/tools/objc/BUILD index 32c5c441d9031e..71299f9782edf7 100644 --- a/tools/objc/BUILD +++ b/tools/objc/BUILD @@ -16,9 +16,18 @@ sh_binary( data = [ ":make_hashed_objlist.py", ":xcrunwrapper", + ":libtool_check_unique", ], ) +cc_binary( + name = "libtool_check_unique", + srcs = [ + "libtool_check_unique.cc", + ], + copts = ["-std=c++17"], +) + sh_binary( name = "xcrunwrapper", srcs = [":xcrunwrapper.sh"], diff --git a/tools/objc/libtool.sh b/tools/objc/libtool.sh index 5b7cb3310b2204..6f122a3d74145a 100755 --- a/tools/objc/libtool.sh +++ b/tools/objc/libtool.sh @@ -37,7 +37,8 @@ WRAPPER="${MY_LOCATION}/xcrunwrapper.sh" # Ensure 0 timestamping for hermetic results. export ZERO_AR_DATE=1 -if `dirname "$0"`/libtool_fast_path "$@"; then +if $(/usr/bin/dirname "$0")/libtool_check_unique "$@"; then + # If there are no duplicate .o basenames, libtool can be invoked with the original arguments "${WRAPPER}" libtool "$@" exit fi diff --git a/tools/objc/libtool_fast_path.cpp b/tools/objc/libtool_check_unique.cc similarity index 84% rename from tools/objc/libtool_fast_path.cpp rename to tools/objc/libtool_check_unique.cc index 9422f129cdd2f0..78db65507594ff 100644 --- a/tools/objc/libtool_fast_path.cpp +++ b/tools/objc/libtool_check_unique.cc @@ -1,16 +1,22 @@ #include #include #include -#include #include -namespace fs = std::filesystem; using namespace std; static unordered_set sBasenames; +string getBasename(string path) { + 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. If there are no duplicates, we can use /usr/bin/libtool directly with no symlinking +// 1 otherwise int main(int argc, const char * argv[]) { regex no_arg_flags = regex("-static|-s|-a|-c|-L|-T|-no_warning_for_no_symbols"); regex single_arg_flags = regex("-arch_only|-syslibroot|-o"); @@ -20,7 +26,7 @@ int main(int argc, const char * argv[]) { if (arg == "-filelist") { ifstream list(argv[i + 1]); for (string line; getline(list, line); ) { - string basename = fs::path(line).filename(); + string basename = getBasename(line); auto pair = sBasenames.insert(basename); if (!pair.second) { return 1; @@ -39,7 +45,7 @@ int main(int argc, const char * argv[]) { } else if (regex_match(arg, regex(".*\\.a$"))) { // Archive inputs can remain untouched, as they come from other targets. } else { - string basename = fs::path(arg).filename(); + string basename = getBasename(arg); auto pair = sBasenames.insert(basename); if (!pair.second) { return 1; diff --git a/tools/objc/libtool_fast_path b/tools/objc/libtool_fast_path deleted file mode 100755 index 907d6e740e3f7988acf3dcc82b4d3c17599a3108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171072 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 Date: Mon, 17 Aug 2020 09:52:59 -0400 Subject: [PATCH 03/11] Faster libtool --- tools/objc/BUILD | 1 - tools/objc/libtool.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/objc/BUILD b/tools/objc/BUILD index 71299f9782edf7..766942d8e8e1f8 100644 --- a/tools/objc/BUILD +++ b/tools/objc/BUILD @@ -25,7 +25,6 @@ cc_binary( srcs = [ "libtool_check_unique.cc", ], - copts = ["-std=c++17"], ) sh_binary( diff --git a/tools/objc/libtool.sh b/tools/objc/libtool.sh index 6f122a3d74145a..7249c802b6869d 100755 --- a/tools/objc/libtool.sh +++ b/tools/objc/libtool.sh @@ -122,4 +122,4 @@ while [[ $# -gt 0 ]]; do esac done -"${WRAPPER}" libtool "$@" "${ARGS[@]}" +"${WRAPPER}" libtool "${ARGS[@]}" From f790ad3b103db623f19bd4e72c4baf9c73ab1f09 Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Mon, 17 Aug 2020 14:57:20 -0400 Subject: [PATCH 04/11] pr responses --- tools/objc/libtool.sh | 2 -- tools/objc/libtool_check_unique.cc | 25 +++++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/tools/objc/libtool.sh b/tools/objc/libtool.sh index 7249c802b6869d..cb09c430caf4b1 100755 --- a/tools/objc/libtool.sh +++ b/tools/objc/libtool.sh @@ -43,8 +43,6 @@ if $(/usr/bin/dirname "$0")/libtool_check_unique "$@"; then exit fi -echo "Duplicate .o basenames detected, taking slow path" - TEMPDIR="$(mktemp -d "${TMPDIR:-/tmp}/libtool.XXXXXXXX")" trap "rm -rf \"${TEMPDIR}\"" EXIT diff --git a/tools/objc/libtool_check_unique.cc b/tools/objc/libtool_check_unique.cc index 78db65507594ff..a0423c3f1b8a25 100644 --- a/tools/objc/libtool_check_unique.cc +++ b/tools/objc/libtool_check_unique.cc @@ -5,9 +5,8 @@ using namespace std; -static unordered_set sBasenames; - -string getBasename(string path) { +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; @@ -18,35 +17,37 @@ string getBasename(string path) { // 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[]) { - regex no_arg_flags = regex("-static|-s|-a|-c|-L|-T|-no_warning_for_no_symbols"); - regex single_arg_flags = regex("-arch_only|-syslibroot|-o"); + unordered_set basenames; + const regex libRegex = regex(".*\\.a$"); + const regex noArgFlags = regex("-static|-s|-a|-c|-L|-T|-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++) { string arg = argv[i]; if (arg == "-filelist") { ifstream list(argv[i + 1]); for (string line; getline(list, line); ) { - string basename = getBasename(line); - auto pair = sBasenames.insert(basename); + const string basename = getBasename(line); + const auto pair = basenames.insert(basename); if (!pair.second) { return 1; } } list.close(); i++; - } else if (regex_match(arg, no_arg_flags)) { + } else if (regex_match(arg, noArgFlags)) { // No arg flags - } else if (regex_match(arg, single_arg_flags)) { + } else if (regex_match(arg, singleArgFlags)) { // Single-arg flags i++; } else if (arg[0] == '-') { return 1; // Unrecognized flag, let the wrapper deal with it - } else if (regex_match(arg, regex(".*\\.a$"))) { + } else if (regex_match(arg, libRegex)) { // Archive inputs can remain untouched, as they come from other targets. } else { - string basename = getBasename(arg); - auto pair = sBasenames.insert(basename); + const string basename = getBasename(arg); + const auto pair = basenames.insert(basename); if (!pair.second) { return 1; } From 41b78a7888cc9cf5c245ca19c9da8ebaa16eaa79 Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Mon, 17 Aug 2020 17:22:01 -0400 Subject: [PATCH 05/11] Faster libtool --- tools/cpp/osx_cc_configure.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/cpp/osx_cc_configure.bzl b/tools/cpp/osx_cc_configure.bzl index a3728044ec685a..5688ac4c8851ee 100644 --- a/tools/cpp/osx_cc_configure.bzl +++ b/tools/cpp/osx_cc_configure.bzl @@ -54,6 +54,7 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): paths = resolve_labels(repository_ctx, [ "@bazel_tools//tools/cpp: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", From c6889970c4921cccfd529f71fb7811051de134d7 Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Tue, 18 Aug 2020 15:13:28 -0400 Subject: [PATCH 06/11] Faster libtool --- tools/cpp/osx_cc_configure.bzl | 28 ++++++++++++++++++++++++++++ tools/objc/BUILD | 7 ------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/tools/cpp/osx_cc_configure.bzl b/tools/cpp/osx_cc_configure.bzl index 5688ac4c8851ee..e49f8a5d38796f 100644 --- a/tools/cpp/osx_cc_configure.bzl +++ b/tools/cpp/osx_cc_configure.bzl @@ -109,6 +109,34 @@ 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"], + )) + xcrun_result = repository_ctx.execute([ + "env", + "-i", + "xcrun", + "--sdk", + "macosx", + "clang", + "-mmacosx-version-min=10.9", + "-std=c++11", + "-lc++", + "-o", + "libtool_check_unique", + libtool_check_unique_src_path, + ], 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("libtool_check_unique failed to generate. Please file an issue at " + + "https://github.com/bazelbuild/bazel/issues with the following:\n" + + error_msg) wrapped_clang_src_path = str(repository_ctx.path( paths["@bazel_tools//tools/osx/crosstool:wrapped_clang.cc"], )) diff --git a/tools/objc/BUILD b/tools/objc/BUILD index 766942d8e8e1f8..59eadb3e09b71f 100644 --- a/tools/objc/BUILD +++ b/tools/objc/BUILD @@ -20,13 +20,6 @@ sh_binary( ], ) -cc_binary( - name = "libtool_check_unique", - srcs = [ - "libtool_check_unique.cc", - ], -) - sh_binary( name = "xcrunwrapper", srcs = [":xcrunwrapper.sh"], From ad7a281f6bd00c3e64d2e98d4be32414d454656b Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Tue, 18 Aug 2020 15:15:40 -0400 Subject: [PATCH 07/11] Faster libtool --- tools/objc/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/objc/BUILD b/tools/objc/BUILD index 59eadb3e09b71f..32c5c441d9031e 100644 --- a/tools/objc/BUILD +++ b/tools/objc/BUILD @@ -16,7 +16,6 @@ sh_binary( data = [ ":make_hashed_objlist.py", ":xcrunwrapper", - ":libtool_check_unique", ], ) From ad7a8bd90ce31195f78cff1b515782786e2b0d3c Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Wed, 19 Aug 2020 08:39:15 -0400 Subject: [PATCH 08/11] Faster libtool --- tools/objc/libtool_check_unique.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/objc/libtool_check_unique.cc b/tools/objc/libtool_check_unique.cc index a0423c3f1b8a25..b24abbba89389a 100644 --- a/tools/objc/libtool_check_unique.cc +++ b/tools/objc/libtool_check_unique.cc @@ -19,7 +19,7 @@ string getBasename(const string &path) { 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|-no_warning_for_no_symbols"); + 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++) { From a6237cabb98238e2d7f52002b4ca301a494649b3 Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Wed, 19 Aug 2020 17:53:17 -0400 Subject: [PATCH 09/11] Faster libtool --- tools/cpp/osx_cc_configure.bzl | 82 +++++++++++++--------------------- 1 file changed, 30 insertions(+), 52 deletions(-) diff --git a/tools/cpp/osx_cc_configure.bzl b/tools/cpp/osx_cc_configure.bzl index e49f8a5d38796f..4666cdac39f9c5 100644 --- a/tools/cpp/osx_cc_configure.bzl +++ b/tools/cpp/osx_cc_configure.bzl @@ -49,6 +49,33 @@ def _get_escaped_xcode_cxx_inc_directories(repository_ctx, cc, xcode_toolchains) 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.""" paths = resolve_labels(repository_ctx, [ @@ -112,61 +139,12 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): libtool_check_unique_src_path = str(repository_ctx.path( paths["@bazel_tools//tools/objc:libtool_check_unique.cc"], )) - xcrun_result = repository_ctx.execute([ - "env", - "-i", - "xcrun", - "--sdk", - "macosx", - "clang", - "-mmacosx-version-min=10.9", - "-std=c++11", - "-lc++", - "-o", - "libtool_check_unique", - libtool_check_unique_src_path, - ], 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("libtool_check_unique 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, 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 c1a21b8bfff2915c18f90c79067f1746306b7d35 Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Thu, 20 Aug 2020 11:44:14 -0400 Subject: [PATCH 10/11] Faster libtool --- tools/objc/libtool.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/objc/libtool.sh b/tools/objc/libtool.sh index a0ea734d0a97a8..321190ff265735 100755 --- a/tools/objc/libtool.sh +++ b/tools/objc/libtool.sh @@ -37,7 +37,7 @@ WRAPPER="${MY_LOCATION}/xcrunwrapper.sh" # Ensure 0 timestamping for hermetic results. export ZERO_AR_DATE=1 -if $(/usr/bin/dirname "$0")/libtool_check_unique "$@"; then +if ${MY_LOCATION}/libtool_check_unique "$@"; then # If there are no duplicate .o basenames, libtool can be invoked with the original arguments "${WRAPPER}" libtool "$@" exit From 350c682ccbb446d5e0079ab5d650b1f5ce05f96f Mon Sep 17 00:00:00 2001 From: Michael Eisel Date: Fri, 21 Aug 2020 19:23:29 -0400 Subject: [PATCH 11/11] Faster libtool --- tools/objc/libtool_check_unique.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/objc/libtool_check_unique.cc b/tools/objc/libtool_check_unique.cc index b24abbba89389a..ad83c93f5517e8 100644 --- a/tools/objc/libtool_check_unique.cc +++ b/tools/objc/libtool_check_unique.cc @@ -1,3 +1,17 @@ +// 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