Bazel BUILD Files

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

External

Internal

Overview

A BUILD is a short program, an interpretable list of Starlark statements. It can be named BUILD or BUILD.bazel and where both exist, BUILD.bazel takes precedence.

General Syntax

Variables must be defined before they are used.

The relative order in which build rules are declared is unimportant.

The file cannot contain function definitions, for or if control statements. List comprehensions and if expressions are allowed.

Starlark programs can't perform arbitrary I/O, which makes the interpretation of the BUILD files hermetic.

BUILD files need to be updated whenever the dependencies of the underlying code change. IntelliJ does that via the "Sync" functionality.

Build Rules

Reconcile with Bazel_Concepts#rules_go.

When a build rule function is executed, it creates a new target in the graph, which can later referred using a label.

The majority of build rules come in families, grouped together by language. For example, go_binary, go_library and cc_test are the build rules for Go binaries, libraries, and tests, respectively.

*_binary rules build executable in a given language. After a build, the executable will reside in the build tool's binary output tree at the corresponding name for the rule's label, so //my:program would appear at $(BINDIR)/my/program.

*_test rules are a specialization of a *_binary rule used for automated testing.

*_library rules specify separately-compiled modules in the given programming language.

Go Rules

https://github.com/bazelbuild/rules_go

go_library

go_library

go_binary

go_binary

go_test

go_test

go_repository

Other Rules

Functions

Functions can be declared in .bzl files.

Extensions

Bazel extensions are files ending in .bzl. Symbols from an extension are imported with the load() statement:

load("//foo/bar:file.bzl", "some_library")
load("//meta/rules:go.bzl", "go_library")
load("//somewhere/gomock:defs.bzl", "gomock")

some_library(
  ...
)

go_library(
  ...
)

gomock(
  ...
)

This can be used to lad new build rules, functions or constants.

TODO: https://bazel.build/concepts/build-files#load