|  | Mojo | 
|  | ==== | 
|  |  | 
|  | Mojo is an effort to extract a common platform out of Chrome's renderer and plugin processes that can support multiple types of sandboxed content, such as HTML, Pepper, or NaCl. | 
|  |  | 
|  | ## Set up your environment | 
|  |  | 
|  | The instructions below only need to be done once. Note that a simple "git clone" command is not sufficient to build the source code because this repo uses the gclient command from depot_tools to manage most third party dependencies. | 
|  |  | 
|  | 1. Download depot_tools and make sure it is in your path:<br>http://www.chromium.org/developers/how-tos/install-depot-tools<br> | 
|  |  | 
|  | 2. Create a directory somewhere for your checkout, cd into it, and run the following commands: | 
|  |  | 
|  |  | 
|  | ``` | 
|  | $ fetch mojo # use --target_os=android if you want an Android build. | 
|  | $ cd src | 
|  | $ ./build/install-build-deps.sh | 
|  | $ gn gen out/Debug | 
|  | ``` | 
|  |  | 
|  | The "fetch mojo" command does the following: | 
|  | - creates a directory called 'src' under your checkout directory | 
|  | - clones the repository using git clone | 
|  | - clones dependencies with gclient sync | 
|  |  | 
|  | Finally, "install-build-deps.sh" installs any packages needed to build. | 
|  |  | 
|  | If the fetch command fails, you will need to delete the src directory and start over. | 
|  |  | 
|  | ## Build Mojo | 
|  |  | 
|  | Build Mojo by running: | 
|  |  | 
|  | ``` | 
|  | $ ninja -C out/Debug -j 10 root | 
|  | ``` | 
|  |  | 
|  | The "root" parameter specifies the target to build, it's not a special keyword. You can find the "root" target in src/BUILD.gn. | 
|  |  | 
|  | (If you are a Googler, see the section at the end of this document for faster builds.) | 
|  |  | 
|  | You can also use the mojob.py script for building. This script automatically calls ninja and sets -j to an appropriate value based on whether Goma is present. You cannot specify a target name with this script. | 
|  | ``` | 
|  | mojo/tools/mojob.py build | 
|  | ``` | 
|  |  | 
|  | Run a demo: | 
|  | ``` | 
|  | mojo/tools/mojo_demo.sh --browser | 
|  | ``` | 
|  |  | 
|  | Run the tests: | 
|  | ``` | 
|  | mojo/tools/mojob.py test | 
|  | ``` | 
|  |  | 
|  | ## Update your repo | 
|  |  | 
|  | You can update your repo like this: | 
|  | ``` | 
|  | $ gclient sync | 
|  | $ git pull --rebase | 
|  | ``` | 
|  |  | 
|  | You do not need to rerun "gn gen out/Debug". Ninja will do so automatically as needed. | 
|  |  | 
|  | ## Contribute | 
|  |  | 
|  | With git you should make all your changes in a local branch. Once your change is committed, you can delete this branch. | 
|  |  | 
|  | Create a local branch named "mywork" and make changes to it. | 
|  | ``` | 
|  | cd src | 
|  | git new-branch mywork | 
|  | vi ... | 
|  | ``` | 
|  | Commit your change locally (this doesn't commit your change to the SVN or Git server) | 
|  |  | 
|  | ``` | 
|  | git commit -a | 
|  | ``` | 
|  | If you added new files, you should tell git so by running `git add <files>` before committing. | 
|  |  | 
|  | Upload your change for review | 
|  |  | 
|  | ``` | 
|  | git cl upload | 
|  | ``` | 
|  |  | 
|  | Respond to review comments | 
|  | See <a href="http://www.chromium.org/developers/contributing-code">Contributing code</a> for more detailed git instructions, including how to update your CL when you get review comments. There's a short tutorial that might be helpful to try before your first change: <a href="http://dev.chromium.org/developers/cpp-in-chromium-101-codelab">C++ in Chromium 101</a>. | 
|  |  | 
|  | To land a change after receiving LGTM: | 
|  | ``` | 
|  | $ git cl land | 
|  | ``` | 
|  |  | 
|  | Don't break the build! Waterfall is here: http://build.chromium.org/p/client.mojo/waterfall | 
|  |  | 
|  | ## Googlers | 
|  |  | 
|  | If you're a Googler, you can use Goma, a distributed compiler service for open-source projects such as Chrome and Android. The instructions below assume that Goma is installed in the default location (~/goma). | 
|  |  | 
|  | To enable Goma, update your "args.gn" file. Open the file in your editor with this command: | 
|  | ``` | 
|  | $ gn args out/Debug | 
|  | ``` | 
|  |  | 
|  | Add this line to the end of the file: | 
|  | ``` | 
|  | use_goma = true | 
|  | ``` | 
|  |  | 
|  | After you close the editor, the "gn args" command will automatically run "gn gen out/Debug" again. | 
|  |  | 
|  | Now you can dramatically increase the number of parallel tasks: | 
|  | ``` | 
|  | $ ninja -C out/Debug -j 1000 root | 
|  | ``` |