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>
This commit is contained in:
Stefan Hajnoczi 2020-08-27 15:29:12 +01:00
parent 6745c8a01f
commit c05012a365
5 changed files with 33 additions and 24 deletions

View File

@ -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.

View File

@ -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

View File

@ -16,7 +16,7 @@ __email__ = "stefanha@redhat.com"
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: if len(args) < 2:
error_opt("missing trace-events filepath") 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)

View File

@ -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 ] output = []
sys.stdout.writelines("\n".join(lines) + "\n") 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

View File

@ -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@' ], command: [ tracetool, group, '--format=h', '@INPUT@', '@OUTPUT@' ])
capture: true)
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@' ], command: [ tracetool, group, '--format=c', '@INPUT@', '@OUTPUT@' ])
capture: true)
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@' ], command: [ tracetool, group, '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ])
capture: true)
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@' ], command: [ tracetool, group, '--format=d', '@INPUT@', '@OUTPUT@' ])
capture: true)
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@' ], command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), '@INPUT@', '@OUTPUT@' ])
capture: true)
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@' ], command: [ tracetool, '--group=all', '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ])
capture: true)
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@' ], command: [ tracetool, '--group=all', '--format=ust-events-c', '@INPUT@', '@OUTPUT@' ])
capture: true)
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