Browse Source

Add a script to make it easier to build a single source file with ninja

Bug: 759146
Change-Id: I19edd0b525044655bb9a38b7ada0be9064457f38
Reviewed-on: https://chromium-review.googlesource.com/636446
Commit-Queue: Sébastien Marchand <sebmarchand@chromium.org>
Reviewed-by: Marc-Antoine Ruel <maruel@chromium.org>
Sebastien Marchand 8 years ago
parent
commit
4dd9682b11
3 changed files with 93 additions and 0 deletions
  1. 8 0
      compile_single_file
  2. 11 0
      compile_single_file.bat
  3. 74 0
      compile_single_file.py

+ 8 - 0
compile_single_file

@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+# Copyright (c) 2017 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.
+
+base_dir=$(dirname "$0")
+
+PYTHONDONTWRITEBYTECODE=1 exec python -u "$base_dir/compile_single_file.py" "$@"

+ 11 - 0
compile_single_file.bat

@@ -0,0 +1,11 @@
+@echo off
+:: Copyright 2017 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.
+setlocal
+
+:: Ensure that "depot_tools" is somewhere in PATH so this tool can be used
+:: standalone, but allow other PATH manipulations to take priority.
+set PATH=%PATH%;%~dp0
+
+python -u "%~dp0compile_single_file.py" %*

+ 74 - 0
compile_single_file.py

@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# Copyright 2017 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.
+
+import argparse
+import os
+import subprocess
+import sys
+
+
+# This function is inspired from the one in src/tools/vim/ninja-build.vim in the
+# Chromium repository.
+def path_to_source_root(path):
+  """Returns the absolute path to the chromium source root."""
+  candidate = os.path.dirname(path)
+  # This is a list of directories that need to identify the src directory. The
+  # shorter it is, the more likely it's wrong (checking for just
+  # "build/common.gypi" would find "src/v8" for files below "src/v8", as
+  # "src/v8/build/common.gypi" exists). The longer it is, the more likely it is
+  # to break when we rename directories.
+  fingerprints = ['chrome', 'net', 'v8', 'build', 'skia']
+  while candidate and not all(
+      [os.path.isdir(os.path.join(candidate, fp)) for fp in fingerprints]):
+    new_candidate = os.path.dirname(candidate)
+    if new_candidate == candidate:
+      raise Exception("Couldn't find source-dir from %s" % path)
+    candidate = os.path.dirname(candidate)
+  return candidate
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '--file-path',
+      help='The file path, could be absolute or relative to the current '
+           'directory.',
+      required=True)
+  parser.add_argument(
+      '--build-dir',
+      help='The build directory, relative to the source directory.',
+      required=True)
+
+  options = parser.parse_args()
+
+  src_dir = path_to_source_root(os.path.abspath(options.file_path))
+  abs_build_dir = os.path.join(src_dir, options.build_dir)
+  src_relpath = os.path.relpath(options.file_path, abs_build_dir)
+
+  print 'Building %s' % options.file_path
+
+  ninja_exec = 'ninja'
+  carets = '^'
+  # We need to make sure that we call the ninja executable, calling |ninja|
+  # directly might end up calling a wrapper script that'll remove the caret
+  # characters.
+  if sys.platform == 'win32':
+    ninja_exec = 'ninja.exe'
+    # The caret character has to be escaped on Windows as it's an escape
+    # character.
+    carets = '^^'
+
+  command = [
+      ninja_exec,
+      '-C', abs_build_dir,
+      '%s%s' % (src_relpath, carets)
+  ]
+  # |shell| should be set to True on Windows otherwise the carets characters
+  # get dropped from the command line.
+  return subprocess.call(command, shell=sys.platform=='win32')
+
+
+if __name__ == '__main__':
+  sys.exit(main())