From b021f3169888b12941392af057c987d349748814 Mon Sep 17 00:00:00 2001 From: Oscar Bonilla <6f6231@gmail.com> Date: Tue, 12 Jun 2018 12:21:44 -0700 Subject: [PATCH] CROSSTOOLS wrapped_clang: handle spaces in paths When bazel calls wrapped_clang, it single-quotes all arguments. However it passes flags with arguments quoted as a whole. That is, wrapped_clang will be called with arguments like these: wrapped_clang '-isysroot /a/path/with spaces' '/a/file with spaces.m' Before this commit, wrapped_clang was blindly splitting on space and calling clang with invalid arguments. Now it only splits on the _first_ space, and only if the argument starts with '-'. Closes #5147. PiperOrigin-RevId: 200259496 --- .../shell/bazel/apple/bazel_apple_test.sh | 29 +++++++++++++++++++ tools/osx/crosstool/wrapped_clang.cc | 13 +-------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/test/shell/bazel/apple/bazel_apple_test.sh b/src/test/shell/bazel/apple/bazel_apple_test.sh index db3063e7074d4e..18b093a9e064a3 100755 --- a/src/test/shell/bazel/apple/bazel_apple_test.sh +++ b/src/test/shell/bazel/apple/bazel_apple_test.sh @@ -385,4 +385,33 @@ EOF || fail "should build apple_binary with dSYMs" } +function test_apple_binary_spaces() { + rm -rf package + mkdir -p package + cat > package/BUILD < "package/the main.m" < &args) { } } -// Splits txt using whitespace delimiter, pushing each substring into strs. -void SplitAndAdd(const std::string &txt, std::vector &strs) { - for (std::istringstream stream(txt); !stream.eof();) { - std::string substring; - stream >> substring; - if (!substring.empty()) { - strs.push_back(substring); - } - } -} - // Finds and replaces all instances of oldsub with newsub, in-place on str. void FindAndReplace(const std::string &oldsub, const std::string &newsub, std::string *str) { @@ -207,7 +196,7 @@ int main(int argc, char *argv[]) { } FindAndReplace("__BAZEL_XCODE_DEVELOPER_DIR__", developer_dir, &arg); FindAndReplace("__BAZEL_XCODE_SDKROOT__", sdk_root, &arg); - SplitAndAdd(arg, processed_args); + processed_args.push_back(arg); } // Check to see if we should postprocess with dsymutil.