a3c3345cac
The arguments in MESONINTROSPECT are quoted with shlex.quote() so it must be parsed with shlex.split(). Otherwise the script will fail if the build directory has a character like "~" in it. Note: this fix cannot be backported directly to any stable branch that doesn't require Meson version 1.4.0 or better; otherwise it will work OK on Linux but will break on Windows hosts. (Unfortunately, Meson prior to version 1.4.0 was inconsistent between host OSes about how it quoted arguments, and used a different quoting process on Windows hosts. Our current git trunk already requires 1.5.0 as of commit07f0d32641
("Require meson version 1.5.0"), but the stable branches are still on older Meson.) Fixes:cf60ccc330
("cutils: Introduce bundle mechanism") Reported-by: Michael Tokarev <mjt@tls.msk.ru> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Tested-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Message-id: 20241018130852.931509-1-peter.maydell@linaro.org [PMM: Updated commit message to give all the detail about the Meson version compability requirements.] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from pathlib import PurePath
|
|
import errno
|
|
import json
|
|
import os
|
|
import shlex
|
|
import subprocess
|
|
import sys
|
|
|
|
def destdir_join(d1: str, d2: str) -> str:
|
|
if not d1:
|
|
return d2
|
|
# c:\destdir + c:\prefix must produce c:\destdir\prefix
|
|
return str(PurePath(d1, *PurePath(d2).parts[1:]))
|
|
|
|
introspect = os.environ.get('MESONINTROSPECT')
|
|
out = subprocess.run([*shlex.split(introspect), '--installed'],
|
|
stdout=subprocess.PIPE, check=True).stdout
|
|
for source, dest in json.loads(out).items():
|
|
bundle_dest = destdir_join('qemu-bundle', dest)
|
|
path = os.path.dirname(bundle_dest)
|
|
try:
|
|
os.makedirs(path, exist_ok=True)
|
|
except BaseException as e:
|
|
print(f'error making directory {path}', file=sys.stderr)
|
|
raise e
|
|
try:
|
|
os.symlink(source, bundle_dest)
|
|
except BaseException as e:
|
|
if not isinstance(e, OSError) or e.errno != errno.EEXIST:
|
|
if os.name == 'nt':
|
|
print('Please enable Developer Mode to support soft link '
|
|
'without Administrator permission')
|
|
print(f'error making symbolic link {dest}', file=sys.stderr)
|
|
raise e
|