b58ab8ac75
Even though unwinding depends on either HAVE_DWARF_SUPPORT or HAVE_LIBUNWIND, scripts testing unwinding can't just look for the existence of either of those flags. This is because NO_LIBDW_DWARF_UNWIND=1 can disable unwinding with libdw, but libdw will still be linked leaving HAVE_DWARF_SUPPORT turned on. Presumably because it is used for things other than unwinding, so I don't think this needs to be fixed. HAVE_DWARF_UNWIND_SUPPORT already takes the combination of all those things into account, and is used to gate the built in tests like "Test dwarf unwind", so add it to the feature list output so that it can be used by the script tests too. Signed-off-by: James Clark <james.clark@arm.com> Reviewed-by: Ian Rogers <irogers@google.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Spoorthy S <spoorts2@in.ibm.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Link: https://lore.kernel.org/r/20240123163903.350306-2-james.clark@arm.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
100 lines
2.5 KiB
C
100 lines
2.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include "builtin.h"
|
|
#include "color.h"
|
|
#include "util/debug.h"
|
|
#include "util/header.h"
|
|
#include <tools/config.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <subcmd/parse-options.h>
|
|
|
|
struct version {
|
|
bool build_options;
|
|
};
|
|
|
|
static struct version version;
|
|
|
|
static struct option version_options[] = {
|
|
OPT_BOOLEAN(0, "build-options", &version.build_options,
|
|
"display the build options"),
|
|
OPT_END(),
|
|
};
|
|
|
|
static const char * const version_usage[] = {
|
|
"perf version [<options>]",
|
|
NULL
|
|
};
|
|
|
|
static void on_off_print(const char *status)
|
|
{
|
|
printf("[ ");
|
|
|
|
if (!strcmp(status, "OFF"))
|
|
color_fprintf(stdout, PERF_COLOR_RED, "%-3s", status);
|
|
else
|
|
color_fprintf(stdout, PERF_COLOR_GREEN, "%-3s", status);
|
|
|
|
printf(" ]");
|
|
}
|
|
|
|
static void status_print(const char *name, const char *macro,
|
|
const char *status)
|
|
{
|
|
printf("%22s: ", name);
|
|
on_off_print(status);
|
|
printf(" # %s\n", macro);
|
|
}
|
|
|
|
#define STATUS(__d, __m) \
|
|
do { \
|
|
if (IS_BUILTIN(__d)) \
|
|
status_print(#__m, #__d, "on"); \
|
|
else \
|
|
status_print(#__m, #__d, "OFF"); \
|
|
} while (0)
|
|
|
|
static void library_status(void)
|
|
{
|
|
STATUS(HAVE_DWARF_SUPPORT, dwarf);
|
|
STATUS(HAVE_DWARF_GETLOCATIONS_SUPPORT, dwarf_getlocations);
|
|
#ifndef HAVE_SYSCALL_TABLE_SUPPORT
|
|
STATUS(HAVE_LIBAUDIT_SUPPORT, libaudit);
|
|
#endif
|
|
STATUS(HAVE_SYSCALL_TABLE_SUPPORT, syscall_table);
|
|
STATUS(HAVE_LIBBFD_SUPPORT, libbfd);
|
|
STATUS(HAVE_DEBUGINFOD_SUPPORT, debuginfod);
|
|
STATUS(HAVE_LIBELF_SUPPORT, libelf);
|
|
STATUS(HAVE_LIBNUMA_SUPPORT, libnuma);
|
|
STATUS(HAVE_LIBNUMA_SUPPORT, numa_num_possible_cpus);
|
|
STATUS(HAVE_LIBPERL_SUPPORT, libperl);
|
|
STATUS(HAVE_LIBPYTHON_SUPPORT, libpython);
|
|
STATUS(HAVE_SLANG_SUPPORT, libslang);
|
|
STATUS(HAVE_LIBCRYPTO_SUPPORT, libcrypto);
|
|
STATUS(HAVE_LIBUNWIND_SUPPORT, libunwind);
|
|
STATUS(HAVE_DWARF_SUPPORT, libdw-dwarf-unwind);
|
|
STATUS(HAVE_ZLIB_SUPPORT, zlib);
|
|
STATUS(HAVE_LZMA_SUPPORT, lzma);
|
|
STATUS(HAVE_AUXTRACE_SUPPORT, get_cpuid);
|
|
STATUS(HAVE_LIBBPF_SUPPORT, bpf);
|
|
STATUS(HAVE_AIO_SUPPORT, aio);
|
|
STATUS(HAVE_ZSTD_SUPPORT, zstd);
|
|
STATUS(HAVE_LIBPFM, libpfm4);
|
|
STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
|
|
STATUS(HAVE_BPF_SKEL, bpf_skeletons);
|
|
STATUS(HAVE_DWARF_UNWIND_SUPPORT, dwarf-unwind-support);
|
|
}
|
|
|
|
int cmd_version(int argc, const char **argv)
|
|
{
|
|
argc = parse_options(argc, argv, version_options, version_usage,
|
|
PARSE_OPT_STOP_AT_NON_OPTION);
|
|
|
|
printf("perf version %s\n", perf_version_string);
|
|
|
|
if (version.build_options || verbose > 0)
|
|
library_status();
|
|
|
|
return 0;
|
|
}
|