All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/4] Patches for Windows
@ 2022-10-31  9:14 Stefan Weil via
  2022-10-31  9:14 ` [PULL 1/4] scripts/nsis.py: Drop the unnecessary path separator Stefan Weil via
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Stefan Weil via @ 2022-10-31  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil

The following changes since commit 75d30fde55485b965a1168a21d016dd07b50ed32:

  Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (2022-10-30 15:07:25 -0400)

are available in the Git repository at:

  https://gitlab.com/stweil/qemu.git tags/pull-qemu-20221031

for you to fetch changes up to 588fec8a4c3fe9e0d1cb3f7ea6fdd46221e42814:

  block/nfs: Fix 32-bit Windows build (2022-10-31 10:06:11 +0100)

----------------------------------------------------------------
Patches for Windows

----------------------------------------------------------------
Bin Meng (4):
      scripts/nsis.py: Drop the unnecessary path separator
      scripts/nsis.py: Fix destination directory name when invoked on Windows
      scripts/nsis.py: Automatically package required DLLs of QEMU executables
      block/nfs: Fix 32-bit Windows build

 block/nfs.c     |  8 ++++++++
 meson.build     |  1 +
 scripts/nsis.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 59 insertions(+), 10 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PULL 1/4] scripts/nsis.py: Drop the unnecessary path separator
  2022-10-31  9:14 [PULL 0/4] Patches for Windows Stefan Weil via
@ 2022-10-31  9:14 ` Stefan Weil via
  2022-10-31  9:14 ` [PULL 2/4] scripts/nsis.py: Fix destination directory name when invoked on Windows Stefan Weil via
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Weil via @ 2022-10-31  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, Philippe Mathieu-Daudé, Stefan Weil

From: Bin Meng <bin.meng@windriver.com>

There is no need to append a path separator to the destination
directory that is passed to "make install".

Signed-off-by: Bin Meng <bin.meng@windriver.com>
Message-Id: <20220908132817.1831008-2-bmeng.cn@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
---
 scripts/nsis.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/nsis.py b/scripts/nsis.py
index 462d6cac3b..bbb41d9386 100644
--- a/scripts/nsis.py
+++ b/scripts/nsis.py
@@ -30,7 +30,7 @@ def main():
 
     destdir = tempfile.mkdtemp()
     try:
-        subprocess.run(["make", "install", "DESTDIR=" + destdir + os.path.sep])
+        subprocess.run(["make", "install", "DESTDIR=" + destdir])
         with open(
             os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
         ) as nsh, open(
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PULL 2/4] scripts/nsis.py: Fix destination directory name when invoked on Windows
  2022-10-31  9:14 [PULL 0/4] Patches for Windows Stefan Weil via
  2022-10-31  9:14 ` [PULL 1/4] scripts/nsis.py: Drop the unnecessary path separator Stefan Weil via
@ 2022-10-31  9:14 ` Stefan Weil via
  2022-10-31  9:14 ` [PULL 3/4] scripts/nsis.py: Automatically package required DLLs of QEMU executables Stefan Weil via
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Weil via @ 2022-10-31  9:14 UTC (permalink / raw)
  To: qemu-devel
  Cc: Bin Meng, Marc-André Lureau, Philippe Mathieu-Daudé,
	Stefan Weil

From: Bin Meng <bin.meng@windriver.com>

"make installer" on Windows fails with the following message:

  Traceback (most recent call last):
    File "G:\msys64\home\foo\git\qemu\scripts\nsis.py", line 89, in <module>
      main()
    File "G:\msys64\home\foo\git\qemu\scripts\nsis.py", line 34, in main
      with open(
  OSError: [Errno 22] Invalid argument:
  'R:/Temp/tmpw83xhjquG:/msys64/qemu/system-emulations.nsh'
  ninja: build stopped: subcommand failed.

Use os.path.splitdrive() to form a canonical path without the drive
letter on Windows. This works with cross-build on Linux too.

Fixes: 8adfeba953e0 ("meson: add NSIS building")
Signed-off-by: Bin Meng <bin.meng@windriver.com>
Message-Id: <20220908132817.1831008-3-bmeng.cn@gmail.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
---
 scripts/nsis.py | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/scripts/nsis.py b/scripts/nsis.py
index bbb41d9386..baa6ef9594 100644
--- a/scripts/nsis.py
+++ b/scripts/nsis.py
@@ -28,16 +28,18 @@ def main():
     parser.add_argument("nsisargs", nargs="*")
     args = parser.parse_args()
 
+    # canonicalize the Windows native prefix path
+    prefix = os.path.splitdrive(args.prefix)[1]
     destdir = tempfile.mkdtemp()
     try:
         subprocess.run(["make", "install", "DESTDIR=" + destdir])
         with open(
-            os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
+            os.path.join(destdir + prefix, "system-emulations.nsh"), "w"
         ) as nsh, open(
-            os.path.join(destdir + args.prefix, "system-mui-text.nsh"), "w"
+            os.path.join(destdir + prefix, "system-mui-text.nsh"), "w"
         ) as muinsh:
             for exe in sorted(glob.glob(
-                os.path.join(destdir + args.prefix, "qemu-system-*.exe")
+                os.path.join(destdir + prefix, "qemu-system-*.exe")
             )):
                 exe = os.path.basename(exe)
                 arch = exe[12:-4]
@@ -61,7 +63,7 @@ def main():
                 !insertmacro MUI_DESCRIPTION_TEXT ${{Section_{0}}} "{1}"
                 """.format(arch, desc))
 
-        for exe in glob.glob(os.path.join(destdir + args.prefix, "*.exe")):
+        for exe in glob.glob(os.path.join(destdir + prefix, "*.exe")):
             signcode(exe)
 
         makensis = [
@@ -69,7 +71,7 @@ def main():
             "-V2",
             "-NOCD",
             "-DSRCDIR=" + args.srcdir,
-            "-DBINDIR=" + destdir + args.prefix,
+            "-DBINDIR=" + destdir + prefix,
         ]
         dlldir = "w32"
         if args.cpu == "x86_64":
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PULL 3/4] scripts/nsis.py: Automatically package required DLLs of QEMU executables
  2022-10-31  9:14 [PULL 0/4] Patches for Windows Stefan Weil via
  2022-10-31  9:14 ` [PULL 1/4] scripts/nsis.py: Drop the unnecessary path separator Stefan Weil via
  2022-10-31  9:14 ` [PULL 2/4] scripts/nsis.py: Fix destination directory name when invoked on Windows Stefan Weil via
@ 2022-10-31  9:14 ` Stefan Weil via
  2022-10-31  9:14 ` [PULL 4/4] block/nfs: Fix 32-bit Windows build Stefan Weil via
  2022-10-31 18:39 ` [PULL 0/4] Patches for Windows Stefan Hajnoczi
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Weil via @ 2022-10-31  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, Marc-André Lureau, Stefan Weil

From: Bin Meng <bin.meng@windriver.com>

At present packaging the required DLLs of QEMU executables is a
manual process, and error prone.

Actually build/config-host.mak contains a GLIB_BINDIR variable
which is the directory where glib and other DLLs reside. This
works for both Windows native build and cross-build on Linux.
We can use it as the search directory for DLLs and automate
the whole DLL packaging process.

Signed-off-by: Bin Meng <bin.meng@windriver.com>
Message-Id: <20220908132817.1831008-4-bmeng.cn@gmail.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
---
 meson.build     |  1 +
 scripts/nsis.py | 46 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/meson.build b/meson.build
index 37737913df..d0a186e7f5 100644
--- a/meson.build
+++ b/meson.build
@@ -3616,6 +3616,7 @@ if host_machine.system() == 'windows'
     '@OUTPUT@',
     get_option('prefix'),
     meson.current_source_dir(),
+    config_host['GLIB_BINDIR'],
     host_machine.cpu(),
     '--',
     '-DDISPLAYVERSION=' + meson.project_version(),
diff --git a/scripts/nsis.py b/scripts/nsis.py
index baa6ef9594..03ed7608a2 100644
--- a/scripts/nsis.py
+++ b/scripts/nsis.py
@@ -18,12 +18,36 @@ def signcode(path):
         return
     subprocess.run([cmd, path])
 
+def find_deps(exe_or_dll, search_path, analyzed_deps):
+    deps = [exe_or_dll]
+    output = subprocess.check_output(["objdump", "-p", exe_or_dll], text=True)
+    output = output.split("\n")
+    for line in output:
+        if not line.startswith("\tDLL Name: "):
+            continue
+
+        dep = line.split("DLL Name: ")[1].strip()
+        if dep in analyzed_deps:
+            continue
+
+        dll = os.path.join(search_path, dep)
+        if not os.path.exists(dll):
+            # assume it's a Windows provided dll, skip it
+            continue
+
+        analyzed_deps.add(dep)
+        # locate the dll dependencies recursively
+        rdeps = find_deps(dll, search_path, analyzed_deps)
+        deps.extend(rdeps)
+
+    return deps
 
 def main():
     parser = argparse.ArgumentParser(description="QEMU NSIS build helper.")
     parser.add_argument("outfile")
     parser.add_argument("prefix")
     parser.add_argument("srcdir")
+    parser.add_argument("dlldir")
     parser.add_argument("cpu")
     parser.add_argument("nsisargs", nargs="*")
     args = parser.parse_args()
@@ -63,9 +87,26 @@ def main():
                 !insertmacro MUI_DESCRIPTION_TEXT ${{Section_{0}}} "{1}"
                 """.format(arch, desc))
 
+        search_path = args.dlldir
+        print("Searching '%s' for the dependent dlls ..." % search_path)
+        dlldir = os.path.join(destdir + prefix, "dll")
+        os.mkdir(dlldir)
+
         for exe in glob.glob(os.path.join(destdir + prefix, "*.exe")):
             signcode(exe)
 
+            # find all dll dependencies
+            deps = set(find_deps(exe, search_path, set()))
+            deps.remove(exe)
+
+            # copy all dlls to the DLLDIR
+            for dep in deps:
+                dllfile = os.path.join(dlldir, os.path.basename(dep))
+                if (os.path.exists(dllfile)):
+                    continue
+                print("Copying '%s' to '%s'" % (dep, dllfile))
+                shutil.copy(dep, dllfile)
+
         makensis = [
             "makensis",
             "-V2",
@@ -73,12 +114,9 @@ def main():
             "-DSRCDIR=" + args.srcdir,
             "-DBINDIR=" + destdir + prefix,
         ]
-        dlldir = "w32"
         if args.cpu == "x86_64":
-            dlldir = "w64"
             makensis += ["-DW64"]
-        if os.path.exists(os.path.join(args.srcdir, "dll")):
-            makensis += ["-DDLLDIR={0}/dll/{1}".format(args.srcdir, dlldir)]
+        makensis += ["-DDLLDIR=" + dlldir]
 
         makensis += ["-DOUTFILE=" + args.outfile] + args.nsisargs
         subprocess.run(makensis)
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PULL 4/4] block/nfs: Fix 32-bit Windows build
  2022-10-31  9:14 [PULL 0/4] Patches for Windows Stefan Weil via
                   ` (2 preceding siblings ...)
  2022-10-31  9:14 ` [PULL 3/4] scripts/nsis.py: Automatically package required DLLs of QEMU executables Stefan Weil via
@ 2022-10-31  9:14 ` Stefan Weil via
  2022-10-31 18:39 ` [PULL 0/4] Patches for Windows Stefan Hajnoczi
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Weil via @ 2022-10-31  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, Stefan Weil

From: Bin Meng <bin.meng@windriver.com>

libnfs.h declares nfs_fstat() as the following for win32:

  int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh,
                struct __stat64 *st);

The 'st' parameter should be of type 'struct __stat64'. The
codes happen to build successfully for 64-bit Windows, but it
does not build for 32-bit Windows.

Fixes: 6542aa9c75bc ("block: add native support for NFS")
Fixes: 18a8056e0bc7 ("block/nfs: cache allocated filesize for read-only files")
Signed-off-by: Bin Meng <bin.meng@windriver.com>
Message-Id: <20220908132817.1831008-6-bmeng.cn@gmail.com>
Reviewed-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
---
 block/nfs.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/block/nfs.c b/block/nfs.c
index 596ebe98cb..ece22353ac 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -418,7 +418,11 @@ static int64_t nfs_client_open(NFSClient *client, BlockdevOptionsNfs *opts,
                                int flags, int open_flags, Error **errp)
 {
     int64_t ret = -EINVAL;
+#ifdef _WIN32
+    struct __stat64 st;
+#else
     struct stat st;
+#endif
     char *file = NULL, *strp = NULL;
 
     qemu_mutex_init(&client->mutex);
@@ -781,7 +785,11 @@ static int nfs_reopen_prepare(BDRVReopenState *state,
                               BlockReopenQueue *queue, Error **errp)
 {
     NFSClient *client = state->bs->opaque;
+#ifdef _WIN32
+    struct __stat64 st;
+#else
     struct stat st;
+#endif
     int ret = 0;
 
     if (state->flags & BDRV_O_RDWR && bdrv_is_read_only(state->bs)) {
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PULL 0/4] Patches for Windows
  2022-10-31  9:14 [PULL 0/4] Patches for Windows Stefan Weil via
                   ` (3 preceding siblings ...)
  2022-10-31  9:14 ` [PULL 4/4] block/nfs: Fix 32-bit Windows build Stefan Weil via
@ 2022-10-31 18:39 ` Stefan Hajnoczi
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2022-10-31 18:39 UTC (permalink / raw)
  To: Stefan Weil via; +Cc: qemu-devel, Stefan Weil

[-- Attachment #1: Type: text/plain, Size: 115 bytes --]

Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/7.2 for any user-visible changes.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-10-31 18:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-31  9:14 [PULL 0/4] Patches for Windows Stefan Weil via
2022-10-31  9:14 ` [PULL 1/4] scripts/nsis.py: Drop the unnecessary path separator Stefan Weil via
2022-10-31  9:14 ` [PULL 2/4] scripts/nsis.py: Fix destination directory name when invoked on Windows Stefan Weil via
2022-10-31  9:14 ` [PULL 3/4] scripts/nsis.py: Automatically package required DLLs of QEMU executables Stefan Weil via
2022-10-31  9:14 ` [PULL 4/4] block/nfs: Fix 32-bit Windows build Stefan Weil via
2022-10-31 18:39 ` [PULL 0/4] Patches for Windows Stefan Hajnoczi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.