On Fri, Sep 4, 2020 at 1:57 PM Quentin Monnet <quentin@xxxxxxxxxxxxx> wrote: > > Bpftool has a number of features that can be included or left aside > during compilation. This includes: > > - Support for libbfd, providing the disassembler for JIT-compiled > programs. > - Support for BPF skeletons, used for profiling programs or iterating on > the PIDs of processes associated with BPF objects. > > In order to make it easy for users to understand what features were > compiled for a given bpftool binary, print the status of the two > features above when showing the version number for bpftool ("bpftool -V" > or "bpftool version"). Document this in the main manual page. Example > invocation: > > $ bpftool -p version > { > "version": "5.9.0-rc1", > "features": [ > "libbfd": true, > "skeletons": true > ] Is this a valid JSON? array of key/value pairs? > } > > Some other parameters are optional at compilation > ("DISASM_FOUR_ARGS_SIGNATURE", LIBCAP support) but they do not impact > significantly bpftool's behaviour from a user's point of view, so their > status is not reported. > > Available commands and supported program types depend on the version > number, and are therefore not reported either. Note that they are > already available, albeit without JSON, via bpftool's help messages. > > Signed-off-by: Quentin Monnet <quentin@xxxxxxxxxxxxx> > --- > tools/bpf/bpftool/Documentation/bpftool.rst | 8 +++++++- > tools/bpf/bpftool/main.c | 22 +++++++++++++++++++++ > 2 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/tools/bpf/bpftool/Documentation/bpftool.rst b/tools/bpf/bpftool/Documentation/bpftool.rst > index 420d4d5df8b6..a3629a3f1175 100644 > --- a/tools/bpf/bpftool/Documentation/bpftool.rst > +++ b/tools/bpf/bpftool/Documentation/bpftool.rst > @@ -50,7 +50,13 @@ OPTIONS > Print short help message (similar to **bpftool help**). > > -V, --version > - Print version number (similar to **bpftool version**). > + Print version number (similar to **bpftool version**), and > + optional features that were included when bpftool was > + compiled. Optional features include linking against libbfd to > + provide the disassembler for JIT-ted programs (**bpftool prog > + dump jited**) and usage of BPF skeletons (some features like > + **bpftool prog profile** or showing pids associated to BPF > + objects may rely on it). nit: I'd emit it as a list, easier to see list of features visually > > -j, --json > Generate JSON output. For commands that cannot produce JSON, this > diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c > index 4a191fcbeb82..2ae8c0d82030 100644 > --- a/tools/bpf/bpftool/main.c > +++ b/tools/bpf/bpftool/main.c > @@ -70,13 +70,35 @@ static int do_help(int argc, char **argv) > > static int do_version(int argc, char **argv) > { > +#ifdef HAVE_LIBBFD_SUPPORT > + const bool has_libbfd = true; > +#else > + const bool has_libbfd = false; > +#endif > +#ifdef BPFTOOL_WITHOUT_SKELETONS > + const bool has_skeletons = false; > +#else > + const bool has_skeletons = true; > +#endif > + > if (json_output) { > jsonw_start_object(json_wtr); > + > jsonw_name(json_wtr, "version"); > jsonw_printf(json_wtr, "\"%s\"", BPFTOOL_VERSION); > + > + jsonw_name(json_wtr, "features"); > + jsonw_start_array(json_wtr); > + jsonw_bool_field(json_wtr, "libbfd", has_libbfd); > + jsonw_bool_field(json_wtr, "skeletons", has_skeletons); > + jsonw_end_array(json_wtr); > + > jsonw_end_object(json_wtr); > } else { > printf("%s v%s\n", bin_name, BPFTOOL_VERSION); > + printf("features: libbfd=%s, skeletons=%s\n", > + has_libbfd ? "true" : "false", > + has_skeletons ? "true" : "false"); now imagine parsing this with CLI text tools, you'll have to find "skeletons=(false|true)" and then parse "true" to know skeletons are supported. Why not just print out features that are supported? > } > return 0; > } > -- > 2.25.1 >