| 
									
										
										
										
											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. |