|  | --- | 
|  | layout: community | 
|  | --- | 
|  |  | 
|  | # Contributing to Bazel | 
|  |  | 
|  | <p class="lead">We welcome contributions! This page covers setting up your | 
|  | machine to develop Bazel and, when you've made a patch, how to submit it.</p> | 
|  |  | 
|  | ## How can I contribute to Bazel? | 
|  |  | 
|  | In general, we prefer contributions that fix bugs or add features (as opposed to | 
|  | stylistic, refactoring, or "cleanup" changes). Please check with us on the | 
|  | [dev list](https://groups.google.com/forum/#!forum/bazel-dev) before investing | 
|  | a lot of time in a patch. | 
|  |  | 
|  | ## Patch Acceptance Process | 
|  |  | 
|  | <!-- Our markdown parser doesn't support nested lists. --> | 
|  | <ol> | 
|  | <li>Read the <a href="governance.html">Bazel governance plan</a>.</li> | 
|  | <li>Discuss your plan and design, and get agreement on our <a href="https://groups.google.com/forum/#!forum/bazel-dev">mailing list</a>. | 
|  | <li>Prepare a git commit that implements the feature. Don't forget to add tests. | 
|  | <li>Create a new code review on <a href="https://bazel-review.googlesource.com">Gerrit</a> | 
|  | by running: | 
|  | <pre>$ git push https://bazel.googlesource.com/bazel HEAD:refs/for/master</pre> | 
|  | Gerrit upload requires that you: | 
|  | <ul> | 
|  | <li>Have signed a | 
|  | <a href="https://cla.developers.google.com">Contributor License Agreement</a>. | 
|  | <li>Have an automatically generated "Change Id" line in your commit message. | 
|  | If you haven't used Gerrit before, it will print a bash command to create | 
|  | the git hook and then you will need to run `git commit --amend` to add the | 
|  | line. | 
|  | </ul> | 
|  | The HTTP password required by Gerrit can be obtained from your | 
|  | <a href="https://bazel-review.googlesource.com/#/settings/http-password">Gerrit settings page</a>. | 
|  | See the | 
|  | <a href="https://gerrit-review.googlesource.com/Documentation/user-upload.html">Gerrit documentation</a> | 
|  | for more information about uploading changes. | 
|  | <li>Complete a code review with a | 
|  | <a href="governance.html#core-contributors">core contributor</a>. Amend your existing | 
|  | commit and re-push to make changes to your patch. | 
|  | <li>An engineer at Google applies the patch to our internal version control | 
|  | system. | 
|  | <li>The patch is exported as a Git commit, at which point the Gerrit code review | 
|  | is closed. | 
|  | </ol> | 
|  |  | 
|  | ## Setting up your coding environment | 
|  |  | 
|  | For now we have partial support for the Eclipse and IntelliJ IDEs for Java. We | 
|  | don't have IDE support for other languages in Bazel right now. | 
|  |  | 
|  | ### Creating an Eclipse project | 
|  |  | 
|  | To work with Eclipse, run `sh scripts/setup-eclipse.sh` from the root of the | 
|  | source tree and it will create the `.project` and the `.classpath` files (if a | 
|  | `.project` file is present, only the `.classpath` will get overwritten). You | 
|  | can then import the project in Eclipse. | 
|  |  | 
|  | _You might see some errors in Eclipse concerning Truth assertions._ | 
|  |  | 
|  | ### Creating an IntelliJ project | 
|  |  | 
|  | To work with IntelliJ, run `sh scripts/setup-intellij.sh` from the root of the | 
|  | source tree and it will create the necessary project files. You can then open | 
|  | the folder as a project in IntelliJ. | 
|  |  | 
|  | <a name="compile-bazel"></a> | 
|  | ### Compiling Bazel | 
|  |  | 
|  | To test out bazel, you need to compile it. There are currently two ways of | 
|  | compiling it: | 
|  |  | 
|  | * `sh compile.sh` bootstraps Bazel from scratch, first compiling it without using | 
|  | Bazel, then rebuilding it again using the just built Bazel and optionally runs | 
|  | tests, too. The resulting binary can be found at `output/bazel`. | 
|  | * `bazel build //src:bazel` builds the Bazel binary using Bazel and the | 
|  | resulting binary can be found at `bazel-bin/src/bazel`. This is the recommended | 
|  | way of rebuilding Bazel once you have bootstrapped it. | 
|  |  | 
|  | In addition to the Bazel binary, you might want to build the various tools Bazel | 
|  | uses. They are located in `//src/java_tools`, `//src/objc_tools` and | 
|  | `//src/tools` and their directories contain README files describing their | 
|  | respective utility. | 
|  |  | 
|  | When modifying Bazel, you want to make sure that the following still works: | 
|  |  | 
|  | * Bootstrap test with `sh compile.sh all` after having removed the | 
|  | `output` directory: it rebuilds Bazel with `./compile.sh`, Bazel with the | 
|  | `compile.sh` Bazel and Bazel with the Bazel-built binary. It compares if the | 
|  | constructed Bazel builts are identical and then runs all bazel tests with | 
|  | `bazel test //src/... //third_party/ijar/...`. This is what we use at Google | 
|  | to ensure that we don't break Bazel when pushing new commits, too. | 
|  |  | 
|  | ### Debugging Bazel | 
|  |  | 
|  | Start creating a debug configuration for both C++ and Java in your bazelrc with the following: | 
|  |  | 
|  | ``` | 
|  | build:debug -c dbg | 
|  | build:debug --javacopt="-g" | 
|  | build:debug --copt="-g" | 
|  | build:debug --strip="never" | 
|  | ``` | 
|  |  | 
|  | Then you can rebuild Bazel with `bazel build --config debug //src:bazel` and use your favorite | 
|  | debugger to start debugging. | 
|  |  | 
|  | For debugging the C++ client you can just run it from gdb or lldb as you normally would. | 
|  | But if you want to debug the Java code, you must attach to the server using the following: | 
|  |  | 
|  | * Run Bazel with debugging option `--host_jvm_debug` before the | 
|  | command (e.g., `bazel --batch --host_jvm_debug build //src:bazel`). | 
|  | * Attach a debugger to the port 5005. With `jdb` for instance, | 
|  | run `jdb -attach localhost:5005`. From within Eclipse, use the | 
|  | [remote Java application launch | 
|  | configuration](http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-remotejava_launch_config.htm). | 
|  | For IntelliJ, you can refer to [Run/Debug Configuration: Remote](https://www.jetbrains.com/idea/help/run-debug-configuration-remote.html). | 
|  |  | 
|  | ## Bazel's code description | 
|  |  | 
|  | Bazel is organized in several parts: | 
|  |  | 
|  | * Client code in `src/main/cpp` provides the command-line interface. | 
|  | * Protocol buffers in `src/main/protobuf`. | 
|  | * Server code in `src/main/java` and `src/test/java`. | 
|  | * Core code which is mostly composed of [SkyFrame](docs/skyframe.html) and some | 
|  | utilities. | 
|  | * [Skylark](docs/skylark/index.html) rules are defined in `tools/build_rules`. | 
|  | If you want to add rules, consider using [Skylark](docs/skylark/index.html) | 
|  | first. | 
|  | * Builtin rules in `com.google.devtools.build.lib.rules` and in | 
|  | `com.google.devtools.build.lib.bazel.rules`. | 
|  | * Java native interfaces in `src/main/native`. | 
|  | * Various tooling for language support (see the list in the | 
|  | [compiling Bazel](#compile-bazel) section). |