97 lines
3.7 KiB
Markdown
97 lines
3.7 KiB
Markdown
|
Notes about Bazel Builds
|
||
|
========================
|
||
|
|
||
|
Skia cannot be built with Bazel yet.
|
||
|
|
||
|
But you should be able to build and run the trivial `tools/bazel_test.cc`:
|
||
|
|
||
|
$ bazel test ...
|
||
|
|
||
|
Dependencies
|
||
|
------------
|
||
|
|
||
|
`WORKSPACE.bazel` acts like `DEPS`, listing external dependencies and how to
|
||
|
fetch them. You can call `bazel sync`, or just let `bazel {build,test,run}`
|
||
|
handle it as needed on its own. The easiest way to add a new dependency is to
|
||
|
start using `tag="..."` or `branch="..."` and then follow the advice of Bazel
|
||
|
to pin that to the `commit` and `shallow_since` it suggests.
|
||
|
|
||
|
We must provide Bazel build configuration for dependencies like `libpng` that
|
||
|
don't provide their own. For `libpng` that's `bazel/libpng.bazel`, linked by
|
||
|
the `new_git_repository()` `build_file` argument, written relative to that
|
||
|
fetched Git repo's root. Its resemblance to `third_party/libpng/BUILD.gn` is
|
||
|
no coincidence... it's pretty much a 1:1 translation between GN and Bazel.
|
||
|
|
||
|
Everything that's checked in builds external dependencies from source. I've
|
||
|
not written an integrated system for substituting prebuilt versions of these
|
||
|
dependencies (e.g. `/usr/include/png.h` and `/usr/lib/libpng.so`), instead
|
||
|
leaving that up to users who want it. The process is not exactly trivial, but
|
||
|
closer to tedious than difficult. Here's an example, overriding `libpng` to
|
||
|
point to prebuilts from Homebrew in ~/brew:
|
||
|
|
||
|
Each overridden dependency will need its own directory with a few files.
|
||
|
|
||
|
$ find overrides
|
||
|
overrides
|
||
|
overrides/libpng
|
||
|
overrides/libpng/include
|
||
|
overrides/libpng/WORKSPACE.bazel
|
||
|
overrides/libpng/BUILD.bazel
|
||
|
|
||
|
`WORKSPACE.bazel` must be present, but in this case can be empty.
|
||
|
|
||
|
$ cat overrides/libpng/WORKSPACE.bazel
|
||
|
|
||
|
`BUILD.bazel` is where it all happens:
|
||
|
|
||
|
$ cat overrides/libpng/BUILD.bazel
|
||
|
cc_library(
|
||
|
name = "libpng",
|
||
|
hdrs = ["include/png.h"],
|
||
|
srcs = ["include/pngconf.h", "include/pnglibconf.h"],
|
||
|
includes = ["include"],
|
||
|
linkopts = ["-lpng", "-L/Users/mtklein/brew/lib"],
|
||
|
visibility = ["//visibility:public"],
|
||
|
)
|
||
|
|
||
|
`include` is a symlink I've made to `~/brew/include` because Bazel doesn't like
|
||
|
absolute paths in `hdrs` or `includes`. On the other hand, a symlink to
|
||
|
`~/brew/lib` doesn't work here, though `-L/Users/mtklein/brew/lib` works fine.
|
||
|
|
||
|
$ readlink overrides/libpng/include
|
||
|
/Users/mtklein/brew/include/
|
||
|
|
||
|
Finally, we point Bazel at all that using `--override_repository`:
|
||
|
|
||
|
$ bazel test ... --override_repository libpng=/Users/mtklein/overrides/libpng
|
||
|
|
||
|
I expect building from source to be the most common use case, and it's more or
|
||
|
less enough to simply know that we can substitute prebuilts this way. The most
|
||
|
interesting part to me is that we don't need to provide this mechanism... it's
|
||
|
all there in stock Bazel. This plan may all want some rethinking in the future
|
||
|
if we want to add the option to trim the dependency entirely and make this
|
||
|
tristate (build it, use it prebuilt, or trim).
|
||
|
|
||
|
.bazelrc
|
||
|
--------
|
||
|
|
||
|
I have not (yet?) checked in a .bazelrc to the Skia repo, but have found it
|
||
|
handy to write my own in ~/.bazelrc:
|
||
|
|
||
|
$ cat ~/.bazelrc
|
||
|
# Print more information on failures.
|
||
|
build --verbose_failures
|
||
|
test --test_output errors
|
||
|
|
||
|
# Create an ASAN config, try `bazel test --config asan ...`.
|
||
|
build:asan --copt -fsanitize=address
|
||
|
build:asan --copt -Wno-macro-redefined # (_FORTIFY_SOURCE redefined.)
|
||
|
build:asan --linkopt -fsanitize=address
|
||
|
|
||
|
# Flip on and off prebuilt overrides easily.
|
||
|
build --override_repository libpng=/Users/mtklein/overrides/libpng
|
||
|
|
||
|
I'm impressed by how much you can configure via bazelrc, and I think this
|
||
|
should let our Bazel build configuration stay mostly focused on the structure
|
||
|
of the project, less cluttered by build settings.
|