aboutsummaryrefslogtreecommitdiff
path: root/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build88
1 files changed, 71 insertions, 17 deletions
diff --git a/meson.build b/meson.build
index 7361eb2eaa..af7ca042b9 100644
--- a/meson.build
+++ b/meson.build
@@ -170,7 +170,22 @@
project('git', 'c',
meson_version: '>=0.61.0',
- version: 'v2.47.GIT',
+ # The version is only of cosmetic nature, so if we cannot find a shell yet we
+ # simply don't set up a version at all. This may be the case for example on
+ # Windows systems, where we first have to bootstrap the host environment.
+ version: find_program('sh', required: false).found() ? run_command(
+ 'GIT-VERSION-GEN', meson.current_source_dir(), '--format=@GIT_VERSION@',
+ capture: true,
+ check: true,
+ ).stdout().strip() : 'unknown',
+ default_options: [
+ # Git requires C99 with GNU extensions, which of course isn't supported by
+ # MSVC. Funny enough, C99 doesn't work with MSVC either, as it has only
+ # learned to define __STDC_VERSION__ with C11 and later. We thus require
+ # GNU C99 and fall back to C11. Meson only learned to handle the fallback
+ # with version 1.3.0, so on older versions we use GNU C99 unconditionally.
+ 'c_std=' + (meson.version().version_compare('>=1.3.0') ? 'gnu99,c11' : 'gnu99'),
+ ],
)
fs = import('fs')
@@ -480,6 +495,13 @@ libgit_sources = [
'xdiff/xutils.c',
]
+libgit_sources += custom_target(
+ input: 'command-list.txt',
+ output: 'command-list.h',
+ command: [shell, meson.current_source_dir() + '/generate-cmdlist.sh', meson.current_source_dir(), '@OUTPUT@'],
+ env: script_environment,
+)
+
builtin_sources = [
'builtin/add.c',
'builtin/am.c',
@@ -607,14 +629,7 @@ builtin_sources = [
'builtin/write-tree.c',
]
-libgit_sources += custom_target(
- input: 'command-list.txt',
- output: 'command-list.h',
- command: [shell, meson.current_source_dir() + '/generate-cmdlist.sh', meson.current_source_dir(), '@OUTPUT@'],
- env: script_environment,
-)
-
-libgit_sources += custom_target(
+builtin_sources += custom_target(
output: 'config-list.h',
command: [
shell,
@@ -625,7 +640,7 @@ libgit_sources += custom_target(
env: script_environment,
)
-libgit_sources += custom_target(
+builtin_sources += custom_target(
input: 'Documentation/githooks.txt',
output: 'hook-list.h',
command: [
@@ -1325,6 +1340,7 @@ if not meson.is_cross_build() and fs.exists('/dev/tty')
libgit_c_args += '-DHAVE_DEV_TTY'
endif
+csprng_backend = get_option('csprng_backend')
https_backend = get_option('https_backend')
sha1_backend = get_option('sha1_backend')
sha1_unsafe_backend = get_option('sha1_unsafe_backend')
@@ -1336,7 +1352,7 @@ if https_backend == 'auto' and security_framework.found()
https_backend = 'CommonCrypto'
endif
-openssl_required = 'openssl' in [https_backend, sha1_backend, sha1_unsafe_backend, sha256_backend]
+openssl_required = 'openssl' in [csprng_backend, https_backend, sha1_backend, sha1_unsafe_backend, sha256_backend]
openssl = dependency('openssl', required: openssl_required, default_options: ['default_library=static'])
if https_backend == 'auto' and openssl.found()
https_backend = 'openssl'
@@ -1421,18 +1437,30 @@ else
error('Unhandled SHA256 backend ' + sha256_backend)
endif
-if compiler.has_header_symbol('stdlib.h', 'arc4random_buf')
+# Backends are ordered to reflect our preference for more secure and faster
+# ones over the ones that are less so.
+if csprng_backend in ['auto', 'arc4random'] and compiler.has_header_symbol('stdlib.h', 'arc4random_buf', required: csprng_backend == 'arc4random')
libgit_c_args += '-DHAVE_ARC4RANDOM'
-elif compiler.has_header_symbol('bsd/stdlib.h', 'arc4random_buf')
+ csprng_backend = 'arc4random'
+elif csprng_backend in ['auto', 'arc4random_bsd'] and compiler.has_header_symbol('bsd/stdlib.h', 'arc4random_buf', required: csprng_backend == 'arc4random_bsd')
libgit_c_args += '-DHAVE_ARC4RANDOM_BSD'
-elif compiler.has_function('getrandom', prefix: '#include <sys/random.h>')
+ csprng_backend = 'arc4random_bsd'
+elif csprng_backend in ['auto', 'getrandom'] and compiler.has_header_symbol('sys/random.h', 'getrandom', required: csprng_backend == 'getrandom')
libgit_c_args += '-DHAVE_GETRANDOM'
-elif compiler.has_function('getentropy', prefix: '#include <unistd.h>')
+ csprng_backend = 'getrandom'
+elif csprng_backend in ['auto', 'getentropy'] and compiler.has_header_symbol('unistd.h', 'getentropy', required: csprng_backend == 'getentropy')
libgit_c_args += '-DHAVE_GETENTROPY'
-elif compiler.has_function('RtlGenRandom', prefix: '#include <windows.h>\n#include <ntsecapi.h>')
+ csprng_backend = 'getentropy'
+elif csprng_backend in ['auto', 'rtlgenrandom'] and compiler.has_header_symbol('ntsecapi.h', 'RtlGenRandom', prefix: '#include <windows.h>', required: csprng_backend == 'rtlgenrandom')
libgit_c_args += '-DHAVE_RTLGENRANDOM'
-elif openssl.found()
+ csprng_backend = 'rtlgenrandom'
+elif csprng_backend in ['auto', 'openssl'] and openssl.found()
libgit_c_args += '-DHAVE_OPENSSL_CSPRNG'
+ csprng_backend = 'openssl'
+elif csprng_backend in ['auto', 'urandom']
+ csprng_backend = 'urandom'
+else
+ error('Unsupported CSPRNG backend: ' + csprng_backend)
endif
if get_option('runtime_prefix')
@@ -1899,6 +1927,10 @@ if get_option('tests')
subdir('t')
endif
+if get_option('fuzzers')
+ subdir('oss-fuzz')
+endif
+
subdir('bin-wrappers')
if get_option('docs') != []
subdir('Documentation')
@@ -1932,6 +1964,27 @@ configure_file(
configuration: build_options_config,
)
+# Development environments can be used via `meson devenv -C <builddir>`. This
+# allows you to execute test scripts directly with the built Git version and
+# puts the built version of Git in your PATH.
+devenv = environment()
+devenv.set('GIT_BUILD_DIR', meson.current_build_dir())
+devenv.prepend('PATH', meson.current_build_dir() / 'bin-wrappers')
+meson.add_devenv(devenv)
+
+# Generate the 'version' file in the distribution tarball. This is used via
+# `meson dist -C <builddir>` to populate the source archive with the Git
+# version that the archive is being generated from.
+meson.add_dist_script(
+ shell,
+ '-c',
+ '"$1" "$2" "$3" --format="@GIT_VERSION@" "$MESON_DIST_ROOT/version"',
+ 'GIT-VERSION-GEN',
+ shell,
+ meson.current_source_dir() / 'GIT-VERSION-GEN',
+ meson.current_source_dir(),
+)
+
summary({
'curl': curl.found(),
'expat': expat.found(),
@@ -1945,6 +1998,7 @@ summary({
}, section: 'Auto-detected features')
summary({
+ 'csprng': csprng_backend,
'https': https_backend,
'sha1': sha1_backend,
'sha1_unsafe': sha1_unsafe_backend,