Message ID | 20220615155634.578-1-akihiko.odaki@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | cutils: Introduce bundle mechanism | expand |
On 6/15/22 17:56, Akihiko Odaki wrote: > Developers often run QEMU without installing. The bundle mechanism > allows to look up files which should be present in installation even in > such a situation. > > It is a general mechanism and can find any files located relative > to the installation tree. The build tree must have a new directory, > qemu-bundle, to represent what files the installation tree would > have for reference by the executables. Thanks for prototyping this, I think this is appealing. I'll take a look later at using meson introspection info to build the preinstall layout. Paolo
On 6/15/22 21:27, Paolo Bonzini wrote: > > Thanks for prototyping this, I think this is appealing. I'll take a > look later at using meson introspection info to build the preinstall > layout. Something like this: diff --git a/meson.build b/meson.build index 0458b69cdf..17023d511a 100644 --- a/meson.build +++ b/meson.build @@ -3612,6 +3612,21 @@ if host_machine.system() == 'windows' alias_target('installer', nsis) endif +##################### +# Preinstalled data # +##################### + +qemu_bundle_sources_stamp = configure_file( + output: 'qemu-bundle-sources.stamp', + command: ['touch', '@OUTPUT']) +custom_target('tree with preinstalled data files', + build_by_default: true, + output: 'qemu-bundle.stamp', + input: qemu_bundle_sources_stamp, + env: {'MESON': config_host['MESON']}, + command: files('symlink-install-tree.py'), + capture: true) + ######################### # Configuration summary # ######################### diff --git a/scripts/symlink-install-tree.py b/scripts/symlink-install-tree.py new file mode 100644 index 0000000000..cd66dc06cd --- /dev/null +++ b/scripts/symlink-install-tree.py @@ -0,0 +1,34 @@ +#! /usr/bin/env python3 + +import json +import os +import subprocess + +def destdir_join(d1: str, d2: str) -> str: + if not d1: + return d2 + if not os.path.isabs(d2): + return os.path.join(d1, d2) + + # c:\destdir + c:\prefix must produce c:\destdir\prefix + if len(d2) > 1 and d2[1] == ':': + return d1 + d2[2:] + return d1 + d2 + +meson = os.environ.get("MESON") +out = subprocess.run([meson, 'introspect', '--installed'], + stdout=subprocess.PIPE, check=True).stdout +for source, dest in json.loads(out).items(): + assert os.path.isabs(source) + bundle_dest = destdir_join('qemu-bundle', dest) + path = os.path.dirname(bundle_dest) + try: + os.makedirs(path, exist_ok=True) + except e: + print('error making directory {path}', file=sys.stderr) + raise e + try: + os.symlink(source, bundle_dest) + except e: + print('error making symbolic link {dest}', file=sys.stderr) + raise e
On 2022/06/16 18:18, Paolo Bonzini wrote: > +def destdir_join(d1: str, d2: str) -> str: > + if not d1: > + return d2 > + if not os.path.isabs(d2): > + return os.path.join(d1, d2) > + > + # c:\destdir + c:\prefix must produce c:\destdir\prefix > + if len(d2) > 1 and d2[1] == ':': > + return d1 + d2[2:] > + return d1 + d2 This is from Meson but buggy so I fixed it and opened a pull request for Meson: https://github.com/mesonbuild/meson/pull/10531 The script included in v8 has the fixed version of destdir_join. Regards, Akihiko Odaki