Macros ====== **Status: Stable** Macro creation -------------- A macro is a function called from the BUILD file. It can instantiate native or Skylark rules. By the end of the loading phase, macros don't exist anymore: Bazel sees only the set of rules they created. Native rules can be instantiated from the `native` module, e.g. ```python native.cc_library(name = x) ``` If you need to know the package name (i.e. which BUILD file is calling the macro), use the constant `PACKAGE_NAME`. Examples -------- * [Macro creating native rules](cookbook.md#macro_native). * [Macro creating Skylark rules](cookbook.md#macro_skylark). Debugging --------- * `bazel query --output=build ///my/path:all` will show you how the BUILD file looks like after evaluation. All macros, globs, loops are expanded. * You can also use `print` for debugging. It displays the message as a warning during the loading phase. Except in rare cases, remove your `print` calls before submitting the code to the depot. Errors ------ If you want to throw an error, use the `fail` function. Explain clearly to the user what went wrong and how to fix their BUILD file. It is not possible to catch an error. Conventions ----------- * All public functions (functions that don't start with underscore) that instantiate rules must have a `name` argument. This argument should not be optional (don't give a default value). * Public functions should use a docstring following [Python conventions](https://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Comments#Comments). * In BUILD files, the `name` argument of the macros must a be a keyword argument (not a positional argument). * The `name` attribute of rules generated by a macro should include the name argument as a prefix. For example, `macro(name = "foo")` can generate a cc_library `foo` and a genrule `foo_gen`. * Macros should have an optional `visibility` argument.