Fix quoting when writing defines on Windows.

For the following string-valued define:
 defines = [ "CR_CLANG_REVISION=\"$clang_revision\"" ]
this was outputting the following on Windows:
 -D"CR_CLANG_REVISION=\"332838-1\""
The Windows shell can't handle the extra quotes, and so the following
macro was being written:
 #define "CR_CLANG_REVISION "332838-1""
This change moves the first quote to before the -D, allowing Windows to
correctly handle the define parameter.

R=brettw@chromium.org

Bug: 396230
Change-Id: I4f6f70acf775577ff9b3077eba9ebf7f8d002da1
Reviewed-on: https://chromium-review.googlesource.com/1071274
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Joey Scarr <jsca@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#565117}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 44054a1e89063bf0063cfc4d72632c2f1589ee8b
diff --git a/tools/gn/ninja_binary_target_writer.cc b/tools/gn/ninja_binary_target_writer.cc
index 1711ad2..fb2fcf8 100644
--- a/tools/gn/ninja_binary_target_writer.cc
+++ b/tools/gn/ninja_binary_target_writer.cc
@@ -60,8 +60,8 @@
   }
 
   void operator()(const std::string& s, std::ostream& out) const {
-    out << " -D";
-    EscapeStringToStream(out, s, options);
+    out << " ";
+    EscapeStringToStream(out, "-D" + s, options);
   }
 
   EscapeOptions options;
diff --git a/tools/gn/ninja_binary_target_writer_unittest.cc b/tools/gn/ninja_binary_target_writer_unittest.cc
index 20239b0..acbd88b 100644
--- a/tools/gn/ninja_binary_target_writer_unittest.cc
+++ b/tools/gn/ninja_binary_target_writer_unittest.cc
@@ -8,6 +8,7 @@
 #include <sstream>
 #include <utility>
 
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "tools/gn/config.h"
 #include "tools/gn/scheduler.h"
@@ -150,6 +151,30 @@
   }
 }
 
+TEST_F(NinjaBinaryTargetWriterTest, EscapeDefines) {
+  TestWithScope setup;
+  Err err;
+
+  TestTarget target(setup, "//foo:bar", Target::STATIC_LIBRARY);
+  target.config_values().defines().push_back("BOOL_DEF");
+  target.config_values().defines().push_back("INT_DEF=123");
+  target.config_values().defines().push_back("STR_DEF=\"ABCD-1\"");
+  ASSERT_TRUE(target.OnResolved(&err));
+
+  std::ostringstream out;
+  NinjaBinaryTargetWriter writer(&target, out);
+  writer.Run();
+
+  const char expectedSubstr[] =
+#if defined(OS_WIN)
+      "defines = -DBOOL_DEF -DINT_DEF=123 \"-DSTR_DEF=\\\"ABCD-1\\\"\"";
+#else
+      "defines = -DBOOL_DEF -DINT_DEF=123 -DSTR_DEF=\\\"ABCD-1\\\"";
+#endif
+  std::string out_str = out.str();
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, expectedSubstr, out_str);
+}
+
 TEST_F(NinjaBinaryTargetWriterTest, StaticLibrary) {
   TestWithScope setup;
   Err err;