diff mbox series

[01/11] meson: fix exec path with enabled runtime prefix

Message ID 20250129-b4-pks-meson-improvements-v1-1-ab709f0be12c@pks.im (mailing list archive)
State Superseded
Headers show
Series meson: cleanups, improvements, smallish fixes | expand

Commit Message

Patrick Steinhardt Jan. 29, 2025, 7:11 a.m. UTC
When the runtime prefix option is enabled, Git is built such that it
knows to locate its binaries relative to the directory a binary is being
executed from. This requires us to figure out relative paths, which is
handled in `system_prefix()` by trying to strip a couple of well-known
paths.

One of these paths, GIT_EXEC_PATH, is expected to be absolute when
runtime prefixes are enabled, but relative otherwise. And while our
Makefile gets this correcty, in Meson we always wire up the absolute
path, which may result in us not being able to find binaries.

Fix this by conditionally injecting the paths depending on whether or
not the `runtime_prefix` option is enabled.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Justin Tobler Jan. 29, 2025, 8:12 p.m. UTC | #1
On 25/01/29 08:11AM, Patrick Steinhardt wrote:
> When the runtime prefix option is enabled, Git is built such that it
> knows to locate its binaries relative to the directory a binary is being
> executed from. This requires us to figure out relative paths, which is
> handled in `system_prefix()` by trying to strip a couple of well-known
> paths.

Ok if I understand this correctly, when the runtime prefix option is
enabled, the prefix that gets setup by `system_prefix()` is expected to
be relative from the directory the binary is being executed at.

> One of these paths, GIT_EXEC_PATH, is expected to be absolute when
> runtime prefixes are enabled, but relative otherwise. And while our
> Makefile gets this correcty, in Meson we always wire up the absolute

s/correcty/correctly/

> path, which may result in us not being able to find binaries.

So the problem is that since GIT_EXEC_PATH is always defined as
absolute, when the runtime prefix option is enabled, the relative prefix
is not able to be correctly set and thus always uses the
`FALLBACK_RUNTIME_PREFIX`.

> Fix this by conditionally injecting the paths depending on whether or
> not the `runtime_prefix` option is enabled.
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/meson.build b/meson.build
> index c54ccd2162..fd83df8c42 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -675,7 +675,6 @@ libgit_c_args = [
>    '-DETC_GITATTRIBUTES="' + get_option('gitattributes') + '"',
>    '-DETC_GITCONFIG="' + get_option('gitconfig') + '"',
>    '-DFALLBACK_RUNTIME_PREFIX="' + get_option('prefix') + '"',
> -  '-DGIT_EXEC_PATH="' + get_option('prefix') / get_option('libexecdir') / 'git-core"',
>    '-DGIT_HOST_CPU="' + host_machine.cpu_family() + '"',
>    '-DGIT_HTML_PATH="' + get_option('datadir') / 'doc/git-doc"',
>    '-DGIT_INFO_PATH="' + get_option('infodir') + '"',
> @@ -1437,6 +1436,7 @@ endif
>  if get_option('runtime_prefix')
>    libgit_c_args += '-DRUNTIME_PREFIX'
>    build_options_config.set('RUNTIME_PREFIX', 'true')
> +  git_exec_path = get_option('libexecdir') / 'git-core'
>  
>    if compiler.has_header('mach-o/dyld.h')
>      libgit_c_args += '-DHAVE_NS_GET_EXECUTABLE_PATH'
> @@ -1473,7 +1473,9 @@ if get_option('runtime_prefix')
>    endif
>  else
>    build_options_config.set('RUNTIME_PREFIX', 'false')
> +  git_exec_path = get_option('prefix') / get_option('libexecdir') / 'git-core'
>  endif
> +libgit_c_args += '-DGIT_EXEC_PATH="' + git_exec_path + '"'

Ok, so now we conditionally set `GIT_EXEC_PATH` depending on whether the
runtime prefix option is enabled. Makes sense

>  
>  git_version_file = custom_target(
>    command: [
> 
> -- 
> 2.48.1.362.g079036d154.dirty
> 
>
Patrick Steinhardt Jan. 30, 2025, 7:06 a.m. UTC | #2
On Wed, Jan 29, 2025 at 02:12:35PM -0600, Justin Tobler wrote:
> On 25/01/29 08:11AM, Patrick Steinhardt wrote:
> > When the runtime prefix option is enabled, Git is built such that it
> > knows to locate its binaries relative to the directory a binary is being
> > executed from. This requires us to figure out relative paths, which is
> > handled in `system_prefix()` by trying to strip a couple of well-known
> > paths.
> 
> Ok if I understand this correctly, when the runtime prefix option is
> enabled, the prefix that gets setup by `system_prefix()` is expected to
> be relative from the directory the binary is being executed at.
> 
> > One of these paths, GIT_EXEC_PATH, is expected to be absolute when
> > runtime prefixes are enabled, but relative otherwise. And while our
> > Makefile gets this correcty, in Meson we always wire up the absolute
> 
> s/correcty/correctly/
> 
> > path, which may result in us not being able to find binaries.
> 
> So the problem is that since GIT_EXEC_PATH is always defined as
> absolute, when the runtime prefix option is enabled, the relative prefix
> is not able to be correctly set and thus always uses the
> `FALLBACK_RUNTIME_PREFIX`.

Yup, excatly.

Patrick
diff mbox series

Patch

diff --git a/meson.build b/meson.build
index c54ccd2162..fd83df8c42 100644
--- a/meson.build
+++ b/meson.build
@@ -675,7 +675,6 @@  libgit_c_args = [
   '-DETC_GITATTRIBUTES="' + get_option('gitattributes') + '"',
   '-DETC_GITCONFIG="' + get_option('gitconfig') + '"',
   '-DFALLBACK_RUNTIME_PREFIX="' + get_option('prefix') + '"',
-  '-DGIT_EXEC_PATH="' + get_option('prefix') / get_option('libexecdir') / 'git-core"',
   '-DGIT_HOST_CPU="' + host_machine.cpu_family() + '"',
   '-DGIT_HTML_PATH="' + get_option('datadir') / 'doc/git-doc"',
   '-DGIT_INFO_PATH="' + get_option('infodir') + '"',
@@ -1437,6 +1436,7 @@  endif
 if get_option('runtime_prefix')
   libgit_c_args += '-DRUNTIME_PREFIX'
   build_options_config.set('RUNTIME_PREFIX', 'true')
+  git_exec_path = get_option('libexecdir') / 'git-core'
 
   if compiler.has_header('mach-o/dyld.h')
     libgit_c_args += '-DHAVE_NS_GET_EXECUTABLE_PATH'
@@ -1473,7 +1473,9 @@  if get_option('runtime_prefix')
   endif
 else
   build_options_config.set('RUNTIME_PREFIX', 'false')
+  git_exec_path = get_option('prefix') / get_option('libexecdir') / 'git-core'
 endif
+libgit_c_args += '-DGIT_EXEC_PATH="' + git_exec_path + '"'
 
 git_version_file = custom_target(
   command: [