* [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