[bundle] Use "phony" builtin tool for create_bundle targets

Instead of using the "stamp" tool which creates files (and potentially
slow down the build since this requires access to the filesystem), use
the builtin "phony" tool.

Bug: 194
Change-Id: Ie1af7020af4e7efc6c8848244c21dac549f179aa
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/16920
Reviewed-by: David Turner <digit@google.com>
Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
diff --git a/src/gn/ninja_create_bundle_target_writer.cc b/src/gn/ninja_create_bundle_target_writer.cc
index efa950e..2eacee4 100644
--- a/src/gn/ninja_create_bundle_target_writer.cc
+++ b/src/gn/ninja_create_bundle_target_writer.cc
@@ -7,6 +7,7 @@
 #include <iterator>
 
 #include "base/strings/string_util.h"
+#include "gn/builtin_tool.h"
 #include "gn/filesystem_utils.h"
 #include "gn/general_tool.h"
 #include "gn/ninja_utils.h"
@@ -36,15 +37,23 @@
               tool_name + "\" tool."));
 }
 
+bool EnsureToolAvailable(const Target* target, const char* tool) {
+  if (!target->toolchain()->GetTool(tool)) {
+    FailWithMissingToolError(tool, target);
+    return false;
+  }
+
+  return true;
+}
+
 bool EnsureAllToolsAvailable(const Target* target) {
   const char* kRequiredTools[] = {
       GeneralTool::kGeneralToolCopyBundleData,
-      GeneralTool::kGeneralToolStamp,
+      GeneralTool::kGeneralToolStamp,  // To create empty partial Info.plist.
   };
 
-  for (size_t i = 0; i < std::size(kRequiredTools); ++i) {
-    if (!target->toolchain()->GetTool(kRequiredTools[i])) {
-      FailWithMissingToolError(kRequiredTools[i], target);
+  for (const char* tool : kRequiredTools) {
+    if (!EnsureToolAvailable(target, tool)) {
       return false;
     }
   }
@@ -52,10 +61,8 @@
   // The compile_xcassets tool is only required if the target has asset
   // catalog resources to compile.
   if (TargetRequireAssetCatalogCompilation(target)) {
-    if (!target->toolchain()->GetTool(
-            GeneralTool::kGeneralToolCompileXCAssets)) {
-      FailWithMissingToolError(GeneralTool::kGeneralToolCompileXCAssets,
-                               target);
+    if (!EnsureToolAvailable(target,
+                             GeneralTool::kGeneralToolCompileXCAssets)) {
       return false;
     }
   }
@@ -102,7 +109,8 @@
       OutputFile(settings_->build_settings(),
                  target_->bundle_data().GetBundleRootDirOutput(settings_)));
 
-  out_ << ": phony " << target_->dependency_output_file().value();
+  out_ << ": " << BuiltinTool::kBuiltinToolPhony << " "
+       << target_->dependency_output_file().value();
   out_ << std::endl;
 }
 
@@ -291,8 +299,7 @@
 
   out_ << "build ";
   WriteOutput(xcassets_input_stamp_file);
-  out_ << ": " << GetNinjaRulePrefixForToolchain(settings_)
-       << GeneralTool::kGeneralToolStamp;
+  out_ << ": " << BuiltinTool::kBuiltinToolPhony;
 
   for (const Target* target : dependencies) {
     out_ << " ";
@@ -357,8 +364,7 @@
 
   out_ << "build ";
   WriteOutput(code_signing_input_stamp_file);
-  out_ << ": " << GetNinjaRulePrefixForToolchain(settings_)
-       << GeneralTool::kGeneralToolStamp;
+  out_ << ": " << BuiltinTool::kBuiltinToolPhony;
 
   for (const SourceFile& source : code_signing_input_files) {
     out_ << " ";
diff --git a/src/gn/ninja_create_bundle_target_writer_unittest.cc b/src/gn/ninja_create_bundle_target_writer_unittest.cc
index 997c058..a5fecca 100644
--- a/src/gn/ninja_create_bundle_target_writer_unittest.cc
+++ b/src/gn/ninja_create_bundle_target_writer_unittest.cc
@@ -170,7 +170,7 @@
       "baz/bar/bar_partial_info.plist || obj/foo/bar.stamp\n"
       "build bar.bundle: phony obj/baz/bar.stamp\n";
   std::string out_str = out.str();
-  EXPECT_EQ(expected, out_str);
+  EXPECT_EQ(expected, out_str) << expected << "----\n" << out_str;
 }
 
 // Tests multiple files from asset catalog.
@@ -393,7 +393,7 @@
       "../../foo/input1.txt || obj/baz/bar.inputdeps.stamp\n"
       "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
       "../../foo/input2.txt || obj/baz/bar.inputdeps.stamp\n"
-      "build obj/baz/bar.xcassets.inputdeps.stamp: stamp "
+      "build obj/baz/bar.xcassets.inputdeps.stamp: phony "
       "obj/foo/assets.stamp "
       "obj/quz/assets.stamp obj/biz/assets.stamp\n"
       "build bar.bundle/Contents/Resources/Assets.car | "
@@ -411,7 +411,7 @@
       "baz/bar/bar_partial_info.plist || obj/baz/bar.inputdeps.stamp\n"
       "build bar.bundle: phony obj/baz/bar.stamp\n";
   std::string out_str = out.str();
-  EXPECT_EQ(expected, out_str);
+  EXPECT_EQ(expected, out_str) << expected << "----\n" << out_str;
 }
 
 // Tests code signing steps.
@@ -477,7 +477,7 @@
       "../../foo/input1.txt || obj/baz/bar.inputdeps.stamp\n"
       "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
       "../../foo/input2.txt || obj/baz/bar.inputdeps.stamp\n"
-      "build obj/baz/bar.codesigning.inputdeps.stamp: stamp "
+      "build obj/baz/bar.codesigning.inputdeps.stamp: phony "
       "../../build/codesign.py "
       "quz "
       "bar.bundle/Contents/Resources/input1.txt "
@@ -491,5 +491,5 @@
       "bar.bundle/_CodeSignature/CodeResources || obj/baz/bar.inputdeps.stamp\n"
       "build bar.bundle: phony obj/baz/bar.stamp\n";
   std::string out_str = out.str();
-  EXPECT_EQ(expected, out_str);
+  EXPECT_EQ(expected, out_str) << expected << "----\n" << out_str;
 }