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 |
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 > >
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 --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: [
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(-)