While Meson has support for _building_ our completion scripts, it does not yet know to also _install_ them. This omission is intentional as it matches the status quo of our Makefile, which doesn't know to install these scripts, either. In fact, our Makefile does not know about these scripts at all: the "build" step that Meson performs is basically just to copy over the files into the build directory, which is required so that our tests know to pick them up for an out-of-tree build. The status quo is somewhat confusing for our users though, as the build steps need to be enabled manually by passing `-Dcontrib=completion` to Meson. So the user explicitly asks for completion scripts, but all they get is that we copy them into the build directory and execute tests. Teach Meson to install completions for Bash and Zsh into the prefix. For now, we try to do the "right thing" and install the scripts into the installation prefix at their canonical paths. These paths should be standardized enough these days so that this works alright for most distributions. If we ever discover that these paths don't work well we can still introduce build options at a later point in time. Signed-off-by: Patrick Steinhardt <ps@xxxxxx> --- Hi, this patch is a result from the discussion at [1]. Thanks! Patrick [1]: <Z-uLqQd7QHZq-tB7@xxxxxxxxx> --- contrib/completion/meson.build | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/contrib/completion/meson.build b/contrib/completion/meson.build index 3a9ddab5940..019c1457488 100644 --- a/contrib/completion/meson.build +++ b/contrib/completion/meson.build @@ -1,16 +1,42 @@ -foreach script : [ - 'git-completion.bash', - 'git-completion.tcsh', - 'git-completion.zsh', - 'git-prompt.sh' -] +foreach script, config : { + 'git-completion.bash': { + 'filename': 'git', + 'install_dir': get_option('datadir') / 'bash-completion/completions', + }, + 'git-completion.tcsh': {}, + 'git-completion.zsh': { + 'filename': '_git', + 'install_dir': get_option('datadir') / 'zsh/site-functions', + }, + 'git-prompt.sh': {}, +} + # We have to discern between the test dependency and the installed file. Our + # tests assume the completion scripts to have the same name as the in-tree + # files, but the installed filenames need to match the executable's basename. if meson.version().version_compare('>=1.3.0') test_dependencies += fs.copyfile(script) + + if config.has_key('install_dir') + fs.copyfile(script, config.get('filename'), + install: true, + install_dir: config.get('install_dir'), + ) + endif else configure_file( input: script, output: script, copy: true, ) + + if config.has_key('install_dir') + configure_file( + input: script, + output: config.get('filename'), + copy: true, + install: true, + install_dir: config.get('install_dir'), + ) + endif endif endforeach --- base-commit: 5b97a56fa0e7d580dc8865b73107407c9b3f0eff change-id: 20250407-b4-pks-meson-install-completions-e5552f1ae2bf