node/unofficial.gni
Joyee Cheung 12fad1bd7b
src: build v8 tick processor as built-in source text modules
Instead of polyfilling it with vm.SourceTextModule,
use a built-in source text module loader so that we can
also build the code cache for it at build tiem to
embed the code cache for them in the binary.

Drive-by: instead of inferring how to compile a particular
built-in at run time, do the inferring at build time,
so the function-based built-ins can be compiled using
parameters quickly looked up from a static map, and
the builtins that should be compiled as source text
modules are known internally based on extension in
the source code (at run time, the extensions are all
removed).

PR-URL: https://github.com/nodejs/node/pull/60518
Reviewed-By: Aditi Singh <aditisingh1400@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
2025-11-11 02:53:13 +00:00

425 lines
12 KiB
Plaintext

# This file is used by GN for building, which is NOT the build system used for
# building official binaries.
# Please take a look at node.gyp if you are making changes to build system.
import("node.gni")
import("$node_v8_path/gni/snapshot_toolchain.gni")
import("$node_v8_path/gni/v8.gni")
# The actual configurations are put inside a template in unofficial.gni to
# prevent accidental edits from contributors.
template("node_gn_build") {
config("node_features") {
defines = []
if (is_component_build) {
defines += [
"USING_UV_SHARED",
"USING_V8_SHARED",
]
}
if (node_use_openssl) {
defines += [ "HAVE_OPENSSL=1" ]
} else {
defines += [ "HAVE_OPENSSL=0" ]
}
if (node_use_sqlite) {
defines += [ "HAVE_SQLITE=1" ]
} else {
defines += [ "HAVE_SQLITE=0" ]
}
if (node_use_amaro) {
defines += [ "HAVE_AMARO=1" ]
} else {
defines += [ "HAVE_AMARO=0" ]
}
if (node_use_v8_platform) {
defines += [ "NODE_USE_V8_PLATFORM=1" ]
} else {
defines += [ "NODE_USE_V8_PLATFORM=0" ]
}
if (node_enable_inspector) {
defines += [ "HAVE_INSPECTOR=1" ]
} else {
defines += [ "HAVE_INSPECTOR=0" ]
}
if (node_use_node_code_cache) {
defines += [ "NODE_USE_NODE_CODE_CACHE=1"]
}
if (v8_enable_i18n_support) {
defines += [ "NODE_HAVE_I18N_SUPPORT=1" ]
}
}
config("node_external_config") {
include_dirs = [
target_gen_dir,
"src",
]
defines = [
"NODE_WANT_INTERNALS=1",
"NODE_EMBEDDER_MODULE_VERSION=$node_module_version",
]
configs = [
":node_features",
"$node_v8_path:external_config",
]
}
config("node_internal_config") {
visibility = [
":*",
"src/inspector:*",
]
configs = [ ":node_external_config" ]
libs = []
cflags = [ "-Wno-microsoft-include" ]
cflags_cc = [
"-Wno-deprecated-declarations",
"-Wno-extra-semi",
"-Wno-implicit-fallthrough",
"-Wno-macro-redefined",
"-Wno-missing-braces",
"-Wno-range-loop-bind-reference",
"-Wno-return-type",
"-Wno-shadow",
"-Wno-sometimes-uninitialized",
"-Wno-string-plus-int",
"-Wno-string-conversion",
"-Wno-unreachable-code",
"-Wno-unreachable-code-break",
"-Wno-unreachable-code-return",
"-Wno-unused-label",
"-Wno-unused-private-field",
"-Wno-unused-variable",
"-Wno-unused-function",
]
if (current_cpu == "x86") {
node_arch = "ia32"
} else {
node_arch = target_cpu
}
if (target_os == "win") {
node_platform = "win32"
} else if (target_os == "mac") {
node_platform = "darwin"
} else {
node_platform = target_os
}
defines = [
"NODE_ARCH=\"$node_arch\"",
"NODE_PLATFORM=\"$node_platform\"",
"NODE_REPORT"
]
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\"",
]
}
}
gypi_values = exec_script("./tools/gypi_to_gn.py",
[ rebase_path("node.gyp"),
"--replace=<@(node_builtin_shareable_builtins)=" ],
"scope",
[ "node.gyp" ])
source_set("libnode") {
configs += [ ":node_internal_config" ]
public_configs = [
":node_external_config",
"deps/googletest:googletest_config",
]
public_deps = [
"deps/ada",
"deps/uv",
"deps/simdjson",
"$node_v8_path",
]
deps = [
":run_node_js2c",
"deps/brotli",
"deps/cares",
"deps/histogram",
"deps/llhttp",
"deps/nbytes",
"deps/nghttp2",
"deps/ngtcp2",
"deps/postject",
"deps/uvwasi",
"deps/zstd",
"//third_party/zlib",
"$node_simdutf_path",
"$node_v8_path:v8_libplatform",
]
sources = [
"$target_gen_dir/node_javascript.cc",
] + gypi_values.node_sources
if (is_win) {
libs = [ "psapi.lib" ]
}
if (is_mac) {
frameworks = [
"CoreFoundation.framework",
"Security.framework",
]
}
if (is_posix) {
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
configs += [ "//build/config/gcc:symbol_visibility_default" ]
}
if (v8_enable_i18n_support) {
deps += [ "//third_party/icu" ]
}
if (node_use_openssl) {
deps += [ "deps/ncrypto" ]
public_deps += [ "$node_openssl_path" ]
sources += gypi_values.node_crypto_sources
}
if (node_use_sqlite) {
deps += [ "deps/sqlite" ]
sources += gypi_values.node_sqlite_sources
}
if (node_enable_inspector) {
deps += [
"$node_inspector_protocol_path:crdtp",
"src/inspector:node_protocol_generated_sources",
"src/inspector:v8_inspector_compress_protocol_json",
]
include_dirs = [
"$target_gen_dir/src",
"$target_gen_dir/src/inspector",
"$node_inspector_protocol_path",
]
node_inspector = exec_script(
"./tools/gypi_to_gn.py",
[ rebase_path("src/inspector/node_inspector.gypi"),
"--replace=<(SHARED_INTERMEDIATE_DIR)=$target_gen_dir" ],
"scope",
[ "src/inspector/node_inspector.gypi" ])
sources += node_inspector.node_inspector_sources +
node_inspector.node_inspector_generated_sources
}
}
executable(target_name) {
forward_variables_from(invoker, "*")
sources = [ "src/node_main.cc" ]
deps = [
":libnode",
"//build/win:default_exe_manifest",
]
if (node_use_node_snapshot) {
sources += [ "$target_gen_dir/node_snapshot.cc" ]
deps += [ ":run_node_mksnapshot" ]
if (is_clang || !is_win) {
cflags_cc = [
"-Wno-c++11-narrowing",
"-Wno-shadow",
]
}
} else {
sources += [ "src/node_snapshot_stub.cc" ]
}
output_name = "node"
if (is_apple) {
# Default optimization on apple adds "-dead_strip" to ldflags, which would
# strip exported V8 and NAPI symbols, has to remove it to make native
# modules work.
# There is almost no performance penalty since we are only removing
# optimization on the node_main.cc.
configs -= [ "//build/config/compiler:default_optimization" ]
}
}
if (node_use_node_snapshot) {
if (current_toolchain == v8_snapshot_toolchain) {
executable("node_mksnapshot") {
configs += [ ":node_internal_config", ":disable_icf" ]
sources = [
"src/node_snapshot_stub.cc",
"tools/snapshot/node_mksnapshot.cc",
]
deps = [ ":libnode" ]
}
# This config disables a link time optimization "ICF", which may merge
# different functions into one if the function signature and body of them are
# identical.
#
# ICF breaks 1:1 mappings of the external references for V8 snapshot, so we
# disable it while taking a V8 snapshot.
config("disable_icf") {
visibility = [ ":*" ] # Only targets in this file can depend on this.
if (is_win) {
ldflags = [ "/OPT:NOICF" ] # link.exe, but also lld-link.exe.
} else if (is_apple && !use_lld) {
ldflags = [ "-Wl,-no_deduplicate" ] # ld64.
} else if ((!is_apple && use_gold) || use_lld) {
ldflags = [ "-Wl,--icf=none" ]
}
}
}
action("run_node_mksnapshot") {
deps = [ ":node_mksnapshot($v8_snapshot_toolchain)" ]
script = "$node_v8_path/tools/run.py"
sources = []
data = []
mksnapshot_dir = get_label_info(":node_mksnapshot($v8_snapshot_toolchain)",
"root_out_dir")
outputs = [ "$target_gen_dir/node_snapshot.cc" ]
args = [
"./" + rebase_path(mksnapshot_dir + "/node_mksnapshot", root_build_dir),
rebase_path("$target_gen_dir/node_snapshot.cc", root_build_dir),
]
}
}
action("generate_config_gypi") {
deps = [ "$node_v8_path:v8_generate_features_json" ]
script = "tools/generate_config_gypi.py"
outputs = [ "$target_gen_dir/config.gypi" ]
depfile = "$target_gen_dir/$target_name.d"
args = rebase_path(outputs, root_build_dir) + [
"--out-dir", rebase_path(root_build_dir, root_build_dir),
"--dep-file", rebase_path(depfile, root_build_dir),
"--node-gn-path", node_path,
]
}
executable("node_js2c") {
deps = [
"deps/uv",
"$node_simdutf_path",
]
sources = [
"tools/js2c.cc",
"tools/executable_wrapper.h",
"src/embedded_data.cc",
"src/embedded_data.h",
"src/builtin_info.cc",
"src/builtin_info.h",
]
include_dirs = [ "src" ]
}
action("run_node_js2c") {
script = "$node_v8_path/tools/run.py"
deps = [
":node_js2c($host_toolchain)",
":generate_config_gypi",
]
node_deps_files = gypi_values.deps_files + node_builtin_shareable_builtins
node_library_files = exec_script("./tools/search_files.py",
[ rebase_path(".", root_build_dir),
rebase_path("lib", root_build_dir),
"js" ],
"list lines")
inputs = node_library_files +
node_deps_files +
[ "$target_gen_dir/config.gypi" ]
outputs = [ "$target_gen_dir/node_javascript.cc" ]
# Get the path to node_js2c executable of the host toolchain.
if (host_os == "win") {
host_executable_suffix = ".exe"
} else {
host_executable_suffix = ""
}
node_js2c_path =
get_label_info(":node_js2c($host_toolchain)", "root_out_dir") + "/" +
get_label_info(":node_js2c($host_toolchain)", "name") +
host_executable_suffix
args = [ rebase_path(node_js2c_path),
rebase_path("$target_gen_dir/node_javascript.cc"),
"--root", rebase_path("."),
"lib", rebase_path("$target_gen_dir/config.gypi") ] +
node_deps_files
}
executable("node_cctest") {
testonly = true
configs += [ ":node_internal_config" ]
deps = [
":libnode",
"deps/googletest",
"deps/googletest:gtest_main",
"deps/nbytes",
"$node_simdutf_path",
]
sources = [ "src/node_snapshot_stub.cc" ]
sources += exec_script("./tools/search_files.py",
[ rebase_path(".", root_build_dir),
rebase_path("test/cctest", root_build_dir),
"cc" ],
"list lines")
if (node_use_openssl) {
deps += [ "deps/ncrypto" ]
} else {
sources -= gypi_values.node_cctest_openssl_sources
}
if (node_enable_inspector) {
deps += [ "src/inspector:crdtp" ]
include_dirs = [
"$target_gen_dir/src",
"$target_gen_dir/src/inspector",
]
} else {
sources -= gypi_values.node_cctest_inspector_sources
}
}
executable("node_embedtest") {
output_name = "embedtest"
testonly = true
deps = [ ":libnode" ]
include_dirs = [ "tools" ]
sources = [
"src/node_snapshot_stub.cc",
"test/embedding/embedtest.cc",
]
}
executable("overlapped_checker") {
output_name = "overlapped-checker"
testonly = true
if (is_win) {
sources = [ "test/overlapped-checker/main_win.c" ]
} else {
sources = [ "test/overlapped-checker/main_unix.c" ]
}
}
}