diff options
author | kcconley@gmail.com <kcconley@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-24 20:16:54 +0000 |
---|---|---|
committer | kcconley@gmail.com <kcconley@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-24 20:16:54 +0000 |
commit | e58fde9381e5d345ebec2bb325c84baeedd45edf (patch) | |
tree | 13c862ebdd30fd5d44f73cfeedc086121f5b1f58 | |
parent | 8f72782d0da288e5d24a7436ec9d1b3187676871 (diff) | |
download | chromium_src-e58fde9381e5d345ebec2bb325c84baeedd45edf.zip chromium_src-e58fde9381e5d345ebec2bb325c84baeedd45edf.tar.gz chromium_src-e58fde9381e5d345ebec2bb325c84baeedd45edf.tar.bz2 |
gn: bootstrap: fixes, added mac support
bootstrap.py:
+ Fixed build (missing/wrong compile flags)
+ Added -s option to stop before trying to rebuild GN with GN
+ -v option passes -v to ninja
+ Use env vars CC, CXX, CXXFLAGS
+ Added mac support
R=brettw@chromium.org
BUG=
Review URL: https://codereview.chromium.org/403463005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285356 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | AUTHORS | 1 | ||||
-rwxr-xr-x | tools/gn/bootstrap/bootstrap.py | 186 | ||||
-rw-r--r-- | tools/gn/bootstrap/build_mac.ninja.template | 25 |
3 files changed, 158 insertions, 54 deletions
@@ -205,6 +205,7 @@ Julien Racle <jracle@logitech.com> Jun Jiang <jun.a.jiang@intel.com> JungJik Lee <jungjik.lee@samsung.com> Junmin Zhu <junmin.zhu@intel.com> +Kal Conley <kcconley@gmail.com> Kalyan Kondapally <kalyan.kondapally@intel.com> Kamil Jiwa <kamil.jiwa@gmail.com> Kangil Han <kangil.han@samsung.com> diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py index c44cd2e..50f3ed8 100755 --- a/tools/gn/bootstrap/bootstrap.py +++ b/tools/gn/bootstrap/bootstrap.py @@ -10,6 +10,7 @@ it with its own BUILD.gn to the final destination. """ import contextlib +import errno import logging import optparse import os @@ -22,15 +23,21 @@ BOOTSTRAP_DIR = os.path.dirname(os.path.abspath(__file__)) GN_ROOT = os.path.dirname(BOOTSTRAP_DIR) SRC_ROOT = os.path.dirname(os.path.dirname(GN_ROOT)) - -def is_linux(): - return sys.platform.startswith('linux') - +is_linux = sys.platform.startswith('linux') +is_mac = sys.platform.startswith('darwin') +is_posix = is_linux or is_mac def check_call(cmd, **kwargs): logging.debug('Running: %s', ' '.join(cmd)) subprocess.check_call(cmd, cwd=GN_ROOT, **kwargs) +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as e: + if e.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise @contextlib.contextmanager def scoped_tempdir(): @@ -47,6 +54,8 @@ def main(argv): help='Do a debug build. Defaults to release build.') parser.add_option('-o', '--output', 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('-v', '--verbose', action='store_true', help='Log more details') options, args = parser.parse_args(argv) @@ -65,31 +74,52 @@ def main(argv): try: with scoped_tempdir() as tempdir: print 'Building gn manually in a temporary directory for bootstrapping...' - build_gn_with_ninja_manually(tempdir) + build_gn_with_ninja_manually(tempdir, options) + temp_gn = os.path.join(tempdir, 'gn') + out_gn = os.path.join(build_root, 'gn') - print 'Building gn using itself to %s...' % build_rel - build_gn_with_gn(os.path.join(tempdir, 'gn'), build_rel, options.debug) + if options.no_bootstrap: + 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) if options.output: # Preserve the executable permission bit. - shutil.copy2(os.path.join(build_root, 'gn'), options.output) + shutil.copy2(out_gn, options.output) except subprocess.CalledProcessError as e: print >> sys.stderr, str(e) return 1 return 0 -def build_gn_with_ninja_manually(tempdir): - write_ninja(os.path.join(tempdir, 'build.ninja')) - check_call(['ninja', '-C', tempdir, 'gn']) - +def build_gn_with_ninja_manually(tempdir, options): + write_ninja(os.path.join(tempdir, 'build.ninja'), options) + cmd = ['ninja', '-C', tempdir] + if options.verbose: + cmd.append('-v') + cmd.append('gn') + check_call(cmd) -def write_ninja(path): +def write_ninja(path, options): + cc = os.environ.get('CC', '') + cxx = os.environ.get('CXX', '') cflags = os.environ.get('CFLAGS', '').split() + cflags_cc = os.environ.get('CXXFLAGS', '').split() ldflags = os.environ.get('LDFLAGS', '').split() include_dirs = [SRC_ROOT] libs = [] + if is_posix: + if options.debug: + cflags.extend(['-O0', '-g']) + else: + cflags.extend(['-O2', '-g0']) + + cflags.extend(['-D_FILE_OFFSET_BITS=64 -pthread', '-pipe']) + cflags_cc.extend(['-std=gnu++11', '-Wno-c++11-narrowing']) + static_libraries = { 'base': {'sources': [], 'tool': 'cxx'}, 'dynamic_annotations': {'sources': [], 'tool': 'cc'}, @@ -203,11 +233,33 @@ def write_ninja(path): 'base/vlog.cc', ]) - if is_linux(): + if is_posix: + static_libraries['base']['sources'].extend([ + 'base/base_paths_posix.cc', + 'base/debug/debugger_posix.cc', + 'base/debug/stack_trace_posix.cc', + 'base/file_util_posix.cc', + 'base/files/file_enumerator_posix.cc', + 'base/files/file_posix.cc', + 'base/message_loop/message_pump_libevent.cc', + 'base/posix/file_descriptor_shuffle.cc', + 'base/process/kill_posix.cc', + 'base/process/process_handle_posix.cc', + 'base/process/process_metrics_posix.cc', + 'base/process/process_posix.cc', + 'base/safe_strerror_posix.cc', + 'base/synchronization/condition_variable_posix.cc', + 'base/synchronization/lock_impl_posix.cc', + 'base/synchronization/waitable_event_posix.cc', + 'base/sys_info_posix.cc', + 'base/threading/platform_thread_posix.cc', + 'base/threading/thread_local_posix.cc', + 'base/threading/thread_local_storage_posix.cc', + 'base/time/time_posix.cc', + ]) static_libraries['libevent'] = { 'sources': [ 'third_party/libevent/buffer.c', - 'third_party/libevent/epoll.c', 'third_party/libevent/evbuffer.c', 'third_party/libevent/evdns.c', 'third_party/libevent/event.c', @@ -222,11 +274,15 @@ def write_ninja(path): 'third_party/libevent/strlcpy.c', ], 'tool': 'cc', - 'include_dirs': [ - os.path.join(SRC_ROOT, 'third_party', 'libevent', 'linux') - ], + 'include_dirs': [], 'cflags': cflags + ['-DHAVE_CONFIG_H'], } + + + if is_linux: + libs.extend(['-lrt']) + ldflags.extend(['-pthread']) + static_libraries['xdg_user_dirs'] = { 'sources': [ 'base/third_party/xdg_user_dirs/xdg_user_dir_lookup.cc', @@ -234,52 +290,54 @@ def write_ninja(path): 'tool': 'cxx', } static_libraries['base']['sources'].extend([ - 'base/base_paths_posix.cc', - 'base/debug/debugger_posix.cc', - 'base/debug/stack_trace_posix.cc', - 'base/file_util_posix.cc', - 'base/files/file_enumerator_posix.cc', - 'base/files/file_posix.cc', - 'base/message_loop/message_pump_glib.cc', - 'base/message_loop/message_pump_libevent.cc', 'base/nix/xdg_util.cc', - 'base/posix/file_descriptor_shuffle.cc', 'base/process/internal_linux.cc', - 'base/process/kill_posix.cc', 'base/process/process_handle_linux.cc', - 'base/process/process_handle_posix.cc', 'base/process/process_iterator_linux.cc', 'base/process/process_linux.cc', 'base/process/process_metrics_linux.cc', - 'base/process/process_metrics_posix.cc', - 'base/process/process_posix.cc', - 'base/safe_strerror_posix.cc', 'base/strings/sys_string_conversions_posix.cc', - 'base/synchronization/condition_variable_posix.cc', - 'base/synchronization/lock_impl_posix.cc', - 'base/synchronization/waitable_event_posix.cc', 'base/sys_info_linux.cc', - 'base/sys_info_posix.cc', 'base/threading/platform_thread_linux.cc', - 'base/threading/platform_thread_posix.cc', - 'base/threading/thread_local_posix.cc', - 'base/threading/thread_local_storage_posix.cc', - 'base/time/time_posix.cc', + ]) + static_libraries['libevent']['include_dirs'].extend([ + os.path.join(SRC_ROOT, 'third_party', 'libevent', 'linux') + ]) + static_libraries['libevent']['sources'].extend([ + 'third_party/libevent/epoll.c', ]) - cflags.extend(['-O2', '-pthread', '-pipe']) - static_libraries['base'].setdefault('cflags', []).extend( - subprocess.check_output( - ['pkg-config', 'gtk+-2.0', 'x11', '--cflags']).split()) - ldflags.extend(['-pthread']) - ldflags.extend(subprocess.check_output( - ['pkg-config', 'gtk+-2.0', 'x11', - '--libs-only-L', '--libs-only-other']).split()) - libs.extend(subprocess.check_output( - ['pkg-config', 'gtk+-2.0', 'x11', '--libs-only-l']).split()) + if is_mac: + static_libraries['base']['sources'].extend([ + 'base/base_paths_mac.mm', + 'base/file_util_mac.mm', + 'base/mac/bundle_locations.mm', + 'base/mac/foundation_util.mm', + 'base/mac/mach_logging.cc', + 'base/mac/scoped_mach_port.cc', + 'base/mac/scoped_nsautorelease_pool.mm', + 'base/message_loop/message_pump_mac.mm', + 'base/process/process_handle_mac.cc', + 'base/process/process_iterator_mac.cc', + 'base/strings/sys_string_conversions_mac.mm', + 'base/time/time_mac.cc', + 'base/threading/platform_thread_mac.mm', + ]) + static_libraries['libevent']['include_dirs'].extend([ + os.path.join(SRC_ROOT, 'third_party', 'libevent', 'mac') + ]) + static_libraries['libevent']['sources'].extend([ + 'third_party/libevent/kqueue.c', + ]) - with open(os.path.join(GN_ROOT, 'bootstrap', 'build.ninja.template')) as f: + + if is_mac: + template_filename = 'build_mac.ninja.template' + else: + template_filename = 'build.ninja.template' + + with open(os.path.join(GN_ROOT, 'bootstrap', template_filename)) as f: ninja_template = f.read() def src_to_obj(path): @@ -296,12 +354,26 @@ def write_ninja(path): ['-I' + dirname for dirname in include_dirs + settings.get('include_dirs', [])]), ' cflags = %s' % ' '.join(cflags + settings.get('cflags', [])), + ' cflags_cc = %s' % + ' '.join(cflags_cc + settings.get('cflags_cc', [])), ]) + if cc: + ninja_lines.append(' cc = %s' % cc) + if cxx: + ninja_lines.append(' cxx = %s' % cxx) ninja_lines.append('build %s.a: alink_thin %s' % ( library, ' '.join([src_to_obj(src_file) for src_file in settings['sources']]))) + if is_mac: + libs.extend([ + '-framework', 'AppKit', + '-framework', 'CoreFoundation', + '-framework', 'Foundation', + '-framework', 'Security', + ]); + ninja_lines.extend([ 'build gn: link %s' % ( ' '.join(['%s.a' % library for library in static_libraries])), @@ -315,12 +387,18 @@ def write_ninja(path): f.write(ninja_template + '\n'.join(ninja_lines)) -def build_gn_with_gn(temp_gn, build_dir, debug): +def build_gn_with_gn(temp_gn, build_dir, options): cmd = [temp_gn, 'gen', build_dir] - if not debug: + if not options.debug: cmd.append('--args=is_debug=false') check_call(cmd) - check_call(['ninja', '-C', build_dir, 'gn']) + + cmd = ['ninja', '-C', build_dir] + if options.verbose: + cmd.append('-v') + cmd.append('gn') + check_call(cmd) + if not debug: check_call(['strip', os.path.join(build_dir, 'gn')]) diff --git a/tools/gn/bootstrap/build_mac.ninja.template b/tools/gn/bootstrap/build_mac.ninja.template new file mode 100644 index 0000000..409ea75 --- /dev/null +++ b/tools/gn/bootstrap/build_mac.ninja.template @@ -0,0 +1,25 @@ +cc = cc +cxx = c++ +ld = $cc +ldxx = $cxx +ar = ar + +rule cc + command = $cc -MMD -MF $out.d $defines $includes $cflags $cflags_c -c $in -o $out + description = CC $out + depfile = $out.d + deps = gcc + +rule cxx + command = $cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc -c $in -o $out + description = CXX $out + depfile = $out.d + deps = gcc + +rule alink_thin + command = rm -f $out && libtool -static -o $out $in + description = AR $out + +rule link + command = $ld $ldflags -o $out $in $solibs $libs + description = LINK $out |