Browse Source

tracetool: add output filename command-line argument

The tracetool.py script writes to stdout. This means the output filename
is not available to the script. Add the output filename to the
command-line so that the script has access to the filename.

This also simplifies the tracetool.py invocation. It's no longer
necessary to use meson's custom_build(capture : true) to save output.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20200827142915.108730-2-stefanha@redhat.com>
Stefan Hajnoczi 5 years ago
parent
commit
c05012a365
5 changed files with 33 additions and 24 deletions
  1. 2 1
      docs/devel/tracing.txt
  2. 1 2
      meson.build
  3. 7 5
      scripts/tracetool.py
  4. 16 2
      scripts/tracetool/__init__.py
  5. 7 14
      trace/meson.build

+ 2 - 1
docs/devel/tracing.txt

@@ -318,7 +318,8 @@ probes:
                          --target-type system \
                          --target-type system \
                          --target-name x86_64 \
                          --target-name x86_64 \
                          --group=all \
                          --group=all \
-                         trace-events-all >qemu.stp
+                         trace-events-all \
+                         qemu.stp
 
 
 To facilitate simple usage of systemtap where there merely needs to be printf
 To facilitate simple usage of systemtap where there merely needs to be printf
 logging of certain probes, a helper script "qemu-trace-stap" is provided.
 logging of certain probes, a helper script "qemu-trace-stap" is provided.

+ 1 - 2
meson.build

@@ -1901,7 +1901,6 @@ foreach target : target_dirs
         custom_target(exe['name'] + stp['ext'],
         custom_target(exe['name'] + stp['ext'],
                       input: trace_events_all,
                       input: trace_events_all,
                       output: exe['name'] + stp['ext'],
                       output: exe['name'] + stp['ext'],
-                      capture: true,
                       install: stp['install'],
                       install: stp['install'],
                       install_dir: get_option('datadir') / 'systemtap/tapset',
                       install_dir: get_option('datadir') / 'systemtap/tapset',
                       command: [
                       command: [
@@ -1910,7 +1909,7 @@ foreach target : target_dirs
                         '--target-name=' + target_name,
                         '--target-name=' + target_name,
                         '--target-type=' + target_type,
                         '--target-type=' + target_type,
                         '--probe-prefix=qemu.' + target_type + '.' + target_name,
                         '--probe-prefix=qemu.' + target_type + '.' + target_name,
-                        '@INPUT@',
+                        '@INPUT@', '@OUTPUT@'
                       ])
                       ])
       endforeach
       endforeach
     endif
     endif

+ 7 - 5
scripts/tracetool.py

@@ -16,7 +16,7 @@
 import sys
 import sys
 import getopt
 import getopt
 
 
-from tracetool import error_write, out
+from tracetool import error_write, out, out_open
 import tracetool.backend
 import tracetool.backend
 import tracetool.format
 import tracetool.format
 
 
@@ -32,7 +32,7 @@ def error_opt(msg = None):
     format_descr = "\n".join([ "    %-15s %s" % (n, d)
     format_descr = "\n".join([ "    %-15s %s" % (n, d)
                                for n,d in tracetool.format.get_list() ])
                                for n,d in tracetool.format.get_list() ])
     error_write("""\
     error_write("""\
-Usage: %(script)s --format=<format> --backends=<backends> [<options>]
+Usage: %(script)s --format=<format> --backends=<backends> [<options>] <trace-events> ... <output>
 
 
 Backends:
 Backends:
 %(backends)s
 %(backends)s
@@ -135,13 +135,15 @@ def main(args):
         if probe_prefix is None:
         if probe_prefix is None:
             probe_prefix = ".".join(["qemu", target_type, target_name])
             probe_prefix = ".".join(["qemu", target_type, target_name])
 
 
-    if len(args) < 1:
-        error_opt("missing trace-events filepath")
+    if len(args) < 2:
+        error_opt("missing trace-events and output filepaths")
     events = []
     events = []
-    for arg in args:
+    for arg in args[:-1]:
         with open(arg, "r") as fh:
         with open(arg, "r") as fh:
             events.extend(tracetool.read_events(fh, arg))
             events.extend(tracetool.read_events(fh, arg))
 
 
+    out_open(args[-1])
+
     try:
     try:
         tracetool.generate(events, arg_group, arg_format, arg_backends,
         tracetool.generate(events, arg_group, arg_format, arg_backends,
                            binary=binary, probe_prefix=probe_prefix)
                            binary=binary, probe_prefix=probe_prefix)

+ 16 - 2
scripts/tracetool/__init__.py

@@ -31,14 +31,28 @@ def error(*lines):
     sys.exit(1)
     sys.exit(1)
 
 
 
 
+out_filename = '<none>'
+out_fobj = sys.stdout
+
+def out_open(filename):
+    global out_filename, out_fobj
+    out_filename = filename
+    out_fobj = open(filename, 'wt')
+
 def out(*lines, **kwargs):
 def out(*lines, **kwargs):
     """Write a set of output lines.
     """Write a set of output lines.
 
 
     You can use kwargs as a shorthand for mapping variables when formatting all
     You can use kwargs as a shorthand for mapping variables when formatting all
     the strings in lines.
     the strings in lines.
+
+    The 'out_filename' kwarg is automatically added with the output filename.
     """
     """
-    lines = [ l % kwargs for l in lines ]
-    sys.stdout.writelines("\n".join(lines) + "\n")
+    output = []
+    for l in lines:
+        kwargs['out_filename'] = out_filename
+        output.append(l % kwargs)
+
+    out_fobj.writelines("\n".join(output) + "\n")
 
 
 # We only want to allow standard C types or fixed sized
 # We only want to allow standard C types or fixed sized
 # integer types. We don't want QEMU specific types
 # integer types. We don't want QEMU specific types

+ 7 - 14
trace/meson.build

@@ -11,20 +11,17 @@ foreach dir : [ '.' ] + trace_events_subdirs
   trace_h = custom_target(fmt.format('trace', 'h'),
   trace_h = custom_target(fmt.format('trace', 'h'),
                           output: fmt.format('trace', 'h'),
                           output: fmt.format('trace', 'h'),
                           input: trace_events_file,
                           input: trace_events_file,
-                          command: [ tracetool, group, '--format=h', '@INPUT@' ],
-                          capture: true)
+                          command: [ tracetool, group, '--format=h', '@INPUT@', '@OUTPUT@' ])
   genh += trace_h
   genh += trace_h
   trace_c = custom_target(fmt.format('trace', 'c'),
   trace_c = custom_target(fmt.format('trace', 'c'),
                           output: fmt.format('trace', 'c'),
                           output: fmt.format('trace', 'c'),
                           input: trace_events_file,
                           input: trace_events_file,
-                          command: [ tracetool, group, '--format=c', '@INPUT@' ],
-                          capture: true)
+                          command: [ tracetool, group, '--format=c', '@INPUT@', '@OUTPUT@' ])
   if 'CONFIG_TRACE_UST' in config_host
   if 'CONFIG_TRACE_UST' in config_host
     trace_ust_h = custom_target(fmt.format('trace-ust', 'h'),
     trace_ust_h = custom_target(fmt.format('trace-ust', 'h'),
                                 output: fmt.format('trace-ust', 'h'),
                                 output: fmt.format('trace-ust', 'h'),
                                 input: trace_events_file,
                                 input: trace_events_file,
-                                command: [ tracetool, group, '--format=ust-events-h', '@INPUT@' ],
-                                capture: true)
+                                command: [ tracetool, group, '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ])
     trace_ss.add(trace_ust_h, lttng, urcubp)
     trace_ss.add(trace_ust_h, lttng, urcubp)
     genh += trace_ust_h
     genh += trace_ust_h
   endif
   endif
@@ -33,8 +30,7 @@ foreach dir : [ '.' ] + trace_events_subdirs
     trace_dtrace = custom_target(fmt.format('trace-dtrace', 'dtrace'),
     trace_dtrace = custom_target(fmt.format('trace-dtrace', 'dtrace'),
                                  output: fmt.format('trace-dtrace', 'dtrace'),
                                  output: fmt.format('trace-dtrace', 'dtrace'),
                                  input: trace_events_file,
                                  input: trace_events_file,
-                                 command: [ tracetool, group, '--format=d', '@INPUT@' ],
-                                 capture: true)
+                                 command: [ tracetool, group, '--format=d', '@INPUT@', '@OUTPUT@' ])
     trace_dtrace_h = custom_target(fmt.format('trace-dtrace', 'h'),
     trace_dtrace_h = custom_target(fmt.format('trace-dtrace', 'h'),
                                    output: fmt.format('trace-dtrace', 'h'),
                                    output: fmt.format('trace-dtrace', 'h'),
                                    input: trace_dtrace,
                                    input: trace_dtrace,
@@ -69,8 +65,7 @@ foreach d : [
   gen = custom_target(d[0],
   gen = custom_target(d[0],
                 output: d[0],
                 output: d[0],
                 input: meson.source_root() / 'trace-events',
                 input: meson.source_root() / 'trace-events',
-                command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), '@INPUT@' ],
-                capture: true)
+                command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), '@INPUT@', '@OUTPUT@' ])
   specific_ss.add(gen)
   specific_ss.add(gen)
 endforeach
 endforeach
 
 
@@ -78,13 +73,11 @@ if 'CONFIG_TRACE_UST' in config_host
   trace_ust_all_h = custom_target('trace-ust-all.h',
   trace_ust_all_h = custom_target('trace-ust-all.h',
                                   output: 'trace-ust-all.h',
                                   output: 'trace-ust-all.h',
                                   input: trace_events_files,
                                   input: trace_events_files,
-                                  command: [ tracetool, '--group=all', '--format=ust-events-h', '@INPUT@' ],
-                                  capture: true)
+                                  command: [ tracetool, '--group=all', '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ])
   trace_ust_all_c = custom_target('trace-ust-all.c',
   trace_ust_all_c = custom_target('trace-ust-all.c',
                                   output: 'trace-ust-all.c',
                                   output: 'trace-ust-all.c',
                                   input: trace_events_files,
                                   input: trace_events_files,
-                                  command: [ tracetool, '--group=all', '--format=ust-events-c', '@INPUT@' ],
-                                  capture: true)
+                                  command: [ tracetool, '--group=all', '--format=ust-events-c', '@INPUT@', '@OUTPUT@' ])
   trace_ss.add(trace_ust_all_h, trace_ust_all_c)
   trace_ss.add(trace_ust_all_h, trace_ust_all_c)
   genh += trace_ust_all_h
   genh += trace_ust_all_h
 endif
 endif