# Build system overview Atom Shell uses `gyp` for project generation, and `ninja` for building, project configurations can be found in `.gyp` and `.gypi` files. ## Gyp files Following `gyp` files contain the main rules of building Atom Shell: * `atom.gyp` defines how Atom Shell itself is built. * `common.gypi` adjusts the build configurations of Node to make it build together with Chromium. * `vendor/brightray/brightray.gyp` defines how `brightray` is built, and includes the default configurations of linking with Chromium. * `vendor/brightray/brightray.gypi` includes general build configurations about building. ## Component build Since Chromium is a quite large project, the final linking stage would take quite a few minutes, making it hard for development. In order to solve this, Chromium introduces the "component build", which builds each component as a separate shared library, so linking can be very quick, in sacrifice of file size and performance. In Atom Shell we took a very similar approach: for `Debug` build, the binary will be linked to shared library version of Chromium's components to achieve fast linking time; for `Release` build, the binary will be linked to the static library versions, so we can have best binary size and performance. ## Minimal bootstrapping All the Chromium's prebuilt binaries are downloaded when running the bootstrap script, by default both static libraries and shared libraries will be downloaded, and the final size is between 800MB to 2GB according to the platform. If you only want to build Atom Shell quickly for testing or development, you can only download the shared library versions by passing the `--dev` parameter: ```bash $ ./script/boostrap.by --dev $ ./script/build.by -c D ``` ## Two-phrase project generation Atom Shell links with different sets of libraries in `Release` and `Debug` builds, however `gyp` doesn't support configuring different link settings for different configurations. To work around this Atom Shell uses a `gyp` variable `libchromiumcontent_component` to control which link settings to use, and only generates one target when running `gyp`. ## Target names Unlike most projects that use `Release` and `Debug` as target names, Atom Shell uses `R` and `D` instead. This is because `gyp` randomly crashes if there is only one `Release` or `Debug` build configuration is defined, and Atom Shell has to only generate one target for one time as stated above. This only affects developers, if you are only building Atom Shell for rebranding you are not affected.