Browse Source

fix: generate valid config.gypi (#31442)

Cheng Zhao 3 years ago
parent
commit
ad67a27dcf

+ 6 - 0
BUILD.gn

@@ -187,6 +187,12 @@ action("electron_js2c") {
          rebase_path(sources, root_build_dir)
 }
 
+action("generate_config_gypi") {
+  outputs = [ "$root_gen_dir/config.gypi" ]
+  script = "script/generate-config-gypi.py"
+  args = rebase_path(outputs) + [ target_cpu ]
+}
+
 target_gen_default_app_js = "$target_gen_dir/js/default_app"
 
 typescript_build("default_app_js") {

+ 1 - 1
patches/node/.patches

@@ -6,7 +6,6 @@ feat_initialize_asar_support.patch
 expose_get_builtin_module_function.patch
 build_add_gn_build_files.patch
 fix_add_default_values_for_variables_in_common_gypi.patch
-feat_add_new_built_with_electron_variable_to_config_gypi.patch
 feat_add_flags_for_low-level_hooks_and_exceptions.patch
 fix_expose_tracing_agent_and_use_tracing_tracingcontroller_instead.patch
 pass_all_globals_through_require.patch
@@ -29,3 +28,4 @@ add_should_read_node_options_from_env_option_to_disable_node_options.patch
 repl_fix_crash_when_sharedarraybuffer_disabled.patch
 fix_crash_creating_private_key_with_unsupported_algorithm.patch
 fix_remove_expired_dst_root_ca_x3.patch
+fix_system_python2_error.patch

+ 6 - 31
patches/node/build_add_gn_build_files.patch

@@ -7,10 +7,10 @@ This adds GN build files for Node, so we don't have to build with GYP.
 
 diff --git a/BUILD.gn b/BUILD.gn
 new file mode 100644
-index 0000000000000000000000000000000000000000..bd26c3623d3314539609a978270d3ced1d167777
+index 0000000000000000000000000000000000000000..1cbc0b10057bf6244caef4d1f8ea606b7d9479cb
 --- /dev/null
 +++ b/BUILD.gn
-@@ -0,0 +1,400 @@
+@@ -0,0 +1,392 @@
 +import("//electron/build/asar.gni")
 +import("//v8/gni/v8.gni")
 +
@@ -75,20 +75,12 @@ index 0000000000000000000000000000000000000000..bd26c3623d3314539609a978270d3ced
 +  ]
 +}
 +
-+action("generate_config_gypi") {
-+  outputs = [
-+    "$target_gen_dir/config.gypi",
-+  ]
-+  script = "tools/generate_config_gypi.py"
-+  args = rebase_path(outputs, root_build_dir)
-+}
-+
 +chdir_action("node_js2c") {
 +  deps = [
-+    ":generate_config_gypi",
++    "//electron:generate_config_gypi",
 +    ":node_js2c_inputs",
 +  ]
-+  config_gypi = [ "$target_gen_dir/config.gypi" ]
++  config_gypi = [ "$root_gen_dir/config.gypi" ]
 +  inputs = library_files + config_gypi
 +  outputs = [
 +    "$target_gen_dir/node_javascript.cc",
@@ -359,10 +351,10 @@ index 0000000000000000000000000000000000000000..bd26c3623d3314539609a978270d3ced
 +
 +copy("node_gypi_headers") {
 +  deps = [
-+    ":generate_config_gypi",
++    "//electron:generate_config_gypi",
 +  ]
 +  sources = [
-+    "$target_gen_dir/config.gypi",
++    "$root_gen_dir/config.gypi",
 +    "common.gypi",
 +  ]
 +  outputs = [
@@ -1660,23 +1652,6 @@ index 0523885212d429ee5c4142137524cb127d8adc97..116815364055a01f0c0619f0f22e9a38
  
  // The NAPI_VERSION provided by this version of the runtime. This is the version
  // which the Node binary being built supports.
-diff --git a/tools/generate_config_gypi.py b/tools/generate_config_gypi.py
-new file mode 100644
-index 0000000000000000000000000000000000000000..01f62d4ae6e3b9d539444e3dff069f0011353caa
---- /dev/null
-+++ b/tools/generate_config_gypi.py
-@@ -0,0 +1,11 @@
-+# TODO: assess which if any of the config variables are important to include in
-+# the js2c'd config.gypi.
-+import sys
-+
-+def main(args):
-+  out = args[0]
-+  with open(out, 'w') as f:
-+    f.write("{'variables':{}}\n")
-+
-+if __name__ == '__main__':
-+  main(sys.argv[1:])
 diff --git a/tools/generate_gn_filenames_json.py b/tools/generate_gn_filenames_json.py
 new file mode 100755
 index 0000000000000000000000000000000000000000..ece315d915f0a7b2c8e823caccba7ffec8420fdf

+ 0 - 21
patches/node/feat_add_new_built_with_electron_variable_to_config_gypi.patch

@@ -1,21 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Shelley Vohr <[email protected]>
-Date: Tue, 2 Oct 2018 11:39:58 -0700
-Subject: feat: add new built_with_electron variable to config.gypi
-
-This allows 3rd-party native modules to know whether they're being built
-against Electron.
-
-diff --git a/tools/generate_config_gypi.py b/tools/generate_config_gypi.py
-index 01f62d4ae6e3b9d539444e3dff069f0011353caa..d8b279f590c115108d5dca879747de7b0c9f1934 100644
---- a/tools/generate_config_gypi.py
-+++ b/tools/generate_config_gypi.py
-@@ -5,7 +5,7 @@ import sys
- def main(args):
-   out = args[0]
-   with open(out, 'w') as f:
--    f.write("{'variables':{}}\n")
-+    f.write("{'variables':{'built_with_electron': 1}}\n")
- 
- if __name__ == '__main__':
-   main(sys.argv[1:])

+ 81 - 0
patches/node/fix_system_python2_error.patch

@@ -0,0 +1,81 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: himself65 <[email protected]>
+Date: Thu, 8 Jul 2021 00:19:00 +0800
+Subject: build: add `library_files` to gyp variables
+
+GYP uses the system path when parsing node.gyp;
+However, if system python is different from our
+gyp runtime python, like '2.7', gyp would crash.
+
+PR-URL: https://github.com/nodejs/node/pull/39293
+
+diff --git a/configure.py b/configure.py
+index d69c52521d80fb3a24f79bcc4d4a364aceb6fa81..1e9ee8adf3cc687c2f832da42dbae78cf5de9da9 100755
+--- a/configure.py
++++ b/configure.py
+@@ -45,6 +45,7 @@ import getmoduleversion
+ import getnapibuildversion
+ import getsharedopensslhasquic
+ from gyp_node import run_gyp
++from utils import SearchFiles
+ 
+ # parse our options
+ parser = argparse.ArgumentParser()
+@@ -1155,6 +1156,8 @@ def gcc_version_ge(version_checked):
+       return False
+   return True
+ 
++def configure_node_lib_files(o):
++  o['variables']['node_library_files'] = SearchFiles('lib', 'js')
+ 
+ def configure_node(o):
+   if options.dest_os == 'android':
+@@ -1903,6 +1906,7 @@ if (options.dest_os):
+ flavor = GetFlavor(flavor_params)
+ 
+ configure_node(output)
++configure_node_lib_files(output)
+ configure_napi(output)
+ configure_library('zlib', output)
+ configure_library('http_parser', output)
+diff --git a/node.gyp b/node.gyp
+index 691ce22ff3d664f9a7a9fb8a6885d68e2e84e23c..be50b280fc59467e5668561bc61422c1c7ca4492 100644
+--- a/node.gyp
++++ b/node.gyp
+@@ -33,7 +33,7 @@
+     # Windows command length limit or there would be an error.
+     # See https://docs.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/command-line-string-limitation
+     'library_files': [
+-      '<!@(python tools/search_files.py --ext js lib)',
++      '<@(node_library_files)',
+     ],
+     'deps_files': [
+       'deps/v8/tools/splaytree.mjs',
+diff --git a/tools/search_files.py b/tools/search_files.py
+deleted file mode 100644
+index e236eee47dc8522c99a3b9d5d0c6c058e855a0e2..0000000000000000000000000000000000000000
+--- a/tools/search_files.py
++++ /dev/null
+@@ -1,22 +0,0 @@
+-#!/usr/bin/env python
+-
+-"""
+-This is a utility for recursively searching files under
+-a specified directory
+-"""
+-
+-import argparse
+-import utils
+-
+-def main():
+-  parser = argparse.ArgumentParser(
+-    description='Search files with a specific extension under a directory',
+-    fromfile_prefix_chars='@'
+-  )
+-  parser.add_argument('--ext', required=True, help='extension to search for')
+-  parser.add_argument('directory', help='input directory')
+-  options = parser.parse_args()
+-  print('\n'.join(utils.SearchFiles(options.directory, options.ext)))
+-
+-if __name__ == "__main__":
+-  main()

+ 65 - 0
script/generate-config-gypi.py

@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+import ast
+import os
+import pprint
+import re
+import subprocess
+import sys
+
+ELECTRON_DIR = os.path.abspath(os.path.join(__file__, '..', '..'))
+NODE_DIR = os.path.join(ELECTRON_DIR, '..', 'third_party', 'electron_node')
+
+def run_node_configure(target_cpu):
+  configure = os.path.join(NODE_DIR, 'configure.py')
+  args = ['--dest-cpu', target_cpu]
+  # Enabled in Chromium's V8.
+  if target_cpu == 'arm64' or target_cpu == 'x64':
+    args += ['--experimental-enable-pointer-compression']
+  # Work around "No acceptable ASM compiler found" error on some Windows
+  # machines, it breaks nothing since Electron does not use OpenSSL.
+  if sys.platform == 'win32':
+    args += ['--openssl-no-asm']
+  subprocess.check_call([sys.executable, configure] + args)
+
+def read_node_config_gypi():
+  config_gypi = os.path.join(NODE_DIR, 'config.gypi')
+  with open(config_gypi, 'r') as f:
+    content = f.read()
+    return ast.literal_eval(content)
+
+def read_electron_args():
+  all_gn = os.path.join(ELECTRON_DIR, 'build', 'args', 'all.gn')
+  args = {}
+  with open(all_gn, 'r') as f:
+    for line in f:
+      if line.startswith('#'):
+        continue
+      m = re.match('([\w_]+) = (.+)', line)
+      if m == None:
+        continue
+      args[m.group(1)] = m.group(2)
+  return args
+
+def main(target_file, target_cpu):
+  run_node_configure(target_cpu)
+  config = read_node_config_gypi()
+  args = read_electron_args()
+
+  # Remove the generated config.gypi to make the parallel/test-process-config
+  # test pass.
+  os.remove(os.path.join(NODE_DIR, 'config.gypi'))
+
+  v = config['variables']
+  # Electron specific variables:
+  v['built_with_electron'] = 1
+  v['node_module_version'] = int(args['node_module_version'])
+  # Used by certain versions of node-gyp.
+  v['build_v8_with_gn'] = 'false'
+
+  with open(target_file, 'w+') as f:
+    f.write(pprint.pformat(config, indent=2))
+
+if __name__ == '__main__':
+  sys.exit(main(*sys.argv[1:]))