soup: Ensure that libsoup RPATHs are added with Homebrew too

With the old method of adding build RPATHs, only the libsoup as
a subproject was supported. However, it's possible to use Homebrew for
libsoup too by adding libsoup as a dependency to the target (even
though we don't link to it).

Apple ld will not add a LC_LOAD_DYLIB entry for a library unless there
are symbols that need it because meson passes `-dead_strip_dylibs`, so
we can do this without issue.

As a bonus, this ensures the correct build RPATHs in all cases.

Additionally, we still need to explicitly add an LC_RPATH for the
installed case.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4027

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8403>
This commit is contained in:
Nirbheek Chauhan 2025-02-04 00:01:01 +05:30 committed by GStreamer Marge Bot
parent 5e086ea3f5
commit c2db03a323
3 changed files with 17 additions and 9 deletions

View File

@ -157,6 +157,7 @@ if host_system == 'windows'
else
if default_library in ['static', 'both']
# Static plugin links to libsoup directly at build time
assert(soup_linked_target)
adaptivedemux2_static = static_library('gstadaptivedemux2',
c_args: [adaptive_args, soup_linked_target_args],
dependencies: [adaptive_deps, soup_linked_target_deps],
@ -165,7 +166,7 @@ else
if default_library in ['shared', 'both']
adaptivedemux2_shared = shared_library('gstadaptivedemux2',
c_args: adaptive_args,
dependencies: adaptive_deps,
dependencies: [adaptive_deps, soup_dlopen_target_deps],
kwargs: adaptive_kwargs + soup_dlopen_target_kwargs)
endif
endif

View File

@ -18,6 +18,7 @@ soup_ver_opt = get_option('soup-version')
default_library = get_option('default_library')
soup_linked_target = host_system == 'windows' or default_library != 'shared'
soup_lookup_dep = get_option('soup-lookup-dep') or soup_linked_target
soup_dlopen_target_deps = []
soup_dlopen_target_kwargs = {}
if get_option('soup').allowed() or get_option('adaptivedemux2').allowed()
@ -43,16 +44,22 @@ if get_option('soup').allowed() or get_option('adaptivedemux2').allowed()
endif
endif
# Hack to set the right RPATH for making dlopen() work inside the devenv on
# macOS when using libsoup as a subproject.
# Hack to set the LC_RPATH for making dlopen() work, since meson will only
# add that for deps that are in the list of dependencies. We also need to add
# install_rpath to cover the installation case. Every other dep is loaded via
# absolute LC_LOAD_DYLIB entries.
if host_system == 'darwin'
foreach dep : [libsoup3_dep, libsoup2_dep]
if dep.found() and dep.type_name() == 'internal'
soup_dlopen_target_kwargs += {
'build_rpath': '@loader_path/../../../libsoup-' + dep.version() / 'libsoup',
}
break
if not dep.found()
continue
endif
soup_dlopen_target_deps += [dep]
if dep.type_name() == 'internal'
soup_dlopen_target_kwargs += {'install_rpath': '@loader_path/..'}
else
soup_dlopen_target_kwargs += {'install_rpath': dep.get_variable('libdir')}
endif
break
endforeach
endif
endif

View File

@ -71,7 +71,7 @@ else
if default_library in ['shared', 'both']
gstsouphttpsrc_shared = shared_library('gstsoup',
c_args : soup_library_c_args,
dependencies : soup_library_deps,
dependencies : soup_library_deps + soup_dlopen_target_deps,
kwargs: soup_library_kwargs + soup_dlopen_target_kwargs,
)
endif