2015-08-31 05:31:07 +00:00
|
|
|
# Build System Overview
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2016-04-22 13:53:26 +00:00
|
|
|
Electron uses [gyp](https://gyp.gsrc.io/) for project generation and
|
|
|
|
[ninja](https://ninja-build.org/) for building. Project configurations can
|
|
|
|
be found in the `.gyp` and `.gypi` files.
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
## Gyp Files
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
Following `gyp` files contain the main rules for building Electron:
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2016-06-09 03:58:58 +00:00
|
|
|
* `electron.gyp` defines how Electron itself is built.
|
2015-04-11 04:11:40 +00:00
|
|
|
* `common.gypi` adjusts the build configurations of Node to make it build
|
|
|
|
together with Chromium.
|
2017-05-10 20:42:21 +00:00
|
|
|
* `brightray/brightray.gyp` defines how `brightray` is built and
|
2015-08-31 05:31:07 +00:00
|
|
|
includes the default configurations for linking with Chromium.
|
2017-05-10 20:42:21 +00:00
|
|
|
* `brightray/brightray.gypi` includes general build configurations about
|
2015-04-11 04:11:40 +00:00
|
|
|
building.
|
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
## Component Build
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
Since Chromium is quite a large project, the final linking stage can take
|
|
|
|
quite a few minutes, which makes it hard for development. In order to solve
|
|
|
|
this, Chromium introduced the "component build", which builds each component as
|
|
|
|
a separate shared library, making linking very quick but sacrificing file size
|
2015-04-11 04:11:40 +00:00
|
|
|
and performance.
|
|
|
|
|
2015-04-16 03:31:12 +00:00
|
|
|
In Electron we took a very similar approach: for `Debug` builds, the binary
|
2015-08-31 05:31:07 +00:00
|
|
|
will be linked to a shared library version of Chromium's components to achieve
|
2015-04-11 04:46:13 +00:00
|
|
|
fast linking time; for `Release` builds, the binary will be linked to the static
|
|
|
|
library versions, so we can have the best possible binary size and performance.
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
## Minimal Bootstrapping
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
All of Chromium's prebuilt binaries (`libchromiumcontent`) are downloaded when
|
2015-07-05 14:40:08 +00:00
|
|
|
running the bootstrap script. By default both static libraries and shared
|
|
|
|
libraries will be downloaded and the final size should be between 800MB and 2GB
|
2015-08-31 05:31:07 +00:00
|
|
|
depending on the platform.
|
2015-07-05 14:40:08 +00:00
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
By default, `libchromiumcontent` is downloaded from Amazon Web Services.
|
|
|
|
If the `LIBCHROMIUMCONTENT_MIRROR` environment variable is set, the bootstrap
|
2015-07-05 14:40:08 +00:00
|
|
|
script will download from it.
|
2015-08-31 05:31:07 +00:00
|
|
|
[`libchromiumcontent-qiniu-mirror`](https://github.com/hokein/libchromiumcontent-qiniu-mirror)
|
|
|
|
is a mirror for `libchromiumcontent`. If you have trouble in accessing AWS, you
|
|
|
|
can switch the download address to it via
|
|
|
|
`export LIBCHROMIUMCONTENT_MIRROR=http://7xk3d2.dl1.z0.glb.clouddn.com/`
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-04-16 03:31:12 +00:00
|
|
|
If you only want to build Electron quickly for testing or development, you
|
2018-05-08 05:16:09 +00:00
|
|
|
can download the shared library versions by passing the `--dev` parameter:
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2017-11-24 10:13:57 +00:00
|
|
|
```sh
|
2015-04-11 04:46:13 +00:00
|
|
|
$ ./script/bootstrap.py --dev
|
|
|
|
$ ./script/build.py -c D
|
2015-04-11 04:11:40 +00:00
|
|
|
```
|
|
|
|
|
2015-12-25 07:04:44 +00:00
|
|
|
## Two-Phase Project Generation
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-04-16 03:31:12 +00:00
|
|
|
Electron links with different sets of libraries in `Release` and `Debug`
|
2015-08-31 05:31:07 +00:00
|
|
|
builds. `gyp`, however, doesn't support configuring different link settings for
|
2015-04-11 04:11:40 +00:00
|
|
|
different configurations.
|
|
|
|
|
2015-04-16 03:31:12 +00:00
|
|
|
To work around this Electron uses a `gyp` variable
|
2015-08-31 05:31:07 +00:00
|
|
|
`libchromiumcontent_component` to control which link settings to use and only
|
2015-04-11 04:11:40 +00:00
|
|
|
generates one target when running `gyp`.
|
|
|
|
|
2015-08-31 05:31:07 +00:00
|
|
|
## Target Names
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2015-04-16 03:31:12 +00:00
|
|
|
Unlike most projects that use `Release` and `Debug` as target names, Electron
|
2015-04-11 04:11:40 +00:00
|
|
|
uses `R` and `D` instead. This is because `gyp` randomly crashes if there is
|
2015-08-31 05:31:07 +00:00
|
|
|
only one `Release` or `Debug` build configuration defined, and Electron only has
|
|
|
|
to generate one target at a time as stated above.
|
2015-04-11 04:11:40 +00:00
|
|
|
|
2018-05-08 05:16:09 +00:00
|
|
|
This only affects developers, if you are building Electron for rebranding
|
2015-04-11 04:11:40 +00:00
|
|
|
you are not affected.
|
2016-10-06 05:21:42 +00:00
|
|
|
|
|
|
|
## Tests
|
|
|
|
|
|
|
|
Test your changes conform to the project coding style using:
|
|
|
|
|
2017-11-24 10:13:57 +00:00
|
|
|
```sh
|
2016-10-06 05:21:42 +00:00
|
|
|
$ npm run lint
|
|
|
|
```
|
|
|
|
|
|
|
|
Test functionality using:
|
|
|
|
|
2017-11-24 10:13:57 +00:00
|
|
|
```sh
|
2016-10-06 05:21:42 +00:00
|
|
|
$ npm test
|
|
|
|
```
|
|
|
|
|
2016-10-06 05:22:01 +00:00
|
|
|
Whenever you make changes to Electron source code, you'll need to re-run the
|
|
|
|
build before the tests:
|
|
|
|
|
2017-11-24 10:13:57 +00:00
|
|
|
```sh
|
2016-10-06 05:22:01 +00:00
|
|
|
$ npm run build && npm test
|
|
|
|
```
|
|
|
|
|
2016-10-06 05:21:42 +00:00
|
|
|
You can make the test suite run faster by isolating the specific test or block
|
|
|
|
you're currently working on using Mocha's
|
2018-05-08 05:16:09 +00:00
|
|
|
[exclusive tests](https://mochajs.org/#exclusive-tests) feature. Append
|
2016-10-06 17:27:33 +00:00
|
|
|
`.only` to any `describe` or `it` function call:
|
2016-10-06 05:21:42 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
describe.only('some feature', function () {
|
|
|
|
// ... only tests in this block will be run
|
|
|
|
})
|
|
|
|
```
|
|
|
|
|
|
|
|
Alternatively, you can use mocha's `grep` option to only run tests matching the
|
|
|
|
given regular expression pattern:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
$ npm test -- --grep child_process
|
|
|
|
```
|
|
|
|
|
|
|
|
Tests that include native modules (e.g. `runas`) can't be executed with the
|
|
|
|
debug build (see [#2558](https://github.com/electron/electron/issues/2558) for
|
|
|
|
details), but they will work with the release build.
|
|
|
|
|
|
|
|
To run the tests with the release build use:
|
|
|
|
|
2017-11-24 10:13:57 +00:00
|
|
|
```sh
|
2016-10-06 05:21:42 +00:00
|
|
|
$ npm test -- -R
|
|
|
|
```
|