| --- | |
| layout: documentation | |
| title: C++ and Bazel | |
| --- | |
| # C++ and Bazel | |
| This page contains resources that help you use Bazel with C++ projects. It links | |
| to a tutorial, build rules, and other information specific to building C++ | |
| projects with Bazel. | |
| ## Working with Bazel | |
| The following resources will help you work with Bazel on C++ projects: | |
| * [Tutorial: Building a C++ project](tutorial/cpp.html) | |
| * [C++ common use cases](cpp-use-cases.html) | |
| * [C/C++ rules](be/c-cpp.html) | |
| * [C++ toolchain configuration](cc-toolchain-config-reference.html) | |
| * [Tutorial: Configuring C++ toolchains](tutorial/cc-toolchain-config.html) | |
| * [Integrating with C++ rules](integrating-with-rules-cc.html) | |
| ## Best practices | |
| In addition to [general Bazel best practices](best-practices.html), below are | |
| best practices specific to C++ projects. | |
| ### BUILD files | |
| Follow the guidelines below when creating your BUILD files: | |
| * Each `BUILD` file should contain one [`cc_library`](be/c-cpp.html#cc_library) | |
| rule target per compilation unit in the directory. | |
| * You should granularize your C++ libraries as much as | |
| possible to maximize incrementality and parallelize the build. | |
| * If there is a single source file in `srcs`, name the library the same as | |
| that C++ file's name. This library should contain C++ file(s), any matching | |
| header file(s), and the library's direct dependencies. For example: | |
| ```python | |
| cc_library( | |
| name = "mylib", | |
| srcs = ["mylib.cc"], | |
| hdrs = ["mylib.h"], | |
| deps = [":lower-level-lib"] | |
| ) | |
| ``` | |
| * Use one `cc_test` rule target per `cc_library` target in the file. Name the | |
| target `[library-name]_test` and the source file `[library-name]_test.cc`. | |
| For example, a test target for the `mylib` library target shown above would | |
| look like this: | |
| ```python | |
| cc_test( | |
| name = "mylib_test", | |
| srcs = ["mylib_test.cc"], | |
| deps = [":mylib"] | |
| ) | |
| ``` | |
| ### Include paths | |
| Follow these guidelines for include paths: | |
| * Make all include paths relative to the workspace directory. | |
| * Use quoted includes (`#include "foo/bar/baz.h"`) for non-system headers, not | |
| angle-brackets (`#include <foo/bar/baz.h>`). | |
| * Avoid using UNIX directory shortcuts, such as `.` (current directory) or `..` | |
| (parent directory). | |
| * For legacy or `third_party` code that requires includes pointing outside the | |
| project repository, such as external repository includes requiring a prefix, | |
| use the [`include_prefix`](be/c-cpp.html#cc_library.include_prefix) and | |
| [`strip_include_prefix`](be/c-cpp.html#cc_library.strip_include_prefix) | |
| arguments on the `cc_library` rule target. |