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

Johannes Doerfert via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 29 18:44:47 PDT 2020


(see below)


On 10/28/20 6: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.
 >
 > # 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-bazel the 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`.

Doesn't the last paragraph mean all benefits derived from this can be
described either as:
   (1) users do not need to clone the llvm-bazel git repo but get the
       files in llvm-project, or
   (2) "interested contributors" could send patches to llvm-project
       instead of llvm-bazel to update the bazel build.

TBH, I have no interest in using bazel nor anything against it being
merged per se. I just find it curious that we merge another build system
"at no cost" for the community (I think I picked that up in the thread
but I might have imagined the phrasing). I mean, there is always "a
cost"* so it boils down to determine if the benefit is worth it.

~ Johannes


* i.a., people will assume we (=the LLVM community) maintain(s) a bazel
   build, which can certainly be a benefit but also a cost", e.g., when
   the build is not properly maintained, support is scarce, etc. and
   emails come in complaining about it (not thinking of prior examples
   here.)



 > _______________________________________________
 > 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