diff --git a/.gitignore b/.gitignore index dad5a3efd8bcae..bb06dde333aec0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,8 +35,6 @@ node node_g *.swp .benchmark_reports -icu_config.gypi -.eslintcache node_trace.*.log coverage/ !**/node_modules/**/coverage @@ -50,11 +48,11 @@ Release/ !**/node_modules/**/release !doc/blog/** *.sln -!nodemsi.sln +!tools/msvs/msi/nodemsi.sln *.suo *.vcproj *.vcxproj -!custom_actions.vcxproj +!tools/msvs/msi/custom_actions.vcxproj *.vcxproj.user *.vcxproj.filters UpgradeLog*.XML @@ -64,12 +62,12 @@ ipch/ *.opensdf *.VC.db *.VC.opendb -.vs/ -.vscode/ /*.exe /config.mk +/config.json /config.gypi +/icu_config.gypi /config.status /config_fips.gypi *-nodegyp* @@ -115,7 +113,6 @@ tools/doc/node_modules tools/clang-format/node_modules # test artifacts -icu_config.gypi *.tap # Xcode workspaces and project folders diff --git a/Makefile b/Makefile index 7ab4a3c70f6e7b..c697d7bd483acf 100644 --- a/Makefile +++ b/Makefile @@ -163,7 +163,7 @@ clean: ## Remove build artifacts. .PHONY: distclean distclean: $(RM) -r out - $(RM) config.gypi icu_config.gypi config_fips.gypi + $(RM) config.gypi icu_config.gypi config_fips.gypi config.json $(RM) config.mk $(RM) -r $(NODE_EXE) $(NODE_G_EXE) $(RM) -r node_modules diff --git a/configure.py b/configure.py index 5a7cade60cb657..51b6b7368e50da 100755 --- a/configure.py +++ b/configure.py @@ -1268,10 +1268,15 @@ def configure_static(o): o['libraries'] += ['-static-libasan'] -def write(filename, data): +def write(filename, data, dumpVerbose=False, isJson=False): print_verbose('creating %s' % filename) - with open(filename, 'w+') as f: - f.write(data) + if dumpVerbose: + print_verbose(data) + with open(filename, 'w+') as fh: + if isJson: + json.dump(data, fh, indent=2, sort_keys=True) + else: + fh.write(data) do_not_edit = '# Do not edit. Generated by the configure script.\n' @@ -1639,20 +1644,25 @@ def make_bin_override(): else: make_global_settings = False +write('config.json', variables, dumpVerbose=True, isJson=True) + output = { - 'variables': variables, 'target_defaults': output, + 'variables': { + 'includes': [ 'config.json' ], + }, } if make_global_settings: output['make_global_settings'] = make_global_settings -print_verbose(output) - -write('config.gypi', do_not_edit + - pprint.pformat(output, indent=2) + '\n') +config_gypi = do_not_edit + pprint.pformat(output, indent=2) + '\n' +write('config.gypi', config_gypi, dumpVerbose=True) -write('config.status', '#!/bin/sh\nset -x\nexec ./configure ' + - ' '.join([pipes.quote(arg) for arg in original_argv]) + '\n') +config_status = """#!/bin/sh +set -x +exec ./configure %s +""" % ' '.join([pipes.quote(arg) for arg in original_argv]) +write('config.status', config_status) os.chmod('config.status', 0o775) config = { @@ -1664,14 +1674,14 @@ def make_bin_override(): if options.prefix: config['PREFIX'] = options.prefix -config = '\n'.join(['='.join(item) for item in config.items()]) + '\n' +config_mk = do_not_edit + '\n'.join(['='.join(item) for item in config.items()]) + '\n' # On Windows there's no reason to search for a different python binary. bin_override = None if sys.platform == 'win32' else make_bin_override() if bin_override: - config = 'export PATH:=' + bin_override + ':$(PATH)\n' + config + config_mk = 'export PATH:=' + bin_override + ':$(PATH)\n' + config_mk -write('config.mk', do_not_edit + config) +write('config.mk', config_mk) gyp_args = ['--no-parallel'] diff --git a/src/node_native_module.h b/src/node_native_module.h index be1fc92a7672f3..92c52f20c72663 100644 --- a/src/node_native_module.h +++ b/src/node_native_module.h @@ -73,6 +73,7 @@ class NativeModuleLoader { // Generated by tools/js2c.py as node_javascript.cc void LoadJavaScriptSource(); // Loads data into source_ UnionBytes GetConfig(); // Return data for config.gypi + UnionBytes GetBuildConfig(); // Return data for config.json // Generated by tools/generate_code_cache.js as node_code_cache.cc when // the build is configured with --code-cache-path=.... They are noops diff --git a/tools/install.py b/tools/install.py index 3befec213b1ce6..00f5fab2d3f57d 100755 --- a/tools/install.py +++ b/tools/install.py @@ -1,28 +1,21 @@ #!/usr/bin/env python from __future__ import print_function -import ast import errno +import json import os -import re import shutil import sys -from getmoduleversion import get_version # set at init time node_prefix = '/usr/local' # PREFIX variable from Makefile install_path = None # base target directory (DESTDIR + PREFIX from Makefile) -target_defaults = None variables = None def abspath(*args): path = os.path.join(*args) return os.path.abspath(path) -def load_config(): - s = open('config.gypi').read() - return ast.literal_eval(s) - def try_unlink(path): try: os.unlink(path) @@ -173,6 +166,7 @@ def ignore_inspector_headers(files, dest): action([ 'common.gypi', 'config.gypi', + 'config.json', 'src/node.h', 'src/node_api.h', 'src/js_native_api.h', @@ -205,14 +199,12 @@ def ignore_inspector_headers(files, dest): ], 'include/node/') def run(args): - global node_prefix, install_path, target_defaults, variables + global node_prefix, install_path, variables # chdir to the project's top-level directory os.chdir(abspath(os.path.dirname(__file__), '..')) - conf = load_config() - variables = conf['variables'] - target_defaults = conf['target_defaults'] + variables = json.load('config.json') # argv[2] is a custom install prefix for packagers (think DESTDIR) # argv[3] is a custom install prefix (think PREFIX) diff --git a/tools/js2c.py b/tools/js2c.py index eff44940c57ec6..35c96c14d7d9ed 100755 --- a/tools/js2c.py +++ b/tools/js2c.py @@ -193,6 +193,10 @@ def ReadMacros(lines): return UnionBytes(config_raw, arraysize(config_raw)); // config.gypi }} +UnionBytes NativeModuleLoader::GetBuildConfig() {{ + return UnionBytes(build_config_raw, arraysize(build_config_raw)); // config.json +}} + }} // namespace native_module }} // namespace node @@ -271,12 +275,19 @@ def AddModule(module, source): # later on anyway, so get it out of the way now if name.endswith('.gypi'): # Currently only config.gypi is allowed - assert name == 'config.gypi' - lines = re.sub(r'\'true\'', 'true', lines) - lines = re.sub(r'\'false\'', 'false', lines) + assert name.endswith('config.gypi') + config_filename = str(name).replace('gypi', 'json') + config = ReadFile(config_filename) + config = re.sub('"true"', 'true', config) + config = re.sub('"false"', 'false', config) + print(config) + config_definition = GetDefinition('build_config_raw', config) + definitions.append(config_definition) + lines = lines.replace("{ 'includes': ['config.json']}", config) lines = re.sub(r'#.*?\n', '', lines) - lines = re.sub(r'\'', '"', lines) + lines = re.sub("'", '"', lines) definition = GetDefinition('config_raw', lines) + print(lines) definitions.append(definition) else: AddModule(name.split('.', 1)[0], lines)