Index: tools/gn/bootstrap/bootstrap.py |
diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py |
index 373883f8e348e1dd536d4b7f410776d6f25fa02b..2dc2a03e769238d889502ca1c2d5fb487a1f5407 100755 |
--- a/tools/gn/bootstrap/bootstrap.py |
+++ b/tools/gn/bootstrap/bootstrap.py |
@@ -11,6 +11,7 @@ it with its own BUILD.gn to the final destination. |
import contextlib |
import errno |
+import json |
import logging |
import optparse |
import os |
@@ -56,8 +57,14 @@ def main(argv): |
help='place output in PATH', metavar='PATH') |
parser.add_option('-s', '--no-rebuild', action='store_true', |
help='Do not rebuild GN with GN.') |
+ parser.add_option('--temp-build-dir', action='store_true', |
+ help='Build GN in temporary directory') |
+ parser.add_option('--use-bundled-clang', action='store_true', |
+ help='Use bundled clang compiler (e.g. when host toolchain ' |
+ 'is too old to support C++11)') |
parser.add_option('-v', '--verbose', action='store_true', |
help='Log more details') |
+ parser.add_option('--json') |
options, args = parser.parse_args(argv) |
if args: |
@@ -69,29 +76,38 @@ def main(argv): |
build_rel = os.path.join('out', 'Debug') |
else: |
build_rel = os.path.join('out', 'Release') |
- build_root = os.path.join(SRC_ROOT, build_rel) |
+ |
+ failures = [] |
try: |
with scoped_tempdir() as tempdir: |
print 'Building gn manually in a temporary directory for bootstrapping...' |
build_gn_with_ninja_manually(tempdir, options) |
temp_gn = os.path.join(tempdir, 'gn') |
+ if options.temp_build_dir: |
+ build_root = os.path.join(tempdir, 'build_root') |
+ else: |
+ build_root = os.path.join(SRC_ROOT, build_rel) |
out_gn = os.path.join(build_root, 'gn') |
if options.no_rebuild: |
mkdir_p(build_root) |
shutil.copy2(temp_gn, out_gn) |
else: |
- print 'Building gn using itself to %s...' % build_rel |
- build_gn_with_gn(temp_gn, build_rel, options) |
+ print 'Building gn using itself to %s...' % build_root |
+ build_gn_with_gn(temp_gn, build_root, options) |
if options.output: |
# Preserve the executable permission bit. |
shutil.copy2(out_gn, options.output) |
except subprocess.CalledProcessError as e: |
print >> sys.stderr, str(e) |
- return 1 |
- return 0 |
+ failures.append(str(e)) |
+ |
+ if options.json: |
+ with open(options.json, 'w') as f: |
+ json.dump(failures, f) |
+ return 1 if failures else 0 |
def build_gn_with_ninja_manually(tempdir, options): |
@@ -103,8 +119,15 @@ def build_gn_with_ninja_manually(tempdir, options): |
check_call(cmd) |
def write_ninja(path, options): |
- cc = os.environ.get('CC', '') |
- cxx = os.environ.get('CXX', '') |
+ default_cc = '' |
+ default_cxx = '' |
+ if options.use_bundled_clang: |
+ clang_dir = os.path.join( |
+ SRC_ROOT, 'third_party', 'llvm-build', 'Release+Asserts', 'bin') |
+ default_cc = os.path.join(clang_dir, 'clang') |
+ default_cxx = os.path.join(clang_dir, 'clang++') |
+ cc = os.environ.get('CC', default_cc) |
+ cxx = os.environ.get('CXX', default_cxx) |
cflags = os.environ.get('CFLAGS', '').split() |
cflags_cc = os.environ.get('CXXFLAGS', '').split() |
ld = os.environ.get('LD', cxx) |
@@ -227,10 +250,13 @@ def write_ninja(path, options): |
'base/time/time.cc', |
'base/timer/elapsed_timer.cc', |
'base/timer/timer.cc', |
+ 'base/trace_event/category_filter.cc', |
+ 'base/trace_event/trace_config.cc', |
'base/trace_event/trace_event_impl.cc', |
'base/trace_event/trace_event_impl_constants.cc', |
'base/trace_event/trace_event_memory.cc', |
'base/trace_event/trace_event_synthetic_delay.cc', |
+ 'base/trace_event/trace_options.cc', |
'base/tracked_objects.cc', |
'base/tracking_info.cc', |
'base/values.cc', |