electron/docs/development/build-system-overview.md

73 lines
3 KiB
Markdown
Raw Normal View History

2015-08-31 05:31:07 +00:00
# Build System Overview
2016-03-16 20:15:34 +00:00
Electron uses [gyp](https://gyp.gsrc.io/) for project generation and [ninja](https://ninja-build.org/) for building. Project
2015-08-31 05:31:07 +00:00
configurations can be found in the `.gyp` and `.gypi` files.
2015-08-31 05:31:07 +00:00
## Gyp Files
2015-08-31 05:31:07 +00:00
Following `gyp` files contain the main rules for building Electron:
2015-04-16 03:31:12 +00:00
* `atom.gyp` defines how Electron itself is built.
* `common.gypi` adjusts the build configurations of Node to make it build
together with Chromium.
2015-08-31 05:31:07 +00:00
* `vendor/brightray/brightray.gyp` defines how `brightray` is built and
includes the default configurations for linking with Chromium.
* `vendor/brightray/brightray.gypi` includes general build configurations about
building.
2015-08-31 05:31:07 +00:00
## Component Build
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
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
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-08-31 05:31:07 +00:00
## Minimal Bootstrapping
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-16 03:31:12 +00:00
If you only want to build Electron quickly for testing or development, you
2015-08-31 05:31:07 +00:00
can download just the shared library versions by passing the `--dev` parameter:
```bash
$ ./script/bootstrap.py --dev
$ ./script/build.py -c D
```
2015-12-25 07:04:44 +00:00
## Two-Phase Project Generation
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
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
generates one target when running `gyp`.
2015-08-31 05:31:07 +00:00
## Target Names
2015-04-16 03:31:12 +00:00
Unlike most projects that use `Release` and `Debug` as target names, Electron
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-08-31 05:31:07 +00:00
This only affects developers, if you are just building Electron for rebranding
you are not affected.