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>
3.7 KiB
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.