Hi, this patch series modernizes our build infrasturcture. It refactors various parts of it to make it possible to perform out-of-tree builds in theory. The series then continues to wire up Meson as a proposed alternative as a modern replacement for our current build systems. It provides better integration into IDEs than our Makefiles, better usability than our Makefiles and CMake, better configuration and discoverability thereof than autoconf and CMake (which is of course my personal opinion). The intent is to have Meson replace autoconf, which is mostly unused and broken. Eventually, the plan would to also replace CMake and our Makefiles in case we figure out that this replacement is indeed a net benefit for the project, but all of this would happen over the course of multiple releases. Changes in v7: - Fix overriding TEST_OUTPUT_DIRECTORY via the environment. - Rework generation of version information. GIT-VERSION-GEN now knows to replace @PLACEHOLDERS@ in other files, and this gets used across Makefiles, CMake and Meson now. This makes us properly rebuild when the version info changes and fixes the version numbers in "git.rc". - The CMake build instructions are now doing a proper out-of-tree build. - We now generate and install gitweb.js, which gets built via a new "generate-gitweb-js.sh". - Some improvements to the Meson documentation. - Wire up DEVELOPER=1 style warnings via `--warnlevel 2` and above. - Wire up sanitizers properly. - Provide a new "regex" option to disable the platform-provided version of regcomp() et al. - Stop installing git-http-backend into bindir. - Install Perl scripts into libexecdir. - Install git-cvsserver into bindir and libexecdir. - Install template directory into datadir. As before, the tip of this patch series catches up with what is happening in "seen". If you want to test it without topics in "seen" you have to revert it. Links to previous versions: - Link to v1: https://lore.kernel.org/r/cover.1727881164.git.ps@xxxxxx - Link to v2: https://lore.kernel.org/r/cover.1728485139.git.ps@xxxxxx - Link to v3: https://lore.kernel.org/r/cover.1729254070.git.ps@xxxxxx - Link to v4: https://lore.kernel.org/r/cover.1729771605.git.ps@xxxxxx - Link to v5: https://lore.kernel.org/r/cover.1731335938.git.ps@xxxxxx - Link to v6: https://lore.kernel.org/r/20241112-pks-meson-v6-0-648b30996827@xxxxxx Thanks! Patrick To: git@xxxxxxxxxxxxxxx Cc: Eli Schwartz <eschwartz@xxxxxxxxxx> Cc: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> Cc: Phillip Wood <phillip.wood123@xxxxxxxxx> Cc: Junio C Hamano <gitster@xxxxxxxxx> Cc: Ramsay Jones <ramsay@xxxxxxxxxxxxxxxxxxxx> Cc: Taylor Blau <me@xxxxxxxxxxxx> Cc: David Aguilar <davvid@xxxxxxxxx> Cc: Jeff King <peff@xxxxxxxx> Cc: Christian Couder <christian.couder@xxxxxxxxx> Patrick Steinhardt (22): Makefile: use common template for GIT-BUILD-OPTIONS Makefile: consistently use @PLACEHOLDER@ to substitute Makefile: refactor GIT-VERSION-GEN to be reusable Makefile: propagate Git version via generated header Makefile: generate "git.rc" via GIT-VERSION-GEN Makefile: consistently use PERL_PATH Makefile: extract script to massage Perl scripts Makefile: use "generate-perl.sh" to massage Perl library Makefile: extract script to massage Shell scripts Makefile: extract script to generate gitweb.cgi Makefile: extract script to generate gitweb.js Makefile: refactor generators to be PWD-independent Makefile: allow "bin-wrappers/" directory to exist Makefile: simplify building of templates Documentation: allow sourcing generated includes from separate dir Documentation: teach "cmd-list.perl" about out-of-tree builds Documentation: extract script to generate a list of mergetools t: better support for out-of-tree builds t: allow overriding build dir Documentation: add comparison of build systems Introduce support for the Meson build system meson: fix conflicts with in-flight topics .gitignore | 3 +- Documentation/CodingGuidelines | 2 +- Documentation/Makefile | 28 +- Documentation/build-docdep.perl | 2 + Documentation/cmd-list.perl | 23 +- Documentation/config/diff.txt | 2 +- Documentation/config/merge.txt | 2 +- Documentation/generate-mergetool-list.sh | 17 + Documentation/git.txt | 24 +- Documentation/meson.build | 317 ++++ Documentation/technical/build-systems.txt | 224 +++ GIT-BUILD-OPTIONS.in | 47 + GIT-VERSION-FILE.in | 1 + GIT-VERSION-GEN | 62 +- Makefile | 232 +-- bin-wrappers/.gitignore | 9 + bin-wrappers/meson.build | 28 + bin-wrappers/wrap-for-bin.sh | 37 + ci/test-documentation.sh | 2 +- configure.ac | 2 +- contrib/buildsystems/CMakeLists.txt | 287 +-- contrib/buildsystems/git-version.in | 1 + contrib/completion/meson.build | 8 + contrib/meson.build | 1 + generate-cmdlist.sh | 42 +- generate-configlist.sh | 20 +- generate-hooklist.sh | 15 +- generate-perl.sh | 37 + generate-script.sh | 34 + git-cvsserver.perl | 2 +- git-instaweb.sh | 8 +- git-request-pull.sh | 2 +- git-send-email.perl | 2 +- git-sh-i18n.sh | 6 +- git-sh-setup.sh | 6 +- git-svn.perl | 2 +- git.rc => git.rc.in | 6 +- gitk-git/po/vi.po | 2 +- gitweb/GITWEB-BUILD-OPTIONS.in | 24 + gitweb/Makefile | 62 +- gitweb/generate-gitweb-cgi.sh | 47 + gitweb/generate-gitweb-js.sh | 12 + gitweb/gitweb.perl | 44 +- gitweb/meson.build | 79 + meson.build | 1857 ++++++++++++++++++++ meson_options.txt | 83 + perl/FromCPAN/Mail/meson.build | 7 + perl/FromCPAN/meson.build | 9 + perl/Git/I18N.pm | 6 +- perl/Git/LoadCPAN.pm | 6 +- perl/Git/LoadCPAN/Mail/meson.build | 7 + perl/Git/LoadCPAN/meson.build | 9 + perl/Git/SVN/Memoize/meson.build | 7 + perl/Git/SVN/meson.build | 20 + perl/Git/meson.build | 18 + perl/header_templates/fixed_prefix.template.pl | 2 +- perl/header_templates/runtime_prefix.template.pl | 8 +- perl/meson.build | 12 + po/meson.build | 27 + subprojects/.gitignore | 1 + subprojects/curl.wrap | 13 + subprojects/expat.wrap | 13 + subprojects/openssl.wrap | 15 + subprojects/pcre2.wrap | 16 + subprojects/zlib.wrap | 13 + t/helper/meson.build | 93 + t/lib-gettext.sh | 4 +- t/meson.build | 1107 ++++++++++++ t/t7609-mergetool--lib.sh | 2 +- t/test-lib.sh | 31 +- templates/Makefile | 39 +- templates/branches-- | 1 - templates/{this--description => description} | 0 .../applypatch-msg.sample} | 0 .../commit-msg.sample} | 0 .../fsmonitor-watchman.sample} | 0 templates/hooks/meson.build | 26 + .../post-update.sample} | 0 .../pre-applypatch.sample} | 0 .../pre-commit.sample} | 0 .../pre-merge-commit.sample} | 0 .../pre-push.sample} | 0 .../pre-rebase.sample} | 0 .../pre-receive.sample} | 0 .../prepare-commit-msg.sample} | 0 .../push-to-checkout.sample} | 0 .../sendemail-validate.sample} | 0 .../{hooks--update.sample => hooks/update.sample} | 0 templates/{info--exclude => info/exclude} | 0 templates/info/meson.build | 7 + templates/meson.build | 15 + unimplemented.sh | 2 +- version-def.h.in | 8 + version.c | 1 + wrap-for-bin.sh | 36 - 95 files changed, 4848 insertions(+), 486 deletions(-) Range-diff versus v6: 1: 7c89e63ea5 ! 1: 61d8677718 Makefile: use common template for GIT-BUILD-OPTIONS @@ Commit message While at it, remove the `SUPPORTS_SIMPLE_IPC` variable that we only set up in CMake as it isn't used anywhere. - Note that this change requires us to move around the setup of - TEST_OUTPUT_DIRECTORY in "test-lib.sh" such that it comes after sourcing - the "GIT-BUILD-OPTIONS" file. This is the only instance I could find - where we rely on ordering on variables. + This change requires us to adapt the setup of TEST_OUTPUT_DIRECTORY in + "test-lib.sh" such that it does not get overwritten after sourcing when + it has been set up via the environment. This is the only instance I + could find where we rely on ordering on variables. Signed-off-by: Patrick Steinhardt <ps@xxxxxx> @@ contrib/buildsystems/CMakeLists.txt: if(NOT PYTHON_TESTS) -file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PYTHON='${NO_PYTHON}'\n") -file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "SUPPORTS_SIMPLE_IPC='${SUPPORTS_SIMPLE_IPC}'\n") +file(STRINGS ${CMAKE_SOURCE_DIR}/GIT-BUILD-OPTIONS.in git_build_options NEWLINE_CONSUME) -+string(REPLACE "@SHELL_PATH@" "${SHELL_PATH}" git_build_options "${git_build_options}") -+string(REPLACE "@TEST_SHELL_PATH@" "${TEST_SHELL_PATH}" git_build_options "${git_build_options}") -+string(REPLACE "@PERL_PATH@" "${PERL_PATH}" git_build_options "${git_build_options}") -+string(REPLACE "@DIFF@" "${DIFF}" git_build_options "${git_build_options}") -+string(REPLACE "@PYTHON_PATH@" "${PYTHON_PATH}" git_build_options "${git_build_options}") -+string(REPLACE "@TAR@" "${TAR}" git_build_options "${git_build_options}") ++string(REPLACE "@SHELL_PATH@" "'${SHELL_PATH}'" git_build_options "${git_build_options}") ++string(REPLACE "@TEST_SHELL_PATH@" "'${TEST_SHELL_PATH}'" git_build_options "${git_build_options}") ++string(REPLACE "@PERL_PATH@" "'${PERL_PATH}'" git_build_options "${git_build_options}") ++string(REPLACE "@DIFF@" "'${DIFF}'" git_build_options "${git_build_options}") ++string(REPLACE "@PYTHON_PATH@" "'${PYTHON_PATH}'" git_build_options "${git_build_options}") ++string(REPLACE "@TAR@" "'${TAR}'" git_build_options "${git_build_options}") +string(REPLACE "@NO_CURL@" "${NO_CURL}" git_build_options "${git_build_options}") +string(REPLACE "@NO_ICONV@" "${NO_ICONV}" git_build_options "${git_build_options}") +string(REPLACE "@NO_EXPAT@" "${NO_EXPAT}" git_build_options "${git_build_options}") @@ contrib/buildsystems/CMakeLists.txt: if(NOT PYTHON_TESTS) +string(REPLACE "@NO_PYTHON@" "${NO_PYTHON}" git_build_options "${git_build_options}") +string(REPLACE "@NO_REGEX@" "" git_build_options "${git_build_options}") +string(REPLACE "@NO_UNIX_SOCKETS@" "${NO_UNIX_SOCKETS}" git_build_options "${git_build_options}") -+string(REPLACE "@PAGER_ENV@" "${PAGER_ENV}" git_build_options "${git_build_options}") ++string(REPLACE "@PAGER_ENV@" "'${PAGER_ENV}'" git_build_options "${git_build_options}") +string(REPLACE "@SANITIZE_LEAK@" "" git_build_options "${git_build_options}") +string(REPLACE "@SANITIZE_ADDRESS@" "" git_build_options "${git_build_options}") +string(REPLACE "@X@" "${EXE_EXTENSION}" git_build_options "${git_build_options}") @@ contrib/buildsystems/CMakeLists.txt: if(NOT PYTHON_TESTS) +string(REPLACE "@GIT_INTEROP_MAKE_OPTS@" "" git_build_options "${git_build_options}") +string(REPLACE "@GIT_TEST_INDEX_VERSION@" "" git_build_options "${git_build_options}") +string(REPLACE "@GIT_TEST_PERL_FATAL_WARNINGS@" "" git_build_options "${git_build_options}") -+string(REPLACE "@RUNTIME_PREFIX@" "${RUNTIME_PREFIX}" git_build_options "${git_build_options}") ++string(REPLACE "@RUNTIME_PREFIX@" "'${RUNTIME_PREFIX}'" git_build_options "${git_build_options}") if(USE_VCPKG) - file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n") + string(APPEND git_build_options "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n") @@ t/test-lib.sh: else GIT_BUILD_DIR="${TEST_DIRECTORY%/t}" if test "$TEST_DIRECTORY" = "$GIT_BUILD_DIR" then +@@ t/test-lib.sh: export LSAN_OPTIONS + prepend_var UBSAN_OPTIONS : $GIT_SAN_OPTIONS + export UBSAN_OPTIONS + ++# The TEST_OUTPUT_DIRECTORY will be overwritten via GIT-BUILD-OPTIONS. So in ++# case the caller has manually set up this variable via the environment we must ++# make sure to not overwrite that value, and thus we save it into ++# TEST_OUTPUT_DIRECTORY_OVERRIDE here. ++if test -n "$TEST_OUTPUT_DIRECTORY" && test -z "$TEST_OUTPUT_DIRECTORY_OVERRIDE" ++then ++ TEST_OUTPUT_DIRECTORY_OVERRIDE=$TEST_OUTPUT_DIRECTORY ++fi ++ + if test ! -f "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS + then + echo >&2 'error: GIT-BUILD-OPTIONS missing (has Git been built?).' @@ t/test-lib.sh: fi . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS export PERL_PATH SHELL_PATH 2: ebddce640a = 2: 749b5d29e5 Makefile: consistently use @PLACEHOLDER@ to substitute -: ---------- > 3: af6b00a7b7 Makefile: refactor GIT-VERSION-GEN to be reusable -: ---------- > 4: 666c1d6cf4 Makefile: propagate Git version via generated header -: ---------- > 5: 0358fa0574 Makefile: generate "git.rc" via GIT-VERSION-GEN 3: 2b8f7520bf = 6: d99407979a Makefile: consistently use PERL_PATH 4: 4545c43196 ! 7: 47e0291d3e Makefile: extract script to massage Perl scripts @@ Makefile: endif - $< >$@+ && \ - chmod +x $@+ && \ +$(SCRIPT_PERL_GEN): % : %.perl generate-perl.sh GIT-PERL-DEFINES GIT-PERL-HEADER GIT-VERSION-FILE -+ $(QUIET_GEN)$(SHELL_PATH) generate-perl.sh ./GIT-BUILD-OPTIONS $(GIT_VERSION) GIT-PERL-HEADER "$<" "$@+" && \ ++ $(QUIET_GEN)$(SHELL_PATH) generate-perl.sh ./GIT-BUILD-OPTIONS ./GIT-VERSION-FILE GIT-PERL-HEADER "$<" "$@+" && \ mv $@+ $@ PERL_DEFINES := $(subst $(space),:,$(PERL_DEFINES)) @@ contrib/buildsystems/CMakeLists.txt: foreach(script ${git_shell_scripts}) string(REPLACE "@PATHSEP@" ":" perl_header "${perl_header}") string(REPLACE "@INSTLIBDIR@" "${INSTLIBDIR}" perl_header "${perl_header}") +file(WRITE ${CMAKE_BINARY_DIR}/PERL-HEADER ${perl_header}) ++ ++add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/GIT-VERSION-FILE" ++ COMMAND "${SH_EXE}" "${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN" ++ "${CMAKE_SOURCE_DIR}" ++ "${CMAKE_SOURCE_DIR}/GIT-VERSION-FILE.in" ++ "${CMAKE_BINARY_DIR}/GIT-VERSION-FILE" ++ DEPENDS ${SH_EXE} "${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN" ++ "${CMAKE_SOURCE_DIR}/GIT-VERSION-FILE.in" ++ VERBATIM) foreach(script ${git_perl_scripts}) - file(STRINGS ${CMAKE_SOURCE_DIR}/${script}.perl content NEWLINE_CONSUME) @@ contrib/buildsystems/CMakeLists.txt: foreach(script ${git_shell_scripts}) + add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/${perl_gen_path}" + COMMAND "${SH_EXE}" "${CMAKE_SOURCE_DIR}/generate-perl.sh" + "${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS" -+ "${PROJECT_VERSION}" ++ "${CMAKE_BINARY_DIR}/GIT-VERSION-FILE" + "${CMAKE_BINARY_DIR}/PERL-HEADER" + "${CMAKE_SOURCE_DIR}/${script}" + "${CMAKE_BINARY_DIR}/${perl_gen_path}" + DEPENDS "${CMAKE_SOURCE_DIR}/generate-perl.sh" + "${CMAKE_SOURCE_DIR}/${script}" ++ "${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS" ++ "${CMAKE_BINARY_DIR}/GIT-VERSION-FILE" + VERBATIM) + list(APPEND perl_gen ${CMAKE_BINARY_DIR}/${perl_gen_path}) endforeach() @@ generate-perl.sh (new) + +if test $# -ne 5 +then -+ echo "USAGE: $0 <GIT_BUILD_OPTIONS> <GIT_VERSION> <PERL_HEADER> <INPUT> <OUTPUT>" >&2 ++ echo "USAGE: $0 <GIT_BUILD_OPTIONS> <GIT_VERSION_FILE> <PERL_HEADER> <INPUT> <OUTPUT>" >&2 + exit 1 +fi + +GIT_BUILD_OPTIONS="$1" -+GIT_VERSION="$2" ++GIT_VERSION_FILE="$2" +PERL_HEADER="$3" +INPUT="$4" +OUTPUT="$5" + +. "$GIT_BUILD_OPTIONS" ++. "$GIT_VERSION_FILE" + +sed -e '1{' \ + -e " s|#!.*perl|#!$PERL_PATH|" \ 5: 50948f7020 ! 8: c3f9a22ae4 Makefile: use "generate-perl.sh" to massage Perl library @@ Makefile: endif endif -perl/build/lib/%.pm: perl/%.pm GIT-PERL-DEFINES -+perl/build/lib/%.pm: perl/%.pm generate-perl.sh GIT-BUILD-OPTIONS GIT-PERL-DEFINES ++perl/build/lib/%.pm: perl/%.pm generate-perl.sh GIT-BUILD-OPTIONS GIT-VERSION-FILE GIT-PERL-DEFINES $(call mkdir_p_parent_template) - $(QUIET_GEN) \ - sed -e 's|@LOCALEDIR@|$(perl_localedir_SQ)|g' \ - -e 's|@NO_GETTEXT@|$(NO_GETTEXT_SQ)|g' \ - -e 's|@NO_PERL_CPAN_FALLBACKS@|$(NO_PERL_CPAN_FALLBACKS_SQ)|g' \ - < $< > $@ -+ $(QUIET_GEN)$(SHELL_PATH) generate-perl.sh ./GIT-BUILD-OPTIONS $(GIT_VERSION) GIT-PERL-HEADER "$<" "$@" ++ $(QUIET_GEN)$(SHELL_PATH) generate-perl.sh ./GIT-BUILD-OPTIONS ./GIT-VERSION-FILE GIT-PERL-HEADER "$<" "$@" perl/build/man/man3/Git.3pm: perl/Git.pm $(call mkdir_p_parent_template) @@ contrib/buildsystems/CMakeLists.txt: endforeach() #create perl header file(STRINGS ${CMAKE_SOURCE_DIR}/perl/header_templates/fixed_prefix.template.pl perl_header ) -@@ contrib/buildsystems/CMakeLists.txt: string(REPLACE "@PATHSEP@" ":" perl_header "${perl_header}") - string(REPLACE "@INSTLIBDIR@" "${INSTLIBDIR}" perl_header "${perl_header}") - file(WRITE ${CMAKE_BINARY_DIR}/PERL-HEADER ${perl_header}) +@@ contrib/buildsystems/CMakeLists.txt: add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/GIT-VERSION-FILE" + "${CMAKE_SOURCE_DIR}/GIT-VERSION-FILE.in" + VERBATIM) -foreach(script ${git_perl_scripts}) +foreach(script ${git_perl_scripts} ${perl_modules}) @@ contrib/buildsystems/CMakeLists.txt: file(STRINGS ${CMAKE_SOURCE_DIR}/git-p4.py file(GLOB templates "${CMAKE_SOURCE_DIR}/templates/*") list(TRANSFORM templates REPLACE "${CMAKE_SOURCE_DIR}/templates/" "") @@ contrib/buildsystems/CMakeLists.txt: file(STRINGS ${CMAKE_SOURCE_DIR}/GIT-BUILD-OPTIONS.in git_build_options NEWLINE_ - string(REPLACE "@SHELL_PATH@" "${SHELL_PATH}" git_build_options "${git_build_options}") - string(REPLACE "@TEST_SHELL_PATH@" "${TEST_SHELL_PATH}" git_build_options "${git_build_options}") - string(REPLACE "@PERL_PATH@" "${PERL_PATH}" git_build_options "${git_build_options}") -+string(REPLACE "@PERL_LOCALEDIR@" "${LOCALEDIR}" git_build_options "${git_build_options}") + string(REPLACE "@SHELL_PATH@" "'${SHELL_PATH}'" git_build_options "${git_build_options}") + string(REPLACE "@TEST_SHELL_PATH@" "'${TEST_SHELL_PATH}'" git_build_options "${git_build_options}") + string(REPLACE "@PERL_PATH@" "'${PERL_PATH}'" git_build_options "${git_build_options}") ++string(REPLACE "@PERL_LOCALEDIR@" "'${LOCALEDIR}'" git_build_options "${git_build_options}") +string(REPLACE "@NO_PERL_CPAN_FALLBACKS@" "" git_build_options "${git_build_options}") - string(REPLACE "@DIFF@" "${DIFF}" git_build_options "${git_build_options}") - string(REPLACE "@PYTHON_PATH@" "${PYTHON_PATH}" git_build_options "${git_build_options}") - string(REPLACE "@TAR@" "${TAR}" git_build_options "${git_build_options}") + string(REPLACE "@DIFF@" "'${DIFF}'" git_build_options "${git_build_options}") + string(REPLACE "@PYTHON_PATH@" "'${PYTHON_PATH}'" git_build_options "${git_build_options}") + string(REPLACE "@TAR@" "'${TAR}'" git_build_options "${git_build_options}") ## generate-perl.sh ## @@ generate-perl.sh: OUTPUT="$5" - . "$GIT_BUILD_OPTIONS" + . "$GIT_VERSION_FILE" sed -e '1{' \ + -e " /^#!.*perl/!b" \ 6: 2340c63def ! 9: 23f094d0ba Makefile: extract script to massage Shell scripts @@ Makefile: GIT-SCRIPT-DEFINES: FORCE + $(QUIET_GEN)./generate-script.sh "$<" "$@+" ./GIT-BUILD-OPTIONS && \ mv $@+ $@ - git.res: git.rc GIT-VERSION-FILE GIT-PREFIX + git.rc: git.rc.in GIT-VERSION-GEN GIT-VERSION-FILE @@ Makefile: GIT-PERL-HEADER: $(PERL_HEADER_TEMPLATE) GIT-PERL-DEFINES Makefile perllibdir: @echo '$(perllibdir_SQ)' @@ contrib/buildsystems/CMakeLists.txt: set(git_shell_scripts @@ contrib/buildsystems/CMakeLists.txt: string(REPLACE "@GIT_INTEROP_MAKE_OPTS@" "" git_build_options "${git_build_optio string(REPLACE "@GIT_TEST_INDEX_VERSION@" "" git_build_options "${git_build_options}") string(REPLACE "@GIT_TEST_PERL_FATAL_WARNINGS@" "" git_build_options "${git_build_options}") - string(REPLACE "@RUNTIME_PREFIX@" "${RUNTIME_PREFIX}" git_build_options "${git_build_options}") -+string(REPLACE "@GITWEBDIR@" "${GITWEBDIR}" git_build_options "${git_build_options}") + string(REPLACE "@RUNTIME_PREFIX@" "'${RUNTIME_PREFIX}'" git_build_options "${git_build_options}") ++string(REPLACE "@GITWEBDIR@" "'${GITWEBDIR}'" git_build_options "${git_build_options}") +string(REPLACE "@USE_GETTEXT_SCHEME@" "" git_build_options "${git_build_options}") -+string(REPLACE "@LOCALEDIR@" "${LOCALEDIR}" git_build_options "${git_build_options}") ++string(REPLACE "@LOCALEDIR@" "'${LOCALEDIR}'" git_build_options "${git_build_options}") +string(REPLACE "@BROKEN_PATH_FIX@" "" git_build_options "${git_build_options}") if(USE_VCPKG) string(APPEND git_build_options "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n") 7: 68c0dad962 ! 10: 457a42ef55 Makefile: extract script to generate gitweb.cgi @@ gitweb/GITWEB-BUILD-OPTIONS.in (new) +PERL_PATH=@PERL_PATH@ +JSMIN=@JSMIN@ +CSSMIN=@CSSMIN@ -+GIT_VERSION=@GIT_VERSION@ +GIT_BINDIR=@GIT_BINDIR@ +GITWEB_CONFIG=@GITWEB_CONFIG@ +GITWEB_CONFIG_SYSTEM=@GITWEB_CONFIG_SYSTEM@ @@ gitweb/Makefile: GITWEB_JSLIB_FILES += static/js/javascript-detection.js + $(MAK_DIR_GITWEB)GITWEB-BUILD-OPTIONS.in >"$@+" @cmp -s $@+ $@ && rm -f $@+ || mv -f $@+ $@ -+$(MAK_DIR_GITWEB)gitweb.cgi: $(MAK_DIR_GITWEB)generate-gitweb.sh ++$(MAK_DIR_GITWEB)gitweb.cgi: $(MAK_DIR_GITWEB)generate-gitweb-cgi.sh $(MAK_DIR_GITWEB)gitweb.cgi: $(MAK_DIR_GITWEB)GITWEB-BUILD-OPTIONS ++$(MAK_DIR_GITWEB)gitweb.cgi: GIT-VERSION-FILE $(MAK_DIR_GITWEB)gitweb.cgi: $(MAK_DIR_GITWEB)gitweb.perl $(QUIET_GEN)$(RM) $@ $@+ && \ - sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \ - $(GITWEB_REPLACE) $< >$@+ && \ - chmod +x $@+ && \ -+ $(MAK_DIR_GITWEB)generate-gitweb.sh $(MAK_DIR_GITWEB)/GITWEB-BUILD-OPTIONS $< $@+ && \ ++ $(MAK_DIR_GITWEB)generate-gitweb-cgi.sh $(MAK_DIR_GITWEB)/GITWEB-BUILD-OPTIONS ./GIT-VERSION-FILE $< $@+ && \ mv $@+ $@ $(MAK_DIR_GITWEB)static/gitweb.js: $(addprefix $(MAK_DIR_GITWEB),$(GITWEB_JSLIB_FILES)) - ## gitweb/generate-gitweb.sh (new) ## + ## gitweb/generate-gitweb-cgi.sh (new) ## @@ +#!/bin/sh + +set -e + -+if test $# -ne 3 ++if test $# -ne 4 +then -+ echo "USAGE: $0 <GITWEB-BUILD-OPTIONS> <INPUT> <OUTPUT>" >&2 ++ echo "USAGE: $0 <GITWEB-BUILD-OPTIONS> <GIT-VERSION-FILE> <INPUT> <OUTPUT>" >&2 + exit 1 +fi + +GITWEB_BUILD_OPTIONS="$1" -+INPUT="$2" -+OUTPUT="$3" ++GIT_VERSION_FILE="$2" ++INPUT="$3" ++OUTPUT="$4" + +. "$GITWEB_BUILD_OPTIONS" ++. "$GIT_VERSION_FILE" + +sed -e "1s|#!/usr/bin/perl|#!$PERL_PATH|" \ + -e "s|@PERL_PATH@|$PERL_PATH|" \ 8: f2735c317c < -: ---------- Makefile: refactor GIT-VERSION-GEN to be reusable -: ---------- > 11: a9842baae7 Makefile: extract script to generate gitweb.js 9: e4fa8b74e8 = 12: eb8c8eaf71 Makefile: refactor generators to be PWD-independent 10: b1bbebf30d = 13: 8d74f3adde Makefile: allow "bin-wrappers/" directory to exist 11: bee17be2a2 ! 14: cda66f5f07 Makefile: simplify building of templates @@ contrib/buildsystems/CMakeLists.txt: include_directories(${CMAKE_BINARY_DIR}) list(TRANSFORM libgit_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/") list(TRANSFORM compat_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/") +@@ contrib/buildsystems/CMakeLists.txt: list(APPEND libgit_SOURCES "${CMAKE_BINARY_DIR}/version-def.h") add_library(libgit ${libgit_SOURCES} ${compat_SOURCES}) #libxdiff 12: b4cea04721 = 15: d763b2c7bb Documentation: allow sourcing generated includes from separate dir 13: 56ba18676e = 16: c3b0ce492c Documentation: teach "cmd-list.perl" about out-of-tree builds 14: 448f3aac9b = 17: 432cc11dea Documentation: extract script to generate a list of mergetools 15: dd4ceab0d8 ! 18: 436f8d7dcb t: better support for out-of-tree builds @@ contrib/buildsystems/CMakeLists.txt: string(REPLACE "@GIT_PERF_MAKE_COMMAND@" "" string(REPLACE "@GIT_INTEROP_MAKE_OPTS@" "" git_build_options "${git_build_options}") string(REPLACE "@GIT_TEST_INDEX_VERSION@" "" git_build_options "${git_build_options}") string(REPLACE "@GIT_TEST_PERL_FATAL_WARNINGS@" "" git_build_options "${git_build_options}") -+string(REPLACE "@GIT_TEST_TEXTDOMAINDIR@" "${CMAKE_BINARY_DIR}/po/build/locale" git_build_options "${git_build_options}") -+string(REPLACE "@GIT_TEST_POPATH@" "${CMAKE_BINARY_DIR}/po" git_build_options "${git_build_options}") -+string(REPLACE "@GIT_TEST_TEMPLATE_DIR@" "${CMAKE_BINARY_DIR}/templates/blt" git_build_options "${git_build_options}") -+string(REPLACE "@GIT_TEST_GITPERLLIB@" "${CMAKE_BINARY_DIR}/perl/build/lib" git_build_options "${git_build_options}") -+string(REPLACE "@GIT_TEST_MERGE_TOOLS_DIR@" "${RUNTIME_PREFIX}" git_build_options "${git_build_options}") - string(REPLACE "@RUNTIME_PREFIX@" "${RUNTIME_PREFIX}" git_build_options "${git_build_options}") - string(REPLACE "@GITWEBDIR@" "${GITWEBDIR}" git_build_options "${git_build_options}") ++string(REPLACE "@GIT_TEST_TEXTDOMAINDIR@" "'${CMAKE_BINARY_DIR}/po/build/locale'" git_build_options "${git_build_options}") ++string(REPLACE "@GIT_TEST_POPATH@" "'${CMAKE_BINARY_DIR}/po'" git_build_options "${git_build_options}") ++string(REPLACE "@GIT_TEST_TEMPLATE_DIR@" "'${CMAKE_BINARY_DIR}/templates/blt'" git_build_options "${git_build_options}") ++string(REPLACE "@GIT_TEST_GITPERLLIB@" "'${CMAKE_BINARY_DIR}/perl/build/lib'" git_build_options "${git_build_options}") ++string(REPLACE "@GIT_TEST_MERGE_TOOLS_DIR@" "'${RUNTIME_PREFIX}'" git_build_options "${git_build_options}") + string(REPLACE "@RUNTIME_PREFIX@" "'${RUNTIME_PREFIX}'" git_build_options "${git_build_options}") + string(REPLACE "@GITWEBDIR@" "'${GITWEBDIR}'" git_build_options "${git_build_options}") string(REPLACE "@USE_GETTEXT_SCHEME@" "" git_build_options "${git_build_options}") ## t/lib-gettext.sh ## 16: c1ac988650 = 19: eba2e18294 t: allow overriding build dir 17: fd053fe4a9 = 20: 0abdac86b1 Documentation: add comparison of build systems 18: 4c10499220 ! 21: 30055908e5 Introduce support for the Meson build system @@ gitweb/meson.build (new) +gitweb_config.set_quoted('PERL_PATH', perl.full_path()) +gitweb_config.set_quoted('CSSMIN', '') +gitweb_config.set_quoted('JSMIN', '') -+gitweb_config.set_quoted('GIT_VERSION', git_version) +gitweb_config.set_quoted('GIT_BINDIR', get_option('prefix') / get_option('bindir')) +gitweb_config.set_quoted('GITWEB_CONFIG', get_option('gitweb_config')) +gitweb_config.set_quoted('GITWEB_CONFIG_SYSTEM', get_option('gitweb_config_system')) @@ gitweb/meson.build (new) + output: 'gitweb.cgi', + command: [ + shell, -+ meson.current_source_dir() / 'generate-gitweb.sh', ++ meson.current_source_dir() / 'generate-gitweb-cgi.sh', + meson.current_build_dir() / 'GITWEB-BUILD-OPTIONS', ++ git_version_file.full_path(), + '@INPUT@', + '@OUTPUT@', + ], + install: true, + install_dir: get_option('datadir') / 'gitweb', ++ depends: [git_version_file], ++) ++ ++javascript_files = [ ++ meson.current_source_dir() / 'static/js/adjust-timezone.js', ++ meson.current_source_dir() / 'static/js/blame_incremental.js', ++ meson.current_source_dir() / 'static/js/javascript-detection.js', ++ meson.current_source_dir() / 'static/js/lib/common-lib.js', ++ meson.current_source_dir() / 'static/js/lib/cookies.js', ++ meson.current_source_dir() / 'static/js/lib/datetime.js', ++] ++ ++test_dependencies += custom_target( ++ input: javascript_files, ++ output: 'gitweb.js', ++ command: [ ++ shell, ++ meson.current_source_dir() / 'generate-gitweb-js.sh', ++ '@OUTPUT@', ++ ] + javascript_files, ++ install: true, ++ install_dir: get_option('datadir') / 'gitweb/static', +) + +foreach asset : [ + 'static/git-favicon.png', + 'static/git-logo.png', + 'static/gitweb.css', -+ 'static/js/adjust-timezone.js', -+ 'static/js/blame_incremental.js', -+ 'static/js/javascript-detection.js', -+ 'static/js/lib/common-lib.js', -+ 'static/js/lib/cookies.js', -+ 'static/js/lib/datetime.js', +] + fs.copyfile(asset, + install: true, @@ meson.build (new) +# Configuration +# ============= +# -+# The exact configuration of Git is determined when setting up the Git -+# directory. Unless told otherwise, Meson will automatically detect the -+# availability of various bits and pieces. There are two different kinds of -+# options that can be used to further tweak the build: ++# The exact configuration of Git is determined when setting up the build ++# directory via `meson setup`. Unless told otherwise, Meson will automatically ++# detect the availability of various bits and pieces. There are two different ++# kinds of options that can be used to further tweak the build: +# +# - Built-in options provided by Meson. +# @@ meson.build (new) +# Options can be configured either when setting up the build directory or can +# be changed in preexisting build directories: +# -+# # Set up a build directory with optimized settings that will be ++# # Set up a new build directory with optimized settings that will be +# # installed into an alternative prefix. -+# $ meson setup --buildtype release --optimization 3 --strip --prefix=/home/$USER ++# $ meson setup --buildtype release --optimization 3 --strip --prefix=/home/$USER build ++# ++# # Set up a new build directory with a higher warning level. Level 2 is ++# # mostly equivalent to setting DEVELOPER=1, level 3 and "everything" ++# # will enable even more warnings. ++# $ meson setup -Dwarning_level=2 +# -+# # Set up a build directory with 'address' and 'undefined' sanitizers ++# # Set up a new build directory with 'address' and 'undefined' sanitizers +# # using Clang. -+# $ CC=clang meson setup -Db_sanitize=address,undefined ++# $ CC=clang meson setup -Db_sanitize=address,undefined build +# +# # Disable tests in a preexisting build directory. +# $ meson configure -Dtests=false @@ meson.build (new) +# # Disable features based on Python +# $ meson configure -Dpython=disabled +# -+# # Disable features based on Python -+# $ meson configure -Dpython=disabled -+# +# Options have a type like booleans, choices, strings or features. Features are +# somewhat special as they can have one of three values: enabled, disabled or +# auto. While the first two values are self-explanatory, "auto" will enable or @@ meson.build (new) + script_environment.prepend('PATH', fs.parent(program.full_path())) +endforeach + -+git_version = run_command(shell, 'GIT-VERSION-GEN', check: false, env: script_environment).stdout().strip() -+if git_version == '' -+ git_version = meson.project_version() -+endif -+ +compiler = meson.get_compiler('c') + +libgit_sources = [ @@ meson.build (new) +build_options_config.set('GIT_TEST_OPTS', '') +build_options_config.set('GIT_TEST_PERL_FATAL_WARNINGS', '') +build_options_config.set('GIT_TEST_UTF8_LOCALE', '') -+build_options_config.set('SANITIZE_ADDRESS', '') -+build_options_config.set('SANITIZE_LEAK', '') +build_options_config.set('BROKEN_PATH_FIX', '') +build_options_config.set_quoted('LOCALEDIR', fs.as_posix(get_option('prefix') / get_option('localedir'))) +build_options_config.set('GITWEBDIR', fs.as_posix(get_option('prefix') / get_option('datadir') / 'gitweb')) @@ meson.build (new) +libgit_include_directories = [ '.' ] +libgit_dependencies = [ ] + ++# Treat any warning level above 1 the same as we treat DEVELOPER=1 in our ++# Makefile. ++if get_option('warning_level') in ['2','3', 'everything'] and compiler.get_argument_syntax() == 'gcc' ++ foreach cflag : [ ++ '-Wdeclaration-after-statement', ++ '-Wformat-security', ++ '-Wold-style-definition', ++ '-Woverflow', ++ '-Wpointer-arith', ++ '-Wstrict-prototypes', ++ '-Wunused', ++ '-Wvla', ++ '-Wwrite-strings', ++ '-fno-common', ++ '-Wtautological-constant-out-of-range-compare', ++ # If a function is public, there should be a prototype and the right ++ # header file should be included. If not, it should be static. ++ '-Wmissing-prototypes', ++ # These are disabled because we have these all over the place. ++ '-Wno-empty-body', ++ '-Wno-missing-field-initializers', ++ '-Wno-sign-compare', ++ ] ++ if compiler.has_argument(cflag) ++ libgit_c_args += cflag ++ endif ++ endforeach ++endif ++ ++if get_option('b_sanitize').contains('address') ++ build_options_config.set('SANITIZE_ADDRESS', 'YesCompiledWithIt') ++else ++ build_options_config.set('SANITIZE_ADDRESS', '') ++endif ++if get_option('b_sanitize').contains('leak') ++ libgit_c_args += '-DSUPPRESS_ANNOTATED_LEAKS' ++ build_options_config.set('SANITIZE_LEAK', 'YesCompiledWithIt') ++else ++ build_options_config.set('SANITIZE_LEAK', '') ++endif ++if get_option('b_sanitize').contains('undefined') ++ libgit_c_args += '-DSHA1DC_FORCE_ALIGNED_ACCESS' ++endif ++ +executable_suffix = '' +if host_machine.system() == 'cygwin' or host_machine.system() == 'windows' + executable_suffix = '.exe' @@ meson.build (new) + build_options_config.set('USE_LIBPCRE2', '') +endif + -+curl = dependency('libcurl', version: '>=7.21.3', required: get_option('curl'), default_options: ['default_library=static', 'tests=disabled']) ++curl = dependency('libcurl', version: '>=7.21.3', required: get_option('curl'), default_options: ['default_library=static', 'tests=disabled', 'tool=disabled']) +use_curl_for_imap_send = false +if curl.found() + if curl.version().version_compare('>=7.34.0') @@ meson.build (new) +build_options_config.set_quoted('FSMONITOR_DAEMON_BACKEND', fsmonitor_backend) +build_options_config.set_quoted('FSMONITOR_OS_SETTINGS', fsmonitor_backend) + -+if compiler.has_header('regex.h') and compiler.get_define('REG_STARTEND', prefix: '#include <regex.h>') != '' ++if not get_option('b_sanitize').contains('address') and get_option('regex').allowed() and compiler.has_header('regex.h') and compiler.get_define('REG_STARTEND', prefix: '#include <regex.h>') != '' + build_options_config.set('NO_REGEX', '') + + if compiler.get_define('REG_ENHANCED', prefix: '#include <regex.h>') != '' + libgit_c_args += '-DUSE_ENHANCED_BASIC_REGULAR_EXPRESSIONS' + libgit_sources += 'compat/regcomp_enhanced.c' + endif -+else ++elif not get_option('regex').enabled() + libgit_c_args += [ + '-DNO_REGEX', + '-DGAWK', @@ meson.build (new) + build_options_config.set('NO_REGEX', '1') + libgit_sources += 'compat/regex/regex.c' + libgit_include_directories += 'compat/regex' ++else ++ error('Native regex support requested but not found') +endif + +# setitimer and friends are provided by compat/mingw.c. @@ meson.build (new) + libgit_c_args += '-DHAVE_CLOCK_MONOTONIC' +endif + -+if compiler.compiles(''' ++if not compiler.compiles(''' + #include <inttypes.h> + + void func(void) @@ meson.build (new) + endif +endif + -+if compiler.run(''' ++if not meson.is_cross_build() and compiler.run(''' + #include <stdio.h> + + int main(int argc, const char **argv) @@ meson.build (new) + configuration: build_options_config, +) + ++version_def_h = custom_target( ++ command: [ ++ shell, ++ meson.current_source_dir() / 'GIT-VERSION-GEN', ++ meson.current_source_dir(), ++ '@INPUT@', ++ '@OUTPUT@', ++ ], ++ input: meson.current_source_dir() / 'version-def.h.in', ++ output: 'version-def.h', ++ build_always_stale: true, ++) ++ ++git_version_file = custom_target( ++ command: [ ++ shell, ++ meson.current_source_dir() / 'GIT-VERSION-GEN', ++ meson.current_source_dir(), ++ '@INPUT@', ++ '@OUTPUT@', ++ ], ++ input: meson.current_source_dir() / 'GIT-VERSION-FILE.in', ++ output: 'GIT-VERSION-FILE', ++ build_always_stale: true, ++) ++ +# Build a separate library for "version.c" so that we do not have to rebuild -+# everything when the current Git commit changes. TODO: this only gets set up -+# at configuration time, so we do not notice version changes unless the build -+# instructions get regenerated. We should refactor the source file such that we -+# can substitute tags in the file via `vcs_tag()`. ++# everything when the current Git commit changes. +libgit_version_library = static_library('git-version', -+ sources: ['version.c'], -+ c_args: libgit_c_args + [ -+ '-DGIT_VERSION="' + git_version + '"', -+ '-DGIT_USER_AGENT="' + 'git/' + git_version + '"', -+ '-DGIT_BUILT_FROM_COMMIT="' + run_command('git', 'rev-parse', '-q', '--verify', 'HEAD', check: false).stdout().strip() + '"', ++ sources: [ ++ 'version.c', ++ version_def_h, + ], ++ c_args: libgit_c_args, + dependencies: libgit_dependencies, + include_directories: libgit_include_directories, +) @@ meson.build (new) +common_main_sources = ['common-main.c'] +common_main_link_args = [ ] +if host_machine.system() == 'windows' -+ # TODO: wire these up properly. -+ common_main_sources += import('windows').compile_resources('git.rc', args: [ -+ '-DMAJOR=1', -+ '-DMINOR=1', -+ '-DMICRO=1', -+ '-DPATCHLEVEL=0', -+ '-DGIT_VERSION=\\\"' + git_version + '.GIT\\\"', -+ ]) ++ git_rc = custom_target( ++ command: [ ++ shell, ++ meson.current_source_dir() / 'GIT-VERSION-GEN', ++ meson.current_source_dir(), ++ '@INPUT@', ++ '@OUTPUT@', ++ ], ++ input: meson.current_source_dir() / 'git.rc.in', ++ output: 'git.rc', ++ build_always_stale: true, ++ ) ++ ++ common_main_sources += import('windows').compile_resources(git_rc, ++ include_directories: [meson.current_source_dir()], ++ ) + if compiler.get_argument_syntax() == 'gcc' + common_main_link_args += [ + '-municode', @@ meson.build (new) + +foreach symlink : [ + 'git', -+ 'git-http-backend', + 'git-receive-pack', + 'git-shell', + 'git-upload-archive', @@ meson.build (new) + shell, + meson.project_source_root() / 'generate-perl.sh', + meson.project_build_root() / 'GIT-BUILD-OPTIONS', -+ git_version, ++ git_version_file.full_path(), + perl_header, + '@INPUT@', + '@OUTPUT@', @@ meson.build (new) + output: fs.stem(script), + command: generate_perl_command, + install: true, -+ install_dir: get_option('datadir') / 'perl5', ++ install_dir: get_option('libexecdir') / 'git-core', ++ depends: [git_version_file], + ) + test_dependencies += generated_script ++ + if script == 'git-cvsserver.perl' + bin_wrappers += generated_script ++ ++ install_symlink(fs.stem(script), ++ install_dir: get_option('bindir'), ++ pointing_to: fs.relative_to(get_option('libexecdir') / 'git-core' / fs.stem(script), get_option('bindir')), ++ ) + endif + endforeach + @@ meson.build (new) ## meson_options.txt (new) ## @@ ++# Configuration for how Git behaves at runtime. +option('default_pager', type: 'string', value: 'less', + description: 'Fall-back pager.') +option('default_editor', type: 'string', value: 'vi', @@ meson_options.txt (new) +option('runtime_prefix', type: 'boolean', value: false, + description: 'Resolve ancillary tooling and support files relative to the location of the runtime binary instead of hard-coding them into the binary.') + ++# Features supported by Git. +option('curl', type: 'feature', value: 'enabled', + description: 'Build helpers used to access remotes with the HTTP transport.') +option('expat', type: 'feature', value: 'enabled', @@ meson_options.txt (new) + description: 'Install bundled copies of CPAN modules that serve as a fallback in case the modules are not available on the system.') +option('python', type: 'feature', value: 'auto', + description: 'Build tools written in Python.') ++option('regex', type: 'feature', value: 'auto', ++ description: 'Use the system-provided regex library instead of the bundled one.') + ++# HTTPS backends. +option('openssl', type: 'feature', value: 'auto', + description: 'Support access to HTTPS remotes. OpenSSL may still be pulled in if configured as SHA1 or SHA256 backend.') +option('CommonCrypto', type: 'feature', value: 'auto', + description: 'Build tools written in Python.') + ++# Hashing backends. +option('sha1_backend', type: 'combo', choices: ['openssl', 'block', 'sha1dc', 'common-crypto'], value: 'sha1dc', + description: 'The backend used for hashing objects with the SHA1 object format') +option('sha256_backend', type: 'combo', choices: ['openssl', 'nettle', 'gcrypt', 'block'], value: 'block', + description: 'The backend used for hashing objects with the SHA256 object format') + ++# Build tweaks. +option('macos_use_homebrew_gettext', type: 'boolean', value: true, + description: 'Use gettext from Homebrew instead of the slightly-broken system-provided one.') + ++# gitweb configuration. +option('gitweb_config', type: 'string', value: 'gitweb_config.perl') +option('gitweb_config_system', type: 'string', value: '/etc/gitweb.conf') +option('gitweb_config_common', type: 'string', value: '/etc/gitweb-common.conf') @@ meson_options.txt (new) +option('gitweb_site_footer', type: 'string', value: '') +option('highlight_bin', type: 'string', value: 'highlight') + ++# Documentation. +option('docs', type: 'array', choices: ['man', 'html'], value: [], + description: 'Which documenattion formats to build and install.') +option('default_help_format', type: 'combo', choices: ['man', 'html'], value: 'man', + description: 'Default format used when executing git-help(1).') + ++# Testing. +option('tests', type: 'boolean', value: true, + description: 'Enable building tests. This requires Perl, but is separate from the "perl" option such that you can build tests without Perl features enabled.') +option('test_output_directory', type: 'string', @@ templates/hooks/meson.build (new) + input: hook, + output: hook, + configuration: template_config, ++ install: true, ++ install_dir: get_option('datadir') / 'git-core/templates', + ) +endforeach @@ templates/info/meson.build (new) + input: 'exclude', + output: 'exclude', + configuration: template_config, ++ install: true, ++ install_dir: get_option('datadir') / 'git-core/templates', +) ## templates/meson.build (new) ## @@ templates/meson.build (new) + input: 'description', + output: 'description', + configuration: template_config, ++ install: true, ++ install_dir: get_option('datadir') / 'git-core/templates', +) + +subdir('hooks') 19: 88a7a7e38b = 22: 3bdf6240a5 meson: fix conflicts with in-flight topics --- base-commit: b31fb630c0fc6869a33ed717163e8a1210460d94 change-id: 20241112-pks-meson-95b665c08f06