xref: /qemu/scripts/symlink-install-tree.py (revision 1f8da027)
1cf60ccc3SAkihiko Odaki#!/usr/bin/env python3
2cf60ccc3SAkihiko Odaki
3cf60ccc3SAkihiko Odakifrom pathlib import PurePath
4cf60ccc3SAkihiko Odakiimport errno
5cf60ccc3SAkihiko Odakiimport json
6cf60ccc3SAkihiko Odakiimport os
7cf60ccc3SAkihiko Odakiimport subprocess
8cf60ccc3SAkihiko Odakiimport sys
9cf60ccc3SAkihiko Odaki
10cf60ccc3SAkihiko Odakidef destdir_join(d1: str, d2: str) -> str:
11cf60ccc3SAkihiko Odaki    if not d1:
12cf60ccc3SAkihiko Odaki        return d2
13cf60ccc3SAkihiko Odaki    # c:\destdir + c:\prefix must produce c:\destdir\prefix
14cf60ccc3SAkihiko Odaki    return str(PurePath(d1, *PurePath(d2).parts[1:]))
15cf60ccc3SAkihiko Odaki
16cf60ccc3SAkihiko Odakiintrospect = os.environ.get('MESONINTROSPECT')
17cf60ccc3SAkihiko Odakiout = subprocess.run([*introspect.split(' '), '--installed'],
18cf60ccc3SAkihiko Odaki                     stdout=subprocess.PIPE, check=True).stdout
19cf60ccc3SAkihiko Odakifor source, dest in json.loads(out).items():
20cf60ccc3SAkihiko Odaki    bundle_dest = destdir_join('qemu-bundle', dest)
21cf60ccc3SAkihiko Odaki    path = os.path.dirname(bundle_dest)
22cf60ccc3SAkihiko Odaki    try:
23cf60ccc3SAkihiko Odaki        os.makedirs(path, exist_ok=True)
24cf60ccc3SAkihiko Odaki    except BaseException as e:
25cf60ccc3SAkihiko Odaki        print(f'error making directory {path}', file=sys.stderr)
26cf60ccc3SAkihiko Odaki        raise e
27cf60ccc3SAkihiko Odaki    try:
28cf60ccc3SAkihiko Odaki        os.symlink(source, bundle_dest)
29cf60ccc3SAkihiko Odaki    except BaseException as e:
30cf60ccc3SAkihiko Odaki        if not isinstance(e, OSError) or e.errno != errno.EEXIST:
31*1f8da027SMateusz Krawczuk            if os.name == 'nt':
32*1f8da027SMateusz Krawczuk                print('Please enable Developer Mode to support soft link '
33*1f8da027SMateusz Krawczuk                      'without Administrator permission')
34cf60ccc3SAkihiko Odaki            print(f'error making symbolic link {dest}', file=sys.stderr)
35cf60ccc3SAkihiko Odaki            raise e
36