diff --git a/compile_single_file b/compile_single_file new file mode 100755 index 000000000..e65816cc1 --- /dev/null +++ b/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" "$@" diff --git a/compile_single_file.bat b/compile_single_file.bat new file mode 100644 index 000000000..84ff3484f --- /dev/null +++ b/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" %* diff --git a/compile_single_file.py b/compile_single_file.py new file mode 100644 index 000000000..e60f830cb --- /dev/null +++ b/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())