Right now we're unconditionally adding RPATH information to the installed binaries and libraries, but that's not always desired. Debian explicitly passes --disable-rpath to configure, and while I haven't been able to find the same option in the spec file for either Fedora or RHEL, by running $ readelf -d /usr/bin/virsh | grep PATH I can see that the information is not present, so I assume they also strip it somehow. Both Debian and Fedora have wiki pages encouraging packagers to avoid setting RPATH: https://wiki.debian.org/RpathIssue https://fedoraproject.org/wiki/RPath_Packaging_Draft Given the above I'm not actually sure whether there even is a valid usecase for RPATH, but I will openly admit I don't understand the problem space well enough to pass judgement. So, assuming there are scenarios where we want RPATH information to be present, our only course of action is making its inclusion configurable, just like it was with autotools. This commit introduces the 'rpath' option, which is enabled by default and can be turned off to avoid including RPATH information in the distributed binaries and libraries. The implementation is pretty naive and arguably verging on unmaintainable, but unfortunately I lack the Meson-fu necessary to do any better than this. Thankfully we have developers on the list who are well versed in the build system and will certainly come up with a reasonable solution :) This commit is better viewed with 'git show -w'. Signed-off-by: Andrea Bolognani <abologna@xxxxxxxxxx> --- meson.build | 7 + meson_options.txt | 1 + src/meson.build | 485 +++++++++++++++++++++++++++++++--------------- tools/meson.build | 332 ++++++++++++++++++++----------- 4 files changed, 566 insertions(+), 259 deletions(-) diff --git a/meson.build b/meson.build index a72d0c0e85..bc050a63e2 100644 --- a/meson.build +++ b/meson.build @@ -156,6 +156,13 @@ if rc.returncode() == 0 endif +# whether to enable rpath + +if get_option('rpath') + conf.set_quoted('RPATH', libdir) +endif + + # figure out libvirt version strings arr_version = meson.project_version().split('.') diff --git a/meson_options.txt b/meson_options.txt index c538d323c1..71d81304bc 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -6,6 +6,7 @@ option('runstatedir', type: 'string', value: '', description: 'State directory f option('expensive_tests', type: 'feature', value: 'auto', description: 'set the default for enabling expensive tests (long timeouts), use VIR_TEST_EXPENSIVE to override') option('test_coverage', type: 'boolean', value: false, description: 'turn on code coverage instrumentation') option('git_werror', type: 'feature', value: 'auto', description: 'use -Werror if building from GIT') +option('rpath', type: 'boolean', value: true, description: 'add rpath information to installed binaries and libraries') # build dependencies options diff --git a/src/meson.build b/src/meson.build index 73ac99f01e..876f954df3 100644 --- a/src/meson.build +++ b/src/meson.build @@ -437,27 +437,50 @@ libvirt_qemu_sources = files( 'libvirt-qemu.c', ) -libvirt_qemu_lib = shared_library( - 'virt-qemu', - libvirt_qemu_sources, - dependencies: [ - src_dep, - ], - link_args: [ - libvirt_nodelete, - libvirt_qemu_syms_flags, - ], - link_with: [ - libvirt_lib, - ], - link_depends: [ - libvirt_qemu_syms_file, - ], - install: true, - install_rpath: libdir, - version: libvirt_lib_version, - soversion: libvirt_so_version, -) +if conf.has('RPATH') + libvirt_qemu_lib = shared_library( + 'virt-qemu', + libvirt_qemu_sources, + dependencies: [ + src_dep, + ], + link_args: [ + libvirt_nodelete, + libvirt_qemu_syms_flags, + ], + link_with: [ + libvirt_lib, + ], + link_depends: [ + libvirt_qemu_syms_file, + ], + install: true, + install_rpath: conf.get('RPATH'), + version: libvirt_lib_version, + soversion: libvirt_so_version, + ) +else + libvirt_qemu_lib = shared_library( + 'virt-qemu', + libvirt_qemu_sources, + dependencies: [ + src_dep, + ], + link_args: [ + libvirt_nodelete, + libvirt_qemu_syms_flags, + ], + link_with: [ + libvirt_lib, + ], + link_depends: [ + libvirt_qemu_syms_file, + ], + install: true, + version: libvirt_lib_version, + soversion: libvirt_so_version, + ) +endif # libvirt-lxc.so symbol files @@ -491,178 +514,338 @@ libvirt_lxc_sources = files( 'libvirt-lxc.c', ) -libvirt_lxc_lib = shared_library( - 'virt-lxc', - libvirt_lxc_sources, - dependencies: [ - apparmor_dep, - selinux_dep, - src_dep, - ], - link_args: [ - libvirt_nodelete, - libvirt_lxc_syms_flags, - ], - link_with: [ - libvirt_lib, - ], - link_depends: [ - libvirt_lxc_syms_file, - ], - install: true, - install_rpath: libdir, - version: libvirt_lib_version, - soversion: libvirt_so_version, -) - - -# libvirt-admin.so - -libvirt_admin_lib = shared_library( - 'virt-admin', - [ - admin_sources, - admin_client_generated, - admin_driver_generated, - datatypes_sources, - dtrace_gen_objects, - ], - dependencies: [ - capng_dep, - devmapper_dep, - gnutls_dep, - libssh2_dep, - libssh_dep, - sasl_dep, - src_dep, - rpc_dep, - xdr_dep, - yajl_dep, - ], - include_directories: [ - admin_inc_dir, - remote_inc_dir, - ], - link_args: [ - libvirt_admin_syms_flags, - libvirt_nodelete, - ], - link_with: [ - libvirt_lib, - ], - link_depends: [ - libvirt_admin_syms_file, - ], - install: true, - install_rpath: libdir, - version: libvirt_lib_version, - soversion: libvirt_so_version, -) - - -# build libvirt shared modules - -foreach module : virt_modules - mod = shared_module( - module['name'], - module.get('sources', []), - name_prefix: module.get('name_prefix', 'lib'), - include_directories: [ - conf_inc_dir, - module.get('include', []), - ], +if conf.has('RPATH') + libvirt_lxc_lib = shared_library( + 'virt-lxc', + libvirt_lxc_sources, dependencies: [ + apparmor_dep, + selinux_dep, src_dep, - module.get('deps', []), - ], + ], + link_args: [ + libvirt_nodelete, + libvirt_lxc_syms_flags, + ], link_with: [ libvirt_lib, - module.get('link_with', []), - ], - link_whole: [ - module.get('link_whole', []), - ], + ], + link_depends: [ + libvirt_lxc_syms_file, + ], + install: true, + install_rpath: conf.get('RPATH'), + version: libvirt_lib_version, + soversion: libvirt_so_version, + ) +else + libvirt_lxc_lib = shared_library( + 'virt-lxc', + libvirt_lxc_sources, + dependencies: [ + apparmor_dep, + selinux_dep, + src_dep, + ], link_args: [ libvirt_nodelete, - module.get('link_args', []), - ], + libvirt_lxc_syms_flags, + ], + link_with: [ + libvirt_lib, + ], + link_depends: [ + libvirt_lxc_syms_file, + ], install: true, - install_dir: module.get('install_dir', libdir / 'libvirt' / 'connection-driver'), - install_rpath: libdir, - ) - set_variable('@0@_module'.format(module['name'].underscorify()), mod) -endforeach + version: libvirt_lib_version, + soversion: libvirt_so_version, + ) +endif -# build libvirt daemons +# libvirt-admin.so -foreach daemon : virt_daemons - bin = executable( - daemon['name'], +if conf.has('RPATH') + libvirt_admin_lib = shared_library( + 'virt-admin', [ - daemon.get('sources', [ remote_daemon_sources, remote_daemon_generated ]), + admin_sources, + admin_client_generated, + admin_driver_generated, + datatypes_sources, dtrace_gen_objects, - ], - c_args: [ - daemon.get('c_args', []), - ], + ], + dependencies: [ + capng_dep, + devmapper_dep, + gnutls_dep, + libssh2_dep, + libssh_dep, + sasl_dep, + src_dep, + rpc_dep, + xdr_dep, + yajl_dep, + ], include_directories: [ - conf_inc_dir, + admin_inc_dir, remote_inc_dir, - daemon.get('include', []), - ], + ], + link_args: [ + libvirt_admin_syms_flags, + libvirt_nodelete, + ], + link_with: [ + libvirt_lib, + ], + link_depends: [ + libvirt_admin_syms_file, + ], + install: true, + install_rpath: conf.get('RPATH'), + version: libvirt_lib_version, + soversion: libvirt_so_version, + ) +else + libvirt_admin_lib = shared_library( + 'virt-admin', + [ + admin_sources, + admin_client_generated, + admin_driver_generated, + datatypes_sources, + dtrace_gen_objects, + ], dependencies: [ - admin_dep, - access_dep, - dbus_dep, + capng_dep, + devmapper_dep, gnutls_dep, - libnl_dep, - rpc_dep, - src_dep, + libssh2_dep, + libssh_dep, sasl_dep, + src_dep, + rpc_dep, xdr_dep, - ], + yajl_dep, + ], + include_directories: [ + admin_inc_dir, + remote_inc_dir, + ], + link_args: [ + libvirt_admin_syms_flags, + libvirt_nodelete, + ], link_with: [ - admin_driver_lib, libvirt_lib, - libvirt_lxc_lib, - libvirt_qemu_lib, - ], - link_args: [ - libvirt_no_undefined, - ], + ], + link_depends: [ + libvirt_admin_syms_file, + ], install: true, - install_dir: sbindir, - install_rpath: libdir, - ) + version: libvirt_lib_version, + soversion: libvirt_so_version, + ) +endif + + +# build libvirt shared modules + +foreach module : virt_modules + if conf.has('RPATH') + mod = shared_module( + module['name'], + module.get('sources', []), + name_prefix: module.get('name_prefix', 'lib'), + include_directories: [ + conf_inc_dir, + module.get('include', []), + ], + dependencies: [ + src_dep, + module.get('deps', []), + ], + link_with: [ + libvirt_lib, + module.get('link_with', []), + ], + link_whole: [ + module.get('link_whole', []), + ], + link_args: [ + libvirt_nodelete, + module.get('link_args', []), + ], + install: true, + install_dir: module.get('install_dir', libdir / 'libvirt' / 'connection-driver'), + install_rpath: conf.get('RPATH'), + ) + else + mod = shared_module( + module['name'], + module.get('sources', []), + name_prefix: module.get('name_prefix', 'lib'), + include_directories: [ + conf_inc_dir, + module.get('include', []), + ], + dependencies: [ + src_dep, + module.get('deps', []), + ], + link_with: [ + libvirt_lib, + module.get('link_with', []), + ], + link_whole: [ + module.get('link_whole', []), + ], + link_args: [ + libvirt_nodelete, + module.get('link_args', []), + ], + install: true, + install_dir: module.get('install_dir', libdir / 'libvirt' / 'connection-driver'), + ) + endif + set_variable('@0@_module'.format(module['name'].underscorify()), mod) +endforeach + + +# build libvirt daemons + +foreach daemon : virt_daemons + if conf.has('RPATH') + bin = executable( + daemon['name'], + [ + daemon.get('sources', [ remote_daemon_sources, remote_daemon_generated ]), + dtrace_gen_objects, + ], + c_args: [ + daemon.get('c_args', []), + ], + include_directories: [ + conf_inc_dir, + remote_inc_dir, + daemon.get('include', []), + ], + dependencies: [ + admin_dep, + access_dep, + dbus_dep, + gnutls_dep, + libnl_dep, + rpc_dep, + src_dep, + sasl_dep, + xdr_dep, + ], + link_with: [ + admin_driver_lib, + libvirt_lib, + libvirt_lxc_lib, + libvirt_qemu_lib, + ], + link_args: [ + libvirt_no_undefined, + ], + install: true, + install_dir: sbindir, + install_rpath: conf.get('RPATH'), + ) + else + bin = executable( + daemon['name'], + [ + daemon.get('sources', [ remote_daemon_sources, remote_daemon_generated ]), + dtrace_gen_objects, + ], + c_args: [ + daemon.get('c_args', []), + ], + include_directories: [ + conf_inc_dir, + remote_inc_dir, + daemon.get('include', []), + ], + dependencies: [ + admin_dep, + access_dep, + dbus_dep, + gnutls_dep, + libnl_dep, + rpc_dep, + src_dep, + sasl_dep, + xdr_dep, + ], + link_with: [ + admin_driver_lib, + libvirt_lib, + libvirt_lxc_lib, + libvirt_qemu_lib, + ], + link_args: [ + libvirt_no_undefined, + ], + install: true, + install_dir: sbindir, + ) +endif endforeach # build libvirt helpers foreach helper : virt_helpers + if conf.has('RPATH') + bin = executable( + helper['name'], + [ + helper['sources'], + ], + c_args: [ + helper.get('c_args', []), + ], + include_directories: [ + helper.get('include', []), + ], + dependencies: [ + src_dep, + helper.get('deps', []), + ], + link_with: [ + libvirt_lib, + ], + install: true, + install_dir: helper.get('install_dir', libexecdir), + install_rpath: conf.get('RPATH'), + ) +else bin = executable( helper['name'], [ helper['sources'], - ], + ], c_args: [ helper.get('c_args', []), - ], + ], include_directories: [ helper.get('include', []), - ], + ], dependencies: [ src_dep, helper.get('deps', []), - ], + ], link_with: [ libvirt_lib, - ], + ], install: true, install_dir: helper.get('install_dir', libexecdir), - install_rpath: libdir, - ) + ) +endif endforeach diff --git a/tools/meson.build b/tools/meson.build index 090179470a..d50ee94f30 100644 --- a/tools/meson.build +++ b/tools/meson.build @@ -59,24 +59,44 @@ if conf.has('WITH_HOST_VALIDATE') ] endif - executable( - 'virt-host-validate', - [ - virt_host_validate_sources, - ], - dependencies: [ - tools_dep, - ], - link_args: [ - coverage_flags, - ], - link_with: [ - libvirt_lib, - ], - install: true, - install_dir: bindir, - install_rpath: libdir, - ) + if conf.has('RPATH') + executable( + 'virt-host-validate', + [ + virt_host_validate_sources, + ], + dependencies: [ + tools_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_lib, + ], + install: true, + install_dir: bindir, + install_rpath: conf.get('RPATH'), + ) + else + executable( + 'virt-host-validate', + [ + virt_host_validate_sources, + ], + dependencies: [ + tools_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_lib, + ], + install: true, + install_dir: bindir, + ) + endif endif if conf.has('WITH_LOGIN_SHELL') @@ -95,25 +115,46 @@ if conf.has('WITH_LOGIN_SHELL') install_dir: bindir, ) - executable( - 'virt-login-shell-helper', - [ - 'virt-login-shell-helper.c', - ], - dependencies: [ - tools_dep, - ], - link_args: [ - coverage_flags, - ], - link_with: [ - libvirt_lib, - libvirt_lxc_lib, - ], - install: true, - install_dir: libexecdir, - install_rpath: libdir, - ) + if conf.has('RPATH') + executable( + 'virt-login-shell-helper', + [ + 'virt-login-shell-helper.c', + ], + dependencies: [ + tools_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_lib, + libvirt_lxc_lib, + ], + install: true, + install_dir: libexecdir, + install_rpath: conf.get('RPATH'), + ) + else + executable( + 'virt-login-shell-helper', + [ + 'virt-login-shell-helper.c', + ], + dependencies: [ + tools_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_lib, + libvirt_lxc_lib, + ], + install: true, + install_dir: libexecdir, + ) + endif install_data('virt-login-shell.conf', install_dir: sysconfdir / 'libvirt') endif @@ -149,78 +190,153 @@ else virsh_icon_res = [] endif -executable( - 'virsh', - [ - 'virsh.c', - 'virsh-backup.c', - 'virsh-checkpoint.c', - 'virsh-completer.c', - 'virsh-completer-domain.c', - 'virsh-completer-checkpoint.c', - 'virsh-completer-host.c', - 'virsh-completer-interface.c', - 'virsh-completer-network.c', - 'virsh-completer-nodedev.c', - 'virsh-completer-nwfilter.c', - 'virsh-completer-pool.c', - 'virsh-completer-secret.c', - 'virsh-completer-snapshot.c', - 'virsh-completer-volume.c', - 'virsh-console.c', - 'virsh-domain.c', - 'virsh-domain-monitor.c', - 'virsh-host.c', - 'virsh-interface.c', - 'virsh-network.c', - 'virsh-nodedev.c', - 'virsh-nwfilter.c', - 'virsh-pool.c', - 'virsh-secret.c', - 'virsh-snapshot.c', - 'virsh-util.c', - 'virsh-volume.c', - virsh_icon_res, - ], - dependencies: [ - tools_dep, - readline_dep, - thread_dep, - ], - link_args: [ - coverage_flags, - ], - link_with: [ - libvirt_lxc_lib, - libvirt_qemu_lib, - libvirt_shell_lib, - ], - install: true, - install_dir: bindir, - install_rpath: libdir, -) +if conf.has('RPATH') + executable( + 'virsh', + [ + 'virsh.c', + 'virsh-backup.c', + 'virsh-checkpoint.c', + 'virsh-completer.c', + 'virsh-completer-domain.c', + 'virsh-completer-checkpoint.c', + 'virsh-completer-host.c', + 'virsh-completer-interface.c', + 'virsh-completer-network.c', + 'virsh-completer-nodedev.c', + 'virsh-completer-nwfilter.c', + 'virsh-completer-pool.c', + 'virsh-completer-secret.c', + 'virsh-completer-snapshot.c', + 'virsh-completer-volume.c', + 'virsh-console.c', + 'virsh-domain.c', + 'virsh-domain-monitor.c', + 'virsh-host.c', + 'virsh-interface.c', + 'virsh-network.c', + 'virsh-nodedev.c', + 'virsh-nwfilter.c', + 'virsh-pool.c', + 'virsh-secret.c', + 'virsh-snapshot.c', + 'virsh-util.c', + 'virsh-volume.c', + virsh_icon_res, + ], + dependencies: [ + tools_dep, + readline_dep, + thread_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_lxc_lib, + libvirt_qemu_lib, + libvirt_shell_lib, + ], + install: true, + install_dir: bindir, + install_rpath: conf.get('RPATH'), + ) +else + executable( + 'virsh', + [ + 'virsh.c', + 'virsh-backup.c', + 'virsh-checkpoint.c', + 'virsh-completer.c', + 'virsh-completer-domain.c', + 'virsh-completer-checkpoint.c', + 'virsh-completer-host.c', + 'virsh-completer-interface.c', + 'virsh-completer-network.c', + 'virsh-completer-nodedev.c', + 'virsh-completer-nwfilter.c', + 'virsh-completer-pool.c', + 'virsh-completer-secret.c', + 'virsh-completer-snapshot.c', + 'virsh-completer-volume.c', + 'virsh-console.c', + 'virsh-domain.c', + 'virsh-domain-monitor.c', + 'virsh-host.c', + 'virsh-interface.c', + 'virsh-network.c', + 'virsh-nodedev.c', + 'virsh-nwfilter.c', + 'virsh-pool.c', + 'virsh-secret.c', + 'virsh-snapshot.c', + 'virsh-util.c', + 'virsh-volume.c', + virsh_icon_res, + ], + dependencies: [ + tools_dep, + readline_dep, + thread_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_lxc_lib, + libvirt_qemu_lib, + libvirt_shell_lib, + ], + install: true, + install_dir: bindir, + ) +endif -executable( - 'virt-admin', - [ - 'virt-admin.c', - 'virt-admin-completer.c', - ], - dependencies: [ - tools_dep, - readline_dep, - ], - link_args: [ - coverage_flags, - ], - link_with: [ - libvirt_admin_lib, - libvirt_shell_lib, - ], - install: true, - install_dir: bindir, - install_rpath: libdir, -) +if conf.has('RPATH') + executable( + 'virt-admin', + [ + 'virt-admin.c', + 'virt-admin-completer.c', + ], + dependencies: [ + tools_dep, + readline_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_admin_lib, + libvirt_shell_lib, + ], + install: true, + install_dir: bindir, + install_rpath: conf.get('RPATH'), + ) +else + executable( + 'virt-admin', + [ + 'virt-admin.c', + 'virt-admin-completer.c', + ], + dependencies: [ + tools_dep, + readline_dep, + ], + link_args: [ + coverage_flags, + ], + link_with: [ + libvirt_admin_lib, + libvirt_shell_lib, + ], + install: true, + install_dir: bindir, + ) +endif tools_conf = configuration_data() tools_conf.set('PACKAGE', meson.project_name()) -- 2.26.2