diff --git a/Makefile b/Makefile index 6cdd65095ddc7d..d4e805c1d54428 100644 --- a/Makefile +++ b/Makefile @@ -103,25 +103,17 @@ $(NODE_G_EXE): config.gypi out/Makefile $(MAKE) -C out BUILDTYPE=Debug V=$(V) if [ ! -r $@ -o ! -L $@ ]; then ln -fs out/Debug/$(NODE_EXE) $@; fi -CODE_CACHE_DIR ?= out/$(BUILDTYPE)/obj/gen -CODE_CACHE_FILE ?= $(CODE_CACHE_DIR)/node_code_cache.cc - ifeq ($(BUILDTYPE),Debug) CONFIG_FLAGS += --debug endif + .PHONY: with-code-cache with-code-cache: - @echo $(CONFIG_FLAGS) - $(PYTHON) ./configure $(CONFIG_FLAGS) - $(MAKE) - mkdir -p $(CODE_CACHE_DIR) - out/$(BUILDTYPE)/mkcodecache $(CODE_CACHE_FILE) - $(PYTHON) ./configure --code-cache-path $(CODE_CACHE_FILE) $(CONFIG_FLAGS) - $(MAKE) + echo "'with-code-cache' target is a noop" .PHONY: test-code-cache test-code-cache: with-code-cache - $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) code-cache + echo "'test-code-cache' target is a noop" out/Makefile: config.gypi common.gypi node.gyp \ deps/uv/uv.gyp deps/http_parser/http_parser.gyp deps/zlib/zlib.gyp \ diff --git a/configure.py b/configure.py index f32e82e6f201c3..a3a412e3a7d542 100755 --- a/configure.py +++ b/configure.py @@ -485,8 +485,9 @@ parser.add_option('--code-cache-path', action='store', dest='code_cache_path', - help='Use a file generated by tools/generate_code_cache.js to compile the' - ' code cache for builtin modules into the binary') + help='optparse.SUPPRESS_HELP') + +# End dummy list. parser.add_option('--without-ssl', action='store_true', @@ -1050,8 +1051,7 @@ def configure_node(o): o['variables']['debug_nghttp2'] = 'false' o['variables']['node_no_browser_globals'] = b(options.no_browser_globals) - if options.code_cache_path: - o['variables']['node_code_cache_path'] = options.code_cache_path + o['variables']['node_code_cache_path'] = 'yes' o['variables']['node_shared'] = b(options.shared) node_module_version = getmoduleversion.get_version() diff --git a/node.gyp b/node.gyp index e5e0ad144f20ee..8809c5204a587e 100644 --- a/node.gyp +++ b/node.gyp @@ -6,7 +6,6 @@ 'node_use_dtrace%': 'false', 'node_use_etw%': 'false', 'node_no_browser_globals%': 'false', - 'node_code_cache_path%': '', 'node_use_v8_platform%': 'true', 'node_use_bundled_v8%': 'true', 'node_shared%': 'false', @@ -224,6 +223,7 @@ 'deps/acorn/acorn/dist/acorn.js', 'deps/acorn/acorn-walk/dist/walk.js', ], + 'mkcodecache_exec': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)mkcodecache<(EXECUTABLE_SUFFIX)', 'conditions': [ [ 'node_shared=="true"', { 'node_target_type%': 'shared_library', @@ -280,16 +280,24 @@ { 'target_name': '<(node_core_target_name)', 'type': 'executable', - 'sources': [ - 'src/node_main.cc' + + 'defines': [ + 'NODE_WANT_INTERNALS=1', ], + 'includes': [ 'node.gypi' ], + 'include_dirs': [ 'src', 'deps/v8/include' ], + + 'sources': [ + 'src/node_main.cc' + ], + 'dependencies': [ 'deps/histogram/histogram.gyp:histogram' ], 'msvs_settings': { @@ -402,7 +410,32 @@ 'LinkIncremental': 2 # enable incremental linking }, }, - }] + }], + ['want_separate_host_toolset==0', { + 'dependencies': [ + 'mkcodecache', + ], + 'actions': [ + { + 'action_name': 'run_mkcodecache', + 'process_outputs_as_sources': 1, + 'inputs': [ + '<(mkcodecache_exec)', + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/node_code_cache.cc', + ], + 'action': [ + '<@(_inputs)', + '<@(_outputs)', + ], + }, + ], + }, { + 'sources': [ + 'src/node_code_cache_stub.cc' + ], + }], ], }, # node_core_target_name { @@ -615,11 +648,6 @@ 'msvs_disabled_warnings!': [4244], 'conditions': [ - [ 'node_code_cache_path!=""', { - 'sources': [ '<(node_code_cache_path)' ] - }, { - 'sources': [ 'src/node_code_cache_stub.cc' ] - }], [ 'node_shared=="true" and node_module_version!="" and OS!="win"', { 'product_extension': '<(shlib_suffix)', 'xcode_settings': { @@ -1047,6 +1075,7 @@ 'defines': [ 'NODE_WANT_INTERNALS=1' ], 'sources': [ + 'src/node_code_cache_stub.cc', 'test/cctest/node_test_fixture.cc', 'test/cctest/test_aliased_buffer.cc', 'test/cctest/test_base64.cc', @@ -1075,7 +1104,9 @@ 'HAVE_INSPECTOR=1', ], }, { - 'defines': [ 'HAVE_INSPECTOR=0' ] + 'defines': [ + 'HAVE_INSPECTOR=0', + ] }], ['OS=="solaris"', { 'ldflags': [ '-I<(SHARED_INTERMEDIATE_DIR)' ] @@ -1130,11 +1161,14 @@ 'deps/uv/include', ], - 'defines': [ 'NODE_WANT_INTERNALS=1' ], - + 'defines': [ + 'NODE_WANT_INTERNALS=1' + ], 'sources': [ + 'src/node_code_cache_stub.cc', 'tools/code_cache/mkcodecache.cc', - 'tools/code_cache/cache_builder.cc' + 'tools/code_cache/cache_builder.cc', + 'tools/code_cache/cache_builder.h', ], 'conditions': [ @@ -1155,22 +1189,22 @@ ], }], ], - }, # cache_builder - ], # end targets + }, # mkcodecache + ], # end targets 'conditions': [ - [ 'OS=="aix" and node_shared=="true"', { + ['OS=="aix" and node_shared=="true"', { 'targets': [ { 'target_name': 'node_aix_shared', 'type': 'shared_library', 'product_name': '<(node_core_target_name)', - 'ldflags': [ '--shared' ], + 'ldflags': ['--shared'], 'product_extension': '<(shlib_suffix)', 'includes': [ 'node.gypi' ], - 'dependencies': [ '<(node_lib_target_name)' ], + 'dependencies': ['<(node_lib_target_name)'], 'include_dirs': [ 'src', 'deps/v8/include', diff --git a/node.gypi b/node.gypi index d6c4c2669834bf..10c09a68829562 100644 --- a/node.gypi +++ b/node.gypi @@ -143,8 +143,8 @@ 'conditions': [ ['OS!="aix" and node_shared=="false"', { 'ldflags': [ - '-Wl,--whole-archive,<(obj_dir)/deps/zlib/<(STATIC_LIB_PREFIX)' - 'zlib<(STATIC_LIB_SUFFIX)', + '-Wl,--whole-archive,' + '<(obj_dir)/deps/zlib/<(STATIC_LIB_PREFIX)zlib<(STATIC_LIB_SUFFIX)', '-Wl,--no-whole-archive', ], }], @@ -184,8 +184,8 @@ 'conditions': [ ['OS!="aix" and node_shared=="false"', { 'ldflags': [ - '-Wl,--whole-archive,<(obj_dir)/deps/uv/<(STATIC_LIB_PREFIX)' - 'uv<(STATIC_LIB_SUFFIX)', + '-Wl,--whole-archive,' + '<(obj_dir)/deps/uv/<(STATIC_LIB_PREFIX)uv<(STATIC_LIB_SUFFIX)', '-Wl,--no-whole-archive', ], }], @@ -223,27 +223,33 @@ [ 'OS=="aix"', { 'defines': [ '_LINUX_SOURCE_COMPAT', - '__STDC_FORMAT_MACROS' + '__STDC_FORMAT_MACROS', ], 'conditions': [ [ 'force_load=="true"', { - + 'variables': { + 'exp_filename': '<(PRODUCT_DIR)/<(_target_name).exp', + }, 'actions': [ { 'action_name': 'expfile', 'inputs': [ - '<(obj_dir)' + '<(obj_dir)', ], 'outputs': [ - '<(PRODUCT_DIR)/node.exp' + '<(exp_filename)', ], 'action': [ 'sh', 'tools/create_expfile.sh', - '<@(_inputs)', '<@(_outputs)' + '<@(_inputs)', + '<@(_outputs)', ], } ], - 'ldflags': ['-Wl,-bE:<(PRODUCT_DIR)/node.exp', '-Wl,-brtl'], + 'ldflags': [ + '-Wl,-bE:<(exp_filename)', + '-Wl,-brtl', + ], }], ], }], diff --git a/test/code-cache/code-cache.status b/test/code-cache/code-cache.status deleted file mode 100644 index 26eb66ea2d1d2c..00000000000000 --- a/test/code-cache/code-cache.status +++ /dev/null @@ -1,21 +0,0 @@ -prefix code-cache - -# To mark a test as flaky, list the test name in the appropriate section -# below, without ".js", followed by ": PASS,FLAKY". Example: -# sample-test : PASS,FLAKY - -[true] # This section applies to all platforms - -[$system==win32] - -[$system==linux] - -[$system==macos] - -[$arch==arm || $arch==arm64] - -[$system==solaris] # Also applies to SmartOS - -[$system==freebsd] - -[$system==aix] diff --git a/test/code-cache/test-code-cache-generator.js b/test/code-cache/test-code-cache-generator.js deleted file mode 100644 index 2fed3294bf4492..00000000000000 --- a/test/code-cache/test-code-cache-generator.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict'; - -// This test verifies the code cache generator can generate a C++ -// file that contains the code cache. This can be removed once we -// actually build that C++ file into our binary. - -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const { spawnSync } = require('child_process'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -const readline = require('readline'); - -console.log('Looking for mkcodecache executable'); -let buildDir; -const stat = fs.statSync(process.execPath); -if (stat.isSymbolicLink()) { - console.log('Binary is a symbolic link'); - buildDir = path.dirname(fs.readlinkSync(process.execPath)); -} else { - buildDir = path.dirname(process.execPath); -} - -const ext = common.isWindows ? '.exe' : ''; -const generator = path.join(buildDir, `mkcodecache${ext}`); -if (!fs.existsSync(generator)) { - common.skip('Could not find mkcodecache'); -} - -console.log(`mkcodecache is ${generator}`); - -tmpdir.refresh(); -const dest = path.join(tmpdir.path, 'cache.cc'); - -// Run mkcodecache -const child = spawnSync(generator, [dest]); -assert.ifError(child.error); -if (child.status !== 0) { - console.log(child.stderr.toString()); - assert.strictEqual(child.status, 0); -} - -// Verifies that: -// - NativeModuleEnv::InitializeCodeCache() -// are defined in the generated code. -// See src/node_native_module_env.h for explanations. - -const rl = readline.createInterface({ - input: fs.createReadStream(dest), - crlfDelay: Infinity -}); - -let hasCacheDef = false; - -rl.on('line', common.mustCallAtLeast((line) => { - if (line.includes('InitializeCodeCache(')) { - hasCacheDef = true; - } -}, 2)); - -rl.on('close', common.mustCall(() => { - assert.ok(hasCacheDef); -})); diff --git a/test/code-cache/testcfg.py b/test/code-cache/testcfg.py deleted file mode 100644 index 0e0035dfed477b..00000000000000 --- a/test/code-cache/testcfg.py +++ /dev/null @@ -1,6 +0,0 @@ -import sys, os -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) -import testpy - -def GetConfiguration(context, root): - return testpy.ParallelTestConfiguration(context, root, 'code-cache') diff --git a/test/code-cache/test-code-cache.js b/test/parallel/test-code-cache.js similarity index 66% rename from test/code-cache/test-code-cache.js rename to test/parallel/test-code-cache.js index e179be7aee37b7..f120b76af27b68 100644 --- a/test/code-cache/test-code-cache.js +++ b/test/parallel/test-code-cache.js @@ -1,6 +1,6 @@ +// Flags: --expose-internals 'use strict'; -// Flags: --expose-internals // This test verifies that if the binary is compiled with code cache, // and the cache is used when built in modules are compiled. // Otherwise, verifies that no cache is used when compiling builtins. @@ -29,9 +29,9 @@ const loadedModules = process.moduleLoadList .filter((m) => m.startsWith('NativeModule')) .map((m) => m.replace('NativeModule ', '')); -// The binary is not configured with code cache, verifies that the builtins +// Cross-compiled binaries do not have code cache, verifies that the builtins // are all compiled without cache and we are doing the bookkeeping right. -if (process.config.variables.node_code_cache_path === undefined) { +if (process.config.variables.want_separate_host_toolset === 1) { console.log('The binary is not configured with code cache'); if (isMainThread) { assert.deepStrictEqual(compiledWithCache, new Set()); @@ -45,20 +45,27 @@ if (process.config.variables.node_code_cache_path === undefined) { // cache are hit assert.notDeepStrictEqual(compiledWithCache, new Set()); } -} else { - console.log('The binary is configured with code cache'); +} else { // Native compiled assert.strictEqual( - typeof process.config.variables.node_code_cache_path, - 'string' + process.config.variables.node_code_cache_path, + 'yes' ); + if (!isMainThread) { + for (const key of [ 'internal/bootstrap/pre_execution' ]) { + canBeRequired.add(key); + cannotBeRequired.delete(key); + } + } + + const wrong = []; for (const key of loadedModules) { - if (cannotBeRequired.has(key)) { - assert(compiledWithoutCache.has(key), - `"${key}" should've been compiled without code cache`); - } else { - assert(compiledWithCache.has(key), - `"${key}" should've been compiled with code cache`); + if (cannotBeRequired.has(key) && !compiledWithoutCache.has(key)) { + wrong.push(`"${key}" should've been compiled **without** code cache`); + } + if (canBeRequired.has(key) && !compiledWithCache.has(key)) { + wrong.push(`"${key}" should've been compiled **with** code cache`); } } + assert.strictEqual(wrong.length, 0, wrong.join('\n')); } diff --git a/vcbuild.bat b/vcbuild.bat index 73405b46ed6516..acbf42e538350e 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -190,6 +190,7 @@ if defined config_flags set configure_flags=%configure_flags% %config_flags% if defined target_arch set configure_flags=%configure_flags% --dest-cpu=%target_arch% if defined openssl_no_asm set configure_flags=%configure_flags% --openssl-no-asm if defined DEBUG_HELPER set configure_flags=%configure_flags% --verbose +if "%target_arch%"=="x86" if "%PROCESSOR_ARCHITECTURE%"=="AMD64" set configure_flags=%configure_flags% --no-cross-compiling if not exist "%~dp0deps\icu" goto no-depsicu if "%target%"=="Clean" echo deleting %~dp0deps\icu