blob: baa6ef95942573d903217cc40420d8a42dbdd9e0 [file] [log] [blame]
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04001#!/usr/bin/env python3
2#
3# Copyright (C) 2020 Red Hat, Inc.
4#
5# SPDX-License-Identifier: GPL-2.0-or-later
6
7import argparse
8import glob
9import os
10import shutil
11import subprocess
12import tempfile
13
14
15def signcode(path):
16 cmd = os.environ.get("SIGNCODE")
17 if not cmd:
18 return
19 subprocess.run([cmd, path])
20
21
22def main():
23 parser = argparse.ArgumentParser(description="QEMU NSIS build helper.")
24 parser.add_argument("outfile")
25 parser.add_argument("prefix")
26 parser.add_argument("srcdir")
27 parser.add_argument("cpu")
28 parser.add_argument("nsisargs", nargs="*")
29 args = parser.parse_args()
30
Bin Meng93dbca22022-09-08 21:28:12 +080031 # canonicalize the Windows native prefix path
32 prefix = os.path.splitdrive(args.prefix)[1]
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040033 destdir = tempfile.mkdtemp()
34 try:
Bin Meng7f8c0442022-09-08 21:28:11 +080035 subprocess.run(["make", "install", "DESTDIR=" + destdir])
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040036 with open(
Bin Meng93dbca22022-09-08 21:28:12 +080037 os.path.join(destdir + prefix, "system-emulations.nsh"), "w"
Peter Maydellc0879632022-03-05 10:57:43 +000038 ) as nsh, open(
Bin Meng93dbca22022-09-08 21:28:12 +080039 os.path.join(destdir + prefix, "system-mui-text.nsh"), "w"
Peter Maydellc0879632022-03-05 10:57:43 +000040 ) as muinsh:
Peter Maydelle422d922022-03-05 10:57:41 +000041 for exe in sorted(glob.glob(
Bin Meng93dbca22022-09-08 21:28:12 +080042 os.path.join(destdir + prefix, "qemu-system-*.exe")
Peter Maydelle422d922022-03-05 10:57:41 +000043 )):
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040044 exe = os.path.basename(exe)
45 arch = exe[12:-4]
46 nsh.write(
47 """
48 Section "{0}" Section_{0}
49 SetOutPath "$INSTDIR"
50 File "${{BINDIR}}\\{1}"
51 SectionEnd
52 """.format(
53 arch, exe
54 )
55 )
Peter Maydellc0879632022-03-05 10:57:43 +000056 if arch.endswith('w'):
57 desc = arch[:-1] + " emulation (GUI)."
58 else:
59 desc = arch + " emulation."
60
61 muinsh.write(
62 """
63 !insertmacro MUI_DESCRIPTION_TEXT ${{Section_{0}}} "{1}"
64 """.format(arch, desc))
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040065
Bin Meng93dbca22022-09-08 21:28:12 +080066 for exe in glob.glob(os.path.join(destdir + prefix, "*.exe")):
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040067 signcode(exe)
68
69 makensis = [
70 "makensis",
71 "-V2",
72 "-NOCD",
73 "-DSRCDIR=" + args.srcdir,
Bin Meng93dbca22022-09-08 21:28:12 +080074 "-DBINDIR=" + destdir + prefix,
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040075 ]
76 dlldir = "w32"
77 if args.cpu == "x86_64":
78 dlldir = "w64"
79 makensis += ["-DW64"]
80 if os.path.exists(os.path.join(args.srcdir, "dll")):
Stefan Weil933c8fe2020-11-17 20:06:40 +010081 makensis += ["-DDLLDIR={0}/dll/{1}".format(args.srcdir, dlldir)]
Marc-André Lureau8adfeba2020-08-26 15:04:19 +040082
83 makensis += ["-DOUTFILE=" + args.outfile] + args.nsisargs
84 subprocess.run(makensis)
85 signcode(args.outfile)
86 finally:
87 shutil.rmtree(destdir)
88
89
90if __name__ == "__main__":
91 main()