1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include "builtin.h" |
3 | #include "color.h" |
4 | #include "util/debug.h" |
5 | #include "util/header.h" |
6 | #include <tools/config.h> |
7 | #include <stdbool.h> |
8 | #include <stdio.h> |
9 | #include <string.h> |
10 | #include <subcmd/parse-options.h> |
11 | |
12 | struct version { |
13 | bool build_options; |
14 | }; |
15 | |
16 | static struct version version; |
17 | |
18 | static struct option version_options[] = { |
19 | OPT_BOOLEAN(0, "build-options" , &version.build_options, |
20 | "display the build options" ), |
21 | OPT_END(), |
22 | }; |
23 | |
24 | static const char * const version_usage[] = { |
25 | "perf version [<options>]" , |
26 | NULL |
27 | }; |
28 | |
29 | static void on_off_print(const char *status) |
30 | { |
31 | printf("[ " ); |
32 | |
33 | if (!strcmp(status, "OFF" )) |
34 | color_fprintf(stdout, PERF_COLOR_RED, "%-3s" , status); |
35 | else |
36 | color_fprintf(stdout, PERF_COLOR_GREEN, "%-3s" , status); |
37 | |
38 | printf(" ]" ); |
39 | } |
40 | |
41 | static void status_print(const char *name, const char *macro, |
42 | const char *status) |
43 | { |
44 | printf("%22s: " , name); |
45 | on_off_print(status); |
46 | printf(" # %s\n" , macro); |
47 | } |
48 | |
49 | #define STATUS(__d, __m) \ |
50 | do { \ |
51 | if (IS_BUILTIN(__d)) \ |
52 | status_print(#__m, #__d, "on"); \ |
53 | else \ |
54 | status_print(#__m, #__d, "OFF"); \ |
55 | } while (0) |
56 | |
57 | static void library_status(void) |
58 | { |
59 | STATUS(HAVE_DWARF_SUPPORT, dwarf); |
60 | STATUS(HAVE_DWARF_GETLOCATIONS_SUPPORT, dwarf_getlocations); |
61 | #ifndef HAVE_SYSCALL_TABLE_SUPPORT |
62 | STATUS(HAVE_LIBAUDIT_SUPPORT, libaudit); |
63 | #endif |
64 | STATUS(HAVE_SYSCALL_TABLE_SUPPORT, syscall_table); |
65 | STATUS(HAVE_LIBBFD_SUPPORT, libbfd); |
66 | STATUS(HAVE_DEBUGINFOD_SUPPORT, debuginfod); |
67 | STATUS(HAVE_LIBELF_SUPPORT, libelf); |
68 | STATUS(HAVE_LIBNUMA_SUPPORT, libnuma); |
69 | STATUS(HAVE_LIBNUMA_SUPPORT, numa_num_possible_cpus); |
70 | STATUS(HAVE_LIBPERL_SUPPORT, libperl); |
71 | STATUS(HAVE_LIBPYTHON_SUPPORT, libpython); |
72 | STATUS(HAVE_SLANG_SUPPORT, libslang); |
73 | STATUS(HAVE_LIBCRYPTO_SUPPORT, libcrypto); |
74 | STATUS(HAVE_LIBUNWIND_SUPPORT, libunwind); |
75 | STATUS(HAVE_DWARF_SUPPORT, libdw-dwarf-unwind); |
76 | STATUS(HAVE_ZLIB_SUPPORT, zlib); |
77 | STATUS(HAVE_LZMA_SUPPORT, lzma); |
78 | STATUS(HAVE_AUXTRACE_SUPPORT, get_cpuid); |
79 | STATUS(HAVE_LIBBPF_SUPPORT, bpf); |
80 | STATUS(HAVE_AIO_SUPPORT, aio); |
81 | STATUS(HAVE_ZSTD_SUPPORT, zstd); |
82 | STATUS(HAVE_LIBPFM, libpfm4); |
83 | STATUS(HAVE_LIBTRACEEVENT, libtraceevent); |
84 | STATUS(HAVE_BPF_SKEL, bpf_skeletons); |
85 | } |
86 | |
87 | int cmd_version(int argc, const char **argv) |
88 | { |
89 | argc = parse_options(argc, argv, version_options, version_usage, |
90 | PARSE_OPT_STOP_AT_NON_OPTION); |
91 | |
92 | printf("perf version %s\n" , perf_version_string); |
93 | |
94 | if (version.build_options || verbose > 0) |
95 | library_status(); |
96 | |
97 | return 0; |
98 | } |
99 | |