xref: /qemu/scripts/nsis.py (revision 138ca49a)
1#!/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
31    destdir = tempfile.mkdtemp()
32    try:
33        subprocess.run(["make", "install", "DESTDIR=" + destdir + os.path.sep])
34        with open(
35            os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
36        ) as nsh:
37            for exe in glob.glob(
38                os.path.join(destdir + args.prefix, "qemu-system-*.exe")
39            ):
40                exe = os.path.basename(exe)
41                arch = exe[12:-4]
42                nsh.write(
43                    """
44                Section "{0}" Section_{0}
45                SetOutPath "$INSTDIR"
46                File "${{BINDIR}}\\{1}"
47                SectionEnd
48                """.format(
49                        arch, exe
50                    )
51                )
52
53        for exe in glob.glob(os.path.join(destdir + args.prefix, "*.exe")):
54            signcode(exe)
55
56        makensis = [
57            "makensis",
58            "-V2",
59            "-NOCD",
60            "-DSRCDIR=" + args.srcdir,
61            "-DBINDIR=" + destdir + args.prefix,
62        ]
63        dlldir = "w32"
64        if args.cpu == "x86_64":
65            dlldir = "w64"
66            makensis += ["-DW64"]
67        if os.path.exists(os.path.join(args.srcdir, "dll")):
68            makensis += ["-DDLLDIR={0}/dll/{1}".format(args.srcdir, dlldir)]
69
70        makensis += ["-DOUTFILE=" + args.outfile] + args.nsisargs
71        subprocess.run(makensis)
72        signcode(args.outfile)
73    finally:
74        shutil.rmtree(destdir)
75
76
77if __name__ == "__main__":
78    main()
79