[libvirt PATCH 0/3] meson: Fix handling of version scripts

Test pipeline: https://gitlab.com/abologna/libvirt/-/pipelines/532183411 Andrea Bolognani (3): meson: Refactor handling of link_args and link_depends meson: Don't attempt to use version scripts on macOS meson: Drop support for -Wl,-M meson.build | 5 +- src/admin/meson.build | 22 +++++++-- src/meson.build | 110 +++++++++++++++++++++++------------------- tools/nss/meson.build | 48 +++++++++++------- 4 files changed, 111 insertions(+), 74 deletions(-) -- 2.35.1

This ensures variable names and the overall structure of the code setting and using them is consistent. It will also make upcoming changes less disruptive. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- src/admin/meson.build | 20 ++++++-- src/meson.build | 104 ++++++++++++++++++++++-------------------- tools/nss/meson.build | 42 +++++++++-------- 3 files changed, 94 insertions(+), 72 deletions(-) diff --git a/src/admin/meson.build b/src/admin/meson.build index 130997fb87..cacd6feb25 100644 --- a/src/admin/meson.build +++ b/src/admin/meson.build @@ -72,7 +72,7 @@ libvirt_admin_syms = custom_target( '@OUTPUT@', 'LIBVIRT_ADMIN_PRIVATE_' + meson.project_version(), '@INPUT@', ], ) -libvirt_admin_syms_file = libvirt_admin_syms + if host_machine.system() == 'windows' libvirt_admin_def = custom_target( 'libvirt_admin.def', @@ -84,12 +84,22 @@ if host_machine.system() == 'windows' ], ) libvirt_admin_syms_file = libvirt_admin_def + libvirt_admin_syms_path = libvirt_admin_syms_file.full_path() +else + libvirt_admin_syms_file = libvirt_admin_syms + libvirt_admin_syms_path = libvirt_admin_syms_file.full_path() endif -libvirt_admin_syms_flags = '@0@@1@'.format( - version_script_flags, - libvirt_admin_syms_file.full_path(), -) +libvirt_admin_link_args = [ + libvirt_nodelete, + '@0@@1@'.format( + version_script_flags, + libvirt_admin_syms_path, + ), +] +libvirt_admin_link_depends = [ + libvirt_admin_syms_file, +] if conf.has('WITH_REMOTE') admin_driver_lib = static_library( diff --git a/src/meson.build b/src/meson.build index 10165ba5ac..ca0e756e5c 100644 --- a/src/meson.build +++ b/src/meson.build @@ -354,7 +354,7 @@ libvirt_syms = custom_target( '@OUTPUT@', 'LIBVIRT_PRIVATE_' + meson.project_version(), '@INPUT@', ], ) -libvirt_syms_file = libvirt_syms + if host_machine.system() == 'windows' libvirt_def = custom_target( 'libvirt.def', @@ -366,15 +366,27 @@ if host_machine.system() == 'windows' ], ) libvirt_syms_file = libvirt_def + libvirt_syms_path = libvirt_syms_file.full_path() +else + libvirt_syms_file = libvirt_syms + libvirt_syms_path = libvirt_syms_file.full_path() endif # libvirt.so library -libvirt_syms_flags = '@0@@1@'.format( - version_script_flags, - libvirt_syms_file.full_path(), -) +libvirt_link_args = [ + libvirt_flat_namespace, + libvirt_no_undefined, + libvirt_nodelete, + '@0@@1@'.format( + version_script_flags, + libvirt_syms_path, + ), +] +libvirt_link_depends = [ + libvirt_syms_file, +] libvirt_lib = shared_library( 'virt', @@ -382,18 +394,11 @@ libvirt_lib = shared_library( dependencies: [ src_dep, ], - link_args: [ - libvirt_flat_namespace, - libvirt_no_undefined, - libvirt_nodelete, - libvirt_syms_flags, - ], + link_args: libvirt_link_args, link_whole: [ libvirt_libs, ], - link_depends: [ - libvirt_syms_file, - ], + link_depends: libvirt_link_depends, install: true, version: libvirt_lib_version, soversion: libvirt_so_version, @@ -403,8 +408,7 @@ libvirt_lib = shared_library( # libvirt-qemu.syms symbol files libvirt_qemu_syms = meson.current_source_dir() / 'libvirt_qemu.syms' -libvirt_qemu_syms_file = libvirt_qemu_syms -libvirt_qemu_syms_path = libvirt_qemu_syms + if host_machine.system() == 'windows' libvirt_qemu_def = custom_target( 'libvirt_qemu.def', @@ -416,16 +420,25 @@ if host_machine.system() == 'windows' ], ) libvirt_qemu_syms_file = libvirt_qemu_def - libvirt_qemu_syms_path = libvirt_qemu_def.full_path() + libvirt_qemu_syms_path = libvirt_qemu_syms_file.full_path() +else + libvirt_qemu_syms_file = libvirt_qemu_syms + libvirt_qemu_syms_path = libvirt_qemu_syms endif # libvirt-qemu.so -libvirt_qemu_syms_flags = '@0@@1@'.format( - version_script_flags, - libvirt_qemu_syms_path, -) +libvirt_qemu_link_args = [ + libvirt_nodelete, + '@0@@1@'.format( + version_script_flags, + libvirt_qemu_syms_path, + ), +] +libvirt_qemu_link_depends = [ + libvirt_qemu_syms_file, +] libvirt_qemu_sources = files( 'libvirt-qemu.c', @@ -437,16 +450,11 @@ libvirt_qemu_lib = shared_library( dependencies: [ src_dep, ], - link_args: [ - libvirt_nodelete, - libvirt_qemu_syms_flags, - ], + link_args: libvirt_qemu_link_args, link_with: [ libvirt_lib, ], - link_depends: [ - libvirt_qemu_syms_file, - ], + link_depends: libvirt_qemu_link_depends, install: true, install_rpath: libvirt_rpath, version: libvirt_lib_version, @@ -457,8 +465,7 @@ libvirt_qemu_lib = shared_library( # libvirt-lxc.so symbol files libvirt_lxc_syms = meson.current_source_dir() / 'libvirt_lxc.syms' -libvirt_lxc_syms_file = libvirt_lxc_syms -libvirt_lxc_syms_path = libvirt_lxc_syms + if host_machine.system() == 'windows' libvirt_lxc_def = custom_target( 'libvirt_lxc.def', @@ -470,16 +477,25 @@ if host_machine.system() == 'windows' ], ) libvirt_lxc_syms_file = libvirt_lxc_def - libvirt_lxc_syms_path = libvirt_lxc_def.full_path() + libvirt_lxc_syms_path = libvirt_lxc_syms_file.full_path() +else + libvirt_lxc_syms_file = libvirt_lxc_syms + libvirt_lxc_syms_path = libvirt_lxc_syms endif # libvirt-lxc.so -libvirt_lxc_syms_flags = '@0@@1@'.format( - version_script_flags, - libvirt_lxc_syms_path, -) +libvirt_lxc_link_args = [ + libvirt_nodelete, + '@0@@1@'.format( + version_script_flags, + libvirt_lxc_syms_path, + ), +] +libvirt_lxc_link_depends = [ + libvirt_lxc_syms_file, +] libvirt_lxc_sources = files( 'libvirt-lxc.c', @@ -493,16 +509,11 @@ libvirt_lxc_lib = shared_library( selinux_dep, src_dep, ], - link_args: [ - libvirt_nodelete, - libvirt_lxc_syms_flags, - ], + link_args: libvirt_lxc_link_args, link_with: [ libvirt_lib, ], - link_depends: [ - libvirt_lxc_syms_file, - ], + link_depends: libvirt_lxc_link_depends, install: true, install_rpath: libvirt_rpath, version: libvirt_lib_version, @@ -537,16 +548,11 @@ if conf.has('WITH_REMOTE') admin_inc_dir, remote_inc_dir, ], - link_args: [ - libvirt_admin_syms_flags, - libvirt_nodelete, - ], + link_args: libvirt_admin_link_args, link_with: [ libvirt_lib, ], - link_depends: [ - libvirt_admin_syms_file, - ], + link_depends: libvirt_admin_link_depends, install: true, install_rpath: libvirt_rpath, version: libvirt_lib_version, diff --git a/tools/nss/meson.build b/tools/nss/meson.build index f77309ebca..c827b865b3 100644 --- a/tools/nss/meson.build +++ b/tools/nss/meson.build @@ -49,25 +49,23 @@ nss_libvirt_guest_impl = static_library( ], ) -nss_libvirt_syms = '@0@@1@'.format( - version_script_flags, - meson.current_source_dir() / nss_sym_file, -) +nss_libvirt_syms_file = meson.current_source_dir() / nss_sym_file +nss_libvirt_syms_path = nss_libvirt_syms_file -nss_libvirt_guest_syms = '@0@@1@'.format( - version_script_flags, - meson.current_source_dir() / nss_guest_sym_file, -) +nss_libvirt_link_args = [ + libvirt_export_dynamic, + coverage_flags, + '@0@@1@'.format( + version_script_flags, + nss_libvirt_syms_path, + ), +] nss_libvirt_lib = shared_library( 'nss_libvirt', name_prefix: nss_prefix, name_suffix: 'so.@0@'.format(nss_so_ver), - link_args: [ - nss_libvirt_syms, - libvirt_export_dynamic, - coverage_flags, - ], + link_args: nss_libvirt_link_args, link_whole: [ nss_libvirt_impl, ], @@ -75,15 +73,23 @@ nss_libvirt_lib = shared_library( install_dir: libdir, ) +nss_libvirt_guest_syms_file = meson.current_source_dir() / nss_guest_sym_file +nss_libvirt_guest_syms_path = nss_libvirt_guest_syms_file + +nss_libvirt_guest_link_args = [ + libvirt_export_dynamic, + coverage_flags, + '@0@@1@'.format( + version_script_flags, + nss_libvirt_guest_syms_path, + ), +] + nss_libvirt_guest_lib = shared_library( 'nss_libvirt_guest', name_prefix: nss_prefix, name_suffix: 'so.@0@'.format(nss_so_ver), - link_args: [ - nss_libvirt_guest_syms, - libvirt_export_dynamic, - coverage_flags, - ], + link_args: nss_libvirt_guest_link_args, link_whole: [ nss_libvirt_guest_impl, ], -- 2.35.1

macOS libraries don't support symbol versioning, so the only result that we achieve by passing additional flags to the linker is a bunch of messages like ld: warning: ignoring file .../libvirt/build/src/libvirt.syms, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x23 0x20 0x57 0x41 ... ) being produced during the build. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- meson.build | 3 +++ src/admin/meson.build | 14 ++++++++------ src/meson.build | 42 ++++++++++++++++++++++++------------------ tools/nss/meson.build | 18 ++++++++++++------ 4 files changed, 47 insertions(+), 30 deletions(-) diff --git a/meson.build b/meson.build index 17cc829543..5787397dcd 100644 --- a/meson.build +++ b/meson.build @@ -510,6 +510,9 @@ libvirt_no_indirect = cc.get_supported_link_arguments([ if host_machine.system() == 'windows' version_script_flags = '-Wl,' +elif host_machine.system() == 'darwin' + # macOS libraries don't support symbol versioning + version_script_flags = '' else test_file = '@0@/src/libvirt_qemu.syms'.format(meson.source_root()) if cc.has_link_argument('-Wl,--version-script=@0@'.format(test_file)) diff --git a/src/admin/meson.build b/src/admin/meson.build index cacd6feb25..692cc128a3 100644 --- a/src/admin/meson.build +++ b/src/admin/meson.build @@ -92,14 +92,16 @@ endif libvirt_admin_link_args = [ libvirt_nodelete, - '@0@@1@'.format( +] +libvirt_admin_link_depends = [] + +if version_script_flags != '' + libvirt_admin_link_args += '@0@@1@'.format( version_script_flags, libvirt_admin_syms_path, - ), -] -libvirt_admin_link_depends = [ - libvirt_admin_syms_file, -] + ) + libvirt_admin_link_depends += libvirt_admin_syms_file +endif if conf.has('WITH_REMOTE') admin_driver_lib = static_library( diff --git a/src/meson.build b/src/meson.build index ca0e756e5c..88a6f15760 100644 --- a/src/meson.build +++ b/src/meson.build @@ -379,14 +379,16 @@ libvirt_link_args = [ libvirt_flat_namespace, libvirt_no_undefined, libvirt_nodelete, - '@0@@1@'.format( +] +libvirt_link_depends = [] + +if version_script_flags != '' + libvirt_link_args += '@0@@1@'.format( version_script_flags, libvirt_syms_path, - ), -] -libvirt_link_depends = [ - libvirt_syms_file, -] + ) + libvirt_link_depends += libvirt_syms_file +endif libvirt_lib = shared_library( 'virt', @@ -431,14 +433,16 @@ endif libvirt_qemu_link_args = [ libvirt_nodelete, - '@0@@1@'.format( +] +libvirt_qemu_link_depends = [] + +if version_script_flags != '' + libvirt_qemu_link_args += '@0@@1@'.format( version_script_flags, libvirt_qemu_syms_path, - ), -] -libvirt_qemu_link_depends = [ - libvirt_qemu_syms_file, -] + ) + libvirt_qemu_link_depends += libvirt_qemu_syms_file +endif libvirt_qemu_sources = files( 'libvirt-qemu.c', @@ -488,14 +492,16 @@ endif libvirt_lxc_link_args = [ libvirt_nodelete, - '@0@@1@'.format( +] +libvirt_lxc_link_depends = [] + +if version_script_flags != '' + libvirt_lxc_link_args += '@0@@1@'.format( version_script_flags, libvirt_lxc_syms_path, - ), -] -libvirt_lxc_link_depends = [ - libvirt_lxc_syms_file, -] + ) + libvirt_lxc_link_depends += libvirt_lxc_syms_file +endif libvirt_lxc_sources = files( 'libvirt-lxc.c', diff --git a/tools/nss/meson.build b/tools/nss/meson.build index c827b865b3..85e2838fb7 100644 --- a/tools/nss/meson.build +++ b/tools/nss/meson.build @@ -55,11 +55,14 @@ nss_libvirt_syms_path = nss_libvirt_syms_file nss_libvirt_link_args = [ libvirt_export_dynamic, coverage_flags, - '@0@@1@'.format( +] + +if version_script_flags != '' + nss_libvirt_link_args += '@0@@1@'.format( version_script_flags, nss_libvirt_syms_path, - ), -] + ) +endif nss_libvirt_lib = shared_library( 'nss_libvirt', @@ -79,11 +82,14 @@ nss_libvirt_guest_syms_path = nss_libvirt_guest_syms_file nss_libvirt_guest_link_args = [ libvirt_export_dynamic, coverage_flags, - '@0@@1@'.format( +] + +if version_script_flags != '' + nss_libvirt_guest_link_args += '@0@@1@'.format( version_script_flags, nss_libvirt_guest_syms_path, - ), -] + ) +endif nss_libvirt_guest_lib = shared_library( 'nss_libvirt_guest', -- 2.35.1

This was originally introduced in c2fb8bfee309, reportedly to support symbol versioning on Solaris; more recently, 30b301c6eaa9 ported it to meson. Up until the previous commit this has resulted in passing -M .../libvirt/build/src/libvirt.syms to the linker on macOS, but the implementation of the -M option on that platform's linker is literally else if ( strcmp(arg, "-M") == 0 ) { // FIX FIX } so in practice we've been providing an additional input file, which the linker understandably ignores after printing a warning since it's not in any format that it recognizes. Considering that LLVM's linker, which is now used by default on FreeBSD, supports the same --version-script option as the GNU linker, that we have introduced special handling for macOS, and that we don't target Solaris, we can simply drop the branch at this point. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- meson.build | 2 -- 1 file changed, 2 deletions(-) diff --git a/meson.build b/meson.build index 5787397dcd..a1c802b00d 100644 --- a/meson.build +++ b/meson.build @@ -517,8 +517,6 @@ else test_file = '@0@/src/libvirt_qemu.syms'.format(meson.source_root()) if cc.has_link_argument('-Wl,--version-script=@0@'.format(test_file)) version_script_flags = '-Wl,--version-script=' - elif cc.has_link_argument('-Wl,-M,') - version_script_flags = '-Wl,-M,' else error('No supported version script link argument found.') endif -- 2.35.1

On 5/5/22 18:10, Andrea Bolognani wrote:
Test pipeline: https://gitlab.com/abologna/libvirt/-/pipelines/532183411
Andrea Bolognani (3): meson: Refactor handling of link_args and link_depends meson: Don't attempt to use version scripts on macOS meson: Drop support for -Wl,-M
meson.build | 5 +- src/admin/meson.build | 22 +++++++-- src/meson.build | 110 +++++++++++++++++++++++------------------- tools/nss/meson.build | 48 +++++++++++------- 4 files changed, 111 insertions(+), 74 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Andrea Bolognani
-
Michal Prívozník