[PATCH RESEND v3] meson: fix Windows build

oltolm posted 1 patch 5 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20250607094503.1307-2-oleg.tolmatcev@gmail.com
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, Alexandre Iooss <erdnaxe@crans.org>, Mahmoud Mandour <ma.mandourr@gmail.com>, Pierrick Bouvier <pierrick.bouvier@linaro.org>, Stefan Hajnoczi <stefanha@redhat.com>, Mads Ynddal <mads@ynddal.dk>
There is a newer version of this series
contrib/plugins/meson.build         |  2 +-
plugins/meson.build                 |  2 +-
scripts/tracetool/__init__.py       | 15 ++++++++++++---
scripts/tracetool/backend/ftrace.py |  4 +---
scripts/tracetool/backend/log.py    |  4 +---
scripts/tracetool/backend/syslog.py |  4 +---
tests/functional/meson.build        |  4 +---
tests/include/meson.build           |  2 +-
tests/tcg/plugins/meson.build       |  2 +-
trace/meson.build                   |  5 +++--
10 files changed, 23 insertions(+), 21 deletions(-)
[PATCH RESEND v3] meson: fix Windows build
Posted by oltolm 5 months, 1 week ago
Sorry, I forgot to cc the maintainers.

The build failed when run on Windows. I replaced calls to Unix programs
like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
´os.path.relpath´ in try-except because it can fail when the two paths
are on different drives. I made sure to convert the Windows paths to
Unix paths to prevent warnings in generated files.

Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
---
 contrib/plugins/meson.build         |  2 +-
 plugins/meson.build                 |  2 +-
 scripts/tracetool/__init__.py       | 15 ++++++++++++---
 scripts/tracetool/backend/ftrace.py |  4 +---
 scripts/tracetool/backend/log.py    |  4 +---
 scripts/tracetool/backend/syslog.py |  4 +---
 tests/functional/meson.build        |  4 +---
 tests/include/meson.build           |  2 +-
 tests/tcg/plugins/meson.build       |  2 +-
 trace/meson.build                   |  5 +++--
 10 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
index fa8a426c8..1876bc784 100644
--- a/contrib/plugins/meson.build
+++ b/contrib/plugins/meson.build
@@ -24,7 +24,7 @@ endif
 if t.length() > 0
   alias_target('contrib-plugins', t)
 else
-  run_target('contrib-plugins', command: find_program('true'))
+  run_target('contrib-plugins', command: [python, '-c', ''])
 endif
 
 plugin_modules += t
diff --git a/plugins/meson.build b/plugins/meson.build
index 5383c7b88..cb7472df8 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -33,7 +33,7 @@ if host_os == 'windows'
     input: qemu_plugin_symbols,
     output: 'qemu_plugin_api.def',
     capture: true,
-    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
+    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])
 
   # then use dlltool to assemble a delaylib.
   # The delaylib will have an "imaginary" name (qemu.exe), that is used by the
diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py
index bc03238c0..6dfcbf71e 100644
--- a/scripts/tracetool/__init__.py
+++ b/scripts/tracetool/__init__.py
@@ -12,12 +12,14 @@
 __email__      = "stefanha@redhat.com"
 
 
+import os
 import re
 import sys
 import weakref
+from pathlib import PurePath
 
-import tracetool.format
 import tracetool.backend
+import tracetool.format
 
 
 def error_write(*lines):
@@ -36,7 +38,7 @@ def error(*lines):
 
 def out_open(filename):
     global out_filename, out_fobj
-    out_filename = filename
+    out_filename = posix_relpath(filename)
     out_fobj = open(filename, 'wt')
 
 def out(*lines, **kwargs):
@@ -308,7 +310,7 @@ def build(line_str, lineno, filename):
             fmt = [fmt_trans, fmt]
         args = Arguments.build(groups["args"])
 
-        return Event(name, props, fmt, args, lineno, filename)
+        return Event(name, props, fmt, args, lineno, posix_relpath(filename))
 
     def __repr__(self):
         """Evaluable string representation for this object."""
@@ -447,3 +449,10 @@ def generate(events, group, format, backends,
     tracetool.backend.dtrace.PROBEPREFIX = probe_prefix
 
     tracetool.format.generate(events, format, backend, group)
+
+def posix_relpath(path, start=None):
+    try:
+        path = os.path.relpath(path, start)
+    except ValueError:
+        pass
+    return PurePath(path).as_posix()
diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py
index baed2ae61..5fa30ccc0 100644
--- a/scripts/tracetool/backend/ftrace.py
+++ b/scripts/tracetool/backend/ftrace.py
@@ -12,8 +12,6 @@
 __email__      = "stefanha@redhat.com"
 
 
-import os.path
-
 from tracetool import out
 
 
@@ -47,7 +45,7 @@ def generate_h(event, group):
         args=event.args,
         event_id="TRACE_" + event.name.upper(),
         event_lineno=event.lineno,
-        event_filename=os.path.relpath(event.filename),
+        event_filename=event.filename,
         fmt=event.fmt.rstrip("\n"),
         argnames=argnames)
 
diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
index de27b7e62..17ba1cd90 100644
--- a/scripts/tracetool/backend/log.py
+++ b/scripts/tracetool/backend/log.py
@@ -12,8 +12,6 @@
 __email__      = "stefanha@redhat.com"
 
 
-import os.path
-
 from tracetool import out
 
 
@@ -55,7 +53,7 @@ def generate_h(event, group):
         '    }',
         cond=cond,
         event_lineno=event.lineno,
-        event_filename=os.path.relpath(event.filename),
+        event_filename=event.filename,
         name=event.name,
         fmt=event.fmt.rstrip("\n"),
         argnames=argnames)
diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py
index 012970f6c..5a3a00fe3 100644
--- a/scripts/tracetool/backend/syslog.py
+++ b/scripts/tracetool/backend/syslog.py
@@ -12,8 +12,6 @@
 __email__      = "stefanha@redhat.com"
 
 
-import os.path
-
 from tracetool import out
 
 
@@ -43,7 +41,7 @@ def generate_h(event, group):
         '    }',
         cond=cond,
         event_lineno=event.lineno,
-        event_filename=os.path.relpath(event.filename),
+        event_filename=event.filename,
         name=event.name,
         fmt=event.fmt.rstrip("\n"),
         argnames=argnames)
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index 52b4706cf..ee222888f 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -411,6 +411,4 @@ foreach speed : ['quick', 'thorough']
   endforeach
 endforeach
 
-run_target('precache-functional',
-           depends: precache_all,
-           command: ['true'])
+alias_target('precache-functional', precache_all)
diff --git a/tests/include/meson.build b/tests/include/meson.build
index 9abba308f..8e8d1ec4e 100644
--- a/tests/include/meson.build
+++ b/tests/include/meson.build
@@ -13,4 +13,4 @@ test_qapi_outputs_extra = [
 test_qapi_files_extra = custom_target('QAPI test (include)',
                                       output: test_qapi_outputs_extra,
                                       input: test_qapi_files,
-                                      command: 'true')
+                                      command: [python, '-c', ''])
diff --git a/tests/tcg/plugins/meson.build b/tests/tcg/plugins/meson.build
index 41f02f2c7..029342282 100644
--- a/tests/tcg/plugins/meson.build
+++ b/tests/tcg/plugins/meson.build
@@ -17,7 +17,7 @@ endif
 if t.length() > 0
   alias_target('test-plugins', t)
 else
-  run_target('test-plugins', command: find_program('true'))
+  run_target('test-plugins', command: [python, '-c', ''])
 endif
 
 plugin_modules += t
diff --git a/trace/meson.build b/trace/meson.build
index 3df454935..9c42a57a0 100644
--- a/trace/meson.build
+++ b/trace/meson.build
@@ -4,7 +4,7 @@ trace_events_files = []
 foreach item : [ '.' ] + trace_events_subdirs + qapi_trace_events
   if item in qapi_trace_events
     trace_events_file = item
-    group_name = item.full_path().split('/')[-1].underscorify()
+    group_name = fs.name(item).underscorify()
   else
     trace_events_file = meson.project_source_root() / item / 'trace-events'
     group_name = item == '.' ? 'root' : item.underscorify()
@@ -57,10 +57,11 @@ foreach item : [ '.' ] + trace_events_subdirs + qapi_trace_events
   endif
 endforeach
 
+cat = [ python, '-c', 'import fileinput; [print(line, end="") for line in fileinput.input()]', '@INPUT@' ]
 trace_events_all = custom_target('trace-events-all',
                                  output: 'trace-events-all',
                                  input: trace_events_files,
-                                 command: [ 'cat', '@INPUT@' ],
+                                 command: cat,
                                  capture: true,
                                  install: get_option('trace_backends') != [ 'nop' ],
                                  install_dir: qemu_datadir)
-- 
2.49.0.windows.1


Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Stefan Hajnoczi 5 months ago
On Sat, Jun 7, 2025 at 5:47 AM oltolm <oleg.tolmatcev@gmail.com> wrote:
>
> Sorry, I forgot to cc the maintainers.
>
> The build failed when run on Windows. I replaced calls to Unix programs
> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> ´os.path.relpath´ in try-except because it can fail when the two paths
> are on different drives. I made sure to convert the Windows paths to
> Unix paths to prevent warnings in generated files.
>
> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> ---
>  contrib/plugins/meson.build         |  2 +-
>  plugins/meson.build                 |  2 +-
>  scripts/tracetool/__init__.py       | 15 ++++++++++++---
>  scripts/tracetool/backend/ftrace.py |  4 +---
>  scripts/tracetool/backend/log.py    |  4 +---
>  scripts/tracetool/backend/syslog.py |  4 +---
>  tests/functional/meson.build        |  4 +---
>  tests/include/meson.build           |  2 +-
>  tests/tcg/plugins/meson.build       |  2 +-
>  trace/meson.build                   |  5 +++--
>  10 files changed, 23 insertions(+), 21 deletions(-)
>
> diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
> index fa8a426c8..1876bc784 100644
> --- a/contrib/plugins/meson.build
> +++ b/contrib/plugins/meson.build
> @@ -24,7 +24,7 @@ endif
>  if t.length() > 0
>    alias_target('contrib-plugins', t)
>  else
> -  run_target('contrib-plugins', command: find_program('true'))
> +  run_target('contrib-plugins', command: [python, '-c', ''])
>  endif
>
>  plugin_modules += t
> diff --git a/plugins/meson.build b/plugins/meson.build
> index 5383c7b88..cb7472df8 100644
> --- a/plugins/meson.build
> +++ b/plugins/meson.build
> @@ -33,7 +33,7 @@ if host_os == 'windows'
>      input: qemu_plugin_symbols,
>      output: 'qemu_plugin_api.def',
>      capture: true,
> -    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
> +    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])
>
>    # then use dlltool to assemble a delaylib.
>    # The delaylib will have an "imaginary" name (qemu.exe), that is used by the
> diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py
> index bc03238c0..6dfcbf71e 100644
> --- a/scripts/tracetool/__init__.py
> +++ b/scripts/tracetool/__init__.py
> @@ -12,12 +12,14 @@
>  __email__      = "stefanha@redhat.com"
>
>
> +import os
>  import re
>  import sys
>  import weakref
> +from pathlib import PurePath
>
> -import tracetool.format
>  import tracetool.backend
> +import tracetool.format
>
>
>  def error_write(*lines):
> @@ -36,7 +38,7 @@ def error(*lines):
>
>  def out_open(filename):
>      global out_filename, out_fobj
> -    out_filename = filename
> +    out_filename = posix_relpath(filename)
>      out_fobj = open(filename, 'wt')
>
>  def out(*lines, **kwargs):
> @@ -308,7 +310,7 @@ def build(line_str, lineno, filename):
>              fmt = [fmt_trans, fmt]
>          args = Arguments.build(groups["args"])
>
> -        return Event(name, props, fmt, args, lineno, filename)
> +        return Event(name, props, fmt, args, lineno, posix_relpath(filename))
>
>      def __repr__(self):
>          """Evaluable string representation for this object."""
> @@ -447,3 +449,10 @@ def generate(events, group, format, backends,
>      tracetool.backend.dtrace.PROBEPREFIX = probe_prefix
>
>      tracetool.format.generate(events, format, backend, group)
> +
> +def posix_relpath(path, start=None):
> +    try:
> +        path = os.path.relpath(path, start)
> +    except ValueError:
> +        pass
> +    return PurePath(path).as_posix()
> diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py
> index baed2ae61..5fa30ccc0 100644
> --- a/scripts/tracetool/backend/ftrace.py
> +++ b/scripts/tracetool/backend/ftrace.py
> @@ -12,8 +12,6 @@
>  __email__      = "stefanha@redhat.com"
>
>
> -import os.path
> -
>  from tracetool import out
>
>
> @@ -47,7 +45,7 @@ def generate_h(event, group):
>          args=event.args,
>          event_id="TRACE_" + event.name.upper(),
>          event_lineno=event.lineno,
> -        event_filename=os.path.relpath(event.filename),
> +        event_filename=event.filename,
>          fmt=event.fmt.rstrip("\n"),
>          argnames=argnames)
>
> diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
> index de27b7e62..17ba1cd90 100644
> --- a/scripts/tracetool/backend/log.py
> +++ b/scripts/tracetool/backend/log.py
> @@ -12,8 +12,6 @@
>  __email__      = "stefanha@redhat.com"
>
>
> -import os.path
> -
>  from tracetool import out
>
>
> @@ -55,7 +53,7 @@ def generate_h(event, group):
>          '    }',
>          cond=cond,
>          event_lineno=event.lineno,
> -        event_filename=os.path.relpath(event.filename),
> +        event_filename=event.filename,
>          name=event.name,
>          fmt=event.fmt.rstrip("\n"),
>          argnames=argnames)
> diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py
> index 012970f6c..5a3a00fe3 100644
> --- a/scripts/tracetool/backend/syslog.py
> +++ b/scripts/tracetool/backend/syslog.py
> @@ -12,8 +12,6 @@
>  __email__      = "stefanha@redhat.com"
>
>
> -import os.path
> -
>  from tracetool import out
>
>
> @@ -43,7 +41,7 @@ def generate_h(event, group):
>          '    }',
>          cond=cond,
>          event_lineno=event.lineno,
> -        event_filename=os.path.relpath(event.filename),
> +        event_filename=event.filename,
>          name=event.name,
>          fmt=event.fmt.rstrip("\n"),
>          argnames=argnames)
> diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> index 52b4706cf..ee222888f 100644
> --- a/tests/functional/meson.build
> +++ b/tests/functional/meson.build
> @@ -411,6 +411,4 @@ foreach speed : ['quick', 'thorough']
>    endforeach
>  endforeach
>
> -run_target('precache-functional',
> -           depends: precache_all,
> -           command: ['true'])
> +alias_target('precache-functional', precache_all)

Hi Oleg,
There is a CI hexagon build failure. Maybe precache_all is []:
../tests/functional/meson.build:417:0: ERROR: alias_target takes at
least 2 arguments, but got 1.

https://gitlab.com/qemu-project/qemu/-/jobs/10336566320#L4267

Please take a look. Thanks!

Stefan

> diff --git a/tests/include/meson.build b/tests/include/meson.build
> index 9abba308f..8e8d1ec4e 100644
> --- a/tests/include/meson.build
> +++ b/tests/include/meson.build
> @@ -13,4 +13,4 @@ test_qapi_outputs_extra = [
>  test_qapi_files_extra = custom_target('QAPI test (include)',
>                                        output: test_qapi_outputs_extra,
>                                        input: test_qapi_files,
> -                                      command: 'true')
> +                                      command: [python, '-c', ''])
> diff --git a/tests/tcg/plugins/meson.build b/tests/tcg/plugins/meson.build
> index 41f02f2c7..029342282 100644
> --- a/tests/tcg/plugins/meson.build
> +++ b/tests/tcg/plugins/meson.build
> @@ -17,7 +17,7 @@ endif
>  if t.length() > 0
>    alias_target('test-plugins', t)
>  else
> -  run_target('test-plugins', command: find_program('true'))
> +  run_target('test-plugins', command: [python, '-c', ''])
>  endif
>
>  plugin_modules += t
> diff --git a/trace/meson.build b/trace/meson.build
> index 3df454935..9c42a57a0 100644
> --- a/trace/meson.build
> +++ b/trace/meson.build
> @@ -4,7 +4,7 @@ trace_events_files = []
>  foreach item : [ '.' ] + trace_events_subdirs + qapi_trace_events
>    if item in qapi_trace_events
>      trace_events_file = item
> -    group_name = item.full_path().split('/')[-1].underscorify()
> +    group_name = fs.name(item).underscorify()
>    else
>      trace_events_file = meson.project_source_root() / item / 'trace-events'
>      group_name = item == '.' ? 'root' : item.underscorify()
> @@ -57,10 +57,11 @@ foreach item : [ '.' ] + trace_events_subdirs + qapi_trace_events
>    endif
>  endforeach
>
> +cat = [ python, '-c', 'import fileinput; [print(line, end="") for line in fileinput.input()]', '@INPUT@' ]
>  trace_events_all = custom_target('trace-events-all',
>                                   output: 'trace-events-all',
>                                   input: trace_events_files,
> -                                 command: [ 'cat', '@INPUT@' ],
> +                                 command: cat,
>                                   capture: true,
>                                   install: get_option('trace_backends') != [ 'nop' ],
>                                   install_dir: qemu_datadir)
> --
> 2.49.0.windows.1
>
>
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Oleg Tolmatcev 5 months ago
Am Do., 12. Juni 2025 um 21:35 Uhr schrieb Stefan Hajnoczi <stefanha@gmail.com>:
>
> On Sat, Jun 7, 2025 at 5:47 AM oltolm <oleg.tolmatcev@gmail.com> wrote:
> >
> > Sorry, I forgot to cc the maintainers.
> >
> > The build failed when run on Windows. I replaced calls to Unix programs
> > like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> > ´os.path.relpath´ in try-except because it can fail when the two paths
> > are on different drives. I made sure to convert the Windows paths to
> > Unix paths to prevent warnings in generated files.
> >
> > Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> > ---
> >  contrib/plugins/meson.build         |  2 +-
> >  plugins/meson.build                 |  2 +-
> >  scripts/tracetool/__init__.py       | 15 ++++++++++++---
> >  scripts/tracetool/backend/ftrace.py |  4 +---
> >  scripts/tracetool/backend/log.py    |  4 +---
> >  scripts/tracetool/backend/syslog.py |  4 +---
> >  tests/functional/meson.build        |  4 +---
> >  tests/include/meson.build           |  2 +-
> >  tests/tcg/plugins/meson.build       |  2 +-
> >  trace/meson.build                   |  5 +++--
> >  10 files changed, 23 insertions(+), 21 deletions(-)
> >
> > diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
> > index fa8a426c8..1876bc784 100644
> > --- a/contrib/plugins/meson.build
> > +++ b/contrib/plugins/meson.build
> > @@ -24,7 +24,7 @@ endif
> >  if t.length() > 0
> >    alias_target('contrib-plugins', t)
> >  else
> > -  run_target('contrib-plugins', command: find_program('true'))
> > +  run_target('contrib-plugins', command: [python, '-c', ''])
> >  endif
> >
> >  plugin_modules += t
> > diff --git a/plugins/meson.build b/plugins/meson.build
> > index 5383c7b88..cb7472df8 100644
> > --- a/plugins/meson.build
> > +++ b/plugins/meson.build
> > @@ -33,7 +33,7 @@ if host_os == 'windows'
> >      input: qemu_plugin_symbols,
> >      output: 'qemu_plugin_api.def',
> >      capture: true,
> > -    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
> > +    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])
> >
> >    # then use dlltool to assemble a delaylib.
> >    # The delaylib will have an "imaginary" name (qemu.exe), that is used by the
> > diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py
> > index bc03238c0..6dfcbf71e 100644
> > --- a/scripts/tracetool/__init__.py
> > +++ b/scripts/tracetool/__init__.py
> > @@ -12,12 +12,14 @@
> >  __email__      = "stefanha@redhat.com"
> >
> >
> > +import os
> >  import re
> >  import sys
> >  import weakref
> > +from pathlib import PurePath
> >
> > -import tracetool.format
> >  import tracetool.backend
> > +import tracetool.format
> >
> >
> >  def error_write(*lines):
> > @@ -36,7 +38,7 @@ def error(*lines):
> >
> >  def out_open(filename):
> >      global out_filename, out_fobj
> > -    out_filename = filename
> > +    out_filename = posix_relpath(filename)
> >      out_fobj = open(filename, 'wt')
> >
> >  def out(*lines, **kwargs):
> > @@ -308,7 +310,7 @@ def build(line_str, lineno, filename):
> >              fmt = [fmt_trans, fmt]
> >          args = Arguments.build(groups["args"])
> >
> > -        return Event(name, props, fmt, args, lineno, filename)
> > +        return Event(name, props, fmt, args, lineno, posix_relpath(filename))
> >
> >      def __repr__(self):
> >          """Evaluable string representation for this object."""
> > @@ -447,3 +449,10 @@ def generate(events, group, format, backends,
> >      tracetool.backend.dtrace.PROBEPREFIX = probe_prefix
> >
> >      tracetool.format.generate(events, format, backend, group)
> > +
> > +def posix_relpath(path, start=None):
> > +    try:
> > +        path = os.path.relpath(path, start)
> > +    except ValueError:
> > +        pass
> > +    return PurePath(path).as_posix()
> > diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py
> > index baed2ae61..5fa30ccc0 100644
> > --- a/scripts/tracetool/backend/ftrace.py
> > +++ b/scripts/tracetool/backend/ftrace.py
> > @@ -12,8 +12,6 @@
> >  __email__      = "stefanha@redhat.com"
> >
> >
> > -import os.path
> > -
> >  from tracetool import out
> >
> >
> > @@ -47,7 +45,7 @@ def generate_h(event, group):
> >          args=event.args,
> >          event_id="TRACE_" + event.name.upper(),
> >          event_lineno=event.lineno,
> > -        event_filename=os.path.relpath(event.filename),
> > +        event_filename=event.filename,
> >          fmt=event.fmt.rstrip("\n"),
> >          argnames=argnames)
> >
> > diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
> > index de27b7e62..17ba1cd90 100644
> > --- a/scripts/tracetool/backend/log.py
> > +++ b/scripts/tracetool/backend/log.py
> > @@ -12,8 +12,6 @@
> >  __email__      = "stefanha@redhat.com"
> >
> >
> > -import os.path
> > -
> >  from tracetool import out
> >
> >
> > @@ -55,7 +53,7 @@ def generate_h(event, group):
> >          '    }',
> >          cond=cond,
> >          event_lineno=event.lineno,
> > -        event_filename=os.path.relpath(event.filename),
> > +        event_filename=event.filename,
> >          name=event.name,
> >          fmt=event.fmt.rstrip("\n"),
> >          argnames=argnames)
> > diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py
> > index 012970f6c..5a3a00fe3 100644
> > --- a/scripts/tracetool/backend/syslog.py
> > +++ b/scripts/tracetool/backend/syslog.py
> > @@ -12,8 +12,6 @@
> >  __email__      = "stefanha@redhat.com"
> >
> >
> > -import os.path
> > -
> >  from tracetool import out
> >
> >
> > @@ -43,7 +41,7 @@ def generate_h(event, group):
> >          '    }',
> >          cond=cond,
> >          event_lineno=event.lineno,
> > -        event_filename=os.path.relpath(event.filename),
> > +        event_filename=event.filename,
> >          name=event.name,
> >          fmt=event.fmt.rstrip("\n"),
> >          argnames=argnames)
> > diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> > index 52b4706cf..ee222888f 100644
> > --- a/tests/functional/meson.build
> > +++ b/tests/functional/meson.build
> > @@ -411,6 +411,4 @@ foreach speed : ['quick', 'thorough']
> >    endforeach
> >  endforeach
> >
> > -run_target('precache-functional',
> > -           depends: precache_all,
> > -           command: ['true'])
> > +alias_target('precache-functional', precache_all)
>
> Hi Oleg,
> There is a CI hexagon build failure. Maybe precache_all is []:
> ../tests/functional/meson.build:417:0: ERROR: alias_target takes at
> least 2 arguments, but got 1.
>
> https://gitlab.com/qemu-project/qemu/-/jobs/10336566320#L4267
>
> Please take a look. Thanks!

Hi Stefan,

this should be replaced with

run_target('precache-functional',
           depends: precache_all,
           command: [python, '-c', ''])

Should I send a v4 of my patch?

Oleg
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by BALATON Zoltan 5 months ago
On Thu, 12 Jun 2025, Oleg Tolmatcev wrote:
> Am Do., 12. Juni 2025 um 21:35 Uhr schrieb Stefan Hajnoczi <stefanha@gmail.com>:
>>
>> On Sat, Jun 7, 2025 at 5:47 AM oltolm <oleg.tolmatcev@gmail.com> wrote:
>>>
>>> Sorry, I forgot to cc the maintainers.
>>>
>>> The build failed when run on Windows. I replaced calls to Unix programs
>>> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
>>> ´os.path.relpath´ in try-except because it can fail when the two paths
>>> are on different drives. I made sure to convert the Windows paths to
>>> Unix paths to prevent warnings in generated files.
>>>
>>> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
>>> ---
>>>  contrib/plugins/meson.build         |  2 +-
>>>  plugins/meson.build                 |  2 +-
>>>  scripts/tracetool/__init__.py       | 15 ++++++++++++---
>>>  scripts/tracetool/backend/ftrace.py |  4 +---
>>>  scripts/tracetool/backend/log.py    |  4 +---
>>>  scripts/tracetool/backend/syslog.py |  4 +---
>>>  tests/functional/meson.build        |  4 +---
>>>  tests/include/meson.build           |  2 +-
>>>  tests/tcg/plugins/meson.build       |  2 +-
>>>  trace/meson.build                   |  5 +++--
>>>  10 files changed, 23 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
>>> index fa8a426c8..1876bc784 100644
>>> --- a/contrib/plugins/meson.build
>>> +++ b/contrib/plugins/meson.build
>>> @@ -24,7 +24,7 @@ endif
>>>  if t.length() > 0
>>>    alias_target('contrib-plugins', t)
>>>  else
>>> -  run_target('contrib-plugins', command: find_program('true'))
>>> +  run_target('contrib-plugins', command: [python, '-c', ''])
>>>  endif
>>>
>>>  plugin_modules += t
>>> diff --git a/plugins/meson.build b/plugins/meson.build
>>> index 5383c7b88..cb7472df8 100644
>>> --- a/plugins/meson.build
>>> +++ b/plugins/meson.build
>>> @@ -33,7 +33,7 @@ if host_os == 'windows'
>>>      input: qemu_plugin_symbols,
>>>      output: 'qemu_plugin_api.def',
>>>      capture: true,
>>> -    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
>>> +    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])
>>>
>>>    # then use dlltool to assemble a delaylib.
>>>    # The delaylib will have an "imaginary" name (qemu.exe), that is used by the
>>> diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py
>>> index bc03238c0..6dfcbf71e 100644
>>> --- a/scripts/tracetool/__init__.py
>>> +++ b/scripts/tracetool/__init__.py
>>> @@ -12,12 +12,14 @@
>>>  __email__      = "stefanha@redhat.com"
>>>
>>>
>>> +import os
>>>  import re
>>>  import sys
>>>  import weakref
>>> +from pathlib import PurePath
>>>
>>> -import tracetool.format
>>>  import tracetool.backend
>>> +import tracetool.format
>>>
>>>
>>>  def error_write(*lines):
>>> @@ -36,7 +38,7 @@ def error(*lines):
>>>
>>>  def out_open(filename):
>>>      global out_filename, out_fobj
>>> -    out_filename = filename
>>> +    out_filename = posix_relpath(filename)
>>>      out_fobj = open(filename, 'wt')
>>>
>>>  def out(*lines, **kwargs):
>>> @@ -308,7 +310,7 @@ def build(line_str, lineno, filename):
>>>              fmt = [fmt_trans, fmt]
>>>          args = Arguments.build(groups["args"])
>>>
>>> -        return Event(name, props, fmt, args, lineno, filename)
>>> +        return Event(name, props, fmt, args, lineno, posix_relpath(filename))
>>>
>>>      def __repr__(self):
>>>          """Evaluable string representation for this object."""
>>> @@ -447,3 +449,10 @@ def generate(events, group, format, backends,
>>>      tracetool.backend.dtrace.PROBEPREFIX = probe_prefix
>>>
>>>      tracetool.format.generate(events, format, backend, group)
>>> +
>>> +def posix_relpath(path, start=None):
>>> +    try:
>>> +        path = os.path.relpath(path, start)
>>> +    except ValueError:
>>> +        pass
>>> +    return PurePath(path).as_posix()
>>> diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py
>>> index baed2ae61..5fa30ccc0 100644
>>> --- a/scripts/tracetool/backend/ftrace.py
>>> +++ b/scripts/tracetool/backend/ftrace.py
>>> @@ -12,8 +12,6 @@
>>>  __email__      = "stefanha@redhat.com"
>>>
>>>
>>> -import os.path
>>> -
>>>  from tracetool import out
>>>
>>>
>>> @@ -47,7 +45,7 @@ def generate_h(event, group):
>>>          args=event.args,
>>>          event_id="TRACE_" + event.name.upper(),
>>>          event_lineno=event.lineno,
>>> -        event_filename=os.path.relpath(event.filename),
>>> +        event_filename=event.filename,
>>>          fmt=event.fmt.rstrip("\n"),
>>>          argnames=argnames)
>>>
>>> diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
>>> index de27b7e62..17ba1cd90 100644
>>> --- a/scripts/tracetool/backend/log.py
>>> +++ b/scripts/tracetool/backend/log.py
>>> @@ -12,8 +12,6 @@
>>>  __email__      = "stefanha@redhat.com"
>>>
>>>
>>> -import os.path
>>> -
>>>  from tracetool import out
>>>
>>>
>>> @@ -55,7 +53,7 @@ def generate_h(event, group):
>>>          '    }',
>>>          cond=cond,
>>>          event_lineno=event.lineno,
>>> -        event_filename=os.path.relpath(event.filename),
>>> +        event_filename=event.filename,
>>>          name=event.name,
>>>          fmt=event.fmt.rstrip("\n"),
>>>          argnames=argnames)
>>> diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py
>>> index 012970f6c..5a3a00fe3 100644
>>> --- a/scripts/tracetool/backend/syslog.py
>>> +++ b/scripts/tracetool/backend/syslog.py
>>> @@ -12,8 +12,6 @@
>>>  __email__      = "stefanha@redhat.com"
>>>
>>>
>>> -import os.path
>>> -
>>>  from tracetool import out
>>>
>>>
>>> @@ -43,7 +41,7 @@ def generate_h(event, group):
>>>          '    }',
>>>          cond=cond,
>>>          event_lineno=event.lineno,
>>> -        event_filename=os.path.relpath(event.filename),
>>> +        event_filename=event.filename,
>>>          name=event.name,
>>>          fmt=event.fmt.rstrip("\n"),
>>>          argnames=argnames)
>>> diff --git a/tests/functional/meson.build b/tests/functional/meson.build
>>> index 52b4706cf..ee222888f 100644
>>> --- a/tests/functional/meson.build
>>> +++ b/tests/functional/meson.build
>>> @@ -411,6 +411,4 @@ foreach speed : ['quick', 'thorough']
>>>    endforeach
>>>  endforeach
>>>
>>> -run_target('precache-functional',
>>> -           depends: precache_all,
>>> -           command: ['true'])
>>> +alias_target('precache-functional', precache_all)
>>
>> Hi Oleg,
>> There is a CI hexagon build failure. Maybe precache_all is []:
>> ../tests/functional/meson.build:417:0: ERROR: alias_target takes at
>> least 2 arguments, but got 1.
>>
>> https://gitlab.com/qemu-project/qemu/-/jobs/10336566320#L4267
>>
>> Please take a look. Thanks!
>
> Hi Stefan,
>
> this should be replaced with
>
> run_target('precache-functional',
>           depends: precache_all,
>           command: [python, '-c', ''])
>
> Should I send a v4 of my patch?

I think it would help if you can send a v4 also fixing up the commit 
message as was discussed so Stefan does not have to do it. Generally more 
than trivial fixup needs a new version of the patch sent by the author, 
only fixing simple typos might not need a resend. Ideally maintainers 
should not need to do any fixup just take the latest patch version.

Regards,
BALATON Zoltan
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Stefan Hajnoczi 5 months ago
On Sat, Jun 07, 2025 at 11:45:04AM +0200, oltolm wrote:
> Sorry, I forgot to cc the maintainers.
> 
> The build failed when run on Windows. I replaced calls to Unix programs
> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> ´os.path.relpath´ in try-except because it can fail when the two paths
> are on different drives. I made sure to convert the Windows paths to
> Unix paths to prevent warnings in generated files.
> 
> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> ---
>  contrib/plugins/meson.build         |  2 +-
>  plugins/meson.build                 |  2 +-
>  scripts/tracetool/__init__.py       | 15 ++++++++++++---
>  scripts/tracetool/backend/ftrace.py |  4 +---
>  scripts/tracetool/backend/log.py    |  4 +---
>  scripts/tracetool/backend/syslog.py |  4 +---
>  tests/functional/meson.build        |  4 +---
>  tests/include/meson.build           |  2 +-
>  tests/tcg/plugins/meson.build       |  2 +-
>  trace/meson.build                   |  5 +++--
>  10 files changed, 23 insertions(+), 21 deletions(-)

Thanks, applied to my tracing tree:
https://gitlab.com/stefanha/qemu/commits/tracing

Stefan
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Pierrick Bouvier 5 months, 1 week ago
On 6/7/25 2:45 AM, oltolm wrote:
> Sorry, I forgot to cc the maintainers.
> 
> The build failed when run on Windows. I replaced calls to Unix programs
> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> ´os.path.relpath´ in try-except because it can fail when the two paths
> are on different drives. I made sure to convert the Windows paths to
> Unix paths to prevent warnings in generated files.
> 
> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> ---
>   contrib/plugins/meson.build         |  2 +-
>   plugins/meson.build                 |  2 +-
>   scripts/tracetool/__init__.py       | 15 ++++++++++++---
>   scripts/tracetool/backend/ftrace.py |  4 +---
>   scripts/tracetool/backend/log.py    |  4 +---
>   scripts/tracetool/backend/syslog.py |  4 +---
>   tests/functional/meson.build        |  4 +---
>   tests/include/meson.build           |  2 +-
>   tests/tcg/plugins/meson.build       |  2 +-
>   trace/meson.build                   |  5 +++--
>   10 files changed, 23 insertions(+), 21 deletions(-)

Are you building using msys2, or another environment on Windows? I'm
curious to know in which configuration the build is failing.

In case you use msys2, maybe you're simply missing some packages. Our
documentation explains what to install [1].
Building out of msys2 on Windows is not recommended, as this is the only
maintained setup (tested in our CI, and maintained as an msys2 package
by msys2 maintainers) for this system.

[1] https://www.qemu.org/docs/master/devel/build-environment.html

Regards,
Pierrick

Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Oleg Tolmatcev 5 months, 1 week ago
Am So., 8. Juni 2025 um 02:43 Uhr schrieb Pierrick Bouvier
<pierrick.bouvier@linaro.org>:
>
> On 6/7/25 2:45 AM, oltolm wrote:
> > Sorry, I forgot to cc the maintainers.
> >
> > The build failed when run on Windows. I replaced calls to Unix programs
> > like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> > ´os.path.relpath´ in try-except because it can fail when the two paths
> > are on different drives. I made sure to convert the Windows paths to
> > Unix paths to prevent warnings in generated files.
> >
> > Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> > ---
> >   contrib/plugins/meson.build         |  2 +-
> >   plugins/meson.build                 |  2 +-
> >   scripts/tracetool/__init__.py       | 15 ++++++++++++---
> >   scripts/tracetool/backend/ftrace.py |  4 +---
> >   scripts/tracetool/backend/log.py    |  4 +---
> >   scripts/tracetool/backend/syslog.py |  4 +---
> >   tests/functional/meson.build        |  4 +---
> >   tests/include/meson.build           |  2 +-
> >   tests/tcg/plugins/meson.build       |  2 +-
> >   trace/meson.build                   |  5 +++--
> >   10 files changed, 23 insertions(+), 21 deletions(-)
>
> Are you building using msys2, or another environment on Windows? I'm
> curious to know in which configuration the build is failing.
>
> In case you use msys2, maybe you're simply missing some packages. Our
> documentation explains what to install [1].
> Building out of msys2 on Windows is not recommended, as this is the only
> maintained setup (tested in our CI, and maintained as an msys2 package
> by msys2 maintainers) for this system.
>
> [1] https://www.qemu.org/docs/master/devel/build-environment.html

Yes I do use msys2, but I only use bash for the initial configuration.
Afterwards I just call meson and ninja from "cmd" not from bash.
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Pierrick Bouvier 5 months, 1 week ago
On 6/8/25 1:23 AM, Oleg Tolmatcev wrote:
> Am So., 8. Juni 2025 um 02:43 Uhr schrieb Pierrick Bouvier
> <pierrick.bouvier@linaro.org>:
>>
>> On 6/7/25 2:45 AM, oltolm wrote:
>>> Sorry, I forgot to cc the maintainers.
>>>
>>> The build failed when run on Windows. I replaced calls to Unix programs
>>> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
>>> ´os.path.relpath´ in try-except because it can fail when the two paths
>>> are on different drives. I made sure to convert the Windows paths to
>>> Unix paths to prevent warnings in generated files.
>>>
>>> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
>>> ---
>>>    contrib/plugins/meson.build         |  2 +-
>>>    plugins/meson.build                 |  2 +-
>>>    scripts/tracetool/__init__.py       | 15 ++++++++++++---
>>>    scripts/tracetool/backend/ftrace.py |  4 +---
>>>    scripts/tracetool/backend/log.py    |  4 +---
>>>    scripts/tracetool/backend/syslog.py |  4 +---
>>>    tests/functional/meson.build        |  4 +---
>>>    tests/include/meson.build           |  2 +-
>>>    tests/tcg/plugins/meson.build       |  2 +-
>>>    trace/meson.build                   |  5 +++--
>>>    10 files changed, 23 insertions(+), 21 deletions(-)
>>
>> Are you building using msys2, or another environment on Windows? I'm
>> curious to know in which configuration the build is failing.
>>
>> In case you use msys2, maybe you're simply missing some packages. Our
>> documentation explains what to install [1].
>> Building out of msys2 on Windows is not recommended, as this is the only
>> maintained setup (tested in our CI, and maintained as an msys2 package
>> by msys2 maintainers) for this system.
>>
>> [1] https://www.qemu.org/docs/master/devel/build-environment.html
> 
> Yes I do use msys2, but I only use bash for the initial configuration.
> Afterwards I just call meson and ninja from "cmd" not from bash.

Maybe it's because it's complicated to execute a single command from 
msys2, and return. Using the -shell parameter of msys2_shell, you can 
pass arguments to bash.

cmd.exe /c c:/msys64/msys2_shell.cmd -defterm -here -no-start -mingw64
   -shell bash -c 'ls / /tmp'

That said, I'm not opposed to the current series, I just wanted to 
understand what is the context.

Thanks,
Pierrick

Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Alex Bennée 5 months, 1 week ago
oltolm <oleg.tolmatcev@gmail.com> writes:

> Sorry, I forgot to cc the maintainers.
>
> The build failed when run on Windows. I replaced calls to Unix programs
> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> ´os.path.relpath´ in try-except because it can fail when the two paths
> are on different drives. I made sure to convert the Windows paths to
> Unix paths to prevent warnings in generated files.
>
> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>

for plugins:

Acked-by: Alex Bennée <alex.bennee@linaro.org>

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Stefan Hajnoczi 5 months, 1 week ago
On Sat, Jun 07, 2025 at 11:45:04AM +0200, oltolm wrote:
> Sorry, I forgot to cc the maintainers.
> 
> The build failed when run on Windows. I replaced calls to Unix programs
> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> ´os.path.relpath´ in try-except because it can fail when the two paths
> are on different drives. I made sure to convert the Windows paths to
> Unix paths to prevent warnings in generated files.
> 
> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> ---
>  contrib/plugins/meson.build         |  2 +-
>  plugins/meson.build                 |  2 +-
>  scripts/tracetool/__init__.py       | 15 ++++++++++++---
>  scripts/tracetool/backend/ftrace.py |  4 +---
>  scripts/tracetool/backend/log.py    |  4 +---
>  scripts/tracetool/backend/syslog.py |  4 +---
>  tests/functional/meson.build        |  4 +---
>  tests/include/meson.build           |  2 +-
>  tests/tcg/plugins/meson.build       |  2 +-
>  trace/meson.build                   |  5 +++--
>  10 files changed, 23 insertions(+), 21 deletions(-)
> 
> diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
> index fa8a426c8..1876bc784 100644
> --- a/contrib/plugins/meson.build
> +++ b/contrib/plugins/meson.build
> @@ -24,7 +24,7 @@ endif
>  if t.length() > 0
>    alias_target('contrib-plugins', t)
>  else
> -  run_target('contrib-plugins', command: find_program('true'))
> +  run_target('contrib-plugins', command: [python, '-c', ''])
>  endif
>  
>  plugin_modules += t
> diff --git a/plugins/meson.build b/plugins/meson.build
> index 5383c7b88..cb7472df8 100644
> --- a/plugins/meson.build
> +++ b/plugins/meson.build
> @@ -33,7 +33,7 @@ if host_os == 'windows'
>      input: qemu_plugin_symbols,
>      output: 'qemu_plugin_api.def',
>      capture: true,
> -    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
> +    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])

On second thought, is print("EXPORTS", end="") correct? Unlike the lines
coming from fileinput, there is no line ending. I though that .def files
look like this:

EXPORTS
  ...
  ...

So maybe end="" should be dropped for EXPORTS to correctly format the
.def file?

(I didn't have a Windows build environment to check myself, but it
should be easy to diff the before/after files to verify whether there
are any changes.)

Stefan
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Oleg Tolmatcev 5 months, 1 week ago
Am Sa., 7. Juni 2025 um 21:12 Uhr schrieb Stefan Hajnoczi <stefanha@redhat.com>:
>
> On Sat, Jun 07, 2025 at 11:45:04AM +0200, oltolm wrote:
> > Sorry, I forgot to cc the maintainers.
> >
> > The build failed when run on Windows. I replaced calls to Unix programs
> > like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> > ´os.path.relpath´ in try-except because it can fail when the two paths
> > are on different drives. I made sure to convert the Windows paths to
> > Unix paths to prevent warnings in generated files.
> >
> > Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> > ---
> >  contrib/plugins/meson.build         |  2 +-
> >  plugins/meson.build                 |  2 +-
> >  scripts/tracetool/__init__.py       | 15 ++++++++++++---
> >  scripts/tracetool/backend/ftrace.py |  4 +---
> >  scripts/tracetool/backend/log.py    |  4 +---
> >  scripts/tracetool/backend/syslog.py |  4 +---
> >  tests/functional/meson.build        |  4 +---
> >  tests/include/meson.build           |  2 +-
> >  tests/tcg/plugins/meson.build       |  2 +-
> >  trace/meson.build                   |  5 +++--
> >  10 files changed, 23 insertions(+), 21 deletions(-)
> >
> > diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
> > index fa8a426c8..1876bc784 100644
> > --- a/contrib/plugins/meson.build
> > +++ b/contrib/plugins/meson.build
> > @@ -24,7 +24,7 @@ endif
> >  if t.length() > 0
> >    alias_target('contrib-plugins', t)
> >  else
> > -  run_target('contrib-plugins', command: find_program('true'))
> > +  run_target('contrib-plugins', command: [python, '-c', ''])
> >  endif
> >
> >  plugin_modules += t
> > diff --git a/plugins/meson.build b/plugins/meson.build
> > index 5383c7b88..cb7472df8 100644
> > --- a/plugins/meson.build
> > +++ b/plugins/meson.build
> > @@ -33,7 +33,7 @@ if host_os == 'windows'
> >      input: qemu_plugin_symbols,
> >      output: 'qemu_plugin_api.def',
> >      capture: true,
> > -    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
> > +    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])
>
> On second thought, is print("EXPORTS", end="") correct? Unlike the lines
> coming from fileinput, there is no line ending. I though that .def files
> look like this:
>
> EXPORTS
>   ...
>   ...
>
> So maybe end="" should be dropped for EXPORTS to correctly format the
> .def file?
>
> (I didn't have a Windows build environment to check myself, but it
> should be easy to diff the before/after files to verify whether there
> are any changes.)

I already did that. It produces the same output.
Oleg
Re: [PATCH RESEND v3] meson: fix Windows build
Posted by Stefan Hajnoczi 5 months, 1 week ago
On Sat, Jun 07, 2025 at 11:45:04AM +0200, oltolm wrote:
> Sorry, I forgot to cc the maintainers.
> 
> The build failed when run on Windows. I replaced calls to Unix programs
> like ´cat´, ´sed´ and ´true´ with calls to ´python´. I wrapped calls to
> ´os.path.relpath´ in try-except because it can fail when the two paths
> are on different drives. I made sure to convert the Windows paths to
> Unix paths to prevent warnings in generated files.
> 
> Signed-off-by: oltolm <oleg.tolmatcev@gmail.com>
> ---
>  contrib/plugins/meson.build         |  2 +-
>  plugins/meson.build                 |  2 +-
>  scripts/tracetool/__init__.py       | 15 ++++++++++++---
>  scripts/tracetool/backend/ftrace.py |  4 +---
>  scripts/tracetool/backend/log.py    |  4 +---
>  scripts/tracetool/backend/syslog.py |  4 +---
>  tests/functional/meson.build        |  4 +---
>  tests/include/meson.build           |  2 +-
>  tests/tcg/plugins/meson.build       |  2 +-
>  trace/meson.build                   |  5 +++--
>  10 files changed, 23 insertions(+), 21 deletions(-)

Thank you for the tracing changes!

I have CCed Paolo for general meson knowledge and the plugins
maintainers/reviewers. If no one responds by Wednesday I will merge it
through my tracing tree.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

> 
> diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
> index fa8a426c8..1876bc784 100644
> --- a/contrib/plugins/meson.build
> +++ b/contrib/plugins/meson.build
> @@ -24,7 +24,7 @@ endif
>  if t.length() > 0
>    alias_target('contrib-plugins', t)
>  else
> -  run_target('contrib-plugins', command: find_program('true'))
> +  run_target('contrib-plugins', command: [python, '-c', ''])
>  endif
>  
>  plugin_modules += t
> diff --git a/plugins/meson.build b/plugins/meson.build
> index 5383c7b88..cb7472df8 100644
> --- a/plugins/meson.build
> +++ b/plugins/meson.build
> @@ -33,7 +33,7 @@ if host_os == 'windows'
>      input: qemu_plugin_symbols,
>      output: 'qemu_plugin_api.def',
>      capture: true,
> -    command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
> +    command: [python, '-c', 'import fileinput, re; print("EXPORTS", end=""); [print(re.sub(r"[{};]", "", line), end="") for line in fileinput.input()]', '@INPUT@'])
>  
>    # then use dlltool to assemble a delaylib.
>    # The delaylib will have an "imaginary" name (qemu.exe), that is used by the
> diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py
> index bc03238c0..6dfcbf71e 100644
> --- a/scripts/tracetool/__init__.py
> +++ b/scripts/tracetool/__init__.py
> @@ -12,12 +12,14 @@
>  __email__      = "stefanha@redhat.com"
>  
>  
> +import os
>  import re
>  import sys
>  import weakref
> +from pathlib import PurePath
>  
> -import tracetool.format
>  import tracetool.backend
> +import tracetool.format
>  
>  
>  def error_write(*lines):
> @@ -36,7 +38,7 @@ def error(*lines):
>  
>  def out_open(filename):
>      global out_filename, out_fobj
> -    out_filename = filename
> +    out_filename = posix_relpath(filename)
>      out_fobj = open(filename, 'wt')
>  
>  def out(*lines, **kwargs):
> @@ -308,7 +310,7 @@ def build(line_str, lineno, filename):
>              fmt = [fmt_trans, fmt]
>          args = Arguments.build(groups["args"])
>  
> -        return Event(name, props, fmt, args, lineno, filename)
> +        return Event(name, props, fmt, args, lineno, posix_relpath(filename))
>  
>      def __repr__(self):
>          """Evaluable string representation for this object."""
> @@ -447,3 +449,10 @@ def generate(events, group, format, backends,
>      tracetool.backend.dtrace.PROBEPREFIX = probe_prefix
>  
>      tracetool.format.generate(events, format, backend, group)
> +
> +def posix_relpath(path, start=None):
> +    try:
> +        path = os.path.relpath(path, start)
> +    except ValueError:
> +        pass
> +    return PurePath(path).as_posix()
> diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py
> index baed2ae61..5fa30ccc0 100644
> --- a/scripts/tracetool/backend/ftrace.py
> +++ b/scripts/tracetool/backend/ftrace.py
> @@ -12,8 +12,6 @@
>  __email__      = "stefanha@redhat.com"
>  
>  
> -import os.path
> -
>  from tracetool import out
>  
>  
> @@ -47,7 +45,7 @@ def generate_h(event, group):
>          args=event.args,
>          event_id="TRACE_" + event.name.upper(),
>          event_lineno=event.lineno,
> -        event_filename=os.path.relpath(event.filename),
> +        event_filename=event.filename,
>          fmt=event.fmt.rstrip("\n"),
>          argnames=argnames)
>  
> diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
> index de27b7e62..17ba1cd90 100644
> --- a/scripts/tracetool/backend/log.py
> +++ b/scripts/tracetool/backend/log.py
> @@ -12,8 +12,6 @@
>  __email__      = "stefanha@redhat.com"
>  
>  
> -import os.path
> -
>  from tracetool import out
>  
>  
> @@ -55,7 +53,7 @@ def generate_h(event, group):
>          '    }',
>          cond=cond,
>          event_lineno=event.lineno,
> -        event_filename=os.path.relpath(event.filename),
> +        event_filename=event.filename,
>          name=event.name,
>          fmt=event.fmt.rstrip("\n"),
>          argnames=argnames)
> diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py
> index 012970f6c..5a3a00fe3 100644
> --- a/scripts/tracetool/backend/syslog.py
> +++ b/scripts/tracetool/backend/syslog.py
> @@ -12,8 +12,6 @@
>  __email__      = "stefanha@redhat.com"
>  
>  
> -import os.path
> -
>  from tracetool import out
>  
>  
> @@ -43,7 +41,7 @@ def generate_h(event, group):
>          '    }',
>          cond=cond,
>          event_lineno=event.lineno,
> -        event_filename=os.path.relpath(event.filename),
> +        event_filename=event.filename,
>          name=event.name,
>          fmt=event.fmt.rstrip("\n"),
>          argnames=argnames)
> diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> index 52b4706cf..ee222888f 100644
> --- a/tests/functional/meson.build
> +++ b/tests/functional/meson.build
> @@ -411,6 +411,4 @@ foreach speed : ['quick', 'thorough']
>    endforeach
>  endforeach
>  
> -run_target('precache-functional',
> -           depends: precache_all,
> -           command: ['true'])
> +alias_target('precache-functional', precache_all)
> diff --git a/tests/include/meson.build b/tests/include/meson.build
> index 9abba308f..8e8d1ec4e 100644
> --- a/tests/include/meson.build
> +++ b/tests/include/meson.build
> @@ -13,4 +13,4 @@ test_qapi_outputs_extra = [
>  test_qapi_files_extra = custom_target('QAPI test (include)',
>                                        output: test_qapi_outputs_extra,
>                                        input: test_qapi_files,
> -                                      command: 'true')
> +                                      command: [python, '-c', ''])
> diff --git a/tests/tcg/plugins/meson.build b/tests/tcg/plugins/meson.build
> index 41f02f2c7..029342282 100644
> --- a/tests/tcg/plugins/meson.build
> +++ b/tests/tcg/plugins/meson.build
> @@ -17,7 +17,7 @@ endif
>  if t.length() > 0
>    alias_target('test-plugins', t)
>  else
> -  run_target('test-plugins', command: find_program('true'))
> +  run_target('test-plugins', command: [python, '-c', ''])
>  endif
>  
>  plugin_modules += t
> diff --git a/trace/meson.build b/trace/meson.build
> index 3df454935..9c42a57a0 100644
> --- a/trace/meson.build
> +++ b/trace/meson.build
> @@ -4,7 +4,7 @@ trace_events_files = []
>  foreach item : [ '.' ] + trace_events_subdirs + qapi_trace_events
>    if item in qapi_trace_events
>      trace_events_file = item
> -    group_name = item.full_path().split('/')[-1].underscorify()
> +    group_name = fs.name(item).underscorify()
>    else
>      trace_events_file = meson.project_source_root() / item / 'trace-events'
>      group_name = item == '.' ? 'root' : item.underscorify()
> @@ -57,10 +57,11 @@ foreach item : [ '.' ] + trace_events_subdirs + qapi_trace_events
>    endif
>  endforeach
>  
> +cat = [ python, '-c', 'import fileinput; [print(line, end="") for line in fileinput.input()]', '@INPUT@' ]
>  trace_events_all = custom_target('trace-events-all',
>                                   output: 'trace-events-all',
>                                   input: trace_events_files,
> -                                 command: [ 'cat', '@INPUT@' ],
> +                                 command: cat,
>                                   capture: true,
>                                   install: get_option('trace_backends') != [ 'nop' ],
>                                   install_dir: qemu_datadir)
> -- 
> 2.49.0.windows.1
>