Make ninja regeneration work when gen.py or template changes

Change-Id: I8d56f64454bf084510e1760943c24bfd8f840ca3
Reviewed-on: https://gn-review.googlesource.com/1362
Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/build/build.ninja.template b/build/build_linux.ninja.template
similarity index 100%
rename from build/build.ninja.template
rename to build/build_linux.ninja.template
diff --git a/build/build_vs.ninja.template b/build/build_win.ninja.template
similarity index 99%
rename from build/build_vs.ninja.template
rename to build/build_win.ninja.template
index 88bba37..f5f8b65 100644
--- a/build/build_vs.ninja.template
+++ b/build/build_win.ninja.template
@@ -1,4 +1,3 @@
-
 arch = environment.x64
 
 rule cc
diff --git a/build/gen.py b/build/gen.py
index d4c4b00..6d551eb 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -16,8 +16,8 @@
 import sys
 import tempfile
 
-BOOTSTRAP_DIR = os.path.dirname(os.path.abspath(__file__))
-REPO_ROOT = os.path.dirname(BOOTSTRAP_DIR)
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+REPO_ROOT = os.path.dirname(SCRIPT_DIR)
 GN_ROOT = os.path.join(REPO_ROOT, 'tools', 'gn')
 
 is_win = sys.platform.startswith('win')
@@ -56,16 +56,24 @@
     'ar = ' + ar,
     'ld = ' + ld,
     '',
+    'rule regen',
+    '  command = %s ../build/gen.py' % sys.executable,
+    '  description = Regenerating ninja files',
+    '',
+    'build build.ninja: regen',
+    '  generator = 1',
+    '  depfile = build.ninja.d',
+    '',
   ]
 
-  if is_win:
-    template_filename = 'build_vs.ninja.template'
-  elif is_mac:
-    template_filename = 'build_mac.ninja.template'
-  else:
-    template_filename = 'build.ninja.template'
 
-  with open(os.path.join(BOOTSTRAP_DIR, template_filename)) as f:
+  template_filename = os.path.join(SCRIPT_DIR, {
+      'win32': 'build_win.ninja.template',
+      'darwin': 'build_mac.ninja.template',
+      'linux2': 'build_linux.ninja.template'
+  }[sys.platform])
+
+  with open(template_filename) as f:
     ninja_template = f.read()
 
   if is_win:
@@ -131,6 +139,13 @@
     f.write(ninja_template)
     f.write('\n'.join(ninja_lines))
 
+  with open(path + '.d', 'w') as f:
+    f.write('build.ninja: ' +
+            os.path.relpath(os.path.join(SCRIPT_DIR, 'gen.py'),
+                            os.path.dirname(path)) + ' ' +
+            os.path.relpath(template_filename, os.path.dirname(path)) + '\n')
+
+
 def write_gn_ninja(path, options):
   if is_win:
     cc = os.environ.get('CC', 'cl.exe')