diff --git a/build/gen.py b/build/gen.py
index 41ed3cd..6fdf6ef 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -40,10 +40,39 @@
   out_dir = os.path.join(REPO_ROOT, 'out')
   if not os.path.isdir(out_dir):
     os.makedirs(out_dir)
-  write_gn_ninja(os.path.join(out_dir, 'build.ninja'), options, linux_sysroot)
+  GenerateLastCommitPosition(os.path.join(out_dir, 'last_commit_position.h'))
+  WriteGNNinja(os.path.join(out_dir, 'build.ninja'), options, linux_sysroot)
   return 0
 
 
+def GenerateLastCommitPosition(header):
+  # When gn was forked from Chromium the revisions were ~550000. Use 600000 as a
+  # non-conflicting base that also makes it relatively easy to see that it's
+  # built from a post-fork build.
+  BASE_COMMIT_POSITION = 600000
+  commit_position = int(len(
+      subprocess.check_output('git log --oneline', shell=True).splitlines()))
+  contents = '''// Generated by build/gen.py.
+
+#ifndef OUT_LAST_COMMIT_POSITION_H_
+#define OUT_LAST_COMMIT_POSITION_H_
+
+#define LAST_COMMIT_POSITION "%d"
+
+#endif  // OUT_LAST_COMMIT_POSITION_H_
+''' % (BASE_COMMIT_POSITION + commit_position)
+
+  # Only write/touch this file if the commit position has changed.
+  old_contents = ''
+  if os.path.isfile(header):
+    with open(header, 'rb') as f:
+      old_contents = f.read()
+
+  if old_contents != contents:
+    with open(header, 'wb') as f:
+      f.write(contents)
+
+
 def UpdateLinuxSysroot():
   # Sysroot revision from:
   # https://cs.chromium.org/chromium/src/build/linux/sysroot_scripts/sysroots.json
@@ -88,10 +117,10 @@
   return sysroot
 
 
-def write_generic_ninja(path, static_libraries, executables,
-                        cc, cxx, ar, ld, options,
-                        cflags=[], cflags_cc=[], ldflags=[], libflags=[],
-                        include_dirs=[], solibs=[]):
+def WriteGenericNinja(path, static_libraries, executables,
+                      cc, cxx, ar, ld, options,
+                      cflags=[], cflags_cc=[], ldflags=[], libflags=[],
+                      include_dirs=[], solibs=[]):
   ninja_header_lines = [
     'cc = ' + cc,
     'cxx = ' + cxx,
@@ -191,7 +220,7 @@
             os.path.relpath(template_filename, os.path.dirname(path)) + '\n')
 
 
-def write_gn_ninja(path, options, linux_sysroot):
+def WriteGNNinja(path, options, linux_sysroot):
   if is_win:
     cc = os.environ.get('CC', 'cl.exe')
     cxx = os.environ.get('CXX', 'cl.exe')
@@ -580,9 +609,9 @@
   executables['gn']['libs'].extend(static_libraries.keys())
   executables['gn_unittests']['libs'].extend(static_libraries.keys())
 
-  write_generic_ninja(path, static_libraries, executables, cc, cxx, ar, ld,
-                      options, cflags, cflags_cc, ldflags, libflags,
-                      include_dirs, libs)
+  WriteGenericNinja(path, static_libraries, executables, cc, cxx, ar, ld,
+                    options, cflags, cflags_cc, ldflags, libflags, include_dirs,
+                    libs)
 
 
 if __name__ == '__main__':
diff --git a/tools/gn/gn_main.cc b/tools/gn/gn_main.cc
index a38aa42..b18c211 100644
--- a/tools/gn/gn_main.cc
+++ b/tools/gn/gn_main.cc
@@ -16,13 +16,7 @@
 #include "util/msg_loop.h"
 #include "util/sys_info.h"
 
-// Only the GN-generated build makes this header for now.
-// TODO(brettw) consider adding this if we need it in GYP.
-#if defined(GN_BUILD)
-#include "tools/gn/last_commit_position.h"
-#else
-#define LAST_COMMIT_POSITION "UNKNOWN"
-#endif
+#include "out/last_commit_position.h"
 
 namespace {
 
diff --git a/tools/gn/last_commit_position.py b/tools/gn/last_commit_position.py
deleted file mode 100644
index a91f722..0000000
--- a/tools/gn/last_commit_position.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Writes the most recent "Cr-Commit-Position" value on the master branch
-to a C header file.
-
-Usage: last_commit_position.py <dir> <outfile> <headerguard>
-
-  <dir>
-    Some directory inside the repo to check. This will be used as the current
-    directory when running git. It's best to pass the repo toplevel directory.
-
-  <outfile>
-    C header file to write.
-
-  <headerguard>
-    String to use as the header guard for the written file.
-"""
-
-import os
-import re
-import subprocess
-import sys
-
-def RunGitCommand(directory, command):
-  """
-  Launches git subcommand.
-
-  Errors are swallowed.
-
-  Returns:
-    A process object or None.
-  """
-  command = ['git'] + command
-  # Force shell usage under cygwin. This is a workaround for
-  # mysterious loss of cwd while invoking cygwin's git.
-  # We can't just pass shell=True to Popen, as under win32 this will
-  # cause CMD to be used, while we explicitly want a cygwin shell.
-  if sys.platform == 'cygwin':
-    command = ['sh', '-c', ' '.join(command)]
-  try:
-    proc = subprocess.Popen(command,
-                            stdout=subprocess.PIPE,
-                            stderr=subprocess.PIPE,
-                            cwd=directory,
-                            shell=(sys.platform=='win32'))
-    return proc
-  except OSError:
-    return None
-
-
-def FetchCommitPosition(directory):
-  regex = re.compile(r'\s*Cr-Commit-Position: refs/heads/master@\{#(\d+)\}\s*')
-
-  # Search this far backward in the git log. The commit position should be
-  # close to the top. We allow some slop for long commit messages, and maybe
-  # there were some local commits after the last "official" one. Having this
-  # max prevents us from searching all history in the case of an error.
-  max_lines = 2048
-
-  proc = RunGitCommand(directory, ['log'])
-  for i in range(max_lines):
-    line = proc.stdout.readline()
-    if not line:
-      return None
-
-    match = regex.match(line)
-    if match:
-      return match.group(1)
-
-  return None
-
-
-def WriteHeader(header_file, header_guard, value):
-  with open(header_file, 'w') as f:
-    f.write('''/* Generated by last_commit_position.py. */
-
-#ifndef %(guard)s
-#define %(guard)s
-
-#define LAST_COMMIT_POSITION "%(value)s"
-
-#endif
-''' % {'guard': header_guard, 'value': value})
-
-
-if len(sys.argv) != 4:
-  print "Wrong number of arguments"
-  sys.exit(1)
-
-git_directory = sys.argv[1]
-output_file = sys.argv[2]
-header_guard = sys.argv[3]
-
-value = FetchCommitPosition(git_directory)
-if not value:
-  value = 'UNKNOWN'
-
-WriteHeader(output_file, header_guard, value)
