From: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
To: "Daniel P. Berrangé " <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, "Cleber Rosa" <crosa@redhat.com>,
"John Snow" <jsnow@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Alex Benné e" <alex.bennee@linaro.org>,
"Gustavo Romero" <gustavo.romero@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Philippe Mathieu-Daudé " <philmd@linaro.org>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
"Richard Henderson" <richard.henderson@linaro.org>
Subject: Re: [PATCH v2] Add -build-info and -build-info-json CLI arguments
Date: Mon, 23 Sep 2024 22:09:32 +0300 [thread overview]
Message-ID: <ka5ia.wqlrej2ef9q@linaro.org> (raw)
In-Reply-To: <ZvGbRWSPPLJDx7BX@redhat.com>
Hello Daniel,
On Mon, 23 Sep 2024 19:45, "Daniel P. Berrangé" <berrange@redhat.com> wrote:
>On Mon, Sep 23, 2024 at 09:05:24AM +0300, Manos Pitsidianakis wrote:
>> Add -build-info and -build-info-json CLI arguments for human and machine
>> readable output of build/compile-time configuration data. The source for
>> this data is the meson generated config-host.h.
>>
>> This information is mainly of interest to developers and other folk who
>> deal with many different builds of QEMU and need a way to properly
>> differentiate them.
>>
>> Because there's always the chance someone will want to consume an
>> interface programmatically, also add a -json option that does the same
>> but outputs a machine-readable JSON object.
>
>This turns our build system configuration information into a
>defacto public API, and while its using JSON, it isn't yusing
>QAPI.
>
>To some degree we leak our build system config names externally
>because the "if" stanzas in the QAPI schema get copied into the
>docs.
>
>Overall though I don't think we should be exposing this build
>config infomation externally. We've had many times, particularly
>with testing, where people have wanted to access CONFIG_XXX info
>about a QEMU binary, but IIRC we've always steered people towards
>querying for the actual feature they want, rather than looking
>at CONFIG_XXX settings.
>
>ie, look a query-audiodevs to discover what audio baxckends are
>built-in, don't look for CONFIG_XXX settings related to audio.
>If there are gaps in information we can query from QMP, we should
>aim to close those gaps.
>
>IOW, I don't think we should expose this build info info in either
>human readable or machine readable format.
QAPI/QMP is not the perspective of this patch, this is for people who
use custom-built (i.e. not from a distro) binaries and want to be able
to identify how it was built. Launching a binary to query stuff is
unnecessarily complex for this task, and the info is not generally
interesting to the API consumers as you said.
Manos
>
>>
>> Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
>> ---
>> Changes in v2:
>> - Fixed alignment of command and documentation in -h output.
>> - Link to v1: https://lore.kernel.org/r/20240923-feature-build-info-cli-v1-1-e8c42d845390@linaro.org
>> ---
>> Notes:
>> Sample output:
>>
>> $ ./qemu-system-aarch64 -build-info
>> ./qemu-system-aarch64 version 9.1.50 (v9.0.0-3444-g8d988656d8) build information
>>
>> configuration key key value
>> ----------------- ---------
>> accept4
>> af_vsock
>> asan_iface_fiber
>> atomic64
>> attr
>> audio_alsa
>> audio_drivers pa,sndio,oss
>> audio_oss
>> audio_pa
>> audio_pipewire
>> audio_sdl
>> audio_sndio
>> avx2_opt
>> avx512bw_opt
>> bdrv_ro_whitelist
>> bdrv_rw_whitelist
>> bindir /usr/local/bin
>> blkzoned
>> brlapi
>> capstone
>> clock_adjtime
>> close_range
>> coroutine_pool
>> cpuid_h
>> curl
>> curses
>> dbus_display
>> debug_graph_lock
>> debug_mutex
>> debug_tcg
>> dup3
>> ebpf
>> epoll
>> epoll_create1
>> eventfd
>> fallocate
>> fallocate_punch_hole
>> fallocate_zero_range
>> fdatasync
>> fdt
>> fiemap
>> fsfreeze
>> fstrim
>> fuse
>> fuse_lseek
>> gbm
>> getauxval
>> getcpu
>> getrandom
>> gettid
>> gio
>> gnutls
>> gnutls_crypto
>> gtk
>> hexagon_idef_parser
>> host_dsosuf .so
>> iasl /bin/iasl
>> inotify
>> inotify1
>> int128
>> int128_type
>> iovec
>> keyutils
>> kvm_targets i386-softmmu,x86_64-softmmu
>> l2tpv3
>> libdw
>> libudev
>> linux
>> linux_io_uring
>> linux_magic_h
>> madvise
>> malloc_trim
>> memalign
>> memfd
>> opengl
>> open_by_handle
>> pixman
>> plugin
>> png
>> posix
>> posix_fallocate
>> posix_madvise
>> posix_memalign
>> ppoll
>> prctl_pr_set_timerslack
>> preadv
>> prefix /usr/local
>> pthread_affinity_np
>> pthread_setname_np_w_tid
>> qemu_confdir /usr/local/etc/qemu
>> qemu_datadir /usr/local/share/qemu
>> qemu_desktopdir /usr/local/share/applications
>> qemu_firmwarepath /usr/local/share/qemu-firmware
>> qemu_helperdir /usr/local/libexec
>> qemu_icondir /usr/local/share/icons
>> qemu_localedir /usr/local/share/locale
>> qemu_localstatedir /var/local
>> qemu_moddir /usr/local/lib/x86_64-linux-gnu/qemu
>> qom_cast_debug
>> relocatable
>> replication
>> rtnetlink
>> sdl
>> seccomp
>> seccomp_sysrawrc
>> secret_keyring
>> selinux
>> sendfile
>> setns
>> signalfd
>> slirp
>> smbd_command /usr/sbin/smbd
>> splice
>> statx
>> statx_mnt_id
>> syncfs
>> sync_file_range
>> sysconfdir /usr/local/etc
>> sysmacros
>> tasn1
>> tcg 1
>> timerfd
>> tls_priority NORMAL
>> tpm
>> trace_file trace
>> trace_log
>> usbfs
>> usb_libusb
>> valgrind_h
>> valloc
>> vduse_blk_export
>> vhost
>> vhost_crypto
>> vhost_kernel
>> vhost_net
>> vhost_net_user
>> vhost_net_vdpa
>> vhost_user
>> vhost_user_blk_server
>> vhost_vdpa
>> virtfs
>> vnc
>> vnc_jpeg
>> vte
>> x11
>> xen_backend
>> xen_ctrl_interface_version 41700
>> xkbcommon
>> zstd
>> blk_zone_rep_capacity
>> btrfs_h
>> copy_file_range
>> drm_h
>> fsxattr
>> getifaddrs
>> host_block_device
>> ipproto_mptcp
>> mlockall
>> openpty
>> pty_h
>> strchrnul
>> struct_stat_st_atim
>> system_function
>> utmpx
>> virgl_d3d_info_ext
>> host_x86_64 1
>> qemu_version 9.1.50
>> qemu_version_major 9
>> qemu_version_micro 50
>> qemu_version_minor 1
>>
>> To: qemu-devel@nongnu.org
>> Cc: "Cleber Rosa" <crosa@redhat.com>
>> Cc: "Daniel P. Berrangé" <berrange@redhat.com>
>> Cc: "John Snow" <jsnow@redhat.com>
>> Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>
>> Cc: "Paolo Bonzini" <pbonzini@redhat.com>
>> Cc: "Alex Bennée" <alex.bennee@linaro.org>
>> Cc: "Gustavo Romero" <gustavo.romero@linaro.org>
>> Cc: "Peter Maydell" <peter.maydell@linaro.org>
>> Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org>
>> Cc: "Pierrick Bouvier" <pierrick.bouvier@linaro.org>
>> Cc: "Richard Henderson" <richard.henderson@linaro.org>
>> Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
>> ---
>> meson.build | 15 +++++++-
>> qemu-options.hx | 15 ++++++++
>> scripts/build_info_gen.py | 91 +++++++++++++++++++++++++++++++++++++++++++++++
>> system/vl.c | 41 +++++++++++++++++++++
>> 4 files changed, 161 insertions(+), 1 deletion(-)
>>
>> diff --git a/meson.build b/meson.build
>> index 10464466ff..eff2ee323a 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -3292,7 +3292,20 @@ endif
>> # Generated sources #
>> #####################
>>
>> -genh += configure_file(output: 'config-host.h', configuration: config_host_data)
>> +config_host_h = configure_file(output: 'config-host.h', configuration: config_host_data)
>> +genh += config_host_h
>> +
>> +build_info_h = custom_target('build-info.h',
>> + output: 'build-info.h',
>> + command: [
>> + find_program('scripts/build_info_gen.py'),
>> + '--config-headers',
>> + config_host_h
>> + ],
>> + capture: true,
>> + build_by_default: true,
>> + build_always_stale: true)
>> +genh += build_info_h
>>
>> hxtool = find_program('scripts/hxtool')
>> shaderinclude = find_program('scripts/shaderinclude.py')
>> diff --git a/qemu-options.hx b/qemu-options.hx
>> index d94e2cbbae..6a32e0624f 100644
>> --- a/qemu-options.hx
>> +++ b/qemu-options.hx
>> @@ -24,6 +24,21 @@ SRST
>> Display version information and exit
>> ERST
>>
>> +DEF("build-info", 0, QEMU_OPTION_build_info,
>> + "-build-info display build information of executable and exit\n", QEMU_ARCH_ALL)
>> +SRST
>> +``-build-info``
>> + Display build information of executable and exit
>> +ERST
>> +
>> +DEF("build-info-json", 0, QEMU_OPTION_build_info_json,
>> + "-build-info-json\n"
>> + " dump build information of executable in JSON format and exit\n", QEMU_ARCH_ALL)
>> +SRST
>> +``-build-info-json``
>> + Dump build information of executable in JSON format and exit
>> +ERST
>> +
>> DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
>> "-machine [type=]name[,prop[=value][,...]]\n"
>> " selects emulated machine ('-machine help' for list)\n"
>> diff --git a/scripts/build_info_gen.py b/scripts/build_info_gen.py
>> new file mode 100755
>> index 0000000000..37a9421651
>> --- /dev/null
>> +++ b/scripts/build_info_gen.py
>> @@ -0,0 +1,91 @@
>> +#!/usr/bin/env python3
>> +
>> +"""
>> +Generate build information header, build-info.h,
>> +for output of -build-info* command line arguments.
>> +
>> +SPDX-FileContributor: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
>> +SPDX-FileCopyrightText: 2024 Linaro Ltd.
>> +SPDX-License-Identifier: GPL-2.0-or-later
>> +"""
>> +
>> +# Formatted with black --line-length 80 scripts/build-info-gen.py
>> +
>> +import argparse
>> +import logging
>> +
>> +
>> +def generate_key_val(header: str) -> str:
>> + # pylint: disable=missing-function-docstring
>> +
>> + with open(header, encoding="utf-8") as cfg:
>> + config = [l.split()[1:] for l in cfg if l.startswith("#define")]
>> +
>> + for cfg in config:
>> + if cfg[0].startswith("HAVE_"):
>> + yield (cfg[0].removeprefix("HAVE_").lower(), None)
>> + continue
>> + yield (
>> + cfg[0].removeprefix("CONFIG_").lower(),
>> + (
>> + cfg[1]
>> + if len(cfg) == 2
>> + else "".join(cfg[1:]).replace('"', "") if len(cfg) > 2 else None
>> + ),
>> + )
>> +
>> +
>> +def main() -> None:
>> + # pylint: disable=missing-function-docstring
>> + parser = argparse.ArgumentParser()
>> + parser.add_argument("-v", "--verbose", action="store_true")
>> + parser.add_argument(
>> + "--config-headers",
>> + metavar="CONFIG_HEADER",
>> + action="append",
>> + dest="config_headers",
>> + help="paths to configuration host C headers (*.h files)",
>> + required=False,
>> + default=[],
>> + )
>> + args = parser.parse_args()
>> + if args.verbose:
>> + logging.basicConfig(level=logging.ERROR)
>> + logging.debug("args: %s", args)
>> + print(
>> + """// @generated by scripts/build-info-gen.py
>> +
>> +#include <stddef.h>"""
>> + )
>> + print(
>> + """static struct build_info_t {
>> + const char *key;
>> + const char *value;
>> +} BUILD_INFO[] = {"""
>> + )
>> + total = 0
>> + header_width = 0
>> + for header in args.config_headers:
>> + for key, val in generate_key_val(header):
>> + total += 1
>> + header_width = max(header_width, len(key))
>> + print(
>> + '{"',
>> + key,
>> + '", "',
>> + val.strip('"').strip(",").strip('"') if val else "",
>> + '"},',
>> + sep="",
>> + )
>> + print("};")
>> + print("\nstatic size_t BUILD_INFO_SIZE = ", total, ";", sep="")
>> + print(
>> + "static unsigned int BUILD_INFO_HEADER_WIDTH = ",
>> + header_width,
>> + ";",
>> + sep="",
>> + )
>> +
>> +
>> +if __name__ == "__main__":
>> + main()
>> diff --git a/system/vl.c b/system/vl.c
>> index fe547ca47c..5266b85d22 100644
>> --- a/system/vl.c
>> +++ b/system/vl.c
>> @@ -908,6 +908,41 @@ static void help(int exitcode)
>> exit(exitcode);
>> }
>>
>> +static void build_info(const char *execname, bool as_json)
>> +{
>> +#include "build-info.h"
>> + if (as_json) {
>> + printf("{\n");
>> + for (size_t i = 0; i + 1 < BUILD_INFO_SIZE ; i++) {
>> + printf("\"%s\":\"%s\",\n",
>> + BUILD_INFO[i].key,
>> + BUILD_INFO[i].value);
>> + }
>> + if (BUILD_INFO_SIZE > 0) {
>> + printf("\"%s\":\"%s\"\n",
>> + BUILD_INFO[BUILD_INFO_SIZE - 1].key,
>> + BUILD_INFO[BUILD_INFO_SIZE - 1].value);
>> + }
>> + printf("}\n");
>> + } else {
>> + printf("%s version "
>> + QEMU_FULL_VERSION
>> + " build information\n\n", execname ?:"QEMU");
>> + printf(" %-*s key value\n",
>> + BUILD_INFO_HEADER_WIDTH,
>> + "configuration key");
>> + printf(" %-*s ---------\n",
>> + BUILD_INFO_HEADER_WIDTH,
>> + "-----------------");
>> + for (size_t i = 0; i < BUILD_INFO_SIZE ; i++) {
>> + printf(" %-*s %s\n",
>> + BUILD_INFO_HEADER_WIDTH,
>> + BUILD_INFO[i].key,
>> + BUILD_INFO[i].value);
>> + }
>> + }
>> +}
>> +
>> enum {
>>
>> #define DEF(option, opt_arg, opt_enum, opt_help, arch_mask) \
>> @@ -3019,6 +3054,12 @@ void qemu_init(int argc, char **argv)
>> version();
>> exit(0);
>> break;
>> + case QEMU_OPTION_build_info:
>> + /* fallthrough */
>> + case QEMU_OPTION_build_info_json:
>> + build_info(argv[0], popt->index != QEMU_OPTION_build_info);
>> + exit(0);
>> + break;
>> case QEMU_OPTION_m:
>> opts = qemu_opts_parse_noisily(qemu_find_opts("memory"), optarg, true);
>> if (opts == NULL) {
>>
>> ---
>> base-commit: 01dc65a3bc262ab1bec8fe89775e9bbfa627becb
>> change-id: 20240922-feature-build-info-cli-c9e08e34c34b
>>
>> --
>> γαῖα πυρί μιχθήτω
>>
>
>With regards,
>Daniel
>--
>|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
>|: https://libvirt.org -o- https://fstop138.berrange.com :|
>|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
>
next prev parent reply other threads:[~2024-09-23 19:16 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-23 6:05 [PATCH v2] Add -build-info and -build-info-json CLI arguments Manos Pitsidianakis
2024-09-23 16:45 ` Daniel P. Berrangé
2024-09-23 19:09 ` Manos Pitsidianakis [this message]
2024-09-24 8:45 ` Daniel P. Berrangé
2024-09-24 9:25 ` Manos Pitsidianakis
2024-09-24 12:02 ` Alex Bennée
2024-09-24 12:08 ` Daniel P. Berrangé
2024-09-24 12:32 ` Manos Pitsidianakis
2024-09-25 17:28 ` Pierrick Bouvier
2024-09-23 16:56 ` Pierrick Bouvier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ka5ia.wqlrej2ef9q@linaro.org \
--to=manos.pitsidianakis@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=berrange@redhat.com \
--cc=crosa@redhat.com \
--cc=gustavo.romero@linaro.org \
--cc=jsnow@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).