a81df1b68b
This shows how to do some "computations" in meson.build using its array and dictionary data structures, and also a basic usage of the sourceset module for conditional compilation. Notice the new "if have_system" part of util/meson.build, which fixes a bug in the old build system was buggy: util/dbus.c was built even for non-softmmu builds, but the dependency on -lgio was lost when the linking was done through libqemuutil.a. Because all of its users required gio otherwise, the bug was hidden. Meson instead propagates libqemuutil's dependencies down to its users, and shows the problem. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
153 lines
4.4 KiB
Python
153 lines
4.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Command-line wrapper for the tracetool machinery.
|
|
"""
|
|
|
|
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
|
__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>"
|
|
__license__ = "GPL version 2 or (at your option) any later version"
|
|
|
|
__maintainer__ = "Stefan Hajnoczi"
|
|
__email__ = "stefanha@redhat.com"
|
|
|
|
|
|
import sys
|
|
import getopt
|
|
|
|
from tracetool import error_write, out
|
|
import tracetool.backend
|
|
import tracetool.format
|
|
|
|
|
|
_SCRIPT = ""
|
|
|
|
def error_opt(msg = None):
|
|
if msg is not None:
|
|
error_write("Error: " + msg + "\n")
|
|
|
|
backend_descr = "\n".join([ " %-15s %s" % (n, d)
|
|
for n,d in tracetool.backend.get_list() ])
|
|
format_descr = "\n".join([ " %-15s %s" % (n, d)
|
|
for n,d in tracetool.format.get_list() ])
|
|
error_write("""\
|
|
Usage: %(script)s --format=<format> --backends=<backends> [<options>]
|
|
|
|
Backends:
|
|
%(backends)s
|
|
|
|
Formats:
|
|
%(formats)s
|
|
|
|
Options:
|
|
--help This help message.
|
|
--list-backends Print list of available backends.
|
|
--check-backends Check if the given backend is valid.
|
|
--binary <path> Full path to QEMU binary.
|
|
--target-type <type> QEMU emulator target type ('system' or 'user').
|
|
--target-name <name> QEMU emulator target name.
|
|
--group <name> Name of the event group
|
|
--probe-prefix <prefix> Prefix for dtrace probe names
|
|
(default: qemu-<target-type>-<target-name>).\
|
|
""" % {
|
|
"script" : _SCRIPT,
|
|
"backends" : backend_descr,
|
|
"formats" : format_descr,
|
|
})
|
|
|
|
if msg is None:
|
|
sys.exit(0)
|
|
else:
|
|
sys.exit(1)
|
|
|
|
def main(args):
|
|
global _SCRIPT
|
|
_SCRIPT = args[0]
|
|
|
|
long_opts = ["backends=", "format=", "help", "list-backends",
|
|
"check-backends", "group="]
|
|
long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix="]
|
|
|
|
try:
|
|
opts, args = getopt.getopt(args[1:], "", long_opts)
|
|
except getopt.GetoptError as err:
|
|
error_opt(str(err))
|
|
|
|
check_backends = False
|
|
arg_backends = []
|
|
arg_format = ""
|
|
arg_group = None
|
|
binary = None
|
|
target_type = None
|
|
target_name = None
|
|
probe_prefix = None
|
|
for opt, arg in opts:
|
|
if opt == "--help":
|
|
error_opt()
|
|
|
|
elif opt == "--backends":
|
|
arg_backends = arg.split(",")
|
|
elif opt == "--group":
|
|
arg_group = arg
|
|
elif opt == "--format":
|
|
arg_format = arg
|
|
|
|
elif opt == "--list-backends":
|
|
public_backends = tracetool.backend.get_list(only_public = True)
|
|
out(", ".join([ b for b,_ in public_backends ]))
|
|
sys.exit(0)
|
|
elif opt == "--check-backends":
|
|
check_backends = True
|
|
|
|
elif opt == "--binary":
|
|
binary = arg
|
|
elif opt == '--target-type':
|
|
target_type = arg
|
|
elif opt == '--target-name':
|
|
target_name = arg
|
|
elif opt == '--probe-prefix':
|
|
probe_prefix = arg
|
|
|
|
else:
|
|
error_opt("unhandled option: %s" % opt)
|
|
|
|
if len(arg_backends) == 0:
|
|
error_opt("no backends specified")
|
|
|
|
if check_backends:
|
|
for backend in arg_backends:
|
|
if not tracetool.backend.exists(backend):
|
|
sys.exit(1)
|
|
sys.exit(0)
|
|
|
|
if arg_group is None:
|
|
error_opt("group name is required")
|
|
|
|
if arg_format == "stap":
|
|
if binary is None:
|
|
error_opt("--binary is required for SystemTAP tapset generator")
|
|
if probe_prefix is None and target_type is None:
|
|
error_opt("--target-type is required for SystemTAP tapset generator")
|
|
if probe_prefix is None and target_name is None:
|
|
error_opt("--target-name is required for SystemTAP tapset generator")
|
|
|
|
if probe_prefix is None:
|
|
probe_prefix = ".".join(["qemu", target_type, target_name])
|
|
|
|
if len(args) < 1:
|
|
error_opt("missing trace-events filepath")
|
|
events = []
|
|
for arg in args:
|
|
with open(arg, "r") as fh:
|
|
events.extend(tracetool.read_events(fh, arg))
|
|
|
|
try:
|
|
tracetool.generate(events, arg_group, arg_format, arg_backends,
|
|
binary=binary, probe_prefix=probe_prefix)
|
|
except tracetool.TracetoolError as e:
|
|
error_opt(str(e))
|
|
|
|
if __name__ == "__main__":
|
|
main(sys.argv)
|