2013-06-19 06:32:41 +00:00
|
|
|
#!/usr/bin/env python
|
2013-04-12 01:46:58 +00:00
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
import argparse
|
2017-05-09 20:38:14 +00:00
|
|
|
import errno
|
2013-06-19 06:32:41 +00:00
|
|
|
import os
|
2015-07-03 02:01:44 +00:00
|
|
|
import subprocess
|
2013-06-19 06:32:41 +00:00
|
|
|
import sys
|
2013-04-12 01:46:58 +00:00
|
|
|
|
2015-04-11 09:30:52 +00:00
|
|
|
from lib.config import LIBCHROMIUMCONTENT_COMMIT, BASE_URL, PLATFORM, \
|
2015-04-11 10:26:15 +00:00
|
|
|
enable_verbose_mode, is_verbose_mode, get_target_arch
|
2016-05-24 17:27:46 +00:00
|
|
|
from lib.util import execute_stdout, get_electron_version, scoped_cwd
|
2013-07-01 07:21:27 +00:00
|
|
|
|
2013-04-12 01:46:58 +00:00
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
|
|
|
VENDOR_DIR = os.path.join(SOURCE_ROOT, 'vendor')
|
2017-05-09 20:38:14 +00:00
|
|
|
DOWNLOAD_DIR = os.path.join(VENDOR_DIR, 'download')
|
2013-07-01 07:21:27 +00:00
|
|
|
PYTHON_26_URL = 'https://chromium.googlesource.com/chromium/deps/python_26'
|
2015-07-02 14:34:05 +00:00
|
|
|
|
2016-08-21 10:30:14 +00:00
|
|
|
NPM = 'npm'
|
2015-07-02 14:34:05 +00:00
|
|
|
if sys.platform in ['win32', 'cygwin']:
|
|
|
|
NPM += '.cmd'
|
2013-04-12 01:46:58 +00:00
|
|
|
|
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
def main():
|
|
|
|
os.chdir(SOURCE_ROOT)
|
2013-04-12 01:46:58 +00:00
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
args = parse_args()
|
2016-05-02 12:19:16 +00:00
|
|
|
defines = args_to_defines(args)
|
2015-04-11 09:30:52 +00:00
|
|
|
if not args.yes and PLATFORM != 'win32':
|
2015-03-17 07:19:49 +00:00
|
|
|
check_root()
|
2014-08-12 12:23:59 +00:00
|
|
|
if args.verbose:
|
2014-12-08 17:03:48 +00:00
|
|
|
enable_verbose_mode()
|
2014-12-12 02:33:39 +00:00
|
|
|
if sys.platform == 'cygwin':
|
|
|
|
update_win32_python()
|
2013-07-01 08:12:31 +00:00
|
|
|
|
2016-05-02 07:45:48 +00:00
|
|
|
update_submodules()
|
|
|
|
|
2016-05-02 07:04:50 +00:00
|
|
|
libcc_source_path = args.libcc_source_path
|
|
|
|
libcc_shared_library_path = args.libcc_shared_library_path
|
|
|
|
libcc_static_library_path = args.libcc_static_library_path
|
|
|
|
|
|
|
|
# Redirect to use local libchromiumcontent build.
|
|
|
|
if args.build_libchromiumcontent:
|
2016-05-02 12:15:10 +00:00
|
|
|
build_libchromiumcontent(args.verbose, args.target_arch, defines)
|
2017-05-09 20:38:14 +00:00
|
|
|
dist_dir = os.path.join(VENDOR_DIR, 'libchromiumcontent', 'dist', 'main')
|
2016-05-02 07:04:50 +00:00
|
|
|
libcc_source_path = os.path.join(dist_dir, 'src')
|
|
|
|
libcc_shared_library_path = os.path.join(dist_dir, 'shared_library')
|
|
|
|
libcc_static_library_path = os.path.join(dist_dir, 'static_library')
|
|
|
|
|
2016-05-03 00:38:15 +00:00
|
|
|
if PLATFORM != 'win32':
|
2016-05-19 01:14:57 +00:00
|
|
|
if not args.disable_clang and args.clang_dir == '':
|
|
|
|
# Download prebuilt clang binaries.
|
|
|
|
update_clang()
|
2015-07-01 06:27:15 +00:00
|
|
|
|
2015-07-03 14:52:26 +00:00
|
|
|
setup_python_libs()
|
2015-07-02 02:56:56 +00:00
|
|
|
update_node_modules('.')
|
2017-05-09 20:38:14 +00:00
|
|
|
setup_libchromiumcontent(args.dev, args.target_arch, args.url,
|
|
|
|
libcc_source_path, libcc_shared_library_path,
|
|
|
|
libcc_static_library_path)
|
2015-07-02 02:56:56 +00:00
|
|
|
|
2016-03-03 23:54:01 +00:00
|
|
|
if PLATFORM == 'linux':
|
2016-03-08 15:05:32 +00:00
|
|
|
download_sysroot(args.target_arch)
|
2015-07-01 09:22:40 +00:00
|
|
|
|
2014-06-25 01:05:10 +00:00
|
|
|
create_chrome_version_h()
|
2013-07-02 01:16:56 +00:00
|
|
|
touch_config_gypi()
|
2016-07-26 10:24:58 +00:00
|
|
|
run_update(defines, args.msvs)
|
2017-05-02 17:14:49 +00:00
|
|
|
create_node_headers()
|
2015-04-12 13:55:17 +00:00
|
|
|
update_electron_modules('spec', args.target_arch)
|
2013-04-12 01:46:58 +00:00
|
|
|
|
2014-08-12 12:28:18 +00:00
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
def parse_args():
|
|
|
|
parser = argparse.ArgumentParser(description='Bootstrap this project')
|
2013-07-01 08:12:31 +00:00
|
|
|
parser.add_argument('-u', '--url',
|
2013-06-19 06:32:41 +00:00
|
|
|
help='The base URL from which to download '
|
|
|
|
'libchromiumcontent (i.e., the URL you passed to '
|
|
|
|
'libchromiumcontent\'s script/upload script',
|
|
|
|
default=BASE_URL,
|
|
|
|
required=False)
|
2014-08-12 12:23:59 +00:00
|
|
|
parser.add_argument('-v', '--verbose',
|
|
|
|
action='store_true',
|
|
|
|
help='Prints the output of the subprocesses')
|
2015-04-07 15:40:36 +00:00
|
|
|
parser.add_argument('-d', '--dev', action='store_true',
|
|
|
|
help='Do not download static_library build')
|
2015-03-17 07:19:49 +00:00
|
|
|
parser.add_argument('-y', '--yes', '--assume-yes',
|
|
|
|
action='store_true',
|
|
|
|
help='Run non-interactively by assuming "yes" to all ' \
|
|
|
|
'prompts.')
|
2016-07-26 08:38:31 +00:00
|
|
|
parser.add_argument('--msvs', action='store_true',
|
|
|
|
help='Generate Visual Studio project')
|
2015-04-11 10:26:15 +00:00
|
|
|
parser.add_argument('--target_arch', default=get_target_arch(),
|
2015-04-11 08:59:44 +00:00
|
|
|
help='Manually specify the arch to build for')
|
2016-05-02 11:06:21 +00:00
|
|
|
parser.add_argument('--clang_dir', default='', help='Path to clang binaries')
|
|
|
|
parser.add_argument('--disable_clang', action='store_true',
|
|
|
|
help='Use compilers other than clang for building')
|
2016-05-02 07:04:50 +00:00
|
|
|
parser.add_argument('--build_libchromiumcontent', action='store_true',
|
|
|
|
help='Build local version of libchromiumcontent')
|
2015-11-08 07:18:22 +00:00
|
|
|
parser.add_argument('--libcc_source_path', required=False,
|
2015-11-09 10:24:32 +00:00
|
|
|
help='The source path of libchromiumcontent. ' \
|
|
|
|
'NOTE: All options of libchromiumcontent are ' \
|
|
|
|
'required OR let electron choose it')
|
2015-11-08 07:18:22 +00:00
|
|
|
parser.add_argument('--libcc_shared_library_path', required=False,
|
2015-11-09 10:24:32 +00:00
|
|
|
help='The shared library path of libchromiumcontent.')
|
2015-11-08 07:18:22 +00:00
|
|
|
parser.add_argument('--libcc_static_library_path', required=False,
|
2015-11-09 10:24:32 +00:00
|
|
|
help='The static library path of libchromiumcontent.')
|
2016-08-10 21:46:41 +00:00
|
|
|
parser.add_argument('--defines', default='',
|
|
|
|
help='The build variables passed to gyp')
|
2013-06-19 06:32:41 +00:00
|
|
|
return parser.parse_args()
|
2013-04-12 01:46:58 +00:00
|
|
|
|
2015-04-11 08:59:44 +00:00
|
|
|
|
2016-05-02 12:19:16 +00:00
|
|
|
def args_to_defines(args):
|
2016-08-10 21:46:41 +00:00
|
|
|
defines = args.defines
|
2016-05-02 12:19:16 +00:00
|
|
|
if args.disable_clang:
|
|
|
|
defines += ' clang=0'
|
|
|
|
if args.clang_dir:
|
|
|
|
defines += ' make_clang_dir=' + args.clang_dir
|
|
|
|
defines += ' clang_use_chrome_plugins=0'
|
|
|
|
return defines
|
|
|
|
|
|
|
|
|
2015-03-17 07:01:33 +00:00
|
|
|
def check_root():
|
|
|
|
if os.geteuid() == 0:
|
|
|
|
print "We suggest not running this as root, unless you're really sure."
|
|
|
|
choice = raw_input("Do you want to continue? [y/N]: ")
|
|
|
|
if choice not in ('y', 'Y'):
|
|
|
|
sys.exit(0)
|
|
|
|
|
2014-08-12 12:28:18 +00:00
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
def update_submodules():
|
2016-05-15 01:33:23 +00:00
|
|
|
execute_stdout(['git', 'submodule', 'sync', '--recursive'])
|
2014-12-07 23:47:05 +00:00
|
|
|
execute_stdout(['git', 'submodule', 'update', '--init', '--recursive'])
|
2013-06-19 06:32:41 +00:00
|
|
|
|
|
|
|
|
2015-07-03 14:52:26 +00:00
|
|
|
def setup_python_libs():
|
|
|
|
for lib in ('requests', 'boto'):
|
|
|
|
with scoped_cwd(os.path.join(VENDOR_DIR, lib)):
|
|
|
|
execute_stdout([sys.executable, 'setup.py', 'build'])
|
2015-07-03 06:23:42 +00:00
|
|
|
|
|
|
|
|
2017-05-09 20:38:14 +00:00
|
|
|
def setup_libchromiumcontent(is_dev, target_arch, url,
|
|
|
|
libcc_source_path,
|
|
|
|
libcc_shared_library_path,
|
|
|
|
libcc_static_library_path):
|
|
|
|
target_dir = os.path.join(DOWNLOAD_DIR, 'libchromiumcontent')
|
|
|
|
download = os.path.join(VENDOR_DIR, 'libchromiumcontent', 'script',
|
|
|
|
'download')
|
|
|
|
args = ['-f', '-c', LIBCHROMIUMCONTENT_COMMIT, '--target_arch', target_arch,
|
|
|
|
url, target_dir]
|
|
|
|
if (libcc_source_path != None and
|
|
|
|
libcc_shared_library_path != None and
|
|
|
|
libcc_static_library_path != None):
|
|
|
|
args += ['--libcc_source_path', libcc_source_path,
|
|
|
|
'--libcc_shared_library_path', libcc_shared_library_path,
|
|
|
|
'--libcc_static_library_path', libcc_static_library_path]
|
|
|
|
mkdir_p(target_dir)
|
|
|
|
else:
|
|
|
|
mkdir_p(DOWNLOAD_DIR)
|
|
|
|
if is_dev:
|
|
|
|
subprocess.check_call([sys.executable, download] + args)
|
|
|
|
else:
|
|
|
|
subprocess.check_call([sys.executable, download, '-s'] + args)
|
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
|
2016-05-03 00:31:39 +00:00
|
|
|
def set_clang_env(env):
|
|
|
|
llvm_dir = os.path.join(SOURCE_ROOT, 'vendor', 'llvm-build',
|
|
|
|
'Release+Asserts', 'bin')
|
|
|
|
env['CC'] = os.path.join(llvm_dir, 'clang')
|
|
|
|
env['CXX'] = os.path.join(llvm_dir, 'clang++')
|
|
|
|
|
|
|
|
|
2015-04-12 05:15:11 +00:00
|
|
|
def update_node_modules(dirname, env=None):
|
|
|
|
if env is None:
|
2016-05-02 12:38:17 +00:00
|
|
|
env = os.environ.copy()
|
2015-07-02 02:56:56 +00:00
|
|
|
if PLATFORM == 'linux':
|
2015-07-03 01:43:09 +00:00
|
|
|
# Use prebuilt clang for building native modules.
|
2016-05-03 00:31:39 +00:00
|
|
|
set_clang_env(env)
|
2015-07-02 02:56:56 +00:00
|
|
|
env['npm_config_clang'] = '1'
|
2014-04-28 02:05:22 +00:00
|
|
|
with scoped_cwd(dirname):
|
2015-07-03 01:43:09 +00:00
|
|
|
args = [NPM, 'install']
|
2014-12-08 17:03:48 +00:00
|
|
|
if is_verbose_mode():
|
2015-07-03 06:23:42 +00:00
|
|
|
args += ['--verbose']
|
2015-07-03 01:43:09 +00:00
|
|
|
# Ignore npm install errors when running in CI.
|
|
|
|
if os.environ.has_key('CI'):
|
|
|
|
try:
|
|
|
|
execute_stdout(args, env)
|
2017-05-02 20:24:29 +00:00
|
|
|
execute_stdout([NPM, 'rebuild'], env)
|
2015-07-03 02:01:44 +00:00
|
|
|
except subprocess.CalledProcessError:
|
2015-07-03 01:43:09 +00:00
|
|
|
pass
|
2014-12-07 23:52:13 +00:00
|
|
|
else:
|
2015-07-03 01:43:09 +00:00
|
|
|
execute_stdout(args, env)
|
2017-05-02 20:24:29 +00:00
|
|
|
execute_stdout([NPM, 'rebuild'], env)
|
2013-07-17 08:29:40 +00:00
|
|
|
|
|
|
|
|
2015-04-12 13:55:17 +00:00
|
|
|
def update_electron_modules(dirname, target_arch):
|
2015-04-12 04:45:18 +00:00
|
|
|
env = os.environ.copy()
|
2017-05-02 17:14:49 +00:00
|
|
|
version = get_electron_version()
|
2015-04-12 04:45:18 +00:00
|
|
|
env['npm_config_arch'] = target_arch
|
2017-05-02 17:14:49 +00:00
|
|
|
env['npm_config_target'] = version
|
2017-05-02 20:47:34 +00:00
|
|
|
env['npm_config_nodedir'] = os.path.join(SOURCE_ROOT, 'dist',
|
|
|
|
'node-{0}'.format(version))
|
2015-04-12 04:45:18 +00:00
|
|
|
update_node_modules(dirname, env)
|
2013-07-01 08:06:37 +00:00
|
|
|
|
|
|
|
|
2013-07-01 07:21:27 +00:00
|
|
|
def update_win32_python():
|
|
|
|
with scoped_cwd(VENDOR_DIR):
|
|
|
|
if not os.path.exists('python_26'):
|
2014-12-07 23:47:05 +00:00
|
|
|
execute_stdout(['git', 'clone', PYTHON_26_URL])
|
2013-07-01 07:21:27 +00:00
|
|
|
|
2015-07-01 06:27:15 +00:00
|
|
|
|
2016-05-02 12:19:16 +00:00
|
|
|
def build_libchromiumcontent(verbose, target_arch, defines):
|
2016-06-14 18:49:54 +00:00
|
|
|
args = [sys.executable,
|
|
|
|
os.path.join(SOURCE_ROOT, 'script', 'build-libchromiumcontent.py')]
|
2016-05-02 07:38:58 +00:00
|
|
|
if verbose:
|
2016-05-02 07:04:50 +00:00
|
|
|
args += ['-v']
|
2016-05-02 12:19:16 +00:00
|
|
|
if defines:
|
|
|
|
args += ['--defines', defines]
|
2016-05-02 07:04:50 +00:00
|
|
|
execute_stdout(args + ['--target_arch', target_arch])
|
|
|
|
|
|
|
|
|
2015-07-01 06:27:15 +00:00
|
|
|
def update_clang():
|
|
|
|
execute_stdout([os.path.join(SOURCE_ROOT, 'script', 'update-clang.sh')])
|
|
|
|
|
|
|
|
|
2016-03-08 15:05:32 +00:00
|
|
|
def download_sysroot(target_arch):
|
|
|
|
if target_arch == 'ia32':
|
2016-03-10 11:54:45 +00:00
|
|
|
target_arch = 'i386'
|
2016-03-08 15:05:32 +00:00
|
|
|
if target_arch == 'x64':
|
|
|
|
target_arch = 'amd64'
|
2016-04-07 06:45:20 +00:00
|
|
|
execute_stdout([sys.executable,
|
|
|
|
os.path.join(SOURCE_ROOT, 'script', 'install-sysroot.py'),
|
2016-03-08 15:05:32 +00:00
|
|
|
'--arch', target_arch])
|
2015-07-01 09:22:40 +00:00
|
|
|
|
2014-06-25 01:05:10 +00:00
|
|
|
def create_chrome_version_h():
|
2017-05-09 20:38:14 +00:00
|
|
|
version_file = os.path.join(VENDOR_DIR, 'libchromiumcontent', 'VERSION')
|
2014-06-25 01:05:10 +00:00
|
|
|
target_file = os.path.join(SOURCE_ROOT, 'atom', 'common', 'chrome_version.h')
|
|
|
|
template_file = os.path.join(SOURCE_ROOT, 'script', 'chrome_version.h.in')
|
|
|
|
|
|
|
|
with open(version_file, 'r') as f:
|
|
|
|
version = f.read()
|
|
|
|
with open(template_file, 'r') as f:
|
|
|
|
template = f.read()
|
2015-09-07 18:55:02 +00:00
|
|
|
content = template.replace('{PLACEHOLDER}', version.strip())
|
|
|
|
|
|
|
|
# We update the file only if the content has changed (ignoring line ending
|
|
|
|
# differences).
|
|
|
|
should_write = True
|
|
|
|
if os.path.isfile(target_file):
|
|
|
|
with open(target_file, 'r') as f:
|
|
|
|
should_write = f.read().replace('r', '') != content.replace('r', '')
|
|
|
|
if should_write:
|
|
|
|
with open(target_file, 'w') as f:
|
2014-06-25 01:05:10 +00:00
|
|
|
f.write(content)
|
|
|
|
|
|
|
|
|
2013-07-02 01:16:56 +00:00
|
|
|
def touch_config_gypi():
|
|
|
|
config_gypi = os.path.join(SOURCE_ROOT, 'vendor', 'node', 'config.gypi')
|
2013-07-02 14:32:14 +00:00
|
|
|
with open(config_gypi, 'w+') as f:
|
2015-12-08 03:14:30 +00:00
|
|
|
content = "\n{'variables':{}}"
|
2013-07-02 14:32:14 +00:00
|
|
|
if f.read() != content:
|
|
|
|
f.write(content)
|
2013-07-02 01:16:56 +00:00
|
|
|
|
|
|
|
|
2016-07-26 10:24:58 +00:00
|
|
|
def run_update(defines, msvs):
|
2016-07-26 08:38:31 +00:00
|
|
|
args = [sys.executable, os.path.join(SOURCE_ROOT, 'script', 'update.py')]
|
|
|
|
if defines:
|
|
|
|
args += ['--defines', defines]
|
|
|
|
if msvs:
|
|
|
|
args += ['--msvs']
|
|
|
|
|
2016-07-26 10:24:58 +00:00
|
|
|
execute_stdout(args)
|
2013-06-19 06:32:41 +00:00
|
|
|
|
|
|
|
|
2017-05-02 17:14:49 +00:00
|
|
|
def create_node_headers():
|
|
|
|
execute_stdout([sys.executable,
|
|
|
|
os.path.join(SOURCE_ROOT, 'script', 'create-node-headers.py'),
|
|
|
|
'--version', get_electron_version()])
|
|
|
|
|
|
|
|
|
2017-05-09 20:38:14 +00:00
|
|
|
def mkdir_p(path):
|
|
|
|
try:
|
|
|
|
os.makedirs(path)
|
|
|
|
except OSError as e:
|
|
|
|
if e.errno != errno.EEXIST:
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
2013-06-19 06:32:41 +00:00
|
|
|
if __name__ == '__main__':
|
|
|
|
sys.exit(main())
|