| # Building Starboard |
| |
| Starboard currently uses GYP as the basis of its build system, though there is |
| already some movement towards GN as a replacement. |
| |
| While you can integrate Starboard into any build system, there are enough knobs |
| and dials that it would be a daunting effort. Instead, Starboard tries to provide a |
| functional build framework that an application developer can easily integrate with. |
| |
| |
| ## The Flow |
| |
| The basic flow of how Starboard builds is: |
| |
| 1. `starboard/build/gyp` - Parse command line parameters and pass them into |
| `GypRunner`. |
| 2. `starboard/build/gyp_runner.py` |
| 1. Load the `PlatformConfiguration`. |
| 2. Load the `ApplicationConfiguration`. |
| 3. Calculate and merge the GYP includes, GYP variables, environment |
| variables, and generator variables, and pass them into GYP. |
| 3. tools/gyp - Parse all the .gyp and included .gypi files, generate ninja. |
| 4. ninja - Build all the source files. |
| |
| |
| ## The Platform vs. the Application |
| |
| In this documentation, you will see a lot of discussion about things being |
| Platform or Application concerns. |
| |
| The Platform is more-or-less what you think it is -- Everything you might need |
| to build any Starboard Application on a given platform. |
| |
| It helps to think about an Application as a broader concept than a single |
| program. From Starboard's build system's perspective, an Application is a |
| *single configuration of build variables per platform*, which may produce many |
| build targets beyond a single executable - shared libraries, tests, and so on. |
| |
| |
| ## Application Customization |
| |
| Each Application will probably want to define its own knobs, dials, and defaults |
| to be able to be customized per platform, and so Starboard provides a space for |
| the Application to do that. |
| |
| Each Application can provide a platform-specific ApplicationConfiguration |
| instance by creating a python module in |
| `<platform-directory>/<application-name>/configuration.py`. This module must |
| contain a class definition that extends from |
| `starboard.build.application_configuration.ApplicationConfiguration`. If the |
| class is not found in the platform-specific location, a generic configuration |
| will be loaded, as dictated by the `APPLICATIONS` registry in |
| `starboard_configuration.py`. |
| |
| Additionally, the Application can provide a GYPI file to be included at |
| `<platform-directory>/<application-name>/configuration.gypi`. This will, by |
| default, be included at the end of all other configuration GYPI files, but this |
| behavior can be arbitrarily customized by the loaded `ApplicationConfiguration` |
| class. |
| |
| |
| ## HOWTO: Create a new Application |
| |
| 1. Create your Application's root `.gyp` file. Often called `all.gyp` or |
| something similar. |
| |
| 2. Create a cross-platform `ApplicationConfiguration` python class for your |
| application. Take a look at |
| [`cobalt_configuration.py`](../../cobalt/build/cobalt_configuration.py) as an |
| example. |
| |
| Define a subclass of |
| `starboard.build.application_configuration.ApplicationConfiguration` and |
| override any desired methods. In particular, you probably at least want to |
| override the `GetDefaultTargetBuildFile()` method to point at your root |
| `.gyp` file from step 1. |
| |
| 3. Register your Application in your `starboard_configuration.py` file in your |
| source tree root. |
| |
| To do this, just add an entry to the `APPLICATIONS` Mapping that maps your |
| canonical Application name to the cross-platform `ApplicationConfiguration` |
| subclass constructor for your application. |
| |
| APPLICATIONS = { |
| # ... |
| |
| 'example_app': example_app.ExampleAppConfiguration |
| |
| # ... |
| } |
| |
| At this point, you should be able to build your application with: |
| |
| starboard/build/gyp -a <application-name> |