[llvm-dev] Contributing Bazel BUILD files similar to gn

Tom Stellard via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 29 08:22:57 PDT 2020

On 10/28/20 7:18 PM, Geoffrey Martin-Noble via llvm-dev wrote:
> Hi all,
> tl;dr: We'd like to contribute Bazel BUILD files for LLVM and MLIR in a 
> side-directory in the monorepo, similar to the gn build.
> Some of us have been working on open-source Bazel BUILD files for the 
> LLVM Project. You may have seen us hanging out in the #build-systems 
> discord channel. As you may know, Google uses Bazel internally and has 
> maintained a Bazel BUILD of LLVM for years. Especially with the 
> introduction of MLIR, we've got more and more OSS projects with a Bazel 
> BUILD depending on LLVM (e.g. IREE <https://github.com/google/iree>and 
> TensorFlow <https://github.com/tensorflow/tensorflow>). We're also not 
> the only ones using Bazel: e.g. PlaidML also has a Bazel BUILD of LLVM 
> that they've borrowed from TF 
> <https://github.com/plaidml/plaidml/blob/master/vendor/llvm/llvm.BUILD>. 
> Each of these projects has to jump through some weird hoops to keep 
> their version of the Bazel BUILD files in sync with the code, which 
> requires some fragile combination of scripts and human intervention. 
> Instead, we'd like to move general-purpose Bazel BUILD files into the 
> LLVM Project monorepo. We expect to follow the model of the GN build 
> where these will be maintained by interested contributors rather than 
> expecting the general community to maintain them.
> To facilitate and test this we've been developing a standalone 
> repository that just has the Bazel BUILD files. It symlinks together the 
> directory trees on top of a submodule as we would need in the monorepo 
> to to avoid in-tree BUILD files. The configuration is at 
> https://github.com/google/llvm-bazel. We now have those in a good place 
> and think they would be useful upstream.

Can you explain some of the benefits to using Bazel instead of CMake?

I'm a little concerned about having two 'unsupported' buildsystems 
living in tree, and I'm not sure what would stop us from continuing to 
add more.  I would feel better if we had a set of guidelines to define 
the criteria for adding a new buildsytem and also criteria for when we 
can remove them.

Would you be able to amend this proposal to include some general 
guidelines for adding/removing new buildsystems, so that we can discuss 
that too?


> # Details
> ## What
> Bazel BUILD files for the LLVM, MLIR, and Clang (PR out for review 
> <https://github.com/google/llvm-bazel/pull/72>) subprojects, potentially 
> expanding to others, as needed. Basically everything currently at 
> https://github.com/google/llvm-bazel.
> ## Where
> In https://github.com/google/llvm-bazelthe BUILD files live in a single 
> directory tree matching the structure of the overall llvm-project 
> directory. For users, @llvm-project is a single Bazel repository 
> <https://docs.bazel.build/versions/master/build-ref.html#repositories>that 
> includes both LLVM and MLIR subprojects. To maintain this structure, we 
> would probably want to put a `bazel` directory in the monorepo's utils 
> directory <https://github.com/llvm/llvm-project/tree/master/utils>, 
> which currently only contains a directory for arcanist. This is 
> different from gn, which is under the LLVM subproject's utils directory 
> <https://github.com/llvm/llvm-project/tree/master/llvm/utils/gn>. We 
> could similarly put the Bazel BUILD files under llvm/utils/bazel but 
> have them be for the entire llvm project (the subsets that are 
> supported). This seems like an odd structure to me, but I know that the 
> CMake build for LLVM also builds the other subprojects 
> <https://github.com/llvm/llvm-project/blob/529ac33197f6/llvm/tools/CMakeLists.txt#L34-L41>, 
> so maybe this would be preferable.
> Alternatively we could split each subproject into a separate Bazel 
> repository and put the Bazel build files under each subproject. I think 
> this fragments the configuration of the BUILD without much benefit.
> ## Configurations
> We currently have configurations for Linux GCC and Clang, MacOS GCC and 
> Clang, and Windows MSVC. Support for other configurations can be added 
> as-desired, but supporting all possible LLVM build configurations is not 
> the goal.
> ## Support
> Support would be similar to the gn build. Contributors could optionally 
> update the Bazel BUILD files as part of their patches, but would be 
> under no obligation to do so.
> ## Preserving History
> I don't *think* the history of llvm-bazel is interesting enough to try 
> to merge it into the monorepo and I was planning to submit this as a 
> single patch, but please let me know if you disagree.
> ## Benefits to the community
>   *
>     Projects that depend on LLVM and use the Bazel build system can
>     avoid duplicating fragile effort. We'll spend more time contributing
>     to LLVM instead :-D
>   *
>     Bazel is stricter than CMake in many ways (e.g. it requires that
>     even header dependencies be declared) and can catch layering issues
>     very easily. There's even an optional layering_check feature we
>     could turn on if its use would benefit the community. (though
>     currently the existing problematic layering makes it a burden to
>     maintain on our own). Even without that additional check, as I've
>     been keeping the Bazel build green, I've found and fixed a number of
>     layering issues in the past couple weeks (e.g.
>     https://reviews.llvm.org/rGb49787df9a
>     <https://reviews.llvm.org/rGb49787df9a535f03761c340dca7ec3ec1155133d>and
>     https://reviews.llvm.org/rGc17ae2916c
>     <https://reviews.llvm.org/rGc17ae2916ccf45a0c1717bd5f11598cc4fff342a>).
> Here's a patch <https://reviews.llvm.org/D90352>adding the Bazel build 
> system. It's basically just `cp -r llvm-bazel/llvm-bazel 
> llvm-project/utils/bazel`.
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

More information about the llvm-dev mailing list