blob: d9e4606d3a73334b767ec8d924b16156f9ba9975 [file] [log] [blame] [view]
Mojo
====
Mojo is a collection of interprocess communication technologies, protocols
and a runtime for creating applications and services that are composable while
being loosely coupled. It simplifies the creation of fully asynchronous
component-based systems and provides guarantees so that components made by
different vendors and in different programming languages can interoperate.
## Set-up and code check-out
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](http://www.chromium.org/developers/how-tos/install-depot-tools)
and make sure it is in your path.
2. [Googlers only] Install Goma in ~/goma.
3. Create a directory somewhere for your checkout (preferably on an SSD), cd
into it, and run the following commands:
```
$ fetch mojo # append --target_os=android to include Android build support.
$ cd src
# Or install-build-deps-android.sh if you plan to build for Android.
$ ./build/install-build-deps.sh
$ mojo/tools/mojob.py gn
```
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
`install-build-deps.sh` installs any packages needed to build, then
`mojo/tools/mojob.py gn` runs `gn args` and configures the build directory,
out/Debug.
If the fetch command fails, you will need to delete the src directory and start
over.
### <a name="configure-android"></a>Adding Android bits in an existing checkout
If you configured your set-up for Linux and now wish to build for Android, edit
the `.gclient` file in your root Mojo directory (the parent directory to src.)
and add this line at the end of the file:
```
target_os = [u'android',u'linux']
```
Bring in Android-specific build dependencies:
```
$ build/install-build-deps-android.sh
```
Pull down all of the packages with this command:
```
$ gclient sync
```
## Update your checkout
You can update your checkout like this. The order is important. You must do the
`git pull` first because `gclient sync` is dependent on the current revision.
```
# Fetch changes from upstream and rebase the current branch on top
$ git pull --rebase
# Update all modules as directed by the DEPS file
$ gclient sync
```
You do not need to rerun `gn gen out/Debug` - ninja does so automatically each
time you build. You might need to rerun `mojo/tools/mojob.py gn` if the GN
flags have changed.
## <a name="buildmojo"></a>Build Mojo
### Linux
Build Mojo for Linux by running:
```
$ ninja -C out/Debug -j 10
```
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 (see the
section on Goma below) is present. You cannot specify a target name with this
script.
```
mojo/tools/mojob.py gn
mojo/tools/mojob.py build
```
Run a demo:
```
out/Debug/mojo_shell mojo:spinning_cube
```
Run the tests:
```
mojo/tools/mojob.py test
```
Run the benchmarks:
```
mojo/devtools/common/mojo_benchmark mojo/tools/data/benchmarks
```
Create a release build:
```
mojo/tools/mojob.py gn --release
mojo/tools/mojob.py build --release
mojo/tools/mojob.py test --release
```
### Android
To build for Android, first make sure that your checkout is [configured](#configure-android) to build
for Android. After that you can use the mojob script as follows:
```
$ mojo/tools/mojob.py gn --android
$ mojo/tools/mojob.py build --android
```
The result will be in out/android_Debug. If you see javac compile errors,
[make sure you have an up-to-date JDK](https://code.google.com/p/chromium/wiki/AndroidBuildInstructions#Install_Java_JDK)
### Goma (Googlers only)
If you're a Googler, you can use Goma, a distributed compiler service for
open-source projects such as Chrome and Android. If Goma is installed in the
default location (~/goma), it will work out-of-the-box with the `mojob.py gn`,
`mojob.py build` workflow described above.
You can also manually add:
```
use_goma = true
```
at the end of the file opened through:
```
$ gn args out/Debug
```
After you close the editor `gn gen out/Debug` will run automatically. Now you
can dramatically increase the number of parallel tasks:
```
$ ninja -C out/Debug -j 1000
```
### Official builds
Official builds for android generate a signed Mojo Shell intended for
distribution. You normally should not need to produce one. If you have any
questions, reach out to [etiennej@chromium.org](mailto:etiennej@chromium.org).
## Run Mojo Shell
Devtools `mojo_run` is a universal shell runner abstracting away the differences
between running on Linux and Android.
Having built Mojo as described above, a demo app can be run as follows:
```
mojo/devtools/common/mojo_run https://core.mojoapps.io/spinning_cube.mojo # Linux
mojo/devtools/common/mojo_run https://core.mojoapps.io/spinning_cube.mojo --android # Android
```
### Development server
Whenever `mojo_run` is run, a development server is set up according to [the
config file](mojoconfig). The server runs on your machine, serving the locally
built apps, but appears to the shell under the `https://core.mojoapps.io` host.
You can ignore the config file and skip spawning the local server (for example,
in order to use apps at the actual https://core.mojoapps.io web host) by passing
`--no-config-file` to `mojo_run`.
### More examples
Some applications can be run directly from the source tree. The development
server serves the `src` directory, allowing to refer to these apps. For
instance, this command serves a dart Mojo app from the source at
`examples/dart/device_info/main.dart`:
```sh
mojo/devtools/common/mojo_run https://core.mojoapps.io/examples/dart/device_info/lib/main.dart [--android]
```
Some applications implement ViewProvider and are run embedded in a view. To run
these, you can pass the app url using the `--embed` flag:
```sh
mojo/devtools/common/mojo_run --embed mojo:moterm_example_app [--android]
```
which is a shorthand for:
```sh
mojo/devtools/common/mojo_run "mojo:launcher mojo:moterm_example_app"
```
For additional information on `mojo_run` refer to the built-in help and the
[documentation](mojo/devtools/common/docs/mojo_run.md).
You can also request more information on what the tool is doing for you by
passing the `--verbose` flag.
### <a name="debugging"></a>Debugging, tracing, profiling
Devtools `mojo_debug` allows you to interactively inspect a running shell,
collect performance traces and attach a gdb debugger.
For additional information refer to the built-in help and the
[documentation](mojo/devtools/common/docs/mojo_debug.md).
### Android set-up
#### Adb
For the Android tooling to work, you will need to have `adb` in your PATH. For
that, you can either run:
```
source build/android/envsetup.sh
```
each time you open a fresh terminal, or add something like:
```
export PATH="$PATH":$MOJO_DIR/src/third_party/android_tools/sdk/platform-tools
```
to your ~/.bashrc file, $MOJO_DIR being a path to your Mojo checkout.
#### Device
**The device has to be running Android 5.0 (Lollipop) or newer.**
Many features useful for development (ie. streaming of the shell stdout when
running shell on the device) will not work unless the device is rooted and
running a userdebug build. For Googlers, [follow the instructions at this
link](http://go/mojo-internal-build-instructions).
### Running manually on Linux
If you wish to, you can also run the Linux Mojo shell directly with no wrappers:
```
./out/Debug/mojo_shell out/Debug/spinning_cube.mojo
```
## 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
```
Fix your source code formatting.
```
$ git cl format
```
Upload your change for review.
```
$ git cl upload
```
Respond to review comments.
See [Contributing code](http://www.chromium.org/developers/contributing-code)
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
making your first change: [C++ in Chromium
101](http://dev.chromium.org/developers/cpp-in-chromium-101-codelab).
To land a change after receiving LGTM:
```
$ git cl land
```
## Monitoring
Our [waterfall](http://build.chromium.org/p/client.mojo/waterfall) continuously
builds and tests the code. Don't break the build!
### Benchmarks
One of the bots, [Mojo Linux
Perf](http://build.chromium.org/p/client.mojo/builders/Mojo%20Linux%20Perf) runs
a [suite of benchmarks](mojo/tools/data/benchmarks) and uploads the results to
the [performance dashboard](https://chromeperf.appspot.com/). You can browse the
results [here](https://chromeperf.appspot.com/report), putting `mojo_benchmarks`
as the "test suite".
Automated alerts about performance regressions are sent to
[mojo-perf-alerts@chromium.org](https://groups.google.com/a/chromium.org/forum/#!forum/mojo-perf-alerts).
For examples of interesting sets of graphs see:
- [app
startup](https://chromeperf.appspot.com/report?sid=4848464df5ca8467770d80b309740ef56fbff00e773c2c53816fd8bff1fda1e0)
- [ipc
performance](https://chromeperf.appspot.com/report?sid=9abc20b46f6f8d908b0f07847f1d42eab54c7025a098336e6dc2d3e2030d66f8)
## Development Tools
These are some helpful tools for use during development.
### Atom IDE plugins
Here are some useful plugins for Atom IDE during Mojo development.
- `language-mojom`: provides syntax highlighting for `*.mojom` files.
- `clang-format`: auto-formats C and C++ code in the editor (make sure to configure the path to the executable in the plugin settings).
### Vim plugins
The `//tools/vim` directory contains the following plugins, refer to each script for installation instructions.
- `mojom`: provides syntax highlighting for `*.mojom` files.
- `clang_format.vim`: binds keyboard shortcuts to invoke `clang-format`.
- `filetypes.vim`: provides syntax highlighting for `*.gyp`, `*.gypi`, and `DEPS` files.
- `ninja-build.vim`: binds keyboard shortcuts to invoke the `ninja` build tool.
### Address Sanitizer (ASAN)
Use ASAN to help find misuse of heap memory such as use-after-free errors.
```
$ mojo/tools/mojob.py gn --asan
$ mojo/tools/mojob.py build --asan
```
Use `//tools/valgrind/asan/asan_symbolize.py` to decode stack traces when ASAN detects an error at runtime.
This tool is not supported on Android.
### Android Stack Parser
Use `//mojo/devtools/common/android_stack_parser/stack` to decode stack traces from Mojo programs running on Android.
Make sure to include the lines containing `Caching mojo app XXX at YYY` which are printed while the program starts up so that the stack tool can locate the necessary symbols on the host machine.