225 lines
7.8 KiB
Plaintext
225 lines
7.8 KiB
Plaintext
= Build Systems
|
|
|
|
The build system is the primary way for both developers and system integrators
|
|
to interact with the Git project. As such, being easy to use and extend for
|
|
those who are not directly developing Git itself is just as important as other
|
|
requirements we have on any potential build system.
|
|
|
|
This document outlines the different requirements that we have for the build
|
|
system and then compares available build systems using these criteria.
|
|
|
|
== Requirements
|
|
|
|
The following subsections present a list of requirements that we have for any
|
|
potential build system. Sections are sorted by decreasing priority.
|
|
|
|
=== Platform support
|
|
|
|
The build system must have support for all of our platforms that we continually
|
|
test against as outlined by our platform support policy. These platforms are:
|
|
|
|
- Linux
|
|
- Windows
|
|
- macOS
|
|
|
|
Furthermore, the build system should have support for the following platforms
|
|
that generally have somebody running test pipelines against regularly:
|
|
|
|
- AIX
|
|
- FreeBSD
|
|
- NetBSD
|
|
- NonStop
|
|
- OpenBSD
|
|
|
|
The platforms which must be supported by the tool should be aligned with our
|
|
[platform support policy](platform-support.txt).
|
|
|
|
=== Auto-detection of supported features
|
|
|
|
The build system must support auto-detection of features which are or aren't
|
|
available on the current platform. Platform maintainers should not be required
|
|
to manually configure the complete build.
|
|
|
|
Auto-detection of the following items is considered to be important:
|
|
|
|
- Check for the existence of headers.
|
|
- Check for the existence of libraries.
|
|
- Check for the existence of exectuables.
|
|
- Check for the runtime behavior of specific functions.
|
|
- Check for specific link order requirements when multiple libraries are
|
|
involved.
|
|
|
|
=== 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.
|
|
|
|
=== IDE support
|
|
|
|
The build system should integrate with well-known IDEs. Well-known IDEs include:
|
|
|
|
- Microsoft Visual Studio
|
|
- Visual Studio Code
|
|
- Xcode
|
|
|
|
There are four levels of support:
|
|
|
|
- Native integration into the IDE.
|
|
- Integration into the IDE via a plugin.
|
|
- Integration into the IDE via generating a project description with the build
|
|
system.
|
|
- No integration.
|
|
|
|
Native integration is preferable, but integration via either a plugin or by
|
|
generating a project description via the build system are considered feasible
|
|
alternatives.
|
|
|
|
Another important distinction is the level of integration. There are two
|
|
features that one generally wants to have:
|
|
|
|
- Integration of build targets.
|
|
- Automatic setup of features like code completion with detected build
|
|
dependencies.
|
|
|
|
The first bullet point is the bare minimum, but is not sufficient to be
|
|
considered proper integration.
|
|
|
|
=== Out-of-tree builds
|
|
|
|
The build system should support out-of-tree builds. Out-of-tree builds allow a
|
|
developer to configure multiple different build directories with different
|
|
configuration, e.g. one "debug" build and one "release" build.
|
|
|
|
=== Cross-platform builds
|
|
|
|
The build system should support cross-platform builds, e.g. building for arm on
|
|
an x86-64 host.
|
|
|
|
=== 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.
|
|
- Templating placeholders in 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 running tests such that utilities like `test_pause` or `debug` work.
|
|
|
|
== Comparison
|
|
|
|
The following list of build systems are considered:
|
|
|
|
- GNU Make
|
|
- autoconf
|
|
- CMake
|
|
- Meson
|
|
|
|
=== GNU Make
|
|
|
|
- Platform support: ubitquitous on all platforms, but not well-integrated into Windows.
|
|
- Auto-detection: no built-in support for auto-detection of features.
|
|
- Ease of use: easy to use, but discovering available options is hard. Makefile
|
|
rules can quickly get out of hand once reaching a certain scope.
|
|
- IDE support: execution of Makefile targets is supported by many IDEs
|
|
- Out-of-tree builds: supported in theory, not wired up in practice.
|
|
- Cross-platform builds: supported in theory, not wired up in practice.
|
|
- Language support:
|
|
- C: Limited built-in support, many parts need to be wired up manually.
|
|
- Rust: No built-in support, needs to be wired up manually.
|
|
- Test integration: partially supported, many parts need to be wired up
|
|
manually.
|
|
|
|
=== autoconf
|
|
|
|
- Platform support: ubiquitous on all platforms, but not well-integrated into Windows.
|
|
- Auto-detection: supported.
|
|
- Ease of use: easy to use, discovering available options is comparatively
|
|
easy. The autoconf syntax is prohibitively hard to extend though due to its
|
|
complex set of interacting files and the hard-to-understand M4 language.
|
|
- IDE support: no integration into IDEs at generation time. The generated
|
|
Makefiles have the same level of support as GNU Make.
|
|
- Out-of-tree builds: supported in theory, not wired up in practice.
|
|
- Cross-platform builds: supported.
|
|
- Language support:
|
|
- C: Limited built-in support, many parts need to be wired up manually.
|
|
- Rust: No built-in support, needs to be wired up manually.
|
|
- Test integration: partially supported, many parts need to be wired up
|
|
manually.
|
|
|
|
=== 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
|
|
- 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.
|
|
- 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.
|