| --- |
| layout: documentation |
| title: Sharing Variables |
| --- |
| |
| # Sharing Variables |
| |
| `BUILD` files are intended to be simple and declarative. They will typically |
| consist of a series of a target declarations. As your code base and your `BUILD` |
| files are getting larger, you will probably notice some duplication, e.g. |
| |
| ``` python |
| cc_library( |
| name = "foo", |
| copts = ["-DVERSION=5"], |
| srcs = ["foo.cc"], |
| ) |
| |
| cc_library( |
| name = "bar", |
| copts = ["-DVERSION=5"], |
| srcs = ["bar.cc"], |
| deps = [":foo"], |
| ) |
| ``` |
| |
| Code duplication in `BUILD` files is usually fine. This can make the file more |
| readable: each declaration can be read and understood without any context. This |
| is important, not only for humans, but also for external tools. For example, a |
| tool might be able to read and update `BUILD` files to add missing dependencies. |
| Code refactoring and code reuse might prevent this kind of automated |
| modification. |
| |
| With that in mind, it is possible to share values, if you still believe it would |
| be useful (e.g. values must be kept in sync). We can update the previous example |
| and introduce a variable: |
| |
| ``` python |
| COPTS = ["-DVERSION=5"] |
| |
| cc_library( |
| name = "foo", |
| copts = COPTS, |
| srcs = ["foo.cc"], |
| ) |
| |
| cc_library( |
| name = "bar", |
| copts = COPTS, |
| srcs = ["bar.cc"], |
| deps = [":foo"], |
| ) |
| ``` |
| |
| The value `COPTS` is now used by multiple declarations. By convention, we use |
| uppercase letters to name global constants. |
| |
| ## Sharing variables across multiple BUILD files |
| |
| If you need to share a value across multiple `BUILD` files, you have to put it |
| in a `.bzl` file. `.bzl` files contain definitions (variables and functions) |
| that can be used in `BUILD` files. |
| |
| In `path/to/variables.bzl`, write: |
| |
| ``` python |
| COPTS = ["-DVERSION=5"] |
| ``` |
| |
| Then, you can update your `BUILD` files to access the variable: |
| |
| ``` python |
| load("//path/to:variables.bzl", "COPTS") |
| |
| cc_library( |
| name = "foo", |
| copts = COPTS, |
| srcs = ["foo.cc"], |
| ) |
| |
| cc_library( |
| name = "bar", |
| copts = COPTS, |
| srcs = ["bar.cc"], |
| deps = [":foo"], |
| ) |
| ``` |