Extending Gazelle ================= Gazelle started out as a build file generator for Go projects, but it can be extended to support other languages and custom sets of rules. To extend Gazelle, you must do three things: * Write a [go_library] with a function named `NewLanguage` that provides an implementation of the [Language] interface. This interface provides hooks for generating rules, parsing configuration directives, and resolving imports to Bazel labels. By convention, the library's package name should match the language (for example, `proto` or `bzl`). * Write a [gazelle_binary](#gazelle_binary) rule. Include your library in the `languages` list. * Write a [gazelle] rule that points to your `gazelle_binary`. When you run `bazel run //:gazelle`, your binary will be built and executed instead of the default binary. Tests ----- To write tests for your gazelle extension, you can use [gazelle_generation_test](#gazelle_generation_test), which will run a gazelle binary of your choosing on a set of test workspaces. Supported languages ------------------- Moved to [/README.rst](/README.rst#supported-languages) Example ------- Gazelle itself is built using the model described above, so it may serve as an example. [//language/proto:go_default_library] and [//language/go:go_default_library] both implement the [Language] interface. There is also [//internal/gazellebinarytest:go_default_library], a stub implementation used for testing. `//cmd/gazelle` is a `gazelle_binary` rule that includes both of these libraries through the `DEFAULT_LANGUAGES` list (you may want to use `DEFAULT_LANGUAGES` in your own rule). ```starlark load("@bazel_gazelle//:def.bzl", "DEFAULT_LANGUAGES", "gazelle_binary") gazelle_binary( name = "gazelle", languages = [ "@rules_python//gazelle", # Use gazelle from rules_python. "@bazel_gazelle//language/go", # Built-in rule from gazelle for Golang. "@bazel_gazelle//language/proto", # Built-in rule from gazelle for Protos. # Any languages that depend on Gazelle's proto plugin must come after it. "@external_repository//language/gazelle", # External languages can be added here. ], visibility = ["//visibility:public"], ) ``` This binary can be invoked using a `gazelle` rule like this: ```starlark load("@bazel_gazelle//:def.bzl", "gazelle") # gazelle:prefix example.com/project gazelle( name = "gazelle", gazelle = "//:my_gazelle_binary", ) ``` You can run this with `bazel run //:gazelle`. Interacting with protos ----------------------- The proto extension ([//language/proto:go_default_library]) gathers metadata from .proto files and generates `proto_library` rules based on that metadata. Extensions that generate language-specific proto rules (e.g., `go_proto_library`) may use this metadata. For API reference, see the [proto godoc]. To get proto configuration information, call [proto.GetProtoConfig]. This is mainly useful for discovering the current proto mode. To get information about `proto_library` rules, examine the `OtherGen` list of rules passed to `language.GenerateRules`. This is a list of rules generated by other language extensions, and it will include `proto_library` rules in each directory, if there were any. For each of these rules, you can call `r.PrivateAttr(proto.PackageKey)` to get a [proto.Package] record. This includes the proto package name, as well as source names, imports, and options. [Language]: https://godoc.org/github.com/bazelbuild/bazel-gazelle/language#Language [//internal/gazellebinarytest:go_default_library]: https://github.com/bazelbuild/bazel-gazelle/tree/master/internal/gazellebinarytest [//language/go:go_default_library]: https://github.com/bazelbuild/bazel-gazelle/tree/master/language/go [//language/proto:go_default_library]: https://github.com/bazelbuild/bazel-gazelle/tree/master/language/proto [gazelle]: https://github.com/bazelbuild/bazel-gazelle#bazel-rule [go_binary]: https://github.com/bazelbuild/rules_go/blob/master/go/core.rst#go-binary [go_library]: https://github.com/bazelbuild/rules_go/blob/master/go/core.rst#go-library [proto godoc]: https://godoc.org/github.com/bazelbuild/bazel-gazelle/language/proto [proto.GetProtoConfig]: https://godoc.org/github.com/bazelbuild/bazel-gazelle/language/proto#GetProtoConfig [proto.Package]: https://godoc.org/github.com/bazelbuild/bazel-gazelle/language/proto#Package ## gazelle_binary
gazelle_binary(name, languages)The `gazelle_binary` rule builds a Go binary that incorporates a list of language extensions. This requires generating a small amount of code that must be compiled into Gazelle's main package, so the normal [go_binary] rule is not used. When the binary runs, each language extension is run sequentially. This affects the order that rules appear in generated build files. Metadata may be produced by an earlier extension and consumed by a later extension. For example, the proto extension stores metadata in hidden attributes of generated `proto_library` rules. The Go extension uses this metadata to generate `go_proto_library` rules. **ATTRIBUTES** | Name | Description | Type | Mandatory | Default | | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this target. | Name | required | | | languages | A list of language extensions the Gazelle binary will use.
gazelle_generation_test(name, gazelle_binary, test_data, build_in_suffix, build_out_suffix, gazelle_timeout_seconds, size, kwargs)gazelle_generation_test is a macro for testing gazelle against workspaces. The generation test expects a file structure like the following: ``` |--
-
| `2` | | size | Specifies a test target's "heaviness": how much time/resources it needs to run. | `None` | | kwargs | Attributes that are passed directly to the test declaration. | none |