Date: prev next · Thread: first prev next last
2025 Archives by date, by thread · List index


Hi Christian,


Thank you very much for your detailed and thoughtful response

We have various types of tests: cppunit, junit, python/UI… and most
are integration-style ones testing multiple components at once, so
that integration might not help much

Thank you for pointing that out.
At this stage, I’m not sure yet which of these test types would benefit most from Bazel’s model — I plan to investigate this in more detail.


gbuild didn't really change since the first migration, so rather it
would be it never had been simplified after the transition phase when
there was a need for some workarounds when two buildsystems were used
at once.

I certainly don’t deny that gbuild has been stable and proven to work.
However, the fact that it hasn’t been simplified for more than a decade is exactly what concerns me. Even if the macro logic itself is not too complex, the interactions between |configure.ac|, numerous |.mk| files, and environment-dependent variables make the system very difficult for new contributors to follow.

Also
absolutely cannot follow why removal of just old code/replacing it by
current code would imply that adding other external libraries would be
hard or not straightforward?

What I was trying to say is that there are still quite a few parts of LibreOffice that seem to reimplement functionality already available in standard or widely-used libraries. If we could gradually replace some of these with well-maintained external ones, we could reduce maintenance cost and modernize the codebase.

For example:

 * our own smart pointer implementations,
 * |tools/json_writer.cxx| (custom JSON writer),
 * |comphelper/source/misc/base64.cxx| (custom Base64 implementation),
 * |comphelper/source/misc/threadpool.cxx| (in-house thread pool system)

Many of these seem to date back to the pre-C++11 era, before the standard library or widely adopted dependencies became mature enough. So using existing, reliable libraries where possible could make maintenance easier in the long run.


No idea what chore library is
Ah, that was a typo. I meant the C++ standard library’s |chrono|


Would there be anyone who would understand that in bazel? I don't know
bazel and I was looking for some more complex examples, but just
couldn't find anything even remotely comparable.

You’re absolutely right — no one will ever understand /everything/.
However, Bazel’s strength is that it allows *understanding by tools*, not only by experts’ memory.
For instance, with
```
bazel query 'deps(//vcl:libvcl)'
```
we can directly inspect dependency trees, visualize relationships, and automatically detect cycles. In the current gbuild system, these relationships exist mostly implicitly, across layers of macros and Makefiles.
Bazel’s model makes such structures visible and analyzable.


I strongly suggest to aim for an automated conversion process.

Wouldn’t a fully automated conversion risk introducing an extra layer of complexity? I’m exploring whether we can design an approach that does not rely heavily on GNU make or Autoconf/configure.


Best regards,
Haruhiko Nishizaki







On 2025/10/14 22:50, Christian Lohmaier wrote:
Hi *,

On Mon, Oct 13, 2025 at 8:07 PM jijinbei<hallucigenia2002@gmail.com> wrote:
[…]
I completely agree — I’m not expecting any dramatic compile-time speedups.
What I find valuable about Bazel is that caching and dependency tracking are built into the system 
by default.
As I have no insight on how that works, I'll just have to take your
word for it :-)

[structure of buildsystem files]
Yes, I understand this is mostly an organizational convention in LibreOffice.
However, one advantage of Bazel is that it integrates testing into the build model.
We have various types of tests: cppunit, junit, python/UI… and most
are integration-style ones testing multiple components at once, so
that integration might not help much, we'd still have our testing
phases after the build is complete...

Each library or module can declare its own test targets directly, so developers can follow the 
conventions of the language or library itself rather than LibreOffice-specific ones.
This could help reduce the number of LibreOffice-specific build rules developers need to learn, 
making the system simpler and easier to work with.
I kinda doubt that this would be as easy in such a complex project
like ours that is using multiple components from different sources,
different build styles, etc.

[rewriting scripts just for the sake of rewriting has its risks]
That’s fair — and I think losing some legacy functionality is acceptable if it leads to a simpler 
and more maintainable structure.
In my view, gbuild has become so complex that almost no one fully understands its internals anymore.
gbuild didn't really change since the first migration, so rather it
would be it never had been simplified after the transition phase when
there was a need for some workarounds when two buildsystems were used
at once. I agree that it can appear complicated when you let the macro
calls confuse you, but when you realize that these are mostly just
fancy placeholder replacements/path assembly operations it is way less
scary... But of course I'm biased since it is familiar, it already was
proven to work.

I fail to see how the build system has an impact on code
refactoring/how a different build system would help with that.

Currently, the gbuild layers and the complex flag logic in configure.ac are deeply intertwined.
It’s often hard to understand which libraries depend on which, directly from the Makefiles.
For instance, there have been discussions (e.g., tdf#39445, tdf#63154) about removing the tools 
module, but isn't the reason this has proven difficult that importing external libraries like chore 
or nlohmann/json is not straightforward under the current setup?
Still even with these examples that are normal code refactorings that
don't even touch the build system since that is such old stuff. Also
absolutely cannot follow why removal of just old code/replacing it by
current code would imply that adding other external libraries would be
hard or not straightforward?
No idea what chore library is, and I'm not aware of someone wanting to
add a json library and not knowing where to start. When adding some
new dependency then it is more a question whether that external
library is available on all supported systems, is
maintained/stable/mature or not and of course whether it does
something we need and has a compatible license and what build system
that new thing uses.

As for what requires what, that's covered by the various
gb_<TargetType>_use_<dependencyType> macros, e.g.
gb_Library_use_libraries to set dependency on other built library or
gb_StaticLibrary_use_unpacked when it is enough that the archive of an
external is unpacked, so it is reflected in the makefiles, and
ultimately the complex logic in configure.ac is just complex because
there's so many different combinations of switches that are
intertwined, the logic would just be as complex in any other
configuration method (or that method would allow invalid combinations
or not support all combinations) - the end result/what the build then
basically is a simple BUILD_TYPE variable with the modules to build,
along with variables containing the compile/link flags for externals
along with some ENABLE_<FOO> for stuff that's finer than module level
– again any system that would support the current combination of
configure switches would have to reflect that in a similar fashion.
Just the option for e.g. linux distribtions to compile against their
system versions of external libraries vs compiling and shipping that
external library is really most of that complexity (and is something
that absolutely must be still possible)

[LO's externals are more than just build dependencies or a binary you grab from a repo]

That’s true, but Bazel can already handle this kind of workflow using 
rules_foreign_cc(https://bazel-contrib.github.io/rules_foreign_cc/)  which allows integrating 
libraries built with Make, CMake, or Meson relatively easily.
I expect this could simplify external integration rather than complicate it.
Well, see above, it is not simply stating to always do that, but only
do that if condition XY, otherwise use the system version...
Also we very frequently require some patches to be applied to fix
bugs/adapt for dependencies, etc. And that is already something that
"shiny-new-thing" style buildsystems don't expect to do. Also
sometimes we ignore the external tool's buildsystem and use our own
makefiles, etc.

[most devs never need to touch the buildsystem, except for adding a line or copying an existing 
snippet]
Even if editing the build system often means “just adding one line to a list,” the overall 
dependency structure still remains something of a black box — is there really anyone who fully 
understands how all of it fits together?
Would there be anyone who would understand that in bazel? I don't know
bazel and I was looking for some more complex examples, but just
couldn't find anything even remotely comparable.
Even the mini-graph of module dependencies is already complex
https://wiki.documentfoundation.org/Development/Build_System compared
to whatever I saw in my search from an example, but that is peanuts if
you go in more detail, so one cannot reasonably expect someone to know
everything, but looking at the files and then finding your way: Yes,
that's definitely possible.

[reproducible in what way?]

Bazel isolates builds inside sandboxes and treats each build action as a pure function,
which prevents side effects and ensures the same inputs always produce the same outputs.
In contrast, Make-based builds depend heavily on environment variables, PATH settings, and the OS 
configuration.
That’s the level of reproducibility I’m referring to — deterministic builds, identical across 
machines.
that sounds nice in theory, e.g. right now we're getting e.g.
timestamp in zip-files/jar files that differ despite being the same
input data. But I wonder whether bazel can help with that as well. And
yea, true that make is depending on environment variables to some
extent, but if bazel shields the build from environment variables,
that also means that converting to bazel is more work, since you'd
them find another way of passing stuff that's currently relying on the
environment..
I wouldn't say it is heavily relying on environment variables, after
all that's why we have configure and generate the config headers and
config_host.mk file reflecting configure's result.
I'd already be happy if identical on the same machine – but currently
it isn't really make/the build system that prevents this.

A minimum viable demo should show how to deal with the configure
options, should work on linux, macOS and Windows (and not a handwavy
"can be easily adapted to…" style), should show how externals are
integrated, should show how the non-compilation stuff like packaging
extensions or help should work. But that is just me personally
speaking.
I’m currently experimenting with a minimal Bazel-based build on Linux to see whether a complete 
migration is technically feasible.
It will take time, but once it’s working I’d like to share the results for discussion.
looking forward to it. As mentioned in another mail I strongly suggest
to aim for an automated conversion process.

ciao
Christian
--
To unsubscribe e-mail to: discuss+unsubscribe@documentfoundation.org
Problems? https://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: https://wiki.documentfoundation.org/Netiquette
List archive: https://listarchives.documentfoundation.org/www/discuss/
Privacy Policy: https://www.documentfoundation.org/privacy

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.