Hi, this small patch series backfills in a couple of missing features into Meson. It also improves test coverage of our Meson-based CI jobs so that we compile with Meson with Visual Studio and compile fuzzers. CI runs for GitLab and GitHub can be found at [1] and [2], respectively. The series is built on top of fbe8d3079d (Git 2.48, 2025-01-10) with ps/meson-weak-sha1-build at 6a0ee54f9a (meson: provide a summary of configured backends, 2024-12-30) merged into it. Changes in v2: - Consistently use `meson.has_header_symbol()` to fix warnings for features not yet available in Meson 0.61, which is our minimum required version. - Add another patch that makes use use `--fatal-meson-warnings` so that such warnings will cause the build to fail. - Fix a bug that made GIT-VERSION-GEN always return tags as version. - Adapt the approach we use to populate the project and distribution tarball versions. - Link to v1: https://lore.kernel.org/r/20250113-b4-pks-meson-additions-v1-0-97f6a93f691d@xxxxxx Thanks! Patrick [1]: https://gitlab.com/gitlab-org/git/-/merge_requests/280 [2]: https://github.com/git/git/pull/1870 --- Patrick Steinhardt (11): GIT-VERSION-GEN: simplify computing the dirty marker GIT-VERSION-GEN: allow running without input and output files meson: populate project version via GIT-VERSION-GEN meson: fix dependencies for generated headers meson: wire up development environments meson: wire up generation of distribution archive meson: wire up fuzzers meson: make the CSPRNG backend configurable meson: fix compilation with Visual Studio ci: raise error when Meson generates warnings ci: wire up Visual Studio build with Meson .github/workflows/main.yml | 52 +++++++++++++++++++++++++++ .gitlab-ci.yml | 38 ++++++++++++++++++++ GIT-VERSION-GEN | 50 ++++++++++++++++---------- ci/run-build-and-tests.sh | 4 ++- meson.build | 87 +++++++++++++++++++++++++++++++++++++--------- meson_options.txt | 4 +++ oss-fuzz/meson.build | 20 +++++++++++ 7 files changed, 219 insertions(+), 36 deletions(-) Range-diff versus v1: 1: 9cceb5db4d ! 1: a546dd43be GIT-VERSION-GEN: simplify computing the dirty marker @@ GIT-VERSION-GEN: then test -f "$SOURCE_DIR"/.git; } && - VN=$(git -C "$SOURCE_DIR" describe --match "v[0-9]*" HEAD 2>/dev/null) && -+ VN=$(git -C "$SOURCE_DIR" describe --match --dirty "v[0-9]*" 2>/dev/null) && ++ VN=$(git -C "$SOURCE_DIR" describe --dirty --match="v[0-9]*" 2>/dev/null) && case "$VN" in *$LF*) (exit 1) ;; - v[0-9]*) 2: 00b9586887 < -: ---------- GIT-VERSION-GEN: move default version into a separate file -: ---------- > 2: 3079bcc87a GIT-VERSION-GEN: allow running without input and output files -: ---------- > 3: aab1945e47 meson: populate project version via GIT-VERSION-GEN 3: a7712e6874 = 4: 782b9677c3 meson: fix dependencies for generated headers 4: 0b30d76c7a = 5: a9efaebe7b meson: wire up development environments 5: 71081feccf ! 6: 92913a6b20 meson: wire up generation of distribution archive @@ Metadata ## Commit message ## meson: wire up generation of distribution archive - Meson knows to generate distribution archives via `meson dist`. Despite - generating the archive itself, this target also knows to compile and - execute tests from that archive, which helps to ensure that the result - is an adequate drop-in replacement for the versioned project. + Meson knows to generate distribution archives via `meson dist`. In + addition to generating the archive itself, this target also knows to + compile and execute tests from that archive, which helps to ensure that + the result is an adequate drop-in replacement for the versioned project. While this already works as-is, one omission is that we don't propagate the commit that this is built from into the resulting archive. This can @@ Commit message version into the "version" file, which GIT-VERSION-GEN knows to read if present. - Use GIT-VERSION-GEN itself to populate that file. There are two smallish - gotchas: - - - The script is executed in the build directory, not in the directory - where we generate the archive. The target directory is propagated - via the "MESON_DIST_ROOT" environment variable, but because we don't - use a shell to execute GIT-VERSION-GEN we cannot populate the envvar - into its arguments. We thus adapt GIT-VERSION-GEN to handle this for - us. - - - We use the "GIT-VERSION-FILE.in" template to generate the version, - which contains a "GIT_VERSION=" prefix that we need to strip after - reading the "version" file. We could avoid this extra logic if we - used a template that only had the `@GIT_VERSION@` placeholder, but - it would require us to add one more template file. + Use GIT-VERSION-GEN to populate that file. As the script is executed in + the build directory, not in the directory where we generate the archive, + we have adapt it to honor the "MESON_DIST_ROOT" environment variable. Signed-off-by: Patrick Steinhardt <ps@xxxxxx> ## GIT-VERSION-GEN ## -@@ GIT-VERSION-GEN: then - exit 1 - fi +@@ GIT-VERSION-GEN: case "$2" in + esac + OUTPUT="$3" +if test -n "$OUTPUT" && test -n "$MESON_DIST_ROOT" +then + OUTPUT="$MESON_DIST_ROOT/$OUTPUT" +fi -+ - DEF_VER=$(cat "$SOURCE_DIR"/GIT-VERSION) # Protect us from reading Git version information outside of the Git directory -@@ GIT-VERSION-GEN: then - # then try git-describe, then default. - if test -f "$SOURCE_DIR"/version - then -- VN=$(cat "$SOURCE_DIR"/version) || VN="$DEF_VER" -+ VN=$(cat "$SOURCE_DIR"/version) && VN=${VN#GIT_VERSION=} || VN="$DEF_VER" - elif { - test -d "$SOURCE_DIR/.git" || - test -d "${GIT_DIR:-.git}" || + # in case it is not a repository itself, but embedded in an unrelated ## meson.build ## @@ meson.build: devenv.set('GIT_BUILD_DIR', meson.current_build_dir()) @@ meson.build: devenv.set('GIT_BUILD_DIR', meson.current_build_dir()) + shell, + meson.current_source_dir() / 'GIT-VERSION-GEN', + meson.current_source_dir(), -+ meson.current_source_dir() / 'GIT-VERSION-FILE.in', ++ '--format=@GIT_VERSION@', + 'version', +) + 6: 5dd6be9be7 = 7: 4bde8aee4c meson: wire up fuzzers 7: 88e2935e52 ! 8: 2f33403322 meson: make the CSPRNG backend configurable @@ meson.build: else 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') @@ meson.build: else 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_function('getrandom', prefix: '#include <sys/random.h>', required: csprng_backend == 'getrandom') ++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_function('getentropy', prefix: '#include <unistd.h>', required: csprng_backend == 'getentropy') ++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_function('RtlGenRandom', prefix: '#include <windows.h>\n#include <ntsecapi.h>', required: csprng_backend == 'rtlgenrandom') ++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' 8: f6ee13d6dc < -: ---------- meson: fix compilation with Visual Studio -: ---------- > 9: d56a24e15a meson: fix compilation with Visual Studio -: ---------- > 10: c624f1d554 ci: raise error when Meson generates warnings 9: 946c31f452 = 11: c7f7e2309a ci: wire up Visual Studio build with Meson --- base-commit: 35a417ddf0eab983e4d5eb69e628aa198114bb05 change-id: 20250107-b4-pks-meson-additions-055c16b3052b