Subject: Re: [RFC PATCH v2 23/24] Documentation: add comparison of build systems

From: Phillip Wood <[email-masked]>
Date: Mon, 14 Oct 2024 16:23:33 +0100

Hi Patrick

On 09/10/2024 15:57, Patrick Steinhardt wrote:

Thanks for putting this together, I've left a few comments below.

> +== Requirements
> +
> +The following subsections present a list of requirements that we have for any
> +potential build system. Sections are sorted by decreasing priority, even though
> +these priorities will naturally differ between users.

This last sentence sounds a bit self contradictory - whose priorities 
are we using?

> +=== Platform support
> +
> +The build system must have support for all of our primary platforms as outlined
> +by. These platforms are:

Something seems to have been lost when the first sentence was edited.

> +  - Linux
> +  - Windows
> +  - macOS
> +
> +Furthermore, the build system should have support for the following secondary
> +platforms:
> +
> +  - AIX
> +  - FreeBSD
> +  - NetBSD
> +  - OpenBSD
> +
> +The platforms which must be supported by the tool should be aligned with our
> +[platform support policy](platform-support.txt).

The platform support document does not use the terms primary or 
secondary when talking about support so I'm not sure what distinction 
we're trying to make here. Also where does NonStop fit into this?

> +=== Ease of use
> +
> +The build system should be both easy to use and easy to extend. While this is
> +naturally a subjective metric it is likely not controversial to say that some
> +build systems are considerably harder to use than others.

The tricky part is deciding how to measure ease of use if we're going to 
use it as a metric for selecting a build system.

> +=== Out-of-tree builds
> +
> +The build system should support out-of-tree builds.

Yes please!

> +=== Language support
> +
> +The following languages and toolchains are of relevance and should be supported
> +by the build system:
> +
> +  - C: the primary compiled language used by Git, must be supported. Relevant
> +    toolchains are GCC, Clang and MSVC.
> +  - Rust: candidate as a second compiled lanugage, should be supported. Relevant
> +    toolchains is the LLVM-based rustc.
> +
> +Built-in support for the respective languages is preferred over support that
> +needs to be wired up manually to avoid unnecessary complexity. Native support
> +includes the following features:
> +
> +  - Compiling objects.
> +  - Dependency tracking.
> +  - Detection of available features.
> +  - Discovery of relevant toolchains.
> +  - Linking libraries and executables.

Do we want a section about templating (i.e. substituting @XXX@) support 
which we use when installing scripts?

> +=== Test integration
> +
> +It should be possible to integrate tests into the build system such that it is
> +possible to build and test Git within the build system. Features which are nice
> +to have:
> +
> +  - Track build-time dependencies for respective tests. Unit tests have
> +    different requirements than integration tests.
> +  - Allow filtering of which tests to run.
> +  - Allow interactive tests that drop the user into a shell with `test_pause` or
> +    `debug`.

Does this last point mean we want to be able to selectively pass 
--interactive to the test script(s) being run?

> +=== CMake
> +
> +- Platform support: not as extensive as GNU Make or autoconf, but all major
> +  platforms are supported.
> +  - AIX
> +  - Cygwin
> +  - FreeBSD
> +  - Linux
> +  - OpenBSD
> +  - Solaris
> +  - Windows
> +  - macOS

This matches the list in the CMake README but in practice it is 
available for a much wider range of platforms including all those listed 
below for meson.

> +- Ease of use: easy to use, discovering available options is not always
> +  trivial. The scripting language used by CMake is somewhat cumbersome to use,
> +  but extending CMake build instructions is doable.
> +- IDE support: natively integrated into Microsoft Visual Studio. Can generate
> +  project descriptions for Xcode. An extension is available for Visual Studio
> +  Code. Many other IDEs have plugins for CMake.
> +- Out-of-tree builds: supported.
> +- Cross-platform builds: supported.
> +- Language support:
> +  - C: Supported for GCC, Clang, MSVC and other toolchains.
> +  - Rust: No built-in support, needs to be wired up manually.
> +- Test integration: supported, even though test dependencies are a bit
> +  cumbersome to use via "test fixtures". Interactive test runs are not
> +  supported.
> +
> +=== Meson
> +
> +- Platform: not as extensive as GNU Make or autoconf, but all major platforms
> +  and some smaller ones are supported.
> +  - AIX
> +  - Cygwin
> +  - DragonflyBSD
> +  - FreeBSD
> +  - Haiku
> +  - Linux
> +  - NetBSD
> +  - OpenBSD
> +  - Solaris
> +  - Windows
> +  - macOS
> +- Ease of use: easy to use, discovering available options is easy. The
> +  scripting language is straight-forward to use.
> +- IDE support: Supports generating build instructions for Xcode and Microsoft
> +  Visual Studio, a plugin exists for Visual Studio Code.

This is my main concern about meson - it means we either loose the nice 
integration on Windows that we have with CMake or we have to continue to 
maintain both. As I understand it Microsoft Visual Studio support 
requires the user to open a mingw terminal and run some to generate a 
build description which they can then use form the GUI which is what the 
CMake support was added to avoid. I guess they also need to install 
meson somehow as well.

Best Wishes

Phillip

> +- Out-of-tree builds: supported.
> +- Cross-platform builds: supported.
> +- Language support:
> +  - C: Supported for GCC, Clang, MSVC and other toolchains.
> +  - Rust: Supported for rustc.
> +- Test integration: supported. Interactive tests are supported starting with
> +  Meson 1.5.0 via the `--interactive` flag.