From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jeremy Apthorp <nornagon@nornagon.net>
Date: Tue, 26 Feb 2019 17:07:45 -0800
Subject: build: add GN build files

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..ec06e14dd327cdf89dc6fd584b6972ae64311ea0
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,370 @@
+import("//electron/build/asar.gni")
+import("//v8/gni/v8.gni")
+
+declare_args() {
+  # Enable the V8 inspector protocol for use with node.
+  node_enable_inspector = true
+
+  # Build node with SSL support.
+  # The variable is called "openssl" for parity with node's GYP build.
+  node_use_openssl = true
+
+  # Use the specified path to system CA (PEM format) in addition to
+  # the BoringSSL supplied CA store or compiled-in Mozilla CA copy.
+  node_openssl_system_ca_path = ""
+
+  # Initialize v8 platform during node.js startup.
+  # NB. this must be turned off in Electron, because Electron initializes the
+  # v8 platform itself.
+  node_use_v8_platform = false
+
+  # Build with DTrace support.
+  node_use_dtrace = false
+
+  # Build with ETW support.
+  node_use_etw = false
+
+  # Build JavaScript in lib/ with DCHECK macros.
+  node_debug_lib = false
+
+  # Custom build tag.
+  node_tag = ""
+
+  # V8 options to pass, see `node --v8-options` for examples
+  node_v8_options = ""
+
+  # Provide a custom URL prefix for the `process.release` properties
+  # `sourceUrl` and `headersUrl`. When compiling a release build, this will
+  # default to https://nodejs.org/download/release/')
+  node_release_urlbase = ""
+
+  # Allows embedders to override the NODE_MODULE_VERSION define
+  node_module_version = ""
+}
+
+assert(!node_use_dtrace, "node_use_dtrace not supported in GN")
+assert(!node_use_etw, "node_use_etw not supported in GN")
+
+assert(!node_enable_inspector || node_use_openssl,
+       "node_enable_inspector requires node_use_openssl")
+
+config("node_internals") {
+  defines = [ "NODE_WANT_INTERNALS=1" ]
+}
+
+node_files = read_file("filenames.json", "json")
+library_files = node_files.library_files
+
+copy("node_js2c_inputs") {
+  sources = library_files
+  outputs = [
+    "$target_gen_dir/js2c_inputs/{{source_target_relative}}",
+  ]
+}
+
+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",
+    ":node_js2c_inputs",
+  ]
+
+  macro_inputs = []
+  if (!node_use_dtrace && !node_use_etw) {
+    macro_inputs += [ "tools/js2c_macros/notrace_macros.py" ]
+  }
+  if (node_debug_lib) {
+    macro_inputs += [ "tools/js2c_macros/nodcheck_macros.py" ]
+  } else {
+    macro_inputs += [ "tools/js2c_macros/dcheck_macros.py" ]
+  }
+  macro_inputs += [ "tools/js2c_macros/check_macros.py" ]
+
+  config_gypi = [ "$target_gen_dir/config.gypi" ]
+
+  inputs = library_files + macro_inputs + config_gypi
+  outputs = [
+    "$target_gen_dir/node_javascript.cc",
+  ]
+
+  cwd = "$target_gen_dir/js2c_inputs"
+  script = "tools/js2c.py"
+  args = library_files + rebase_path(macro_inputs + config_gypi) + ["--target"] + rebase_path(outputs)
+}
+
+config("node_features") {
+  defines = []
+  if (node_enable_inspector) {
+    defines += [ "HAVE_INSPECTOR=1" ]
+  } else {
+    defines += [ "HAVE_INSPECTOR=0" ]
+  }
+  if (node_use_openssl) {
+    defines += [ "HAVE_OPENSSL=1" ]
+  } else {
+    defines += [ "HAVE_OPENSSL=0" ]
+  }
+  # boringssl does not support SSL_trace, let's disable it
+  defines += ["OPENSSL_NO_SSL_TRACE=1"]
+  if (v8_enable_i18n_support) {
+    defines += [ "NODE_HAVE_I18N_SUPPORT=1" ]
+  } else {
+    defines += [ "NODE_HAVE_I18N_SUPPORT=0" ]
+  }
+  if (node_use_v8_platform) {
+    defines += [ "NODE_USE_V8_PLATFORM=1" ]
+  } else {
+    defines += [ "NODE_USE_V8_PLATFORM=0" ]
+  }
+}
+
+config("node_lib_config") {
+  include_dirs = [ "src" ]
+
+  # FIXME(deepak1556): include paths should be corrected,
+  # refer https://docs.google.com/presentation/d/1oxNHaVjA9Gn_rTzX6HIpJHP7nXRua_0URXxxJ3oYRq0/edit#slide=id.g71ecd450e_2_702
+  cflags = [ "-Wno-microsoft-include" ]
+
+  configs = [ ":node_features" ]
+
+  if (is_debug) {
+    defines = [ "DEBUG" ]
+  }
+}
+
+config("node_internal_config") {
+  visibility = [
+    ":*",
+    "src/inspector:*",
+  ]
+  defines = [
+    "NODE_WANT_INTERNALS=1",
+    "NODE_IMPLEMENTATION",
+  ]
+  if (node_module_version != "") {
+    defines += [ "NODE_MODULE_VERSION=" + node_module_version ]
+  }
+  if (is_component_build) {
+    defines += [
+      "NODE_SHARED_MODE",
+    ]
+  }
+
+  if (target_cpu == "x86") {
+    node_arch = "ia32"
+  } else {
+    node_arch = target_cpu
+  }
+  defines += [ "NODE_ARCH=\"$node_arch\"" ]
+
+  if (target_os == "win") {
+    node_platform = "win32"
+  } else if (target_os == "mac") {
+    node_platform = "darwin"
+  } else {
+    node_platform = target_os
+  }
+  defines += [ "NODE_PLATFORM=\"$node_platform\"" ]
+
+  if (is_win) {
+    defines += [
+      "NOMINMAX",
+      "_UNICODE=1",
+    ]
+  } else {
+    defines += [ "__POSIX__" ]
+  }
+
+  if (node_tag != "") {
+    defines += [ "NODE_TAG=\"$node_tag\"" ]
+  }
+  if (node_v8_options != "") {
+    defines += [ "NODE_V8_OPTIONS=\"$node_v8_options\"" ]
+  }
+  if (node_release_urlbase != "") {
+    defines += [ "NODE_RELEASE_URLBASE=\"$node_release_urlbase\"" ]
+  }
+
+  if (node_use_openssl) {
+    defines += [
+      "NODE_OPENSSL_SYSTEM_CERT_PATH=\"$node_openssl_system_ca_path\"",
+      "EVP_CTRL_CCM_SET_TAG=EVP_CTRL_GCM_SET_TAG",
+    ]
+  }
+}
+
+component("node_lib") {
+  deps = [
+    ":node_js2c",
+    "deps/cares",
+    "deps/histogram",
+    "deps/http_parser",
+    "deps/llhttp",
+    "deps/nghttp2",
+    "deps/zlib",
+    "//third_party/brotli:dec",
+    "//third_party/brotli:enc",
+    "//v8:v8_libplatform",
+  ]
+  public_deps = [
+    "deps/uv",
+    "//electron:electron_js2c",
+    "//v8",
+  ]
+  configs += [ ":node_internal_config" ]
+  public_configs = [ ":node_lib_config" ]
+  include_dirs = [ "src" ]
+  libs = []
+  cflags_cc = [
+    "-Wno-deprecated-declarations",
+    "-Wno-implicit-fallthrough",
+    "-Wno-return-type",
+    "-Wno-sometimes-uninitialized",
+    "-Wno-string-plus-int",
+    "-Wno-unused-function",
+    "-Wno-unused-label",
+    "-Wno-unused-private-field",
+    "-Wno-unused-variable",
+  ]
+
+  if (v8_enable_i18n_support) {
+    deps += [ "//third_party/icu" ]
+  }
+
+  sources = node_files.node_sources
+  sources += [
+    "$root_gen_dir/electron_natives.cc",
+    "$target_gen_dir/node_javascript.cc",
+    "src/node_code_cache_stub.cc",
+    "src/node_snapshot_stub.cc",
+  ]
+
+  if (is_win) {
+    libs += [ "psapi.lib" ]
+  }
+  if (is_mac) {
+    libs += [ "CoreFoundation.framework" ]
+  }
+
+  if (node_enable_inspector) {
+    sources += [
+      "src/inspector_agent.cc",
+      "src/inspector_agent.h",
+      "src/inspector_io.cc",
+      "src/inspector_io.h",
+      "src/inspector_js_api.cc",
+      "src/inspector_profiler.cc",
+      "src/inspector_socket.cc",
+      "src/inspector_socket.h",
+      "src/inspector_socket_server.cc",
+      "src/inspector_socket_server.h",
+    ]
+    deps += [ "src/inspector" ]
+  }
+
+  if (node_use_openssl) {
+    deps += [ "//third_party/boringssl" ]
+    sources += [
+      "src/node_crypto.cc",
+      "src/node_crypto.h",
+      "src/node_crypto_bio.cc",
+      "src/node_crypto_bio.h",
+      "src/node_crypto_clienthello-inl.h",
+      "src/node_crypto_clienthello.cc",
+      "src/node_crypto_clienthello.h",
+      "src/node_crypto_groups.h",
+      "src/tls_wrap.cc",
+      "src/tls_wrap.h",
+    ]
+    cflags_cc += [ "-Wno-sign-compare" ]
+  }
+}
+
+##### node_headers
+
+node_headers_dir = "$root_gen_dir/node_headers"
+
+header_group_index = 0
+header_groups = []
+foreach(header_group, node_files.headers) {
+  copy("node_headers_${header_group_index}") {
+    sources = header_group.files
+    outputs = [
+      "$node_headers_dir/${header_group.dest_dir}/{{source_file_part}}",
+    ]
+  }
+  header_groups += [ ":node_headers_${header_group_index}" ]
+  header_group_index += 1
+}
+
+copy("zlib_headers") {
+  sources = [
+    "deps/zlib/zconf.h",
+    "deps/zlib/zlib.h",
+  ]
+  outputs = [
+    "$node_headers_dir/include/node/{{source_file_part}}",
+  ]
+}
+
+copy("node_gypi_headers") {
+  deps = [
+    ":generate_config_gypi",
+  ]
+  sources = [
+    "$target_gen_dir/config.gypi",
+    "common.gypi",
+  ]
+  outputs = [
+    "$node_headers_dir/include/node/{{source_file_part}}",
+  ]
+}
+
+action("node_version_header") {
+  inputs = [
+    "src/node_version.h",
+  ]
+  outputs = [
+    "$node_headers_dir/include/node/node_version.h",
+  ]
+  script = "tools/generate_node_version_header.py"
+  args = [ rebase_path("src/node_version.h"), rebase_path(outputs[0]) ]
+  if (node_module_version != "") {
+    args += [ "$node_module_version" ]
+  }
+}
+
+action("tar_headers") {
+  deps = [
+    ":copy_headers",
+  ]
+  outputs = [
+    "$root_gen_dir/node_headers.tar.gz",
+  ]
+  script = "tools/tar.py"
+  args = [
+    rebase_path("$root_gen_dir/node_headers"),
+    rebase_path(outputs[0]),
+  ]
+}
+
+group("copy_headers") {
+  public_deps = header_groups + [
+                  ":zlib_headers",
+                  ":node_gypi_headers",
+                  ":node_version_header",
+                ]
+}
+
+group("headers") {
+  public_deps = [
+    ":tar_headers",
+  ]
+}
diff --git a/deps/cares/BUILD.gn b/deps/cares/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..0b7737ca061ae6a12647f5d7bf0c2d1bc7d5bdd9
--- /dev/null
+++ b/deps/cares/BUILD.gn
@@ -0,0 +1,126 @@
+config("cares_config") {
+  include_dirs = [ "include" ]
+}
+static_library("cares") {
+  defines = [ "CARES_STATICLIB" ]
+  include_dirs = [
+    "include",
+    "src",
+  ]
+  public_configs = [ ":cares_config" ]
+
+  libs = []
+  cflags_c = [
+    "-Wno-logical-not-parentheses",
+    "-Wno-sign-compare",
+  ]
+
+  sources = [
+    "include/ares.h",
+    "include/ares_rules.h",
+    "include/ares_version.h",
+    "include/nameser.h",
+    "src/ares__close_sockets.c",
+    "src/ares__get_hostent.c",
+    "src/ares__read_line.c",
+    "src/ares__timeval.c",
+    "src/ares_android.c",
+    "src/ares_cancel.c",
+    "src/ares_create_query.c",
+    "src/ares_data.c",
+    "src/ares_data.h",
+    "src/ares_destroy.c",
+    "src/ares_dns.h",
+    "src/ares_expand_name.c",
+    "src/ares_expand_string.c",
+    "src/ares_fds.c",
+    "src/ares_free_hostent.c",
+    "src/ares_free_string.c",
+    "src/ares_getenv.h",
+    "src/ares_gethostbyaddr.c",
+    "src/ares_gethostbyname.c",
+    "src/ares_getnameinfo.c",
+    "src/ares_getopt.c",
+    "src/ares_getopt.h",
+    "src/ares_getsock.c",
+    "src/ares_inet_net_pton.h",
+    "src/ares_init.c",
+    "src/ares_ipv6.h",
+    "src/ares_library_init.c",
+    "src/ares_library_init.h",
+    "src/ares_llist.c",
+    "src/ares_llist.h",
+    "src/ares_mkquery.c",
+    "src/ares_nowarn.c",
+    "src/ares_nowarn.h",
+    "src/ares_options.c",
+    "src/ares_parse_a_reply.c",
+    "src/ares_parse_aaaa_reply.c",
+    "src/ares_parse_mx_reply.c",
+    "src/ares_parse_naptr_reply.c",
+    "src/ares_parse_ns_reply.c",
+    "src/ares_parse_ptr_reply.c",
+    "src/ares_parse_soa_reply.c",
+    "src/ares_parse_srv_reply.c",
+    "src/ares_parse_txt_reply.c",
+    "src/ares_platform.h",
+    "src/ares_private.h",
+    "src/ares_process.c",
+    "src/ares_query.c",
+    "src/ares_search.c",
+    "src/ares_send.c",
+    "src/ares_setup.h",
+    "src/ares_strcasecmp.c",
+    "src/ares_strcasecmp.h",
+    "src/ares_strdup.c",
+    "src/ares_strdup.h",
+    "src/ares_strerror.c",
+    "src/ares_strsplit.c",
+    "src/ares_timeout.c",
+    "src/ares_version.c",
+    "src/ares_writev.c",
+    "src/ares_writev.h",
+    "src/bitncmp.c",
+    "src/bitncmp.h",
+    "src/inet_net_pton.c",
+    "src/inet_ntop.c",
+    "src/setup_once.h",
+  ]
+
+  if (!is_win) {
+    defines += [
+      "_DARWIN_USE_64_BIT_INODE=1",
+      "_LARGEFILE_SOURCE",
+      "_FILE_OFFSET_BITS=64",
+      "_GNU_SOURCE",
+    ]
+  }
+
+  if (is_win) {
+    defines += [ "CARES_PULL_WS2TCPIP_H=1" ]
+    include_dirs += [ "config/win32" ]
+    sources += [
+      "src/ares_getenv.c",
+      "src/ares_iphlpapi.h",
+      "src/ares_platform.c",
+      "src/config-win32.h",
+      "src/windows_port.c",
+    ]
+    libs += [
+      "ws2_32.lib",
+      "iphlpapi.lib",
+    ]
+  } else {
+    defines += [ "HAVE_CONFIG_H" ]
+  }
+
+  if (is_linux) {
+    include_dirs += [ "config/linux" ]
+    sources += [ "config/linux/ares_config.h" ]
+  }
+
+  if (is_mac) {
+    include_dirs += [ "config/darwin" ]
+    sources += [ "config/darwin/ares_config.h" ]
+  }
+}
diff --git a/deps/histogram/BUILD.gn b/deps/histogram/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..e741a2a9c238a782a674ddcb9a1f98de5b36db79
--- /dev/null
+++ b/deps/histogram/BUILD.gn
@@ -0,0 +1,17 @@
+config("histogram_config") {
+  include_dirs = [ "src" ]
+
+  cflags = [
+    "-Wno-implicit-function-declaration",
+    "-Wno-incompatible-pointer-types",
+  ]
+}
+
+static_library("histogram") {
+  public_configs = [ ":histogram_config" ]
+
+  sources = [
+    "src/hdr_histogram.c",
+    "src/hdr_histogram.h",
+  ]
+}
diff --git a/deps/http_parser/BUILD.gn b/deps/http_parser/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..da9e2b42dccacc1ed9b00202c1ff73ebc60d0e8a
--- /dev/null
+++ b/deps/http_parser/BUILD.gn
@@ -0,0 +1,13 @@
+config("http_parser_config") {
+  defines = [ "HTTP_PARSER_STRICT=0" ]
+  include_dirs = [ "." ]
+}
+
+static_library("http_parser") {
+  include_dirs = [ "." ]
+  public_configs = [ ":http_parser_config" ]
+  cflags_c = [ "-Wno-string-conversion" ]
+  sources = [
+    "http_parser.c",
+  ]
+}
diff --git a/deps/llhttp/BUILD.gn b/deps/llhttp/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..ce15bc57093caa1bd84ea77e7438e892fb916427
--- /dev/null
+++ b/deps/llhttp/BUILD.gn
@@ -0,0 +1,14 @@
+config("llhttp_config") {
+  include_dirs = [ "include" ]
+  cflags = [ "-Wno-unreachable-code" ]
+}
+
+static_library("llhttp") {
+  include_dirs = [ "include" ]
+  public_configs = [ ":llhttp_config" ]
+  sources = [
+    "src/api.c",
+    "src/http.c",
+    "src/llhttp.c",
+  ]
+}
diff --git a/deps/nghttp2/BUILD.gn b/deps/nghttp2/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..66af819990b338caa49ca59d1fe6c5ad61816d05
--- /dev/null
+++ b/deps/nghttp2/BUILD.gn
@@ -0,0 +1,46 @@
+config("nghttp2_config") {
+  defines = [ "NGHTTP2_STATICLIB" ]
+  include_dirs = [ "lib/includes" ]
+}
+static_library("nghttp2") {
+  public_configs = [ ":nghttp2_config" ]
+  defines = [
+    "_U_",
+    "BUILDING_NGHTTP2",
+    "NGHTTP2_STATICLIB",
+  ]
+  include_dirs = [ "lib/includes" ]
+  if (is_win) {
+    defines += [ "HAVE_CONFIG_H" ]
+  }
+
+  cflags_c = [
+    "-Wno-implicit-function-declaration",
+    "-Wno-string-plus-int",
+  ]
+
+  sources = [
+    "lib/nghttp2_buf.c",
+    "lib/nghttp2_callbacks.c",
+    "lib/nghttp2_debug.c",
+    "lib/nghttp2_frame.c",
+    "lib/nghttp2_hd.c",
+    "lib/nghttp2_hd_huffman.c",
+    "lib/nghttp2_hd_huffman_data.c",
+    "lib/nghttp2_helper.c",
+    "lib/nghttp2_http.c",
+    "lib/nghttp2_map.c",
+    "lib/nghttp2_mem.c",
+    "lib/nghttp2_npn.c",
+    "lib/nghttp2_option.c",
+    "lib/nghttp2_outbound_item.c",
+    "lib/nghttp2_pq.c",
+    "lib/nghttp2_priority_spec.c",
+    "lib/nghttp2_queue.c",
+    "lib/nghttp2_rcbuf.c",
+    "lib/nghttp2_session.c",
+    "lib/nghttp2_stream.c",
+    "lib/nghttp2_submit.c",
+    "lib/nghttp2_version.c",
+  ]
+}
diff --git a/deps/uv/BUILD.gn b/deps/uv/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..c90d5d9cf767c1460a549a993ad8a1ad16792703
--- /dev/null
+++ b/deps/uv/BUILD.gn
@@ -0,0 +1,186 @@
+config("libuv_config") {
+  include_dirs = [ "include" ]
+
+  defines = []
+
+  if (is_linux) {
+    defines += [ "_POSIX_C_SOURCE=200112" ]
+  }
+  if (!is_win) {
+    defines += [
+      "_LARGEFILE_SOURCE",
+      "_FILE_OFFSET_BITS=64",
+    ]
+  }
+  if (is_mac) {
+    defines += [ "_DARWIN_USE_64_BIT_INODE=1" ]
+  }
+}
+
+static_library("uv") {
+  include_dirs = [
+    "include",
+    "src",
+  ]
+
+  public_configs = [ ":libuv_config" ]
+
+  ldflags = []
+
+  defines = []
+
+  # This only has an effect on Windows, where it will cause libuv's symbols to be exported in node.lib
+  defines += [ "BUILDING_UV_SHARED=1" ]
+
+  cflags_c = [
+    "-Wno-bitwise-op-parentheses",
+    "-Wno-implicit-function-declaration",
+    "-Wno-missing-braces",
+    "-Wno-sign-compare",
+    "-Wno-sometimes-uninitialized",
+    "-Wno-string-conversion",
+    "-Wno-switch",
+    "-Wno-unused-function",
+    "-Wno-unused-variable",
+    "-Wno-unreachable-code",
+  ]
+
+  libs = []
+
+  sources = [
+    "include/uv.h",
+    "include/uv/errno.h",
+    "include/uv/threadpool.h",
+    "include/uv/tree.h",
+    "include/uv/version.h",
+    "src/fs-poll.c",
+    "src/heap-inl.h",
+    "src/idna.c",
+    "src/idna.h",
+    "src/inet.c",
+    "src/queue.h",
+    "src/strscpy.c",
+    "src/strscpy.h",
+    "src/threadpool.c",
+    "src/timer.c",
+    "src/uv-common.c",
+    "src/uv-common.h",
+    "src/uv-data-getter-setters.c",
+    "src/version.c",
+  ]
+
+  if (is_win) {
+    defines += [ "_GNU_SOURCE" ]
+    sources += [
+      "include/uv/win.h",
+      "src/win/async.c",
+      "src/win/atomicops-inl.h",
+      "src/win/core.c",
+      "src/win/detect-wakeup.c",
+      "src/win/dl.c",
+      "src/win/error.c",
+      "src/win/fs-event.c",
+      "src/win/fs.c",
+      "src/win/getaddrinfo.c",
+      "src/win/getnameinfo.c",
+      "src/win/handle-inl.h",
+      "src/win/handle.c",
+      "src/win/internal.h",
+      "src/win/loop-watcher.c",
+      "src/win/pipe.c",
+      "src/win/poll.c",
+      "src/win/process-stdio.c",
+      "src/win/process.c",
+      "src/win/req-inl.h",
+      "src/win/signal.c",
+      "src/win/snprintf.c",
+      "src/win/stream-inl.h",
+      "src/win/stream.c",
+      "src/win/tcp.c",
+      "src/win/thread.c",
+      "src/win/tty.c",
+      "src/win/udp.c",
+      "src/win/util.c",
+      "src/win/winapi.c",
+      "src/win/winapi.h",
+      "src/win/winsock.c",
+      "src/win/winsock.h",
+    ]
+    libs += [
+      "advapi32.lib",
+      "iphlpapi.lib",
+      "psapi.lib",
+      "shell32.lib",
+      "user32.lib",
+      "userenv.lib",
+      "ws2_32.lib",
+    ]
+  } else {
+    sources += [
+      "include/uv/aix.h",
+      "include/uv/bsd.h",
+      "include/uv/darwin.h",
+      "include/uv/linux.h",
+      "include/uv/sunos.h",
+      "include/uv/unix.h",
+      "src/unix/async.c",
+      "src/unix/atomic-ops.h",
+      "src/unix/core.c",
+      "src/unix/dl.c",
+      "src/unix/fs.c",
+      "src/unix/getaddrinfo.c",
+      "src/unix/getnameinfo.c",
+      "src/unix/internal.h",
+      "src/unix/loop-watcher.c",
+      "src/unix/loop.c",
+      "src/unix/pipe.c",
+      "src/unix/poll.c",
+      "src/unix/process.c",
+      "src/unix/pthread-fixes.c",
+      "src/unix/signal.c",
+      "src/unix/spinlock.h",
+      "src/unix/stream.c",
+      "src/unix/tcp.c",
+      "src/unix/thread.c",
+      "src/unix/tty.c",
+      "src/unix/udp.c",
+    ]
+    libs += [ "m" ]
+    ldflags += [ "-pthread" ]
+  }
+  if (is_mac || is_linux) {
+    sources += [ "src/unix/proctitle.c" ]
+  }
+  if (is_mac) {
+    sources += [
+      "src/unix/darwin-proctitle.c",
+      "src/unix/darwin.c",
+      "src/unix/fsevents.c",
+    ]
+    defines += [
+      "_DARWIN_USE_64_BIT_INODE=1",
+      "_DARWIN_UNLIMITED_SELECT=1",
+    ]
+  }
+  if (is_linux) {
+    defines += [ "_GNU_SOURCE" ]
+    sources += [
+      "src/unix/linux-core.c",
+      "src/unix/linux-inotify.c",
+      "src/unix/linux-syscalls.c",
+      "src/unix/linux-syscalls.h",
+      "src/unix/procfs-exepath.c",
+      "src/unix/sysinfo-loadavg.c",
+    ]
+    libs += [
+      "dl",
+      "rt",
+    ]
+  }
+  if (is_mac) {  # is_bsd
+    sources += [
+      "src/unix/bsd-ifaddrs.c",
+      "src/unix/kqueue.c",
+    ]
+  }
+}
diff --git a/deps/zlib/BUILD.gn b/deps/zlib/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..f13b471d17128468bed06e66bd03a2eaaea76280
--- /dev/null
+++ b/deps/zlib/BUILD.gn
@@ -0,0 +1,58 @@
+config("includes") {
+  include_dirs = [ "." ]
+}
+
+config("ignored_warnings") {
+  if (is_win) {
+    cflags = [
+      "/wd4131",  # old-style declarator
+      "/wd4127",  # conditional expression is constant
+      "/wd4244",  # possible loss of data on type conversion
+      "/wd4996",  # deprecated 'open'
+    ]
+  } else {
+    cflags = [
+      "-Wno-implicit-function-declaration",
+      "-Wno-shift-negative-value",
+    ]
+  }
+}
+
+source_set("zlib") {
+  sources = [
+    "adler32.c",
+    "compress.c",
+    "crc32.c",
+    "crc32.h",
+    "deflate.c",
+    "deflate.h",
+    "gzclose.c",
+    "gzguts.h",
+    "gzlib.c",
+    "gzread.c",
+    "gzwrite.c",
+    "infback.c",
+    "inffast.c",
+    "inffast.h",
+    "inffixed.h",
+    "inflate.c",
+    "inflate.h",
+    "inftrees.c",
+    "inftrees.h",
+    "trees.c",
+    "trees.h",
+    "uncompr.c",
+    "zconf.h",
+    "zlib.h",
+    "zutil.c",
+    "zutil.h",
+  ]
+
+  if (is_win) {
+    defines = [ "ZLIB_DLL" ]
+  }
+
+  configs += [ ":ignored_warnings" ]
+
+  public_configs = [ ":includes" ]
+}
diff --git a/filenames.json b/filenames.json
new file mode 100644
index 0000000000000000000000000000000000000000..aa9aa6d32f7d33a6f82ccb32a52f53ed3d5a77f0
--- /dev/null
+++ b/filenames.json
@@ -0,0 +1,447 @@
+// This file is automatically generated by generate_gn_filenames_json.py
+// DO NOT EDIT
+{
+  "headers": [
+    {
+      "dest_dir": "include/node/",
+      "files": [
+        "src/js_native_api.h",
+        "src/js_native_api_types.h",
+        "src/node.h",
+        "src/node_api.h",
+        "src/node_api_types.h",
+        "src/node_buffer.h",
+        "src/node_object_wrap.h"
+      ]
+    },
+    {
+      "dest_dir": "include/node//",
+      "files": [
+        "//v8/include/v8-internal.h",
+        "//v8/include/v8-platform.h",
+        "//v8/include/v8-profiler.h",
+        "//v8/include/v8-util.h",
+        "//v8/include/v8-value-serializer-version.h",
+        "//v8/include/v8-version-string.h",
+        "//v8/include/v8-version.h",
+        "//v8/include/v8-wasm-trap-handler-posix.h",
+        "//v8/include/v8-wasm-trap-handler-win.h",
+        "//v8/include/v8.h",
+        "//v8/include/v8config.h"
+      ]
+    },
+    {
+      "dest_dir": "include/node//libplatform/",
+      "files": [
+        "//v8/include/libplatform/libplatform-export.h",
+        "//v8/include/libplatform/libplatform.h",
+        "//v8/include/libplatform/v8-tracing.h"
+      ]
+    },
+    {
+      "dest_dir": "include/node//uv/",
+      "files": [
+        "deps/uv/include/uv/aix.h",
+        "deps/uv/include/uv/android-ifaddrs.h",
+        "deps/uv/include/uv/bsd.h",
+        "deps/uv/include/uv/darwin.h",
+        "deps/uv/include/uv/errno.h",
+        "deps/uv/include/uv/linux.h",
+        "deps/uv/include/uv/os390.h",
+        "deps/uv/include/uv/posix.h",
+        "deps/uv/include/uv/stdint-msvc2008.h",
+        "deps/uv/include/uv/sunos.h",
+        "deps/uv/include/uv/threadpool.h",
+        "deps/uv/include/uv/tree.h",
+        "deps/uv/include/uv/unix.h",
+        "deps/uv/include/uv/version.h",
+        "deps/uv/include/uv/win.h"
+      ]
+    },
+    {
+      "dest_dir": "include/node//",
+      "files": [
+        "deps/uv/include/uv.h"
+      ]
+    }
+  ],
+  "library_files": [
+    "lib/internal/bootstrap/loaders.js",
+    "lib/internal/bootstrap/node.js",
+    "lib/internal/bootstrap/pre_execution.js",
+    "lib/internal/per_context/primordials.js",
+    "lib/internal/per_context/domexception.js",
+    "lib/async_hooks.js",
+    "lib/assert.js",
+    "lib/buffer.js",
+    "lib/child_process.js",
+    "lib/console.js",
+    "lib/constants.js",
+    "lib/crypto.js",
+    "lib/cluster.js",
+    "lib/dgram.js",
+    "lib/dns.js",
+    "lib/domain.js",
+    "lib/events.js",
+    "lib/fs.js",
+    "lib/http.js",
+    "lib/http2.js",
+    "lib/_http_agent.js",
+    "lib/_http_client.js",
+    "lib/_http_common.js",
+    "lib/_http_incoming.js",
+    "lib/_http_outgoing.js",
+    "lib/_http_server.js",
+    "lib/https.js",
+    "lib/inspector.js",
+    "lib/module.js",
+    "lib/net.js",
+    "lib/os.js",
+    "lib/path.js",
+    "lib/perf_hooks.js",
+    "lib/process.js",
+    "lib/punycode.js",
+    "lib/querystring.js",
+    "lib/readline.js",
+    "lib/repl.js",
+    "lib/stream.js",
+    "lib/_stream_readable.js",
+    "lib/_stream_writable.js",
+    "lib/_stream_duplex.js",
+    "lib/_stream_transform.js",
+    "lib/_stream_passthrough.js",
+    "lib/_stream_wrap.js",
+    "lib/string_decoder.js",
+    "lib/sys.js",
+    "lib/timers.js",
+    "lib/tls.js",
+    "lib/_tls_common.js",
+    "lib/_tls_wrap.js",
+    "lib/trace_events.js",
+    "lib/tty.js",
+    "lib/url.js",
+    "lib/util.js",
+    "lib/v8.js",
+    "lib/vm.js",
+    "lib/worker_threads.js",
+    "lib/zlib.js",
+    "lib/internal/assert.js",
+    "lib/internal/assert/assertion_error.js",
+    "lib/internal/async_hooks.js",
+    "lib/internal/buffer.js",
+    "lib/internal/cli_table.js",
+    "lib/internal/child_process.js",
+    "lib/internal/cluster/child.js",
+    "lib/internal/cluster/master.js",
+    "lib/internal/cluster/round_robin_handle.js",
+    "lib/internal/cluster/shared_handle.js",
+    "lib/internal/cluster/utils.js",
+    "lib/internal/cluster/worker.js",
+    "lib/internal/console/constructor.js",
+    "lib/internal/console/global.js",
+    "lib/internal/crypto/certificate.js",
+    "lib/internal/crypto/cipher.js",
+    "lib/internal/crypto/diffiehellman.js",
+    "lib/internal/crypto/hash.js",
+    "lib/internal/crypto/keygen.js",
+    "lib/internal/crypto/keys.js",
+    "lib/internal/crypto/pbkdf2.js",
+    "lib/internal/crypto/random.js",
+    "lib/internal/crypto/scrypt.js",
+    "lib/internal/crypto/sig.js",
+    "lib/internal/crypto/util.js",
+    "lib/internal/constants.js",
+    "lib/internal/dgram.js",
+    "lib/internal/dns/promises.js",
+    "lib/internal/dns/utils.js",
+    "lib/internal/dtrace.js",
+    "lib/internal/encoding.js",
+    "lib/internal/errors.js",
+    "lib/internal/error-serdes.js",
+    "lib/internal/fixed_queue.js",
+    "lib/internal/freelist.js",
+    "lib/internal/freeze_intrinsics.js",
+    "lib/internal/fs/dir.js",
+    "lib/internal/fs/promises.js",
+    "lib/internal/fs/read_file_context.js",
+    "lib/internal/fs/rimraf.js",
+    "lib/internal/fs/streams.js",
+    "lib/internal/fs/sync_write_stream.js",
+    "lib/internal/fs/utils.js",
+    "lib/internal/fs/watchers.js",
+    "lib/internal/http.js",
+    "lib/internal/idna.js",
+    "lib/internal/inspector_async_hook.js",
+    "lib/internal/js_stream_socket.js",
+    "lib/internal/linkedlist.js",
+    "lib/internal/main/check_syntax.js",
+    "lib/internal/main/eval_string.js",
+    "lib/internal/main/eval_stdin.js",
+    "lib/internal/main/inspect.js",
+    "lib/internal/main/print_bash_completion.js",
+    "lib/internal/main/print_help.js",
+    "lib/internal/main/prof_process.js",
+    "lib/internal/main/repl.js",
+    "lib/internal/main/run_main_module.js",
+    "lib/internal/main/run_third_party_main.js",
+    "lib/internal/main/worker_thread.js",
+    "lib/internal/modules/cjs/helpers.js",
+    "lib/internal/modules/cjs/loader.js",
+    "lib/internal/modules/esm/loader.js",
+    "lib/internal/modules/esm/create_dynamic_module.js",
+    "lib/internal/modules/esm/default_resolve.js",
+    "lib/internal/modules/esm/module_job.js",
+    "lib/internal/modules/esm/module_map.js",
+    "lib/internal/modules/esm/translators.js",
+    "lib/internal/net.js",
+    "lib/internal/options.js",
+    "lib/internal/policy/manifest.js",
+    "lib/internal/policy/sri.js",
+    "lib/internal/priority_queue.js",
+    "lib/internal/process/esm_loader.js",
+    "lib/internal/process/execution.js",
+    "lib/internal/process/main_thread_only.js",
+    "lib/internal/process/per_thread.js",
+    "lib/internal/process/policy.js",
+    "lib/internal/process/promises.js",
+    "lib/internal/process/stdio.js",
+    "lib/internal/process/warning.js",
+    "lib/internal/process/worker_thread_only.js",
+    "lib/internal/process/report.js",
+    "lib/internal/process/task_queues.js",
+    "lib/internal/querystring.js",
+    "lib/internal/readline/utils.js",
+    "lib/internal/repl.js",
+    "lib/internal/repl/await.js",
+    "lib/internal/repl/history.js",
+    "lib/internal/repl/utils.js",
+    "lib/internal/socket_list.js",
+    "lib/internal/source_map/prepare_stack_trace.js",
+    "lib/internal/source_map/source_map.js",
+    "lib/internal/source_map/source_map_cache.js",
+    "lib/internal/test/binding.js",
+    "lib/internal/timers.js",
+    "lib/internal/tls.js",
+    "lib/internal/trace_events_async_hooks.js",
+    "lib/internal/tty.js",
+    "lib/internal/url.js",
+    "lib/internal/util.js",
+    "lib/internal/util/comparisons.js",
+    "lib/internal/util/debuglog.js",
+    "lib/internal/util/inspect.js",
+    "lib/internal/util/inspector.js",
+    "lib/internal/util/types.js",
+    "lib/internal/http2/core.js",
+    "lib/internal/http2/compat.js",
+    "lib/internal/http2/util.js",
+    "lib/internal/v8_prof_polyfill.js",
+    "lib/internal/v8_prof_processor.js",
+    "lib/internal/validators.js",
+    "lib/internal/stream_base_commons.js",
+    "lib/internal/vm/source_text_module.js",
+    "lib/internal/worker.js",
+    "lib/internal/worker/io.js",
+    "lib/internal/streams/lazy_transform.js",
+    "lib/internal/streams/async_iterator.js",
+    "lib/internal/streams/buffer_list.js",
+    "lib/internal/streams/duplexpair.js",
+    "lib/internal/streams/legacy.js",
+    "lib/internal/streams/destroy.js",
+    "lib/internal/streams/state.js",
+    "lib/internal/streams/pipeline.js",
+    "lib/internal/streams/end-of-stream.js",
+    "lib/internal/streams/from.js",
+    "deps/v8/tools/splaytree.js",
+    "deps/v8/tools/codemap.js",
+    "deps/v8/tools/consarray.js",
+    "deps/v8/tools/csvparser.js",
+    "deps/v8/tools/profile.js",
+    "deps/v8/tools/profile_view.js",
+    "deps/v8/tools/logreader.js",
+    "deps/v8/tools/arguments.js",
+    "deps/v8/tools/tickprocessor.js",
+    "deps/v8/tools/SourceMap.js",
+    "deps/v8/tools/tickprocessor-driver.js",
+    "deps/node-inspect/lib/_inspect.js",
+    "deps/node-inspect/lib/internal/inspect_client.js",
+    "deps/node-inspect/lib/internal/inspect_repl.js",
+    "deps/acorn/acorn/dist/acorn.js",
+    "deps/acorn/acorn-walk/dist/walk.js",
+    "deps/acorn-plugins/acorn-class-fields/index.js",
+    "deps/acorn-plugins/acorn-numeric-separator/index.js",
+    "deps/acorn-plugins/acorn-private-class-elements/index.js",
+    "deps/acorn-plugins/acorn-private-methods/index.js",
+    "deps/acorn-plugins/acorn-static-class-features/index.js"
+  ],
+  "node_sources": [
+    "src/api/async_resource.cc",
+    "src/api/callback.cc",
+    "src/api/encoding.cc",
+    "src/api/environment.cc",
+    "src/api/exceptions.cc",
+    "src/api/hooks.cc",
+    "src/api/utils.cc",
+    "src/async_wrap.cc",
+    "src/cares_wrap.cc",
+    "src/connect_wrap.cc",
+    "src/connection_wrap.cc",
+    "src/debug_utils.cc",
+    "src/env.cc",
+    "src/fs_event_wrap.cc",
+    "src/handle_wrap.cc",
+    "src/heap_utils.cc",
+    "src/js_native_api.h",
+    "src/js_native_api_types.h",
+    "src/js_native_api_v8.cc",
+    "src/js_native_api_v8.h",
+    "src/js_native_api_v8_internals.h",
+    "src/js_stream.cc",
+    "src/module_wrap.cc",
+    "src/node.cc",
+    "src/node_api.cc",
+    "src/node_binding.cc",
+    "src/node_buffer.cc",
+    "src/node_config.cc",
+    "src/node_constants.cc",
+    "src/node_contextify.cc",
+    "src/node_credentials.cc",
+    "src/node_dir.cc",
+    "src/node_domain.cc",
+    "src/node_env_var.cc",
+    "src/node_errors.cc",
+    "src/node_file.cc",
+    "src/node_http_parser_llhttp.cc",
+    "src/node_http_parser_traditional.cc",
+    "src/node_http2.cc",
+    "src/node_i18n.cc",
+    "src/node_main_instance.cc",
+    "src/node_messaging.cc",
+    "src/node_metadata.cc",
+    "src/node_native_module.cc",
+    "src/node_native_module_env.cc",
+    "src/node_options.cc",
+    "src/node_os.cc",
+    "src/node_perf.cc",
+    "src/node_platform.cc",
+    "src/node_postmortem_metadata.cc",
+    "src/node_process_events.cc",
+    "src/node_process_methods.cc",
+    "src/node_process_object.cc",
+    "src/node_serdes.cc",
+    "src/node_stat_watcher.cc",
+    "src/node_symbols.cc",
+    "src/node_task_queue.cc",
+    "src/node_trace_events.cc",
+    "src/node_types.cc",
+    "src/node_url.cc",
+    "src/node_util.cc",
+    "src/node_v8.cc",
+    "src/node_watchdog.cc",
+    "src/node_worker.cc",
+    "src/node_zlib.cc",
+    "src/pipe_wrap.cc",
+    "src/process_wrap.cc",
+    "src/sharedarraybuffer_metadata.cc",
+    "src/signal_wrap.cc",
+    "src/spawn_sync.cc",
+    "src/stream_base.cc",
+    "src/stream_pipe.cc",
+    "src/stream_wrap.cc",
+    "src/string_bytes.cc",
+    "src/string_decoder.cc",
+    "src/tcp_wrap.cc",
+    "src/timers.cc",
+    "src/tracing/agent.cc",
+    "src/tracing/node_trace_buffer.cc",
+    "src/tracing/node_trace_writer.cc",
+    "src/tracing/trace_event.cc",
+    "src/tracing/traced_value.cc",
+    "src/tty_wrap.cc",
+    "src/udp_wrap.cc",
+    "src/util.cc",
+    "src/uv.cc",
+    "src/aliased_buffer.h",
+    "src/async_wrap.h",
+    "src/async_wrap-inl.h",
+    "src/base_object.h",
+    "src/base_object-inl.h",
+    "src/base64.h",
+    "src/connect_wrap.h",
+    "src/connection_wrap.h",
+    "src/debug_utils.h",
+    "src/env.h",
+    "src/env-inl.h",
+    "src/handle_wrap.h",
+    "src/histogram.h",
+    "src/histogram-inl.h",
+    "src/http_parser_adaptor.h",
+    "src/js_stream.h",
+    "src/memory_tracker.h",
+    "src/memory_tracker-inl.h",
+    "src/module_wrap.h",
+    "src/node.h",
+    "src/node_api.h",
+    "src/node_api_types.h",
+    "src/node_binding.h",
+    "src/node_buffer.h",
+    "src/node_constants.h",
+    "src/node_context_data.h",
+    "src/node_contextify.h",
+    "src/node_dir.h",
+    "src/node_errors.h",
+    "src/node_file.h",
+    "src/node_http_parser_impl.h",
+    "src/node_http2.h",
+    "src/node_http2_state.h",
+    "src/node_i18n.h",
+    "src/node_internals.h",
+    "src/node_main_instance.h",
+    "src/node_messaging.h",
+    "src/node_metadata.h",
+    "src/node_mutex.h",
+    "src/node_native_module.h",
+    "src/node_native_module_env.h",
+    "src/node_object_wrap.h",
+    "src/node_options.h",
+    "src/node_options-inl.h",
+    "src/node_perf.h",
+    "src/node_perf_common.h",
+    "src/node_platform.h",
+    "src/node_process.h",
+    "src/node_revert.h",
+    "src/node_root_certs.h",
+    "src/node_stat_watcher.h",
+    "src/node_union_bytes.h",
+    "src/node_url.h",
+    "src/node_version.h",
+    "src/node_v8_platform-inl.h",
+    "src/node_watchdog.h",
+    "src/node_worker.h",
+    "src/pipe_wrap.h",
+    "src/req_wrap.h",
+    "src/req_wrap-inl.h",
+    "src/sharedarraybuffer_metadata.h",
+    "src/spawn_sync.h",
+    "src/stream_base.h",
+    "src/stream_base-inl.h",
+    "src/stream_pipe.h",
+    "src/stream_wrap.h",
+    "src/string_bytes.h",
+    "src/string_decoder.h",
+    "src/string_decoder-inl.h",
+    "src/string_search.h",
+    "src/tcp_wrap.h",
+    "src/tracing/agent.h",
+    "src/tracing/node_trace_buffer.h",
+    "src/tracing/node_trace_writer.h",
+    "src/tracing/trace_event.h",
+    "src/tracing/trace_event_common.h",
+    "src/tracing/traced_value.h",
+    "src/tty_wrap.h",
+    "src/udp_wrap.h",
+    "src/util.h",
+    "src/util-inl.h",
+    "deps/http_parser/http_parser.h",
+    "deps/v8/include/v8.h"
+  ]
+}
diff --git a/src/inspector/BUILD.gn b/src/inspector/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..f3c5c798c0aefcb8cf9b1570a7b4817c477aecf6
--- /dev/null
+++ b/src/inspector/BUILD.gn
@@ -0,0 +1,199 @@
+import("//v8/gni/v8.gni")
+
+inspector_protocol_dir = "../../tools/inspector_protocol"
+
+_protocol_generated = [
+  "protocol/Forward.h",
+  "protocol/Protocol.cpp",
+  "protocol/Protocol.h",
+  "protocol/NodeWorker.cpp",
+  "protocol/NodeWorker.h",
+  "protocol/NodeTracing.cpp",
+  "protocol/NodeTracing.h",
+  "protocol/NodeRuntime.cpp",
+  "protocol/NodeRuntime.h",
+]
+
+# These are from node_protocol_config.json
+# These convoluted path hacks are to work around the fact that node.js is very
+# confused about what paths are in its includes, without changing node at all.
+# Hopefully, keying everything in this file off the paths that are in
+# node_protocol_config.json will mean that the paths stay in sync.
+inspector_protocol_package = "src/node/inspector/protocol"
+inspector_protocol_output = "node/inspector/protocol"
+
+config("inspector_config") {
+  include_dirs = [
+    "$target_gen_dir",
+    "$target_gen_dir/src",
+  ]
+
+  configs = [ "../..:node_features" ]
+}
+
+source_set("inspector") {
+  sources = [
+    "main_thread_interface.cc",
+    "main_thread_interface.h",
+    "node_string.cc",
+    "node_string.h",
+    "runtime_agent.cc",
+    "runtime_agent.h",
+    "tracing_agent.cc",
+    "tracing_agent.h",
+    "worker_agent.cc",
+    "worker_agent.h",
+    "worker_inspector.cc",
+    "worker_inspector.h",
+  ]
+  sources += rebase_path(_protocol_generated,
+                         ".",
+                         "$target_gen_dir/$inspector_protocol_package/..")
+  include_dirs = [
+    "//v8/include",
+    "..",
+  ]
+  deps = [
+    ":protocol_generated_sources",
+    ":v8_inspector_compress_protocol_json",
+    "../../deps/uv",
+    "//third_party/icu:icuuc",
+  ]
+  configs += [ "../..:node_internal_config" ]
+  public_configs = [ ":inspector_config" ]
+}
+
+# This based on the template from //v8/../inspector_protocol.gni
+action("protocol_generated_sources") {
+  # This is to ensure that the output directory exists--the code generator
+  # doesn't create it.
+  write_file("$target_gen_dir/$inspector_protocol_package/.dummy", "")
+  script = "$inspector_protocol_dir/code_generator.py"
+
+  inputs = [
+    "$target_gen_dir/node_protocol_config.json",
+    "$target_gen_dir/src/node_protocol.json",
+    "$inspector_protocol_dir/lib/base_string_adapter_cc.template",
+    "$inspector_protocol_dir/lib/base_string_adapter_h.template",
+    "$inspector_protocol_dir/lib/Allocator_h.template",
+    "$inspector_protocol_dir/lib/Array_h.template",
+    "$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
+    "$inspector_protocol_dir/lib/DispatcherBase_h.template",
+    "$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
+    "$inspector_protocol_dir/lib/ErrorSupport_h.template",
+    "$inspector_protocol_dir/lib/Forward_h.template",
+    "$inspector_protocol_dir/lib/FrontendChannel_h.template",
+    "$inspector_protocol_dir/lib/Maybe_h.template",
+    "$inspector_protocol_dir/lib/Object_cpp.template",
+    "$inspector_protocol_dir/lib/Object_h.template",
+    "$inspector_protocol_dir/lib/Parser_cpp.template",
+    "$inspector_protocol_dir/lib/Parser_h.template",
+    "$inspector_protocol_dir/lib/Protocol_cpp.template",
+    "$inspector_protocol_dir/lib/ValueConversions_h.template",
+    "$inspector_protocol_dir/lib/Values_cpp.template",
+    "$inspector_protocol_dir/lib/Values_h.template",
+    "$inspector_protocol_dir/templates/Exported_h.template",
+    "$inspector_protocol_dir/templates/Imported_h.template",
+    "$inspector_protocol_dir/templates/TypeBuilder_cpp.template",
+    "$inspector_protocol_dir/templates/TypeBuilder_h.template",
+  ]
+
+  deps = [
+    ":node_protocol_config",
+    ":node_protocol_json",
+  ]
+
+  args = [
+    "--jinja_dir",
+    rebase_path("//third_party/", root_build_dir),  # jinja is in chromium's third_party
+    "--output_base",
+    rebase_path("$target_gen_dir/src", root_build_dir),
+    "--config",
+    rebase_path("$target_gen_dir/node_protocol_config.json", root_build_dir),
+  ]
+
+  outputs =
+      get_path_info(rebase_path(rebase_path(_protocol_generated,
+                                            ".",
+                                            "$inspector_protocol_output/.."),
+                                ".",
+                                "$target_gen_dir/src"),
+                    "abspath")
+}
+
+template("generate_protocol_json") {
+  copy_target_name = target_name + "_copy"
+  copy(copy_target_name) {
+    sources = invoker.sources
+    outputs = [
+      "$target_gen_dir/{{source_file_part}}",
+    ]
+  }
+  copied_pdl = get_target_outputs(":$copy_target_name")
+  action(target_name) {
+    deps = [
+      ":$copy_target_name",
+    ]
+    sources = copied_pdl
+    outputs = invoker.outputs
+    script = "//v8/third_party/inspector_protocol/convert_protocol_to_json.py"
+    args = rebase_path(sources + outputs, root_build_dir)
+  }
+}
+
+copy("node_protocol_config") {
+  sources = [
+    "node_protocol_config.json",
+  ]
+  outputs = [
+    "$target_gen_dir/{{source_file_part}}",
+  ]
+}
+
+generate_protocol_json("node_protocol_json") {
+  sources = [
+    "node_protocol.pdl",
+  ]
+  outputs = [
+    "$target_gen_dir/src/node_protocol.json",
+  ]
+}
+
+generate_protocol_json("v8_protocol_json") {
+  sources = [
+    "//v8/include/js_protocol.pdl",
+  ]
+  outputs = [
+    "$target_gen_dir/js_protocol.json",
+  ]
+}
+
+action("concatenate_protocols") {
+  deps = [
+    ":node_protocol_json",
+    ":v8_protocol_json",
+  ]
+  inputs = [
+    "$target_gen_dir/js_protocol.json",
+    "$target_gen_dir/src/node_protocol.json",
+  ]
+  outputs = [
+    "$target_gen_dir/concatenated_protocol.json",
+  ]
+  script = "//v8/third_party/inspector_protocol/concatenate_protocols.py"
+  args = rebase_path(inputs + outputs, root_build_dir)
+}
+
+action("v8_inspector_compress_protocol_json") {
+  deps = [
+    ":concatenate_protocols",
+  ]
+  inputs = [
+    "$target_gen_dir/concatenated_protocol.json",
+  ]
+  outputs = [
+    "$target_gen_dir/v8_inspector_protocol_json.h",
+  ]
+  script = "../../tools/compress_json.py"
+  args = rebase_path(inputs + outputs, root_build_dir)
+}
diff --git a/src/node_version.h b/src/node_version.h
index 8a6fb55a5a3824b40d2c744a0ed1e8d84e6bbc4a..c68a60d7b0a818b25ce3bd44037d52abe57769f2 100644
--- a/src/node_version.h
+++ b/src/node_version.h
@@ -89,7 +89,10 @@
  * version matching should open a pull request to reserve a number in this
  * registry.
  */
+// Electron sets NODE_MODULE_VERSION in their GN configuration
+#ifndef NODE_MODULE_VERSION
 #define NODE_MODULE_VERSION 72
+#endif
 
 // 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..9be5ffae55057c4072599d17384735984851de5a
--- /dev/null
+++ b/tools/generate_gn_filenames_json.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+import json
+import os
+import sys
+
+import install
+
+
+def LoadPythonDictionary(path):
+  file_string = open(path).read()
+  try:
+    file_data = eval(file_string, {'__builtins__': None}, None)
+  except SyntaxError, e:
+    e.filename = path
+    raise
+  except Exception, e:
+    raise Exception("Unexpected error while reading %s: %s" % (path, str(e)))
+
+  assert isinstance(file_data, dict), "%s does not eval to a dictionary" % path
+
+  return file_data
+
+
+FILENAMES_JSON_HEADER = '''
+// This file is automatically generated by generate_gn_filenames_json.py
+// DO NOT EDIT
+'''.lstrip()
+
+
+if __name__ == '__main__':
+  node_root_dir = os.path.dirname(os.path.dirname(__file__))
+  node_gyp_path = os.path.join(node_root_dir, 'node.gyp')
+  out = {}
+  node_gyp = LoadPythonDictionary(node_gyp_path)
+  out['library_files'] = node_gyp['variables']['library_files']
+  node_lib_target = next(
+      t for t in node_gyp['targets']
+      if t['target_name'] == '<(node_lib_target_name)')
+  node_source_blacklist = {
+      '<@(library_files)',
+      'common.gypi',
+      '<(SHARED_INTERMEDIATE_DIR)/node_javascript.cc',
+  }
+  out['node_sources'] = [
+      f for f in node_lib_target['sources']
+      if f not in node_source_blacklist]
+
+  out['headers'] = []
+
+  def add_headers(files, dest_dir):
+    if 'src/node.h' in files:
+      files = [f for f in files if f.endswith('.h') and f != 'src/node_version.h']
+    elif any(f.startswith('../../v8/') for f in files):
+      files = [f.replace('../../v8/', '//v8/', 1) for f in files]
+    hs = {'files': sorted(files), 'dest_dir': dest_dir}
+    out['headers'].append(hs)
+
+  install.variables = {'node_shared_libuv': 'false'}
+  install.headers(add_headers)
+  with open(os.path.join(node_root_dir, 'filenames.json'), 'w') as f:
+    f.write(FILENAMES_JSON_HEADER)
+    f.write(json.dumps(out, sort_keys=True, indent=2, separators=(',', ': ')))
+    f.write('\n')
diff --git a/tools/generate_node_version_header.py b/tools/generate_node_version_header.py
new file mode 100755
index 0000000000000000000000000000000000000000..3088ae4bdf814ae255c9805ebd393b2eee17e941
--- /dev/null
+++ b/tools/generate_node_version_header.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+import re
+import sys
+
+node_version_file = sys.argv[1]
+out_file = sys.argv[2]
+NMV = None
+if len(sys.argv) > 3:
+  NMV = sys.argv[3]
+
+with open(node_version_file, 'r') as in_file, open(out_file, 'w') as out_file:
+  changed = False
+  contents = in_file.read()
+  new_contents = re.sub(
+    r'^#define NODE_MODULE_VERSION [0-9]+$',
+    '#define NODE_MODULE_VERSION ' + NMV,
+    contents,
+    flags=re.MULTILINE)
+
+  changed = contents != new_contents
+
+  if not changed and NMV is not None:
+    raise Exception("Did not modify the NMV from nodes value, this value MUST differ from node")
+
+  out_file.writelines(new_contents)
diff --git a/tools/install.py b/tools/install.py
index 655802980a6ea94d1d4ca1dc63c8c8e905fbb83a..ab1a18a215cb7393310324c6dbcacc6655bae9ef 100755
--- a/tools/install.py
+++ b/tools/install.py
@@ -163,8 +163,8 @@ def files(action):
 def headers(action):
   def ignore_inspector_headers(files_arg, dest):
     inspector_headers = [
-      'deps/v8/include/v8-inspector.h',
-      'deps/v8/include/v8-inspector-protocol.h'
+      '../../v8/include/v8-inspector.h',
+      '../../v8/include/v8-inspector-protocol.h'
     ]
     files_arg = [name for name in files_arg if name not in inspector_headers]
     action(files_arg, dest)
@@ -186,7 +186,7 @@ def headers(action):
   if sys.platform.startswith('aix'):
     action(['out/Release/node.exp'], 'include/node/')
 
-  subdir_files('deps/v8/include', 'include/node/', ignore_inspector_headers)
+  subdir_files('../../v8/include', 'include/node/', ignore_inspector_headers)
 
   if 'false' == variables.get('node_shared_libuv'):
     subdir_files('deps/uv/include', 'include/node/', action)
diff --git a/tools/js2c.py b/tools/js2c.py
index 1346b2a87046d3472577875c887b3b44a63280ed..752344d68c3f63b4c5e491b33d4576ed48f8b74f 100755
--- a/tools/js2c.py
+++ b/tools/js2c.py
@@ -261,10 +261,18 @@ def NormalizeFileName(filename):
     split = ['internal'] + split
   else:  # `lib/**/*.js` so drop the 'lib' part
     split = split[1:]
+
   if len(split):
     filename = '/'.join(split)
-  return os.path.splitext(filename)[0]
 
+  # Electron-specific: when driving the node build from Electron, we generate
+  # config.gypi in a separate directory and pass the absolute path to js2c.
+  # This overrides the absolute path so that the variable names in the
+  # generated C are as if it was in the root node directory.
+  if filename.endswith("/config.gypi"):
+    filename = "config.gypi"
+
+  return os.path.splitext(filename)[0]
 
 def JS2C(source_files, target):
   # Process input from all *macro.py files
diff --git a/tools/tar.py b/tools/tar.py
new file mode 100644
index 0000000000000000000000000000000000000000..eb697be25779db62c829aac45a509804e9fff331
--- /dev/null
+++ b/tools/tar.py
@@ -0,0 +1,12 @@
+import os
+import sys
+import tarfile
+
+source = sys.argv[1]
+target = sys.argv[2]
+
+os.chdir(os.path.dirname(source))
+
+tarball = tarfile.open(name=os.path.basename(target), mode='w:gz')
+tarball.add(os.path.relpath(source))
+tarball.close()
