This project is a set of dependency and build configurations to build Node.js with GN.
V8 was originally built with SCons. Following Chromium, it made the switch to GYP, completing around 2012. That was when Node.js started its success story. However, again following Chromium, V8 made the switch to GN, completing in 2016. So far, Node.js has hesitated in adopting GN. One of the reasons is its now established native modules ecosystem that relies on GYP for build configuration.
Electron, having both Chromium and Node.js as its dependencies, adopted GN. Many files in this repository have been derived from the Electron project, with appropriate changes to avoid the need for forking files, to implement a standalone build, or to fix test failures.
Some reading material:
- GN build system
- Discussion on building Node.js with GN
- Discussion on building Node.js with cmake
- Discussion on building Node.js with Bazel
- Document on GYP deprecation and Node.js
- Document on Bazel for Node.js
Get depot_tools first.
mkdir node-ci
cd node-ci
fetch node-ci
Alternatively, you can
mkdir node-ci
cd node-ci
git clone https://chromium.googlesource.com/v8/node-ci
gclient config https://chromium.googlesource.com/v8/node-ci --unmanaged
cd node-ci
make deps
make node
JOBS=4 make test
For more advanced build options, check out tools/gn-gen.py --help
.
To update a dependency, e.g. V8 or Node.js, use gclient to update DEPS.
gclient setdep --var=v8_revision=<updated-git-hash>
To apply changes, e.g. for local testing, use git:
cd v8
git remote add local-v8 <path-to-v8-checkout>/.git
git fetch local-v8
git checkout local-v8/<your-branch>
- Stay as slim as possible. By avoiding to fork files from dependencies, future maintenance becomes less a hassle.
- Pull necessary sources as dependencies rather than checking in the sources.
- Stay as up-to-date as possible. The point of this is to be able to build with newest versions of dependencies, including Node.js, V8, and ICU.
- Simplicity. It should be easy to get up and running.
- Support building on Windows. The current configurations have been tested for Linux and Mac.
- Platform-specific OpenSSL build configurations. The current build only supports the slowest platform-independent configuration.
- To translate every configuration from the GYP build.
- To support platforms not supported by Chromium.
- To replace Node.js' test runner with the one used by V8.
- To use GN to build native modules.
- Proper dependency management. Upgrading dependencies is just a small change in
DEPS
. - No need to port V8 changes to GYP.
- Availability of sanitizers.
- Ability to use GN features such as jumbo builds.
- Toolchain to build is bundled as dependency.