qemu/scripts/nsis.py
<<
>>
Prefs
   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