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
diff --git a/src/test/shell/bazel/apple/bazel_apple_test.sh b/src/test/shell/bazel/apple/bazel_apple_test.sh
index db3063e..18b093a 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 @@
       || fail "should build apple_binary with dSYMs"
 }
 
+function test_apple_binary_spaces() {
+  rm -rf package
+  mkdir -p package
+  cat > package/BUILD <<EOF
+apple_binary(
+    name = "main_binary",
+    deps = [":main_lib"],
+    platform_type = "ios",
+    minimum_os_version = "10.0",
+)
+objc_library(
+    name = "main_lib",
+    srcs = ["the main.m"],
+)
+EOF
+  cat > "package/the main.m" <<EOF
+int main() {
+  return 0;
+}
+EOF
+
+  bazel build --verbose_failures //package:main_binary \
+      --apple_crosstool_transition \
+      --ios_multi_cpus=i386,x86_64 \
+      --xcode_version=$XCODE_VERSION \
+      --apple_generate_dsym=true \
+      || fail "should build apple_binary with dSYMs"
+}
+
 run_suite "apple_tests"
diff --git a/tools/osx/crosstool/wrapped_clang.cc b/tools/osx/crosstool/wrapped_clang.cc
index 0f92db9..1fcdb53 100644
--- a/tools/osx/crosstool/wrapped_clang.cc
+++ b/tools/osx/crosstool/wrapped_clang.cc
@@ -118,17 +118,6 @@
   }
 }
 
-// Splits txt using whitespace delimiter, pushing each substring into strs.
-void SplitAndAdd(const std::string &txt, std::vector<std::string> &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 @@
     }
     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.