2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								# Build System Overview
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Electron uses `gyp` for project generation and `ninja` for building. Project
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								configurations can be found in the `.gyp` and `.gypi` files.
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								## Gyp Files
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Following `gyp` files contain the main rules for building Electron:
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-16 11:31:12 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								* `atom.gyp` defines how Electron itself is built.
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								* `common.gypi` adjusts the build configurations of Node to make it build
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  together with Chromium.
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								* `vendor/brightray/brightray.gyp` defines how `brightray` is built and
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  includes the default configurations for linking with Chromium.
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								* `vendor/brightray/brightray.gypi` includes general build configurations about
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  building.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								## Component Build
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07: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 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and performance.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-16 11:31:12 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								In Electron we took a very similar approach: for `Debug` builds, the binary
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								will be linked to a shared library version of Chromium's components to achieve
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:46:13 +08: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 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								## Minimal Bootstrapping
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								All of Chromium's prebuilt binaries (`libchromiumcontent`) are downloaded when
							 | 
						
					
						
							
								
									
										
										
										
											2015-07-05 22:40:08 +08: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-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								depending on the platform.
							 | 
						
					
						
							
								
									
										
										
										
											2015-07-05 22:40:08 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								By default, `libchromiumcontent` is downloaded from Amazon Web Services.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the `LIBCHROMIUMCONTENT_MIRROR` environment variable is set, the bootstrap
							 | 
						
					
						
							
								
									
										
										
										
											2015-07-05 22:40:08 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								script will download from it.
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07: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 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-16 11:31:12 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If you only want to build Electron quickly for testing or development, you
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								can download just the shared library versions by passing the `--dev` parameter:
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```bash
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:46:13 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								$ ./script/bootstrap.py --dev
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								$ ./script/build.py -c D
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-12-24 23:04:44 -08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								## Two-Phase Project Generation
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-16 11:31:12 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Electron links with different sets of libraries in `Release` and `Debug`
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								builds. `gyp`, however, doesn't support configuring different link settings for
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								different configurations.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-16 11:31:12 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								To work around this Electron uses a `gyp` variable
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								`libchromiumcontent_component` to control which link settings to use and only
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								generates one target when running `gyp`.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								## Target Names
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-16 11:31:12 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Unlike most projects that use `Release` and `Debug` as target names, Electron
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								uses `R` and `D` instead. This is because `gyp` randomly crashes if there is
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07: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 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2015-08-30 22:31:07 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								This only affects developers, if you are just building Electron for rebranding
							 | 
						
					
						
							
								
									
										
										
										
											2015-04-11 12:11:40 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								you are not affected.
							 |