From f67968d244bb448c0bb07edda3571c0878eb11f7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 14:28:54 -0700 Subject: [PATCH 01/13] Parse args in test.py --- package.json | 2 +- script/test.py | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index a1f3b8608c62..8f7badda18b4 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "build": "python ./script/build.py -c D", "clean": "python ./script/clean.py", "clean-build": "python ./script/clean.py --build", - "coverage": "npm run instrument-code-coverage && npm test -- --use-instrumented-asar", + "coverage": "npm run instrument-code-coverage && npm test -- --use_instrumented_asar", "instrument-code-coverage": "electabul instrument --input-path ./lib --output-path ./out/coverage/electron.asar", "lint": "npm run lint-js && npm run lint-cpp && npm run lint-py && npm run lint-api-docs-js && npm run lint-api-docs", "lint-js": "standard && cd spec && standard", diff --git a/script/test.py b/script/test.py index 1d0e7295d5ec..beeeb17f5b3a 100755 --- a/script/test.py +++ b/script/test.py @@ -1,5 +1,6 @@ #!/usr/bin/env python +import argparse import os import shutil import subprocess @@ -17,9 +18,8 @@ PRODUCT_NAME = electron_gyp()['product_name%'] def main(): os.chdir(SOURCE_ROOT) - config = 'D' - if len(sys.argv) == 2 and sys.argv[1] == '-R': - config = 'R' + args = parse_args() + config = args.configuration if sys.platform == 'darwin': electron = os.path.join(SOURCE_ROOT, 'out', config, @@ -36,10 +36,9 @@ def main(): electron = os.path.join(SOURCE_ROOT, 'out', config, PROJECT_NAME) resources_path = os.path.join(SOURCE_ROOT, 'out', config) - use_instrumented_asar = '--use-instrumented-asar' in sys.argv returncode = 0 try: - if use_instrumented_asar: + if args.use_instrumented_asar: install_instrumented_asar_file(resources_path) subprocess.check_call([electron, 'spec'] + sys.argv[1:]) except subprocess.CalledProcessError as e: @@ -47,7 +46,7 @@ def main(): except KeyboardInterrupt: returncode = 0 - if use_instrumented_asar: + if args.use_instrumented_asar: restore_uninstrumented_asar_file(resources_path) if os.environ.has_key('OUTPUT_TO_FILE'): @@ -60,6 +59,19 @@ def main(): return returncode +def parse_args(): + parser = argparse.ArgumentParser(description='Run Electron tests') + parser.add_argument('--use_instrumented_asar', + help='Run tests with coverage instructed asar file', + action='store_true', + required=False) + parser.add_argument('-c', '--configuration', + help='Build configuration to run tests against', + default='D', + required=False) + return parser.parse_args() + + def install_instrumented_asar_file(resources_path): asar_path = os.path.join(resources_path, '{0}.asar'.format(PROJECT_NAME)) uninstrumented_path = os.path.join(resources_path, From 7e867f478e7bb97c05e6164204c5ae49606e8b06 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 14:31:16 -0700 Subject: [PATCH 02/13] Don't build helpers or rebuild modules during bootstrap --- script/bootstrap.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/script/bootstrap.py b/script/bootstrap.py index 2ea57ee34bd0..3e9d34a48a70 100755 --- a/script/bootstrap.py +++ b/script/bootstrap.py @@ -65,7 +65,6 @@ def main(): create_chrome_version_h() touch_config_gypi() run_update(defines, args.msvs) - create_node_headers() update_electron_modules('spec', args.target_arch) @@ -183,12 +182,10 @@ def update_node_modules(dirname, env=None): if os.environ.has_key('CI'): try: execute_stdout(args, env) - execute_stdout([NPM, 'rebuild'], env) except subprocess.CalledProcessError: pass else: execute_stdout(args, env) - execute_stdout([NPM, 'rebuild'], env) def update_electron_modules(dirname, target_arch): @@ -271,12 +268,6 @@ def run_update(defines, msvs): execute_stdout(args) -def create_node_headers(): - execute_stdout([sys.executable, - os.path.join(SOURCE_ROOT, 'script', 'create-node-headers.py'), - '--version', get_electron_version()]) - - def get_libchromiumcontent_commit(): commit = os.getenv('LIBCHROMIUMCONTENT_COMMIT') if commit: From 22bc1b004ec7cd0078c657749da9a7372614be17 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 14:53:42 -0700 Subject: [PATCH 03/13] Move npm helpers to lib/util --- script/bootstrap.py | 39 ++------------------------------------- script/lib/util.py | 44 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/script/bootstrap.py b/script/bootstrap.py index 3e9d34a48a70..b30f23961182 100755 --- a/script/bootstrap.py +++ b/script/bootstrap.py @@ -9,7 +9,8 @@ import sys from lib.config import BASE_URL, PLATFORM, enable_verbose_mode, \ is_verbose_mode, get_target_arch -from lib.util import execute, execute_stdout, get_electron_version, scoped_cwd +from lib.util import execute, execute_stdout, get_electron_version, \ + scoped_cwd, update_node_modules SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) @@ -17,10 +18,6 @@ VENDOR_DIR = os.path.join(SOURCE_ROOT, 'vendor') DOWNLOAD_DIR = os.path.join(VENDOR_DIR, 'download') PYTHON_26_URL = 'https://chromium.googlesource.com/chromium/deps/python_26' -NPM = 'npm' -if sys.platform in ['win32', 'cygwin']: - NPM += '.cmd' - def main(): os.chdir(SOURCE_ROOT) @@ -65,7 +62,6 @@ def main(): create_chrome_version_h() touch_config_gypi() run_update(defines, args.msvs) - update_electron_modules('spec', args.target_arch) def parse_args(): @@ -167,37 +163,6 @@ def set_clang_env(env): env['CXX'] = os.path.join(llvm_dir, 'clang++') -def update_node_modules(dirname, env=None): - if env is None: - env = os.environ.copy() - if PLATFORM == 'linux': - # Use prebuilt clang for building native modules. - set_clang_env(env) - env['npm_config_clang'] = '1' - with scoped_cwd(dirname): - args = [NPM, 'install'] - if is_verbose_mode(): - args += ['--verbose'] - # Ignore npm install errors when running in CI. - if os.environ.has_key('CI'): - try: - execute_stdout(args, env) - except subprocess.CalledProcessError: - pass - else: - execute_stdout(args, env) - - -def update_electron_modules(dirname, target_arch): - env = os.environ.copy() - version = get_electron_version() - env['npm_config_arch'] = target_arch - env['npm_config_target'] = version - env['npm_config_nodedir'] = os.path.join(SOURCE_ROOT, 'dist', - 'node-{0}'.format(version)) - update_node_modules(dirname, env) - - def update_win32_python(): with scoped_cwd(VENDOR_DIR): if not os.path.exists('python_26'): diff --git a/script/lib/util.py b/script/lib/util.py index b40ccd0cce61..27355803fa70 100644 --- a/script/lib/util.py +++ b/script/lib/util.py @@ -15,12 +15,16 @@ import urllib2 import os import zipfile -from config import is_verbose_mode +from config import is_verbose_mode, PLATFORM from env_util import get_vs_env BOTO_DIR = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'vendor', 'boto')) +NPM = 'npm' +if sys.platform in ['win32', 'cygwin']: + NPM += '.cmd' + def get_host_arch(): """Returns the host architecture with a predictable string.""" @@ -244,3 +248,41 @@ def import_vs_env(target_arch): vs_arch = 'x86_amd64' env = get_vs_env('14.0', vs_arch) os.environ.update(env) + + +def set_clang_env(env): + SOURCE_ROOT = os.path.abspath(os.path.join(__file__, '..', '..', '..')) + 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++') + + +def update_electron_modules(dirname, target_arch, nodedir): + env = os.environ.copy() + version = get_electron_version() + env['npm_config_arch'] = target_arch + env['npm_config_target'] = version + env['npm_config_nodedir'] = nodedir + update_node_modules(dirname, env) + + +def update_node_modules(dirname, env=None): + if env is None: + env = os.environ.copy() + if PLATFORM == 'linux': + # Use prebuilt clang for building native modules. + set_clang_env(env) + env['npm_config_clang'] = '1' + with scoped_cwd(dirname): + args = [NPM, 'install'] + if is_verbose_mode(): + args += ['--verbose'] + # Ignore npm install errors when running in CI. + if os.environ.has_key('CI'): + try: + execute_stdout(args, env) + except subprocess.CalledProcessError: + pass + else: + execute_stdout(args, env) From 29f776c57d32bf976fb46734f2c0164f7d36c163 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:13:05 -0700 Subject: [PATCH 04/13] Allow headers directory to be specified on cli --- script/create-node-headers.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/script/create-node-headers.py b/script/create-node-headers.py index 992cd1657514..dad3c0650554 100755 --- a/script/create-node-headers.py +++ b/script/create-node-headers.py @@ -33,26 +33,34 @@ HEADERS_FILES = [ def main(): - safe_mkdir(DIST_DIR) - args = parse_args() - node_headers_dir = os.path.join(DIST_DIR, 'node-{0}'.format(args.version)) - iojs_headers_dir = os.path.join(DIST_DIR, 'iojs-{0}'.format(args.version)) - iojs2_headers_dir = os.path.join(DIST_DIR, + + safe_mkdir(args.directory) + + node_headers_dir = os.path.join(args.directory, + 'node-{0}'.format(args.version)) + iojs_headers_dir = os.path.join(args.directory, + 'iojs-{0}'.format(args.version)) + iojs2_headers_dir = os.path.join(args.directory, 'iojs-{0}-headers'.format(args.version)) copy_headers(node_headers_dir) - create_header_tarball(node_headers_dir) + create_header_tarball(args.directory, node_headers_dir) + copy_headers(iojs_headers_dir) - create_header_tarball(iojs_headers_dir) + create_header_tarball(args.directory, iojs_headers_dir) + copy_headers(iojs2_headers_dir) - create_header_tarball(iojs2_headers_dir) + create_header_tarball(args.directory, iojs2_headers_dir) def parse_args(): parser = argparse.ArgumentParser(description='create node header tarballs') parser.add_argument('-v', '--version', help='Specify the version', required=True) + parser.add_argument('-d', '--directory', help='Specify the output directory', + default=DIST_DIR, + required=False) return parser.parse_args() @@ -85,9 +93,9 @@ def copy_headers(dist_headers_dir): os.path.join(dist_headers_dir, 'deps')) -def create_header_tarball(dist_headers_dir): +def create_header_tarball(directory, dist_headers_dir): target = dist_headers_dir + '.tar.gz' - with scoped_cwd(DIST_DIR): + with scoped_cwd(directory): tarball = tarfile.open(name=target, mode='w:gz') tarball.add(os.path.relpath(dist_headers_dir)) tarball.close() From 54f4644660f6ffd68d91c49f9a4b3ae48b7fa025 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:13:23 -0700 Subject: [PATCH 05/13] Rebuild modules after installing --- script/lib/util.py | 1 + 1 file changed, 1 insertion(+) diff --git a/script/lib/util.py b/script/lib/util.py index 27355803fa70..b08f13996bcb 100644 --- a/script/lib/util.py +++ b/script/lib/util.py @@ -265,6 +265,7 @@ def update_electron_modules(dirname, target_arch, nodedir): env['npm_config_target'] = version env['npm_config_nodedir'] = nodedir update_node_modules(dirname, env) + execute_stdout([NPM, 'rebuild'], env) def update_node_modules(dirname, env=None): From 9971f0d54ccf2046957a86a2cd9c0d104243a607 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:14:50 -0700 Subject: [PATCH 06/13] Add option to rebuild test modules before running --- script/test.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/script/test.py b/script/test.py index beeeb17f5b3a..19aeb5009c2f 100755 --- a/script/test.py +++ b/script/test.py @@ -6,7 +6,9 @@ import shutil import subprocess import sys -from lib.util import electron_gyp, rm_rf +from lib.config import PLATFORM, enable_verbose_mode, get_target_arch +from lib.util import electron_gyp, execute, get_electron_version, rm_rf, \ + update_electron_modules SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) @@ -21,6 +23,14 @@ def main(): args = parse_args() config = args.configuration + if args.verbose: + enable_verbose_mode() + + spec_modules = os.path.join(SOURCE_ROOT, 'spec', 'node_modules') + if args.rebuild_native_modules or not os.path.isdir(spec_modules): + rebuild_native_modules(spec_modules, + os.path.join(SOURCE_ROOT, 'out', config)) + if sys.platform == 'darwin': electron = os.path.join(SOURCE_ROOT, 'out', config, '{0}.app'.format(PRODUCT_NAME), 'Contents', @@ -65,6 +75,13 @@ def parse_args(): help='Run tests with coverage instructed asar file', action='store_true', required=False) + parser.add_argument('--rebuild_native_modules', + help='Rebuild native modules used by specs', + action='store_true', + required=False) + parser.add_argument('-v', '--verbose', + action='store_true', + help='Prints the output of the subprocesses') parser.add_argument('-c', '--configuration', help='Build configuration to run tests against', default='D', @@ -90,5 +107,26 @@ def restore_uninstrumented_asar_file(resources_path): shutil.move(uninstrumented_path, asar_path) +def run_python_script(script, *args): + script_path = os.path.join(SOURCE_ROOT, 'script', script) + return execute([sys.executable, script_path] + list(args)) + + +def rebuild_native_modules(modules_path, out_dir): + version = get_electron_version() + + run_python_script('create-node-headers.py', + '--version', version, + '--directory', out_dir) + + if PLATFORM == 'win32': + iojs_lib = os.path.join(out_dir, 'Release', 'iojs.lib') + atom_lib = os.path.join(out_dir, 'node.dll.lib') + shutil.copy2(atom_lib, iojs_lib) + + update_electron_modules(os.path.dirname(modules_path), get_target_arch(), + os.path.join(out_dir, 'node-{0}'.format(version))) + + if __name__ == '__main__': sys.exit(main()) From 0d4a397656b45a88647f1f73588012ab5577c904 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:40:51 -0700 Subject: [PATCH 07/13] Only rebuild test modules on non-Windows or release builds --- script/lib/util.py | 2 +- script/test.py | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/script/lib/util.py b/script/lib/util.py index b08f13996bcb..053023dad09d 100644 --- a/script/lib/util.py +++ b/script/lib/util.py @@ -265,7 +265,7 @@ def update_electron_modules(dirname, target_arch, nodedir): env['npm_config_target'] = version env['npm_config_nodedir'] = nodedir update_node_modules(dirname, env) - execute_stdout([NPM, 'rebuild'], env) + execute_stdout([NPM, 'rebuild'], env, dirname) def update_node_modules(dirname, env=None): diff --git a/script/test.py b/script/test.py index 19aeb5009c2f..d9ed9c2b7727 100755 --- a/script/test.py +++ b/script/test.py @@ -28,8 +28,7 @@ def main(): spec_modules = os.path.join(SOURCE_ROOT, 'spec', 'node_modules') if args.rebuild_native_modules or not os.path.isdir(spec_modules): - rebuild_native_modules(spec_modules, - os.path.join(SOURCE_ROOT, 'out', config)) + rebuild_native_modules(config, spec_modules) if sys.platform == 'darwin': electron = os.path.join(SOURCE_ROOT, 'out', config, @@ -79,6 +78,10 @@ def parse_args(): help='Rebuild native modules used by specs', action='store_true', required=False) + parser.add_argument('--ci', + help='Run tests in CI mode', + action='store_true', + required=False) parser.add_argument('-v', '--verbose', action='store_true', help='Prints the output of the subprocesses') @@ -112,20 +115,28 @@ def run_python_script(script, *args): return execute([sys.executable, script_path] + list(args)) -def rebuild_native_modules(modules_path, out_dir): +def rebuild_native_modules(config, modules_path): + out_dir = os.path.join(SOURCE_ROOT, 'out', config) version = get_electron_version() + node_dir = os.path.join(out_dir, 'node-{0}'.format(version)) run_python_script('create-node-headers.py', '--version', version, '--directory', out_dir) if PLATFORM == 'win32': - iojs_lib = os.path.join(out_dir, 'Release', 'iojs.lib') + lib_dir = os.path.join(node_dir, 'Release') + safe_mkdir(lib_dir) + iojs_lib = os.path.join(lib_dir, 'iojs.lib') atom_lib = os.path.join(out_dir, 'node.dll.lib') shutil.copy2(atom_lib, iojs_lib) - update_electron_modules(os.path.dirname(modules_path), get_target_arch(), - os.path.join(out_dir, 'node-{0}'.format(version))) + # Native modules can only be compiled against release builds on Windows + if config == 'R' or PLATFORM != 'win32': + update_electron_modules(os.path.dirname(modules_path), get_target_arch(), + node_dir) + else: + update_node_modules(os.path.dirname(modules_path)) if __name__ == '__main__': From dd0601e67436973c962120af7f5ec6e25bf8e7e7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:41:05 -0700 Subject: [PATCH 08/13] Rebuild native modules used in specs on each CI run --- script/cibuild | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/cibuild b/script/cibuild index f523fa1af5fa..2950e695bc53 100755 --- a/script/cibuild +++ b/script/cibuild @@ -89,7 +89,7 @@ def main(): else: run_script('build.py', ['-c', 'D']) if PLATFORM == 'win32' or target_arch == 'x64': - run_script('test.py', ['--ci']) + run_script('test.py', ['--ci', '--rebuild_native_modules']) run_script('verify-ffmpeg.py') From 18a80c0ed797308c74d39da3924eb9631de16a98 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:42:05 -0700 Subject: [PATCH 09/13] Add missing safe_mkdir import --- script/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/test.py b/script/test.py index d9ed9c2b7727..c06036b0ba08 100755 --- a/script/test.py +++ b/script/test.py @@ -8,7 +8,7 @@ import sys from lib.config import PLATFORM, enable_verbose_mode, get_target_arch from lib.util import electron_gyp, execute, get_electron_version, rm_rf, \ - update_electron_modules + safe_mkdir, update_electron_modules SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) From 24f0813ef1b76eae701439e604e3b42986ca0538 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 15:42:39 -0700 Subject: [PATCH 10/13] Add missing update_node_modules import --- script/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/test.py b/script/test.py index c06036b0ba08..07f397bd350b 100755 --- a/script/test.py +++ b/script/test.py @@ -8,7 +8,7 @@ import sys from lib.config import PLATFORM, enable_verbose_mode, get_target_arch from lib.util import electron_gyp, execute, get_electron_version, rm_rf, \ - safe_mkdir, update_electron_modules + safe_mkdir, update_node_modules, update_electron_modules SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) From 90964290a66bdd1a1fe66eb29f3595ea8cace21c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 16:04:38 -0700 Subject: [PATCH 11/13] Add separate run script just to rebuild test modules --- package.json | 1 + script/rebuild-test-modules.py | 64 ++++++++++++++++++++++++++++++++++ script/test.py | 41 +++++----------------- 3 files changed, 74 insertions(+), 32 deletions(-) create mode 100755 script/rebuild-test-modules.py diff --git a/package.json b/package.json index 8f7badda18b4..1e227e6690ce 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "browserify": "browserify", "bump-version": "./script/bump-version.py", "build": "python ./script/build.py -c D", + "rebuild-test-modules": "python ./script/rebuild-test-modules.py", "clean": "python ./script/clean.py", "clean-build": "python ./script/clean.py --build", "coverage": "npm run instrument-code-coverage && npm test -- --use_instrumented_asar", diff --git a/script/rebuild-test-modules.py b/script/rebuild-test-modules.py new file mode 100755 index 000000000000..7cbb189f519e --- /dev/null +++ b/script/rebuild-test-modules.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import argparse +import os +import shutil +import subprocess +import sys + +from lib.config import PLATFORM, enable_verbose_mode, get_target_arch +from lib.util import execute_stdout, get_electron_version, safe_mkdir, \ + update_node_modules, update_electron_modules + + +SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + + +def main(): + os.chdir(SOURCE_ROOT) + + args = parse_args() + config = args.configuration + + if args.verbose: + enable_verbose_mode() + + spec_modules = os.path.join(SOURCE_ROOT, 'spec', 'node_modules') + out_dir = os.path.join(SOURCE_ROOT, 'out', config) + version = get_electron_version() + node_dir = os.path.join(out_dir, 'node-{0}'.format(version)) + + # Create node headers + script_path = os.path.join(SOURCE_ROOT, 'script', 'create-node-headers.py') + execute_stdout([sys.executable, script_path, '--version', version, + '--directory', out_dir]) + + if PLATFORM == 'win32': + lib_dir = os.path.join(node_dir, 'Release') + safe_mkdir(lib_dir) + iojs_lib = os.path.join(lib_dir, 'iojs.lib') + atom_lib = os.path.join(out_dir, 'node.dll.lib') + shutil.copy2(atom_lib, iojs_lib) + + # Native modules can only be compiled against release builds on Windows + if config == 'R' or PLATFORM != 'win32': + update_electron_modules(os.path.dirname(spec_modules), get_target_arch(), + node_dir) + else: + update_node_modules(os.path.dirname(spec_modules)) + + +def parse_args(): + parser = argparse.ArgumentParser(description='Rebuild native test modules') + parser.add_argument('-v', '--verbose', + action='store_true', + help='Prints the output of the subprocesses') + parser.add_argument('-c', '--configuration', + help='Build configuration to rebuild modules against', + default='D', + required=False) + return parser.parse_args() + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/script/test.py b/script/test.py index 07f397bd350b..804bce9eb61e 100755 --- a/script/test.py +++ b/script/test.py @@ -6,9 +6,8 @@ import shutil import subprocess import sys -from lib.config import PLATFORM, enable_verbose_mode, get_target_arch -from lib.util import electron_gyp, execute, get_electron_version, rm_rf, \ - safe_mkdir, update_node_modules, update_electron_modules +from lib.config import enable_verbose_mode +from lib.util import electron_gyp, execute_stdout, rm_rf SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) @@ -28,7 +27,7 @@ def main(): spec_modules = os.path.join(SOURCE_ROOT, 'spec', 'node_modules') if args.rebuild_native_modules or not os.path.isdir(spec_modules): - rebuild_native_modules(config, spec_modules) + rebuild_native_modules(args.verbose, config) if sys.platform == 'darwin': electron = os.path.join(SOURCE_ROOT, 'out', config, @@ -110,34 +109,12 @@ def restore_uninstrumented_asar_file(resources_path): shutil.move(uninstrumented_path, asar_path) -def run_python_script(script, *args): - script_path = os.path.join(SOURCE_ROOT, 'script', script) - return execute([sys.executable, script_path] + list(args)) - - -def rebuild_native_modules(config, modules_path): - out_dir = os.path.join(SOURCE_ROOT, 'out', config) - version = get_electron_version() - node_dir = os.path.join(out_dir, 'node-{0}'.format(version)) - - run_python_script('create-node-headers.py', - '--version', version, - '--directory', out_dir) - - if PLATFORM == 'win32': - lib_dir = os.path.join(node_dir, 'Release') - safe_mkdir(lib_dir) - iojs_lib = os.path.join(lib_dir, 'iojs.lib') - atom_lib = os.path.join(out_dir, 'node.dll.lib') - shutil.copy2(atom_lib, iojs_lib) - - # Native modules can only be compiled against release builds on Windows - if config == 'R' or PLATFORM != 'win32': - update_electron_modules(os.path.dirname(modules_path), get_target_arch(), - node_dir) - else: - update_node_modules(os.path.dirname(modules_path)) - +def rebuild_native_modules(verbose, configuration): + script_path = os.path.join(SOURCE_ROOT, 'script', 'rebuild-test-modules.py') + args = ['--configuration', configuration] + if verbose: + args += ['--verbose'] + execute_stdout([sys.executable, script_path] + args) if __name__ == '__main__': sys.exit(main()) From 5cf4995f2e4055e52bd4d21b2c08f4a68d48ffce Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 25 May 2017 16:40:15 -0700 Subject: [PATCH 12/13] DRY up logic to check if native modules should be loaded --- spec/api-browser-window-spec.js | 19 +++++++------ spec/modules-spec.js | 49 +++++++++++++++++---------------- spec/static/main.js | 2 ++ spec/webview-spec.js | 33 +++++++++++----------- 4 files changed, 55 insertions(+), 48 deletions(-) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 48f8a579c60a..5c084cb178fd 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -12,6 +12,7 @@ const {ipcRenderer, remote, screen} = require('electron') const {app, ipcMain, BrowserWindow, protocol, webContents} = remote const isCI = remote.getGlobal('isCi') +const nativeModulesEnabled = remote.getGlobal('nativeModulesEnabled') describe('BrowserWindow module', function () { var fixtures = path.resolve(__dirname, 'fixtures') @@ -1301,19 +1302,19 @@ describe('BrowserWindow module', function () { w.loadURL('file://' + path.join(fixtures, 'api', 'native-window-open-iframe.html')) }) - if (process.platform !== 'win32' || process.execPath.toLowerCase().indexOf('\\out\\d\\') === -1) { - it('loads native addons correctly after reload', (done) => { + it('loads native addons correctly after reload', (done) => { + if (!nativeModulesEnabled) return done() + + ipcMain.once('answer', (event, content) => { + assert.equal(content, 'function') ipcMain.once('answer', (event, content) => { assert.equal(content, 'function') - ipcMain.once('answer', (event, content) => { - assert.equal(content, 'function') - done() - }) - w.reload() + done() }) - w.loadURL('file://' + path.join(fixtures, 'api', 'native-window-open-native-addon.html')) + w.reload() }) - } + w.loadURL('file://' + path.join(fixtures, 'api', 'native-window-open-native-addon.html')) + }) }) }) diff --git a/spec/modules-spec.js b/spec/modules-spec.js index ba87ed3466a8..51f54201f566 100644 --- a/spec/modules-spec.js +++ b/spec/modules-spec.js @@ -5,38 +5,41 @@ const {remote} = require('electron') const {BrowserWindow} = remote const {closeWindow} = require('./window-helpers') +const nativeModulesEnabled = remote.getGlobal('nativeModulesEnabled') + describe('modules support', function () { var fixtures = path.join(__dirname, 'fixtures') describe('third-party module', function () { - if (process.platform !== 'win32' || process.execPath.toLowerCase().indexOf('\\out\\d\\') === -1) { - describe('runas', function () { - it('can be required in renderer', function () { - require('runas') - }) + describe('runas', function () { + if (!nativeModulesEnabled) return - it('can be required in node binary', function (done) { - var runas = path.join(fixtures, 'module', 'runas.js') - var child = require('child_process').fork(runas) - child.on('message', function (msg) { - assert.equal(msg, 'ok') - done() - }) - }) + it('can be required in renderer', function () { + require('runas') }) - describe('ffi', function () { - if (process.platform === 'win32') return - - it('does not crash', function () { - var ffi = require('ffi') - var libm = ffi.Library('libm', { - ceil: ['double', ['double']] - }) - assert.equal(libm.ceil(1.5), 2) + it('can be required in node binary', function (done) { + var runas = path.join(fixtures, 'module', 'runas.js') + var child = require('child_process').fork(runas) + child.on('message', function (msg) { + assert.equal(msg, 'ok') + done() }) }) - } + }) + + describe('ffi', function () { + if (!nativeModulesEnabled) return + if (process.platform === 'win32') return + + it('does not crash', function () { + var ffi = require('ffi') + var libm = ffi.Library('libm', { + ceil: ['double', ['double']] + }) + assert.equal(libm.ceil(1.5), 2) + }) + }) describe('q', function () { var Q = require('q') diff --git a/spec/static/main.js b/spec/static/main.js index bff7d4ceeca3..9e59037a5508 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -89,6 +89,8 @@ if (global.isCi) { }) } +global.nativeModulesEnabled = process.platform !== 'win32' || process.execPath.toLowerCase().indexOf('\\out\\d\\') === -1 + // Register app as standard scheme. global.standardScheme = 'app' global.zoomScheme = 'zoom' diff --git a/spec/webview-spec.js b/spec/webview-spec.js index 180da5b80ca4..51600d4711d3 100644 --- a/spec/webview-spec.js +++ b/spec/webview-spec.js @@ -7,6 +7,7 @@ const {app, session, getGuestWebContents, ipcMain, BrowserWindow, webContents} = const {closeWindow} = require('./window-helpers') const isCI = remote.getGlobal('isCi') +const nativeModulesEnabled = remote.getGlobal('nativeModulesEnabled') describe(' tag', function () { this.timeout(3 * 60 * 1000) @@ -171,23 +172,23 @@ describe(' tag', function () { document.body.appendChild(webview) }) - if (process.platform !== 'win32' || process.execPath.toLowerCase().indexOf('\\out\\d\\') === -1) { - it('loads native modules when navigation happens', function (done) { - var listener = function () { - webview.removeEventListener('did-finish-load', listener) - var listener2 = function (e) { - assert.equal(e.message, 'function') - done() - } - webview.addEventListener('console-message', listener2) - webview.reload() + it('loads native modules when navigation happens', function (done) { + if (!nativeModulesEnabled) return done() + + var listener = function () { + webview.removeEventListener('did-finish-load', listener) + var listener2 = function (e) { + assert.equal(e.message, 'function') + done() } - webview.addEventListener('did-finish-load', listener) - webview.setAttribute('nodeintegration', 'on') - webview.src = 'file://' + fixtures + '/pages/native-module.html' - document.body.appendChild(webview) - }) - } + webview.addEventListener('console-message', listener2) + webview.reload() + } + webview.addEventListener('did-finish-load', listener) + webview.setAttribute('nodeintegration', 'on') + webview.src = 'file://' + fixtures + '/pages/native-module.html' + document.body.appendChild(webview) + }) }) describe('preload attribute', function () { From e83d66294e85c90067fd2844c1ff568fdf2dca58 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 30 May 2017 09:17:05 -0700 Subject: [PATCH 13/13] Remove unused function --- script/bootstrap.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/script/bootstrap.py b/script/bootstrap.py index b30f23961182..41ee7de5ee41 100755 --- a/script/bootstrap.py +++ b/script/bootstrap.py @@ -156,13 +156,6 @@ def setup_libchromiumcontent(is_dev, target_arch, url, subprocess.check_call([sys.executable, download, '-s'] + args) -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++') - - def update_win32_python(): with scoped_cwd(VENDOR_DIR): if not os.path.exists('python_26'):