2bc4077c9e
I have been hacking around on Bazel more today, and while I think it was a day well spent, I've got intentionally nothing to commit except notes. Change-Id: I711eaf403e447aff5b19830d3ed8c5132c98c469 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/316910 Reviewed-by: Joe Gregorio <jcgregorio@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
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.
|