[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 17/32] meson, cutils: allow non-relocatable installs
From: |
Paolo Bonzini |
Subject: |
[PULL 17/32] meson, cutils: allow non-relocatable installs |
Date: |
Wed, 18 Oct 2023 10:27:37 +0200 |
Say QEMU is configured with bindir = "/usr/bin" and a firmware path
that starts with "/usr/share/qemu". Ever since QEMU 5.2, QEMU's
install has been relocatable: if you move qemu-system-x86_64 from
/usr/bin to /home/username/bin, it will start looking for firmware in
/home/username/share/qemu. Previously, you would get a non-relocatable
install where the moved QEMU will keep looking for firmware in
/usr/share/qemu.
Windows almost always wants relocatable installs, and in fact that
is why QEMU 5.2 introduced relocatability in the first place.
However, newfangled distribution mechanisms such as AppImage
(https://docs.appimage.org/reference/best-practices.html), and
possibly NixOS, also dislike using at runtime the absolute paths
that were established at build time.
On POSIX systems you almost never care; if you do, your usecase
dictates which one is desirable, so there's no single answer.
Obviously relocatability works fine most of the time, because not many
people have complained about QEMU's switch to relocatable install,
and that's why until now there was no way to disable relocatability.
But a non-relocatable, non-modular binary can help if you want to do
experiments with old firmware and new QEMU or vice versa (because you
can just upgrade/downgrade the firmware package, and use rpm2cpio or
similar to extract the QEMU binaries outside /usr), so allow both.
This patch allows one to build a non-relocatable install using a new
option to configure. Why? Because it's not too hard, and because
it helps the user double check the relocatability of their install.
Note that the same code that handles relocation also lets you run QEMU
from the build tree and pick e.g. firmware files from the source tree
transparently. Therefore that part remains active with this patch,
even if you configure with --disable-relocatable.
Suggested-by: Michael Tokarev <mjt@tls.msk.ru>
Reviewed-by: Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
meson.build | 20 ++++++++++++++++++++
meson_options.txt | 2 ++
scripts/meson-buildoptions.sh | 3 +++
util/cutils.c | 11 ++++++++---
4 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/meson.build b/meson.build
index 010d2c649c2..1be9f92f7da 100644
--- a/meson.build
+++ b/meson.build
@@ -2111,6 +2111,7 @@ config_host_data.set('CONFIG_OPENGL', opengl.found())
config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
config_host_data.set('CONFIG_RBD', rbd.found())
config_host_data.set('CONFIG_RDMA', rdma.found())
+config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
config_host_data.set('CONFIG_SDL', sdl.found())
config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
@@ -4054,6 +4055,7 @@ if 'simple' in get_option('trace_backends')
endif
summary_info += {'D-Bus display': dbus_display}
summary_info += {'QOM debugging': get_option('qom_cast_debug')}
+summary_info += {'Relocatable install': get_option('relocatable')}
summary_info += {'vhost-kernel support': have_vhost_kernel}
summary_info += {'vhost-net support': have_vhost_net}
summary_info += {'vhost-user support': have_vhost_user}
@@ -4356,3 +4358,21 @@ if host_arch == 'unknown' or not
supported_oses.contains(targetos)
message('If you want to help supporting QEMU on this platform, please')
message('contact the developers at qemu-devel@nongnu.org.')
endif
+
+actually_reloc = get_option('relocatable')
+# check if get_relocated_path() is actually able to relocate paths
+if get_option('relocatable') and \
+ not (get_option('prefix') /
get_option('bindir')).startswith(get_option('prefix') / '')
+ message()
+ warning('bindir not included within prefix, the installation will not be
relocatable.')
+ actually_reloc = false
+endif
+if not actually_reloc and (targetos == 'windows' or get_option('relocatable'))
+ if targetos == 'windows'
+ message()
+ warning('Windows installs should usually be relocatable.')
+ endif
+ message()
+ message('QEMU will have to be installed under ' + get_option('prefix') + '.')
+ message('Use --disable-relocatable to remove this warning.')
+endif
diff --git a/meson_options.txt b/meson_options.txt
index 6a17b909680..e237b268469 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -101,6 +101,8 @@ option('cfi_debug', type: 'boolean', value: false,
description: 'Verbose errors in case of CFI violation')
option('multiprocess', type: 'feature', value: 'auto',
description: 'Out of process device emulation support')
+option('relocatable', type : 'boolean', value : 'true',
+ description: 'toggle relocatable install')
option('vfio_user_server', type: 'feature', value: 'disabled',
description: 'vfio-user server support')
option('dbus_display', type: 'feature', value: 'auto',
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index 2a74b0275b3..d4b89e6b443 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -17,6 +17,7 @@ meson_options_help() {
printf "%s\n" ' code for the Hexagon frontend'
printf "%s\n" ' --disable-install-blobs install provided firmware blobs'
printf "%s\n" ' --disable-qom-cast-debug cast debugging support'
+ printf "%s\n" ' --disable-relocatable toggle relocatable install'
printf "%s\n" ' --docdir=VALUE Base directory for documentation
installation'
printf "%s\n" ' (can be empty) [share/doc]'
printf "%s\n" ' --enable-block-drv-whitelist-in-tools'
@@ -421,6 +422,8 @@ _meson_option_parse() {
--disable-rbd) printf "%s" -Drbd=disabled ;;
--enable-rdma) printf "%s" -Drdma=enabled ;;
--disable-rdma) printf "%s" -Drdma=disabled ;;
+ --enable-relocatable) printf "%s" -Drelocatable=true ;;
+ --disable-relocatable) printf "%s" -Drelocatable=false ;;
--enable-replication) printf "%s" -Dreplication=enabled ;;
--disable-replication) printf "%s" -Dreplication=disabled ;;
--enable-rng-none) printf "%s" -Drng_none=true ;;
diff --git a/util/cutils.c b/util/cutils.c
index c99d26c5e2d..64f817b477b 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -1178,9 +1178,11 @@ char *get_relocated_path(const char *dir)
#else
g_string_append(result, dir);
#endif
- } else if (!starts_with_prefix(dir) || !starts_with_prefix(bindir)) {
- g_string_assign(result, dir);
- } else {
+ goto out;
+ }
+
+ if (IS_ENABLED(CONFIG_RELOCATABLE) &&
+ starts_with_prefix(dir) && starts_with_prefix(bindir)) {
g_string_assign(result, exec_dir);
/* Advance over common components. */
@@ -1203,7 +1205,10 @@ char *get_relocated_path(const char *dir)
assert(G_IS_DIR_SEPARATOR(dir[-1]));
g_string_append(result, dir - 1);
}
+ goto out;
}
+ g_string_assign(result, dir);
+out:
return g_string_free(result, false);
}
--
2.41.0
- [PULL 06/32] tests/vm: netbsd: install dtc, (continued)
- [PULL 06/32] tests/vm: netbsd: install dtc, Paolo Bonzini, 2023/10/18
- [PULL 02/32] iotests: use the correct python to run linters, Paolo Bonzini, 2023/10/18
- [PULL 07/32] scripts: Mark feature_to_c.py as non-executable to fix a build issue, Paolo Bonzini, 2023/10/18
- [PULL 08/32] scripts/get_maintainer.pl: don't print parentheses, Paolo Bonzini, 2023/10/18
- [PULL 09/32] tests/docker: avoid invalid escape in Python string, Paolo Bonzini, 2023/10/18
- [PULL 04/32] target/i386/cpu: Fix CPUID_HT exposure, Paolo Bonzini, 2023/10/18
- [PULL 10/32] docs/sphinx: avoid invalid escape in Python string, Paolo Bonzini, 2023/10/18
- [PULL 11/32] target/hexagon: avoid invalid escape in Python string, Paolo Bonzini, 2023/10/18
- [PULL 12/32] tests/avocado: avoid invalid escape in Python string, Paolo Bonzini, 2023/10/18
- [PULL 13/32] tests/vm: avoid invalid escape in Python string, Paolo Bonzini, 2023/10/18
- [PULL 17/32] meson, cutils: allow non-relocatable installs,
Paolo Bonzini <=
- [PULL 14/32] tracetool: avoid invalid escape in Python string, Paolo Bonzini, 2023/10/18
- [PULL 16/32] meson: do not use set10, Paolo Bonzini, 2023/10/18
- [PULL 15/32] meson: do not build shaders by default, Paolo Bonzini, 2023/10/18
- [PULL 19/32] hw/xen: cleanup sourcesets, Paolo Bonzini, 2023/10/18
- [PULL 20/32] hw/remote: move stub vfu_object_set_bus_irq out of stubs/, Paolo Bonzini, 2023/10/18
- [PULL 22/32] configure, tests/tcg: simplify GDB conditionals, Paolo Bonzini, 2023/10/18
- [PULL 21/32] tests/tcg/arm: move non-SVE tests out of conditional, Paolo Bonzini, 2023/10/18
- [PULL 18/32] configure: clean up handling of CFI option, Paolo Bonzini, 2023/10/18
- [PULL 24/32] configure: clean up PIE option handling, Paolo Bonzini, 2023/10/18