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

Eric Christopher via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 29 19:39:57 PDT 2020


On Thu, Oct 29, 2020 at 9:44 PM Johannes Doerfert via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> (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.
>
>
Absolutely. This could happen. The main reason behind this is to make
integating among a number of llvm based projects that use bazel (TF and
TF-based projects primarily, though it sounds like FB's internal process
would be helped as their system is similar to bazel).


> 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.
>
>
As far as I can think the cost is...


>
> * 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.)
>
>
... this. If the system becomes a source of problems or user complaints
then I think it's absolutely reasonable to remove it.

-eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201029/eaec3192/attachment.html>


More information about the llvm-dev mailing list