diff mbox series

[2/3] perf build: Use libtraceevent from the system

Message ID 20221205225940.3079667-3-irogers@google.com (mailing list archive)
State Handled Elsewhere
Delegated to: BPF
Headers show
Series libtraceevent from system and build fix | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch
bpf/vmtest-bpf-PR success PR summary
bpf/vmtest-bpf-VM_Test-1 success Logs for ShellCheck
bpf/vmtest-bpf-VM_Test-2 success Logs for build for aarch64 with gcc
bpf/vmtest-bpf-VM_Test-3 success Logs for build for aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-4 success Logs for build for s390x with gcc
bpf/vmtest-bpf-VM_Test-5 success Logs for build for x86_64 with gcc
bpf/vmtest-bpf-VM_Test-6 success Logs for build for x86_64 with llvm-16
bpf/vmtest-bpf-VM_Test-7 success Logs for llvm-toolchain
bpf/vmtest-bpf-VM_Test-8 success Logs for set-matrix
bpf/vmtest-bpf-VM_Test-9 success Logs for test_maps on aarch64 with gcc
bpf/vmtest-bpf-VM_Test-10 success Logs for test_maps on aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-11 success Logs for test_maps on s390x with gcc
bpf/vmtest-bpf-VM_Test-12 success Logs for test_maps on x86_64 with gcc
bpf/vmtest-bpf-VM_Test-13 success Logs for test_maps on x86_64 with llvm-16
bpf/vmtest-bpf-VM_Test-14 success Logs for test_progs on aarch64 with gcc
bpf/vmtest-bpf-VM_Test-15 success Logs for test_progs on aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-16 success Logs for test_progs on s390x with gcc
bpf/vmtest-bpf-VM_Test-17 fail Logs for test_progs on x86_64 with gcc
bpf/vmtest-bpf-VM_Test-18 success Logs for test_progs on x86_64 with llvm-16
bpf/vmtest-bpf-VM_Test-19 success Logs for test_progs_no_alu32 on aarch64 with gcc
bpf/vmtest-bpf-VM_Test-20 success Logs for test_progs_no_alu32 on aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-21 success Logs for test_progs_no_alu32 on s390x with gcc
bpf/vmtest-bpf-VM_Test-22 fail Logs for test_progs_no_alu32 on x86_64 with gcc
bpf/vmtest-bpf-VM_Test-23 success Logs for test_progs_no_alu32 on x86_64 with llvm-16
bpf/vmtest-bpf-VM_Test-24 success Logs for test_progs_no_alu32_parallel on aarch64 with gcc
bpf/vmtest-bpf-VM_Test-25 success Logs for test_progs_no_alu32_parallel on aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-26 success Logs for test_progs_no_alu32_parallel on s390x with gcc
bpf/vmtest-bpf-VM_Test-27 success Logs for test_progs_no_alu32_parallel on x86_64 with gcc
bpf/vmtest-bpf-VM_Test-28 success Logs for test_progs_no_alu32_parallel on x86_64 with llvm-16
bpf/vmtest-bpf-VM_Test-29 success Logs for test_progs_parallel on aarch64 with gcc
bpf/vmtest-bpf-VM_Test-30 success Logs for test_progs_parallel on aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-31 success Logs for test_progs_parallel on s390x with gcc
bpf/vmtest-bpf-VM_Test-32 success Logs for test_progs_parallel on x86_64 with gcc
bpf/vmtest-bpf-VM_Test-33 success Logs for test_progs_parallel on x86_64 with llvm-16
bpf/vmtest-bpf-VM_Test-34 success Logs for test_verifier on aarch64 with gcc
bpf/vmtest-bpf-VM_Test-35 success Logs for test_verifier on aarch64 with llvm-16
bpf/vmtest-bpf-VM_Test-36 success Logs for test_verifier on s390x with gcc
bpf/vmtest-bpf-VM_Test-37 success Logs for test_verifier on x86_64 with gcc
bpf/vmtest-bpf-VM_Test-38 success Logs for test_verifier on x86_64 with llvm-16

Commit Message

Ian Rogers Dec. 5, 2022, 10:59 p.m. UTC
Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
build, don't compile in libtraceevent and libtracefs support. This
also disables CONFIG_TRACE that controls "perf
trace". CONFIG_TRACEEVENT is used to control enablement in
Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
kmem, kwork, lock, sched and timechart are removed. The majority of
commands continue to work including "perf test".

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/Build                              | 11 ++-
 tools/perf/Makefile.config                    | 37 +++----
 tools/perf/Makefile.perf                      | 99 +------------------
 tools/perf/arch/x86/util/Build                |  2 +-
 tools/perf/arch/x86/util/intel-pt.c           |  4 +
 tools/perf/builtin-annotate.c                 |  2 +
 tools/perf/builtin-inject.c                   |  8 ++
 tools/perf/builtin-kmem.c                     |  1 +
 tools/perf/builtin-kvm.c                      | 12 +--
 tools/perf/builtin-kwork.c                    |  1 +
 tools/perf/builtin-record.c                   |  2 +
 tools/perf/builtin-report.c                   |  9 +-
 tools/perf/builtin-script.c                   | 19 +++-
 tools/perf/builtin-timechart.c                |  1 +
 tools/perf/builtin-trace.c                    |  5 +-
 tools/perf/builtin-version.c                  |  1 +
 tools/perf/perf.c                             | 24 +++--
 .../perf/scripts/python/Perf-Trace-Util/Build |  2 +-
 tools/perf/tests/Build                        | 12 +--
 tools/perf/tests/builtin-test.c               |  6 ++
 tools/perf/tests/parse-events.c               | 20 ++++
 tools/perf/util/Build                         | 10 +-
 tools/perf/util/data-convert-bt.c             |  5 +-
 tools/perf/util/data-convert-json.c           |  9 +-
 tools/perf/util/evlist.c                      |  6 +-
 tools/perf/util/evlist.h                      |  4 +
 tools/perf/util/evsel.c                       | 11 ++-
 tools/perf/util/evsel.h                       | 12 ++-
 tools/perf/util/evsel_fprintf.c               |  7 +-
 tools/perf/util/header.c                      | 19 ++++
 tools/perf/util/header.h                      |  2 +
 tools/perf/util/intel-pt.c                    |  7 +-
 tools/perf/util/parse-events.c                | 15 +++
 tools/perf/util/parse-events.h                |  1 -
 tools/perf/util/python.c                      |  4 +
 tools/perf/util/scripting-engines/Build       |  6 +-
 .../scripting-engines/trace-event-python.c    |  1 +
 tools/perf/util/session.c                     |  2 +
 tools/perf/util/session.h                     |  2 +
 tools/perf/util/sort.c                        | 60 +++++++++--
 tools/perf/util/synthetic-events.c            |  6 ++
 tools/perf/util/trace-event-parse.c           |  2 +
 tools/perf/util/trace-event-read.c            |  1 +
 tools/perf/util/trace-event-scripting.c       |  1 +
 tools/perf/util/trace-event.c                 |  1 -
 tools/perf/util/trace-event.h                 | 11 ++-
 46 files changed, 312 insertions(+), 171 deletions(-)

Comments

Arnaldo Carvalho de Melo Dec. 6, 2022, 4:15 p.m. UTC | #1
Em Mon, Dec 05, 2022 at 02:59:39PM -0800, Ian Rogers escreveu:
> Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> build, don't compile in libtraceevent and libtracefs support. This
> also disables CONFIG_TRACE that controls "perf
> trace". CONFIG_TRACEEVENT is used to control enablement in
> Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> kmem, kwork, lock, sched and timechart are removed. The majority of
> commands continue to work including "perf test".

Had just this .rej and I fixed it up manually, testing now:

[acme@quaco perf]$ cat tools/perf/util/Build.rej
--- tools/perf/util/Build
+++ tools/perf/util/Build
@@ -69,17 +69,17 @@ perf-y += namespaces.o
 perf-y += comm.o
 perf-y += thread.o
 perf-y += thread_map.o
-perf-y += trace-event-parse.o
 perf-y += parse-events-flex.o
 perf-y += parse-events-bison.o
 perf-y += pmu.o
 perf-y += pmu-flex.o
 perf-y += pmu-bison.o
 perf-y += pmu-hybrid.o
-perf-y += trace-event-read.o
-perf-y += trace-event-info.o
-perf-y += trace-event-scripting.o
-perf-y += trace-event.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
+perf-$(CONFIG_TRACEEVENT) += trace-event.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
 perf-y += svghelper.o
 perf-y += sort.o
 perf-y += hist.o
[acme@quaco perf]$ 

> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  tools/perf/Build                              | 11 ++-
>  tools/perf/Makefile.config                    | 37 +++----
>  tools/perf/Makefile.perf                      | 99 +------------------
>  tools/perf/arch/x86/util/Build                |  2 +-
>  tools/perf/arch/x86/util/intel-pt.c           |  4 +
>  tools/perf/builtin-annotate.c                 |  2 +
>  tools/perf/builtin-inject.c                   |  8 ++
>  tools/perf/builtin-kmem.c                     |  1 +
>  tools/perf/builtin-kvm.c                      | 12 +--
>  tools/perf/builtin-kwork.c                    |  1 +
>  tools/perf/builtin-record.c                   |  2 +
>  tools/perf/builtin-report.c                   |  9 +-
>  tools/perf/builtin-script.c                   | 19 +++-
>  tools/perf/builtin-timechart.c                |  1 +
>  tools/perf/builtin-trace.c                    |  5 +-
>  tools/perf/builtin-version.c                  |  1 +
>  tools/perf/perf.c                             | 24 +++--
>  .../perf/scripts/python/Perf-Trace-Util/Build |  2 +-
>  tools/perf/tests/Build                        | 12 +--
>  tools/perf/tests/builtin-test.c               |  6 ++
>  tools/perf/tests/parse-events.c               | 20 ++++
>  tools/perf/util/Build                         | 10 +-
>  tools/perf/util/data-convert-bt.c             |  5 +-
>  tools/perf/util/data-convert-json.c           |  9 +-
>  tools/perf/util/evlist.c                      |  6 +-
>  tools/perf/util/evlist.h                      |  4 +
>  tools/perf/util/evsel.c                       | 11 ++-
>  tools/perf/util/evsel.h                       | 12 ++-
>  tools/perf/util/evsel_fprintf.c               |  7 +-
>  tools/perf/util/header.c                      | 19 ++++
>  tools/perf/util/header.h                      |  2 +
>  tools/perf/util/intel-pt.c                    |  7 +-
>  tools/perf/util/parse-events.c                | 15 +++
>  tools/perf/util/parse-events.h                |  1 -
>  tools/perf/util/python.c                      |  4 +
>  tools/perf/util/scripting-engines/Build       |  6 +-
>  .../scripting-engines/trace-event-python.c    |  1 +
>  tools/perf/util/session.c                     |  2 +
>  tools/perf/util/session.h                     |  2 +
>  tools/perf/util/sort.c                        | 60 +++++++++--
>  tools/perf/util/synthetic-events.c            |  6 ++
>  tools/perf/util/trace-event-parse.c           |  2 +
>  tools/perf/util/trace-event-read.c            |  1 +
>  tools/perf/util/trace-event-scripting.c       |  1 +
>  tools/perf/util/trace-event.c                 |  1 -
>  tools/perf/util/trace-event.h                 | 11 ++-
>  46 files changed, 312 insertions(+), 171 deletions(-)
> 
> diff --git a/tools/perf/Build b/tools/perf/Build
> index 496b096153bb..edafe3cb3d07 100644
> --- a/tools/perf/Build
> +++ b/tools/perf/Build
> @@ -5,7 +5,6 @@ perf-y += builtin-diff.o
>  perf-y += builtin-evlist.o
>  perf-y += builtin-ftrace.o
>  perf-y += builtin-help.o
> -perf-y += builtin-sched.o
>  perf-y += builtin-buildid-list.o
>  perf-y += builtin-buildid-cache.o
>  perf-y += builtin-kallsyms.o
> @@ -13,11 +12,8 @@ perf-y += builtin-list.o
>  perf-y += builtin-record.o
>  perf-y += builtin-report.o
>  perf-y += builtin-stat.o
> -perf-y += builtin-timechart.o
>  perf-y += builtin-top.o
>  perf-y += builtin-script.o
> -perf-y += builtin-kmem.o
> -perf-y += builtin-lock.o
>  perf-y += builtin-kvm.o
>  perf-y += builtin-inject.o
>  perf-y += builtin-mem.o
> @@ -25,7 +21,12 @@ perf-y += builtin-data.o
>  perf-y += builtin-version.o
>  perf-y += builtin-c2c.o
>  perf-y += builtin-daemon.o
> -perf-y += builtin-kwork.o
> +
> +perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o
>  
>  perf-$(CONFIG_TRACE) += builtin-trace.o
>  perf-$(CONFIG_LIBELF) += builtin-probe.o
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 9cc3c48f3288..b34288cb1900 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
>    EXTLIBS += $(EXTLIBS_LIBUNWIND)
>  endif
>  
> -ifeq ($(NO_SYSCALL_TABLE),0)
> -  $(call detected,CONFIG_TRACE)
> -else
> -  ifndef NO_LIBAUDIT
> -    $(call feature_check,libaudit)
> -    ifneq ($(feature-libaudit), 1)
> -      msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> -      NO_LIBAUDIT := 1
> -    else
> -      CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> -      EXTLIBS += -laudit
> -      $(call detected,CONFIG_TRACE)
> +ifneq ($(NO_LIBTRACEEVENT),1)
> +  ifeq ($(NO_SYSCALL_TABLE),0)
> +    $(call detected,CONFIG_TRACE)
> +  else
> +    ifndef NO_LIBAUDIT
> +      $(call feature_check,libaudit)
> +      ifneq ($(feature-libaudit), 1)
> +        msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> +        NO_LIBAUDIT := 1
> +      else
> +        CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> +        EXTLIBS += -laudit
> +        $(call detected,CONFIG_TRACE)
> +      endif
>      endif
>    endif
>  endif
> @@ -1182,9 +1184,11 @@ ifdef LIBPFM4
>    endif
>  endif
>  
> -ifdef LIBTRACEEVENT_DYNAMIC
> +# libtraceevent is a recommended dependency picked up from the system.
> +ifneq ($(NO_LIBTRACEEVENT),1)
>    $(call feature_check,libtraceevent)
>    ifeq ($(feature-libtraceevent), 1)
> +    CFLAGS += -DHAVE_LIBTRACEEVENT
>      EXTLIBS += -ltraceevent
>      LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
>      LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> @@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
>      LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
>      LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
>      CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
> +    $(call detected,CONFIG_TRACEEVENT)
>    else
> -    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
> +    dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
>    endif
> -endif
>  
> -ifdef LIBTRACEFS_DYNAMIC
>    $(call feature_check,libtracefs)
>    ifeq ($(feature-libtracefs), 1)
>      EXTLIBS += -ltracefs
> @@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
>      LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
>      LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
>      CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
> -  else
> -    dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
>    endif
>  endif
>  
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index 6689f644782f..f0e4daeef812 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -128,10 +128,6 @@ include ../scripts/utilities.mak
>  #
>  # Define BUILD_BPF_SKEL to enable BPF skeletons
>  #
> -# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
> -#
> -# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
> -#
>  
>  # As per kernel Makefile, avoid funny character set dependencies
>  unexport LC_ALL
> @@ -242,10 +238,6 @@ sub-make: fixdep
>  else # force_fixdep
>  
>  LIBAPI_DIR      = $(srctree)/tools/lib/api/
> -ifndef LIBTRACEEVENT_DYNAMIC
> -LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
> -LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
> -endif
>  LIBBPF_DIR      = $(srctree)/tools/lib/bpf/
>  LIBSUBCMD_DIR   = $(srctree)/tools/lib/subcmd/
>  LIBSYMBOL_DIR   = $(srctree)/tools/lib/symbol/
> @@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
>  grep-libs = $(filter -l%,$(1))
>  strip-libs = $(filter-out -l%,$(1))
>  
> -ifndef LIBTRACEEVENT_DYNAMIC
> -ifneq ($(OUTPUT),)
> -  LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
> -else
> -  LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
> -endif
> -LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
> -LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
> -LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
> -LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
> -export LIBTRACEEVENT
> -LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
> -CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
> -#
> -# The static build has no dynsym table, so this does not work for
> -# static build. Looks like linker starts to scream about that now
> -# (in Fedora 26) so we need to switch it off for static build.
> -DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
> -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
> -else
> -LIBTRACEEVENT_DYNAMIC_LIST =
> -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
> -endif
> -
>  ifneq ($(OUTPUT),)
>    LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
>  else
> @@ -381,11 +348,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
>  python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
>  
>  PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> -ifndef LIBTRACEEVENT_DYNAMIC
> -PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
> -else
>  PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> -endif
>  
>  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
>  
> @@ -430,9 +393,6 @@ ifndef NO_LIBBPF
>      PERFLIBS += $(LIBBPF)
>    endif
>  endif
> -ifndef LIBTRACEEVENT_DYNAMIC
> -  PERFLIBS += $(LIBTRACEEVENT)
> -endif
>  
>  # We choose to avoid "if .. else if .. else .. endif endif"
>  # because maintaining the nesting to match is a pain.  If
> @@ -682,9 +642,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
>  # Create python binding output directory if not already present
>  _dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
>  
> -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
> +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
>  	$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
> -        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
> +        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
>  	  $(PYTHON_WORD) util/setup.py \
>  	  --quiet build_ext; \
>  	cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
> @@ -710,8 +670,8 @@ $(PERF_IN): prepare FORCE
>  $(PMU_EVENTS_IN): FORCE prepare
>  	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
>  
> -$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
> -	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
> +$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
> +	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
>  		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
>  
>  $(GTK_IN): FORCE prepare
> @@ -797,10 +757,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
>  	$(LIBSYMBOL) \
>  	bpf-skel
>  
> -ifndef LIBTRACEEVENT_DYNAMIC
> -prepare: $(LIBTRACEEVENT)
> -endif
> -
>  $(OUTPUT)%.o: %.c prepare FORCE
>  	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
>  
> @@ -856,38 +812,6 @@ endif
>  
>  $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
>  
> -ifndef LIBTRACEEVENT_DYNAMIC
> -LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
> -
> -$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
> -		$@ install_headers
> -
> -$(LIBTRACEEVENT)-clean:
> -	$(call QUIET_CLEAN, libtraceevent)
> -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
> -
> -libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> -		plugins
> -
> -libtraceevent_plugins-clean:
> -	$(call QUIET_CLEAN, libtraceevent_plugins)
> -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -
> -$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> -		$(LIBTRACEEVENT_FLAGS) $@
> -
> -install-traceevent-plugins: libtraceevent_plugins
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
> -		$(LIBTRACEEVENT_FLAGS) install
> -endif
> -
>  $(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
>  	$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
>  		DESTDIR=$(LIBAPI_DESTDIR) prefix= \
> @@ -1095,10 +1019,6 @@ install-tests: all install-gtk
>  
>  install-bin: install-tools install-tests
>  
> -ifndef LIBTRACEEVENT_DYNAMIC
> -install-bin: install-traceevent-plugins
> -endif
> -
>  install: install-bin try-install-man
>  
>  install-python_ext:
> @@ -1124,11 +1044,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
>  $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
>  	$(Q)$(MKDIR) -p $@
>  
> -ifndef LIBTRACEEVENT_DYNAMIC
> -$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
> -	$(Q)$(MKDIR) -p $@
> -endif
> -
>  ifdef BUILD_BPF_SKEL
>  BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
>  BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
> @@ -1211,10 +1126,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
>  	$(call QUIET_CLEAN, Documentation) \
>  	$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
>  
> -ifndef LIBTRACEEVENT_DYNAMIC
> -clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
> -endif
> -
>  #
>  # To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
>  # file if defined, with no further action.
> @@ -1232,6 +1143,6 @@ FORCE:
>  .PHONY: all install clean config-clean strip install-gtk
>  .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
>  .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
> -.PHONY: libtraceevent_plugins archheaders
> +.PHONY: archheaders
>  
>  endif # force_fixdep
> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> index dbeb04cb336e..a92644f12eec 100644
> --- a/tools/perf/arch/x86/util/Build
> +++ b/tools/perf/arch/x86/util/Build
> @@ -1,7 +1,7 @@
>  perf-y += header.o
>  perf-y += tsc.o
>  perf-y += pmu.o
> -perf-y += kvm-stat.o
> +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>  perf-y += perf_regs.o
>  perf-y += topdown.o
>  perf-y += machine.o
> diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
> index af102f471e9f..1e39a034cee9 100644
> --- a/tools/perf/arch/x86/util/intel-pt.c
> +++ b/tools/perf/arch/x86/util/intel-pt.c
> @@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
>  	return 0;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int intel_pt_track_switches(struct evlist *evlist)
>  {
>  	const char *sched_switch = "sched:sched_switch";
> @@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)
>  
>  	return 0;
>  }
> +#endif
>  
>  static void intel_pt_valid_str(char *str, size_t len, u64 valid)
>  {
> @@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
>  					ptr->have_sched_switch = 2;
>  			}
>  		} else {
> +#ifdef HAVE_LIBTRACEEVENT
>  			err = intel_pt_track_switches(evlist);
>  			if (err == -EPERM)
>  				pr_debug2("Unable to select sched:sched_switch\n");
> @@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
>  				return err;
>  			else
>  				ptr->have_sched_switch = 1;
> +#endif
>  		}
>  	}
>  
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 517d928c00e3..90458ca6933f 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
>  			.namespaces = perf_event__process_namespaces,
>  			.attr	= perf_event__process_attr,
>  			.build_id = perf_event__process_build_id,
> +#ifdef HAVE_LIBTRACEEVENT
>  			.tracing_data   = perf_event__process_tracing_data,
> +#endif
>  			.id_index	= perf_event__process_id_index,
>  			.auxtrace_info	= perf_event__process_auxtrace_info,
>  			.auxtrace	= perf_event__process_auxtrace,
> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> index e254f18986f7..3f4e4dd5abf3 100644
> --- a/tools/perf/builtin-inject.c
> +++ b/tools/perf/builtin-inject.c
> @@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
>  	return err;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int perf_event__repipe_tracing_data(struct perf_session *session,
>  					   union perf_event *event)
>  {
> @@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
>  
>  	return perf_event__process_tracing_data(session, event);
>  }
> +#endif
>  
>  static int dso__read_build_id(struct dso *dso)
>  {
> @@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
>  	return 0;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int perf_inject__sched_stat(struct perf_tool *tool,
>  				   union perf_event *event __maybe_unused,
>  				   struct perf_sample *sample,
> @@ -836,6 +839,7 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
>  	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
>  	return perf_event__repipe(tool, event_sw, &sample_sw, machine);
>  }
> +#endif
>  
>  static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
>  {
> @@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
>  		inject->tool.mmap	  = perf_event__repipe_mmap;
>  		inject->tool.mmap2	  = perf_event__repipe_mmap2;
>  		inject->tool.fork	  = perf_event__repipe_fork;
> +#ifdef HAVE_LIBTRACEEVENT
>  		inject->tool.tracing_data = perf_event__repipe_tracing_data;
> +#endif
>  	}
>  
>  	output_data_offset = perf_session__data_offset(session->evlist);
> @@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
>  				evsel->handler = perf_inject__sched_switch;
>  			} else if (!strcmp(name, "sched:sched_process_exit"))
>  				evsel->handler = perf_inject__sched_process_exit;
> +#ifdef HAVE_LIBTRACEEVENT
>  			else if (!strncmp(name, "sched:sched_stat_", 17))
>  				evsel->handler = perf_inject__sched_stat;
> +#endif
>  		}
>  	} else if (inject->itrace_synth_opts.vm_time_correlation) {
>  		session->itrace_synth_opts = &inject->itrace_synth_opts;
> diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> index ebfab2ca1702..e20656c431a4 100644
> --- a/tools/perf/builtin-kmem.c
> +++ b/tools/perf/builtin-kmem.c
> @@ -35,6 +35,7 @@
>  #include <regex.h>
>  
>  #include <linux/ctype.h>
> +#include <traceevent/event-parse.h>
>  
>  static int	kmem_slab;
>  static int	kmem_page;
> diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
> index 7d9ec1bac1a2..641e739c717c 100644
> --- a/tools/perf/builtin-kvm.c
> +++ b/tools/perf/builtin-kvm.c
> @@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
>  	return filename;
>  }
>  
> -#ifdef HAVE_KVM_STAT_SUPPORT
> +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
>  
>  void exit_event_get_key(struct evsel *evsel,
>  			struct perf_sample *sample,
> @@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
>  		pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
>  }
>  
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
>  static int process_lost_event(struct perf_tool *tool,
>  			      union perf_event *event __maybe_unused,
>  			      struct perf_sample *sample __maybe_unused,
> @@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
>  	return true;
>  }
>  
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
>  /* keeping the max events to a modest level to keep
>   * the processing of samples per mmap smooth.
>   */
> @@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
>  	return kvm_events_report_vcpu(kvm);
>  }
>  
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
>  static struct evlist *kvm_live_event_list(void)
>  {
>  	struct evlist *evlist;
> @@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
>  	if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
>  		return kvm_events_report(&kvm, argc - 1 , argv + 1);
>  
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
>  	if (!strncmp(argv[1], "live", 4))
>  		return kvm_events_live(&kvm, argc - 1 , argv + 1);
>  #endif
> @@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
>  		return cmd_top(argc, argv);
>  	else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
>  		return __cmd_buildid_list(file_name, argc, argv);
> -#ifdef HAVE_KVM_STAT_SUPPORT
> +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
>  	else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
>  		return kvm_cmd_stat(file_name, argc, argv);
>  #endif
> diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> index 0e02b8098644..dc59d75180d1 100644
> --- a/tools/perf/builtin-kwork.c
> +++ b/tools/perf/builtin-kwork.c
> @@ -23,6 +23,7 @@
>  
>  #include <subcmd/pager.h>
>  #include <subcmd/parse-options.h>
> +#include <traceevent/event-parse.h>
>  
>  #include <errno.h>
>  #include <inttypes.h>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index b7fd7ec586fb..7e17374f6c1a 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
>  	if (rec->no_buildid)
>  		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (!have_tracepoints(&rec->evlist->core.entries))
>  		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
> +#endif
>  
>  	if (!rec->opts.branch_stack)
>  		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index b6d77d3da64f..2ee2ecca208e 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -67,6 +67,10 @@
>  #include <unistd.h>
>  #include <linux/mman.h>
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  struct report {
>  	struct perf_tool	tool;
>  	struct perf_session	*session;
> @@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
>  			.lost		 = perf_event__process_lost,
>  			.read		 = process_read_event,
>  			.attr		 = process_attr,
> +#ifdef HAVE_LIBTRACEEVENT
>  			.tracing_data	 = perf_event__process_tracing_data,
> +#endif
>  			.build_id	 = perf_event__process_build_id,
>  			.id_index	 = perf_event__process_id_index,
>  			.auxtrace_info	 = perf_event__process_auxtrace_info,
> @@ -1660,6 +1666,7 @@ int cmd_report(int argc, const char **argv)
>  						  report.range_num);
>  	}
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (session->tevent.pevent &&
>  	    tep_set_function_resolver(session->tevent.pevent,
>  				      machine__resolve_kernel_addr,
> @@ -1668,7 +1675,7 @@ int cmd_report(int argc, const char **argv)
>  		       __func__);
>  		return -1;
>  	}
> -
> +#endif
>  	sort__setup_elide(stdout);
>  
>  	ret = __cmd_report(&report);
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index d7ec8c1af293..88888fb885c8 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -62,6 +62,9 @@
>  #include "perf.h"
>  
>  #include <linux/ctype.h>
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
>  
>  static char const		*script_name;
>  static char const		*generate_script_lang;
> @@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
>  		perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
>  		return;
>  	}
> -
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (PRINT_FIELD(TRACE) && sample->raw_data) {
>  		event_format__fprintf(evsel->tp_format, sample->cpu,
>  				      sample->raw_data, sample->raw_size, fp);
>  	}
> -
> +#endif
>  	if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
>  		perf_sample__fprintf_synth(sample, evsel, fp);
>  
> @@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)
>  
>  static void setup_scripting(void)
>  {
> +#ifdef HAVE_LIBTRACEEVENT
>  	setup_perl_scripting();
>  	setup_python_scripting();
> +#endif
>  }
>  
>  static int flush_scripting(void)
> @@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
>  			.fork		 = perf_event__process_fork,
>  			.attr		 = process_attr,
>  			.event_update   = perf_event__process_event_update,
> +#ifdef HAVE_LIBTRACEEVENT
>  			.tracing_data	 = perf_event__process_tracing_data,
> +#endif
>  			.feature	 = process_feature_event,
>  			.build_id	 = perf_event__process_build_id,
>  			.id_index	 = perf_event__process_id_index,
> @@ -4215,6 +4222,7 @@ int cmd_script(int argc, const char **argv)
>  	else
>  		symbol_conf.use_callchain = false;
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (session->tevent.pevent &&
>  	    tep_set_function_resolver(session->tevent.pevent,
>  				      machine__resolve_kernel_addr,
> @@ -4223,7 +4231,7 @@ int cmd_script(int argc, const char **argv)
>  		err = -1;
>  		goto out_delete;
>  	}
> -
> +#endif
>  	if (generate_script_lang) {
>  		struct stat perf_stat;
>  		int input;
> @@ -4259,9 +4267,12 @@ int cmd_script(int argc, const char **argv)
>  			err = -ENOENT;
>  			goto out_delete;
>  		}
> -
> +#ifdef HAVE_LIBTRACEEVENT
>  		err = scripting_ops->generate_script(session->tevent.pevent,
>  						     "perf-script");
> +#else
> +		err = scripting_ops->generate_script(NULL, "perf-script");
> +#endif
>  		goto out_delete;
>  	}
>  
> diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
> index c36296bb7637..6c629e7d370a 100644
> --- a/tools/perf/builtin-timechart.c
> +++ b/tools/perf/builtin-timechart.c
> @@ -38,6 +38,7 @@
>  #include "util/string2.h"
>  #include "util/tracepoint.h"
>  #include <linux/err.h>
> +#include <traceevent/event-parse.h>
>  
>  #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
>  FILE *open_memstream(char **ptr, size_t *sizeloc);
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 543c379d2a57..6909cd9f48d1 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -15,7 +15,6 @@
>   */
>  
>  #include "util/record.h"
> -#include <traceevent/event-parse.h>
>  #include <api/fs/tracing_path.h>
>  #include <bpf/bpf.h>
>  #include "util/bpf_map.h"
> @@ -80,6 +79,10 @@
>  #include <linux/ctype.h>
>  #include <perf/mmap.h>
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  #ifndef O_CLOEXEC
>  # define O_CLOEXEC		02000000
>  #endif
> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> index a71f491224da..a886929ec6e5 100644
> --- a/tools/perf/builtin-version.c
> +++ b/tools/perf/builtin-version.c
> @@ -82,6 +82,7 @@ static void library_status(void)
>  	STATUS(HAVE_AIO_SUPPORT, aio);
>  	STATUS(HAVE_ZSTD_SUPPORT, zstd);
>  	STATUS(HAVE_LIBPFM, libpfm4);
> +	STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
>  }
>  
>  int cmd_version(int argc, const char **argv)
> diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> index 7af135dea1cd..82bbe0ca858b 100644
> --- a/tools/perf/perf.c
> +++ b/tools/perf/perf.c
> @@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
>  	{ "report",	cmd_report,	0 },
>  	{ "bench",	cmd_bench,	0 },
>  	{ "stat",	cmd_stat,	0 },
> +#ifdef HAVE_LIBTRACEEVENT
>  	{ "timechart",	cmd_timechart,	0 },
> +#endif
>  	{ "top",	cmd_top,	0 },
>  	{ "annotate",	cmd_annotate,	0 },
>  	{ "version",	cmd_version,	0 },
>  	{ "script",	cmd_script,	0 },
> +#ifdef HAVE_LIBTRACEEVENT
>  	{ "sched",	cmd_sched,	0 },
> +#endif
>  #ifdef HAVE_LIBELF_SUPPORT
>  	{ "probe",	cmd_probe,	0 },
>  #endif
> +#ifdef HAVE_LIBTRACEEVENT
>  	{ "kmem",	cmd_kmem,	0 },
>  	{ "lock",	cmd_lock,	0 },
> +#endif
>  	{ "kvm",	cmd_kvm,	0 },
>  	{ "test",	cmd_test,	0 },
> -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> +#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
>  	{ "trace",	cmd_trace,	0 },
>  #endif
>  	{ "inject",	cmd_inject,	0 },
> @@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
>  	{ "data",	cmd_data,	0 },
>  	{ "ftrace",	cmd_ftrace,	0 },
>  	{ "daemon",	cmd_daemon,	0 },
> +#ifdef HAVE_LIBTRACEEVENT
>  	{ "kwork",	cmd_kwork,	0 },
> +#endif
>  };
>  
>  struct pager_config {
> @@ -500,14 +508,18 @@ int main(int argc, const char **argv)
>  		argv[0] = cmd;
>  	}
>  	if (strstarts(cmd, "trace")) {
> -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> -		setup_path();
> -		argv[0] = "trace";
> -		return cmd_trace(argc, argv);
> -#else
> +#ifndef HAVE_LIBTRACEEVENT
> +		fprintf(stderr,
> +			"trace command not available: missing libtraceevent devel package at build time.\n");
> +		goto out;
> +#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
>  		fprintf(stderr,
>  			"trace command not available: missing audit-libs devel package at build time.\n");
>  		goto out;
> +#else
> +		setup_path();
> +		argv[0] = "trace";
> +		return cmd_trace(argc, argv);
>  #endif
>  	}
>  	/* Look for flags.. */
> diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
> index 7d0e33ce6aba..f65625a60704 100644
> --- a/tools/perf/scripts/python/Perf-Trace-Util/Build
> +++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
> @@ -1,3 +1,3 @@
> -perf-y += Context.o
> +perf-$(CONFIG_TRACEEVENT) += Context.o
>  
>  CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
> diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> index 11b69023011b..34ebc009e05a 100644
> --- a/tools/perf/tests/Build
> +++ b/tools/perf/tests/Build
> @@ -6,13 +6,13 @@ perf-y += parse-events.o
>  perf-y += dso-data.o
>  perf-y += attr.o
>  perf-y += vmlinux-kallsyms.o
> -perf-y += openat-syscall.o
> -perf-y += openat-syscall-all-cpus.o
> -perf-y += openat-syscall-tp-fields.o
> -perf-y += mmap-basic.o
> +perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
> +perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
> +perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
> +perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
>  perf-y += perf-record.o
>  perf-y += evsel-roundtrip-name.o
> -perf-y += evsel-tp-sched.o
> +perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
>  perf-y += fdarray.o
>  perf-y += pmu.o
>  perf-y += pmu-events.o
> @@ -30,7 +30,7 @@ perf-y += task-exit.o
>  perf-y += sw-clock.o
>  perf-y += mmap-thread-lookup.o
>  perf-y += thread-maps-share.o
> -perf-y += switch-tracking.o
> +perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
>  perf-y += keep-tracking.o
>  perf-y += code-reading.o
>  perf-y += sample-parsing.o
> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index 4c6ae59a4dfd..658449204ce5 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
> @@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {
>  
>  static struct test_suite *generic_tests[] = {
>  	&suite__vmlinux_matches_kallsyms,
> +#ifdef HAVE_LIBTRACEEVENT
>  	&suite__openat_syscall_event,
>  	&suite__openat_syscall_event_on_all_cpus,
>  	&suite__basic_mmap,
> +#endif
>  	&suite__mem,
>  	&suite__parse_events,
>  	&suite__expr,
> @@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
>  	&suite__dso_data_cache,
>  	&suite__dso_data_reopen,
>  	&suite__perf_evsel__roundtrip_name_test,
> +#ifdef HAVE_LIBTRACEEVENT
>  	&suite__perf_evsel__tp_sched_test,
>  	&suite__syscall_openat_tp_fields,
> +#endif
>  	&suite__attr,
>  	&suite__hists_link,
>  	&suite__python_use,
> @@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
>  	&suite__thread_maps_share,
>  	&suite__hists_output,
>  	&suite__hists_cumulate,
> +#ifdef HAVE_LIBTRACEEVENT
>  	&suite__switch_tracking,
> +#endif
>  	&suite__fdarray__filter,
>  	&suite__fdarray__add,
>  	&suite__kmod_path__parse,
> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> index 3440dd2616b0..dcbfb93287e8 100644
> --- a/tools/perf/tests/parse-events.c
> +++ b/tools/perf/tests/parse-events.c
> @@ -46,6 +46,7 @@ static bool kvm_s390_create_vm_valid(void)
>  }
>  #endif
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int test__checkevent_tracepoint(struct evlist *evlist)
>  {
>  	struct evsel *evsel = evlist__first(evlist);
> @@ -76,6 +77,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
>  	}
>  	return TEST_OK;
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  static int test__checkevent_raw(struct evlist *evlist)
>  {
> @@ -222,6 +224,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
>  	return TEST_OK;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
>  {
>  	struct evsel *evsel = evlist__first(evlist);
> @@ -252,6 +255,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
>  
>  	return test__checkevent_tracepoint_multi(evlist);
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  static int test__checkevent_raw_modifier(struct evlist *evlist)
>  {
> @@ -453,6 +457,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
>  	return TEST_OK;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int test__checkevent_list(struct evlist *evlist)
>  {
>  	struct evsel *evsel = evlist__first(evlist);
> @@ -491,6 +496,7 @@ static int test__checkevent_list(struct evlist *evlist)
>  
>  	return TEST_OK;
>  }
> +#endif
>  
>  static int test__checkevent_pmu_name(struct evlist *evlist)
>  {
> @@ -762,6 +768,7 @@ static int test__group2(struct evlist *evlist)
>  	return TEST_OK;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int test__group3(struct evlist *evlist __maybe_unused)
>  {
>  	struct evsel *evsel, *leader;
> @@ -853,6 +860,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>  
>  	return TEST_OK;
>  }
> +#endif
>  
>  static int test__group4(struct evlist *evlist __maybe_unused)
>  {
> @@ -1460,6 +1468,7 @@ static int test__sym_event_dc(struct evlist *evlist)
>  	return TEST_OK;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int count_tracepoints(void)
>  {
>  	struct dirent *events_ent;
> @@ -1513,6 +1522,7 @@ static int test__all_tracepoints(struct evlist *evlist)
>  
>  	return test__checkevent_tracepoint_multi(evlist);
>  }
> +#endif /* HAVE_LIBTRACEVENT */
>  
>  static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
>  {
> @@ -1642,6 +1652,7 @@ struct evlist_test {
>  };
>  
>  static const struct evlist_test test__events[] = {
> +#ifdef HAVE_LIBTRACEEVENT
>  	{
>  		.name  = "syscalls:sys_enter_openat",
>  		.check = test__checkevent_tracepoint,
> @@ -1652,6 +1663,7 @@ static const struct evlist_test test__events[] = {
>  		.check = test__checkevent_tracepoint_multi,
>  		/* 1 */
>  	},
> +#endif
>  	{
>  		.name  = "r1a",
>  		.check = test__checkevent_raw,
> @@ -1702,6 +1714,7 @@ static const struct evlist_test test__events[] = {
>  		.check = test__checkevent_breakpoint_w,
>  		/* 1 */
>  	},
> +#ifdef HAVE_LIBTRACEEVENT
>  	{
>  		.name  = "syscalls:sys_enter_openat:k",
>  		.check = test__checkevent_tracepoint_modifier,
> @@ -1712,6 +1725,7 @@ static const struct evlist_test test__events[] = {
>  		.check = test__checkevent_tracepoint_multi_modifier,
>  		/* 3 */
>  	},
> +#endif
>  	{
>  		.name  = "r1a:kp",
>  		.check = test__checkevent_raw_modifier,
> @@ -1757,11 +1771,13 @@ static const struct evlist_test test__events[] = {
>  		.check = test__checkevent_breakpoint_w_modifier,
>  		/* 2 */
>  	},
> +#ifdef HAVE_LIBTRACEEVENT
>  	{
>  		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
>  		.check = test__checkevent_list,
>  		/* 3 */
>  	},
> +#endif
>  	{
>  		.name  = "instructions:G",
>  		.check = test__checkevent_exclude_host_modifier,
> @@ -1792,11 +1808,13 @@ static const struct evlist_test test__events[] = {
>  		.check = test__group2,
>  		/* 9 */
>  	},
> +#ifdef HAVE_LIBTRACEEVENT
>  	{
>  		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
>  		.check = test__group3,
>  		/* 0 */
>  	},
> +#endif
>  	{
>  		.name  = "{cycles:u,instructions:kp}:p",
>  		.check = test__group4,
> @@ -1807,11 +1825,13 @@ static const struct evlist_test test__events[] = {
>  		.check = test__group5,
>  		/* 2 */
>  	},
> +#ifdef HAVE_LIBTRACEEVENT
>  	{
>  		.name  = "*:*",
>  		.check = test__all_tracepoints,
>  		/* 3 */
>  	},
> +#endif
>  	{
>  		.name  = "{cycles,cache-misses:G}:H",
>  		.check = test__group_gh1,
> diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> index ab37f588ee8b..612406311e27 100644
> --- a/tools/perf/util/Build
> +++ b/tools/perf/util/Build
> @@ -69,17 +69,17 @@ perf-y += namespaces.o
>  perf-y += comm.o
>  perf-y += thread.o
>  perf-y += thread_map.o
> -perf-y += trace-event-parse.o
>  perf-y += parse-events-flex.o
>  perf-y += parse-events-bison.o
>  perf-y += pmu.o
>  perf-y += pmu-flex.o
>  perf-y += pmu-bison.o
>  perf-y += pmu-hybrid.o
> -perf-y += trace-event-read.o
> -perf-y += trace-event-info.o
> -perf-y += trace-event-scripting.o
> -perf-y += trace-event.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
>  perf-y += svghelper.o
>  perf-y += sort.o
>  perf-y += hist.o
> diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> index c65cdaf6975e..8031b586e813 100644
> --- a/tools/perf/util/data-convert-bt.c
> +++ b/tools/perf/util/data-convert-bt.c
> @@ -19,7 +19,6 @@
>  #include <babeltrace/ctf-writer/event-fields.h>
>  #include <babeltrace/ctf-ir/utils.h>
>  #include <babeltrace/ctf/events.h>
> -#include <traceevent/event-parse.h>
>  #include "asm/bug.h"
>  #include "data-convert.h"
>  #include "session.h"
> @@ -36,6 +35,10 @@
>  #include "clockid.h"
>  #include "util/sample.h"
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  #define pr_N(n, fmt, ...) \
>  	eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
>  
> diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
> index 57db59068cb6..ba9d93ce9463 100644
> --- a/tools/perf/util/data-convert-json.c
> +++ b/tools/perf/util/data-convert-json.c
> @@ -27,6 +27,10 @@
>  #include "util/thread.h"
>  #include "util/tool.h"
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  struct convert_json {
>  	struct perf_tool tool;
>  	FILE *out;
> @@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
>  	}
>  	output_json_format(out, false, 3, "]");
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (sample->raw_data) {
>  		int i;
>  		struct tep_format_field **fields;
> @@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
>  			free(fields);
>  		}
>  	}
> -
> +#endif
>  	output_json_format(out, false, 2, "}");
>  	return 0;
>  }
> @@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
>  			.exit           = perf_event__process_exit,
>  			.fork           = perf_event__process_fork,
>  			.lost           = perf_event__process_lost,
> +#ifdef HAVE_LIBTRACEEVENT
>  			.tracing_data   = perf_event__process_tracing_data,
> +#endif
>  			.build_id       = perf_event__process_build_id,
>  			.id_index       = perf_event__process_id_index,
>  			.auxtrace_info  = perf_event__process_auxtrace_info,
> diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> index fbf3192bced9..590d4e77effc 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
>  	return evsel;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
>  {
>  	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
> @@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
>  
>  	evlist__add(evlist, evsel);
>  	return evsel;
> -};
> +}
> +#endif
>  
>  int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
>  {
> @@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
>  	return NULL;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
>  {
>  	struct evsel *evsel = evsel__newtp(sys, name);
> @@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
>  	evlist__add(evlist, evsel);
>  	return 0;
>  }
> +#endif
>  
>  struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
>  {
> diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
> index 16734c6756b3..e5b84ead566c 100644
> --- a/tools/perf/util/evlist.h
> +++ b/tools/perf/util/evlist.h
> @@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
>  {
>  	return evlist__add_aux_dummy(evlist, true);
>  }
> +#ifdef HAVE_LIBTRACEEVENT
>  struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
> +#endif
>  
>  int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
>  			 evsel__sb_cb_t cb, void *data);
> @@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
>  int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
>  void evlist__stop_sb_thread(struct evlist *evlist);
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
> +#endif
>  
>  int __evlist__set_tracepoints_handlers(struct evlist *evlist,
>  				       const struct evsel_str_handler *assocs,
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 0f617359a82f..ca911856c4b1 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -12,7 +12,6 @@
>  #include <linux/bitops.h>
>  #include <api/fs/fs.h>
>  #include <api/fs/tracing_path.h>
> -#include <traceevent/event-parse.h>
>  #include <linux/hw_breakpoint.h>
>  #include <linux/perf_event.h>
>  #include <linux/compiler.h>
> @@ -57,6 +56,10 @@
>  
>  #include <linux/ctype.h>
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  struct perf_missing_features perf_missing_features;
>  
>  static clockid_t clockid;
> @@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
>  			goto out_err;
>  	}
>  	evsel->cgrp = cgroup__get(orig->cgrp);
> +#ifdef HAVE_LIBTRACEEVENT
>  	evsel->tp_format = orig->tp_format;
> +#endif
>  	evsel->handler = orig->handler;
>  	evsel->core.leader = orig->core.leader;
>  
> @@ -479,6 +484,7 @@ struct evsel *evsel__clone(struct evsel *orig)
>  /*
>   * Returns pointer with encoded error via <linux/err.h> interface.
>   */
> +#ifdef HAVE_LIBTRACEEVENT
>  struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
>  {
>  	struct evsel *evsel = zalloc(perf_evsel__object.size);
> @@ -516,6 +522,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
>  out_err:
>  	return ERR_PTR(err);
>  }
> +#endif
>  
>  const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
>  	"cycles",
> @@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
>  	return size;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
>  {
>  	return tep_find_field(evsel->tp_format, name);
> @@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
>  
>  	return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
>  }
> +#endif
>  
>  bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
>  {
> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> index f3485799ddf9..d572be41b960 100644
> --- a/tools/perf/util/evsel.h
> +++ b/tools/perf/util/evsel.h
> @@ -72,7 +72,9 @@ struct evsel {
>  		char			*name;
>  		char			*group_name;
>  		const char		*pmu_name;
> +#ifdef HAVE_LIBTRACEEVENT
>  		struct tep_event	*tp_format;
> +#endif
>  		char			*filter;
>  		unsigned long		max_events;
>  		double			scale;
> @@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
>  }
>  
>  struct evsel *evsel__clone(struct evsel *orig);
> -struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
>  
>  int copy_config_terms(struct list_head *dst, struct list_head *src);
>  void free_config_terms(struct list_head *config_terms);
>  
> +
> +#ifdef HAVE_LIBTRACEEVENT
> +struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> +
>  /*
>   * Returns pointer with encoded error via <linux/err.h> interface.
>   */
> @@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
>  {
>  	return evsel__newtp_idx(sys, name, 0);
>  }
> +#endif
>  
>  struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  struct tep_event *event_format__new(const char *sys, const char *name);
> +#endif
>  
>  void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
>  void evsel__exit(struct evsel *evsel);
> @@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);
>  
>  struct perf_sample;
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
>  u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
>  
> @@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
>  {
>  	return evsel__rawptr(evsel, sample, name);
>  }
> +#endif
>  
>  struct tep_format_field;
>  
> diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> index 8c2ea8001329..bd22c4932d10 100644
> --- a/tools/perf/util/evsel_fprintf.c
> +++ b/tools/perf/util/evsel_fprintf.c
> @@ -2,7 +2,6 @@
>  #include <inttypes.h>
>  #include <stdio.h>
>  #include <stdbool.h>
> -#include <traceevent/event-parse.h>
>  #include "evsel.h"
>  #include "util/evsel_fprintf.h"
>  #include "util/event.h"
> @@ -13,6 +12,10 @@
>  #include "srcline.h"
>  #include "dso.h"
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
>  {
>  	va_list args;
> @@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
>  					 term, (u64)evsel->core.attr.sample_freq);
>  	}
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (details->trace_fields) {
>  		struct tep_format_field *field;
>  
> @@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
>  			field = field->next;
>  		}
>  	}
> +#endif
>  out:
>  	fputc('\n', fp);
>  	return ++printed;
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index dc2ae397d400..404d816ca124 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -6,6 +6,7 @@
>  #include <sys/types.h>
>  #include <byteswap.h>
>  #include <unistd.h>
> +#include <regex.h>
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <linux/compiler.h>
> @@ -55,6 +56,10 @@
>  #include <linux/ctype.h>
>  #include <internal/lib.h>
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  /*
>   * magic2 = "PERFILE2"
>   * must be a numerical value to let the endianness
> @@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
>  	return 0;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int write_tracing_data(struct feat_fd *ff,
>  			      struct evlist *evlist)
>  {
> @@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,
>  
>  	return read_tracing_data(ff->fd, &evlist->core.entries);
>  }
> +#endif
>  
>  static int write_build_id(struct feat_fd *ff,
>  			  struct evlist *evlist __maybe_unused)
> @@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
>  FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
>  FEAT_PROCESS_STR_FUN(cpuid, cpuid);
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int process_tracing_data(struct feat_fd *ff, void *data)
>  {
>  	ssize_t ret = trace_report(ff->fd, data, false);
>  
>  	return ret < 0 ? -1 : 0;
>  }
> +#endif
>  
>  static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
>  {
> @@ -3366,7 +3375,9 @@ static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
>  const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
>  
>  const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
> +#ifdef HAVE_LIBTRACEEVENT
>  	FEAT_OPN(TRACING_DATA,	tracing_data,	false),
> +#endif
>  	FEAT_OPN(BUILD_ID,	build_id,	false),
>  	FEAT_OPR(HOSTNAME,	hostname,	false),
>  	FEAT_OPR(OSRELEASE,	osrelease,	false),
> @@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
>  	return ret <= 0 ? -1 : 0;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
>  {
>  	struct tep_event *event;
> @@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
>  
>  	return 0;
>  }
> +#endif
>  
>  int perf_session__read_header(struct perf_session *session, int repipe_fd)
>  {
> @@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
>  		lseek(fd, tmp, SEEK_SET);
>  	}
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	perf_header__process_sections(header, fd, &session->tevent,
>  				      perf_file_section__process);
>  
>  	if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
>  		goto out_delete_evlist;
> +#else
> +	perf_header__process_sections(header, fd, NULL, perf_file_section__process);
> +#endif
>  
>  	return 0;
>  out_errno:
> @@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
>  	return 0;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  int perf_event__process_tracing_data(struct perf_session *session,
>  				     union perf_event *event)
>  {
> @@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,
>  
>  	return size_read + padding;
>  }
> +#endif
>  
>  int perf_event__process_build_id(struct perf_session *session,
>  				 union perf_event *event)
> diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
> index 2d5e601ba60f..e3861ae62172 100644
> --- a/tools/perf/util/header.h
> +++ b/tools/perf/util/header.h
> @@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
>  				     union perf_event *event,
>  				     struct evlist **pevlist);
>  size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
> +#ifdef HAVE_LIBTRACEEVENT
>  int perf_event__process_tracing_data(struct perf_session *session,
>  				     union perf_event *event);
> +#endif
>  int perf_event__process_build_id(struct perf_session *session,
>  				 union perf_event *event);
>  bool is_perf_magic(u64 magic);
> diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> index e3548ddef254..6d3921627e33 100644
> --- a/tools/perf/util/intel-pt.c
> +++ b/tools/perf/util/intel-pt.c
> @@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
>  	return 1;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int intel_pt_process_switch(struct intel_pt *pt,
>  				   struct perf_sample *sample)
>  {
> @@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,
>  
>  	return machine__set_current_tid(pt->machine, cpu, -1, tid);
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  static int intel_pt_context_switch_in(struct intel_pt *pt,
>  				      struct perf_sample *sample)
> @@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
>  			return err;
>  	}
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
>  		err = intel_pt_process_switch(pt, sample);
> -	else if (event->header.type == PERF_RECORD_ITRACE_START)
> +	else
> +#endif
> +	if (event->header.type == PERF_RECORD_ITRACE_START)
>  		err = intel_pt_process_itrace_start(pt, event, sample);
>  	else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
>  		err = intel_pt_process_aux_output_hw_id(pt, event, sample);
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 6502cd679f57..21cce83462b3 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -445,6 +445,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
>  	return ret;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static void tracepoint_error(struct parse_events_error *e, int err,
>  			     const char *sys, const char *name)
>  {
> @@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
>  	closedir(events_dir);
>  	return ret;
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  #ifdef HAVE_LIBBPF_SUPPORT
>  struct __add_bpf_event_param {
> @@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
>  		return config_term_common(attr, term, err);
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int config_term_tracepoint(struct perf_event_attr *attr,
>  				  struct parse_events_term *term,
>  				  struct parse_events_error *err)
> @@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
>  
>  	return 0;
>  }
> +#endif
>  
>  static int config_attr(struct perf_event_attr *attr,
>  		       struct list_head *head,
> @@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
>  				struct parse_events_error *err,
>  				struct list_head *head_config)
>  {
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (head_config) {
>  		struct perf_event_attr attr;
>  
> @@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
>  	else
>  		return add_tracepoint_event(list, idx, sys, event,
>  					    err, head_config);
> +#else
> +	(void)list;
> +	(void)idx;
> +	(void)sys;
> +	(void)event;
> +	(void)head_config;
> +	parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
> +				strdup("libtraceevent is necessary for tracepoint support"));
> +	return -1;
> +#endif
>  }
>  
>  int parse_events_add_numeric(struct parse_events_state *parse_state,
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index 07df7bb7b042..428e72eaafcc 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -18,7 +18,6 @@ struct parse_events_error;
>  struct option;
>  struct perf_pmu;
>  
> -bool have_tracepoints(struct list_head *evlist);
>  bool is_event_supported(u8 type, u64 config);
>  
>  const char *event_type(int type);
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index b5941c74a0d6..728fe2f51759 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -417,6 +417,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
>  	return ret;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static bool is_tracepoint(struct pyrf_event *pevent)
>  {
>  	return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
> @@ -486,14 +487,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
>  
>  	return tracepoint_field(pevent, field);
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  static PyObject*
>  pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
>  {
>  	PyObject *obj = NULL;
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (is_tracepoint(pevent))
>  		obj = get_tracepoint_field(pevent, attr_name);
> +#endif
>  
>  	return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
>  }
> diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
> index 0f5ba28339cf..77544d2c447c 100644
> --- a/tools/perf/util/scripting-engines/Build
> +++ b/tools/perf/util/scripting-engines/Build
> @@ -1,5 +1,7 @@
> -perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> -perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> +ifeq ($(CONFIG_TRACEEVENT),y)
> +  perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> +  perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> +endif
>  
>  CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
>  
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index d685a7399ee2..fabba21919b8 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -30,6 +30,7 @@
>  #include <linux/bitmap.h>
>  #include <linux/compiler.h>
>  #include <linux/time64.h>
> +#include <traceevent/event-parse.h>
>  
>  #include "../build-id.h"
>  #include "../counts.h"
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 1facd4616317..7c021c6cedb9 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
>  			evlist__delete(session->evlist);
>  		perf_data__close(session->data);
>  	}
> +#ifdef HAVE_LIBTRACEEVENT
>  	trace_event__cleanup(&session->tevent);
> +#endif
>  	free(session);
>  }
>  
> diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> index be5871ea558f..ee3715e8563b 100644
> --- a/tools/perf/util/session.h
> +++ b/tools/perf/util/session.h
> @@ -33,7 +33,9 @@ struct perf_session {
>  	struct auxtrace		*auxtrace;
>  	struct itrace_synth_opts *itrace_synth_opts;
>  	struct list_head	auxtrace_index;
> +#ifdef HAVE_LIBTRACEEVENT
>  	struct trace_event	tevent;
> +#endif
>  	struct perf_record_time_conv	time_conv;
>  	bool			repipe;
>  	bool			one_mmap;
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index 2e7330867e2e..c7a97b33e134 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -22,7 +22,6 @@
>  #include "srcline.h"
>  #include "strlist.h"
>  #include "strbuf.h"
> -#include <traceevent/event-parse.h>
>  #include "mem-events.h"
>  #include "annotate.h"
>  #include "event.h"
> @@ -32,6 +31,10 @@
>  #include <linux/kernel.h>
>  #include <linux/string.h>
>  
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
>  regex_t		parent_regex;
>  const char	default_parent_pattern[] = "^sys_|^do_page_fault";
>  const char	*parent_pattern = default_parent_pattern;
> @@ -743,6 +746,7 @@ struct sort_entry sort_time = {
>  
>  /* --sort trace */
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static char *get_trace_output(struct hist_entry *he)
>  {
>  	struct trace_seq seq;
> @@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
>  	.se_snprintf    = hist_entry__trace_snprintf,
>  	.se_width_idx	= HISTC_TRACE,
>  };
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  /* sort keys for branch stacks */
>  
> @@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
>  	DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
>  	DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
>  	DIM(SORT_TRANSACTION, "transaction", sort_transaction),
> +#ifdef HAVE_LIBTRACEEVENT
>  	DIM(SORT_TRACE, "trace", sort_trace),
> +#endif
>  	DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
>  	DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
>  	DIM(SORT_CGROUP, "cgroup", sort_cgroup),
> @@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt)	\
>  	return hse->se == &sort_ ## key ;			\
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  MK_SORT_ENTRY_CHK(trace)
> +#else
> +bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> +{
> +	return false;
> +}
> +#endif
>  MK_SORT_ENTRY_CHK(srcline)
>  MK_SORT_ENTRY_CHK(srcfile)
>  MK_SORT_ENTRY_CHK(thread)
> @@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
>  	return 0;
>  }
>  
> +#ifndef HAVE_LIBTRACEEVENT
> +bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> +{
> +	return false;
> +}
> +bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
> +				     struct hists *hists __maybe_unused)
> +{
> +	return false;
> +}
> +#else
>  struct hpp_dynamic_entry {
>  	struct perf_hpp_fmt hpp;
>  	struct evsel *evsel;
> @@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
>  
>  	return hde;
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
>  {
> @@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
>  		new_hse = memdup(hse, sizeof(*hse));
>  		if (new_hse)
>  			new_fmt = &new_hse->hpp;
> +#ifdef HAVE_LIBTRACEEVENT
>  	} else if (perf_hpp__is_dynamic_entry(fmt)) {
>  		struct hpp_dynamic_entry *hde, *new_hde;
>  
> @@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
>  		new_hde = memdup(hde, sizeof(*hde));
>  		if (new_hde)
>  			new_fmt = &new_hde->hpp;
> +#endif
>  	} else {
>  		new_fmt = memdup(fmt, sizeof(*fmt));
>  	}
> @@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
>  	return evsel;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  static int __dynamic_dimension__add(struct evsel *evsel,
>  				    struct tep_format_field *field,
>  				    bool raw_trace, int level)
> @@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
>  	}
>  	return ret;
>  }
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  static int add_dynamic_entry(struct evlist *evlist, const char *tok,
>  			     int level)
>  {
>  	char *str, *event_name, *field_name, *opt_name;
>  	struct evsel *evsel;
> -	struct tep_format_field *field;
>  	bool raw_trace = symbol_conf.raw_trace;
>  	int ret = 0;
>  
> @@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
>  		raw_trace = true;
>  	}
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (!strcmp(field_name, "trace_fields")) {
>  		ret = add_all_dynamic_fields(evlist, raw_trace, level);
>  		goto out;
> @@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
>  		ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
>  		goto out;
>  	}
> +#endif
>  
>  	evsel = find_evsel(evlist, event_name);
>  	if (evsel == NULL) {
> @@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
>  		goto out;
>  	}
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (!strcmp(field_name, "*")) {
>  		ret = add_evsel_fields(evsel, raw_trace, level);
>  	} else {
> -		field = tep_find_any_field(evsel->tp_format, field_name);
> +		struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
> +
>  		if (field == NULL) {
>  			pr_debug("Cannot find event field for %s.%s\n",
>  				 event_name, field_name);
> @@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
>  
>  		ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
>  	}
> +#else
> +	(void)level;
> +	(void)raw_trace;
> +#endif /* HAVE_LIBTRACEEVENT */
>  
>  out:
>  	free(str);
> @@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
>  	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
>  		struct sort_dimension *sd = &common_sort_dimensions[i];
>  
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
>  			continue;
>  
>  		for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
> -			if (!strcmp(dynamic_headers[j], sd->name))
> +			if (sd->name && !strcmp(dynamic_headers[j], sd->name))
>  				sort_dimension_add_dynamic_header(sd);
>  		}
>  
> @@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
>  	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
>  		struct sort_dimension *sd = &bstack_sort_dimensions[i];
>  
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
>  			continue;
>  
>  		if (sort__mode != SORT_MODE__BRANCH)
> @@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
>  	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
>  		struct sort_dimension *sd = &memory_sort_dimensions[i];
>  
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
>  			continue;
>  
>  		if (sort__mode != SORT_MODE__MEMORY)
> @@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
>  	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
>  		struct sort_dimension *sd = &common_sort_dimensions[i];
>  
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
>  			continue;
>  
>  		return __sort_dimension__add_output(list, sd);
> @@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
>  	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
>  		struct sort_dimension *sd = &bstack_sort_dimensions[i];
>  
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
>  			continue;
>  
>  		if (sort__mode != SORT_MODE__BRANCH)
> @@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
>  	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
>  		struct sort_dimension *sd = &memory_sort_dimensions[i];
>  
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
>  			continue;
>  
>  		if (sort__mode != SORT_MODE__MEMORY)
> @@ -3508,6 +3545,9 @@ void reset_output_field(void)
>  
>  static void add_key(struct strbuf *sb, const char *str, int *llen)
>  {
> +	if (!str)
> +		return;
> +
>  	if (*llen >= 75) {
>  		strbuf_addstr(sb, "\n\t\t\t ");
>  		*llen = INDENT;
> diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
> index 0645795ff080..3ab6a92b1a6d 100644
> --- a/tools/perf/util/synthetic-events.c
> +++ b/tools/perf/util/synthetic-events.c
> @@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
>  	return err;
>  }
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
>  					perf_event__handler_t process)
>  {
> @@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
>  
>  	return aligned_size;
>  }
> +#endif
>  
>  int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
>  				    perf_event__handler_t process, struct machine *machine)
> @@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
>  	}
>  	ret += err;
>  
> +#ifdef HAVE_LIBTRACEEVENT
>  	if (have_tracepoints(&evlist->core.entries)) {
>  		int fd = perf_data__fd(data);
>  
> @@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
>  		}
>  		ret += err;
>  	}
> +#else
> +	(void)data;
> +#endif
>  
>  	return ret;
>  }
> diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
> index c9c83a40647c..2d3c2576bab7 100644
> --- a/tools/perf/util/trace-event-parse.c
> +++ b/tools/perf/util/trace-event-parse.c
> @@ -11,6 +11,8 @@
>  #include "trace-event.h"
>  
>  #include <linux/ctype.h>
> +#include <linux/kernel.h>
> +#include <traceevent/event-parse.h>
>  
>  static int get_common_field(struct scripting_context *context,
>  			    int *offset, int *size, const char *type)
> diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> index 43146a4ce2fb..1162c49b8082 100644
> --- a/tools/perf/util/trace-event-read.c
> +++ b/tools/perf/util/trace-event-read.c
> @@ -11,6 +11,7 @@
>  #include <sys/stat.h>
>  #include <sys/wait.h>
>  #include <sys/mman.h>
> +#include <traceevent/event-parse.h>
>  #include <fcntl.h>
>  #include <unistd.h>
>  #include <errno.h>
> diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> index 636a010d929b..56175c53f9af 100644
> --- a/tools/perf/util/trace-event-scripting.c
> +++ b/tools/perf/util/trace-event-scripting.c
> @@ -9,6 +9,7 @@
>  #include <stdlib.h>
>  #include <string.h>
>  #include <errno.h>
> +#include <traceevent/event-parse.h>
>  
>  #include "debug.h"
>  #include "trace-event.h"
> diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
> index b3ee651e3d91..8ad75b31e09b 100644
> --- a/tools/perf/util/trace-event.c
> +++ b/tools/perf/util/trace-event.c
> @@ -1,5 +1,4 @@
>  // SPDX-License-Identifier: GPL-2.0
> -
>  #include <stdio.h>
>  #include <unistd.h>
>  #include <stdlib.h>
> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> index 8f39f5bcb2c2..add6c5d9531c 100644
> --- a/tools/perf/util/trace-event.h
> +++ b/tools/perf/util/trace-event.h
> @@ -2,9 +2,11 @@
>  #ifndef _PERF_UTIL_TRACE_EVENT_H
>  #define _PERF_UTIL_TRACE_EVENT_H
>  
> -#include <traceevent/event-parse.h>
> -#include "parse-events.h"
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <linux/types.h>
>  
> +struct evlist;
>  struct machine;
>  struct perf_sample;
>  union perf_event;
> @@ -18,6 +20,11 @@ struct trace_event {
>  	struct tep_plugin_list	*plugin_list;
>  };
>  
> +typedef char *(tep_func_resolver_t)(void *priv,
> +				    unsigned long long *addrp, char **modp);
> +
> +bool have_tracepoints(struct list_head *evlist);
> +
>  int trace_event__init(struct trace_event *t);
>  void trace_event__cleanup(struct trace_event *t);
>  int trace_event__register_resolver(struct machine *machine,
> -- 
> 2.39.0.rc0.267.gcb52ba06e7-goog
Arnaldo Carvalho de Melo Dec. 6, 2022, 4:20 p.m. UTC | #2
Em Tue, Dec 06, 2022 at 01:15:04PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Mon, Dec 05, 2022 at 02:59:39PM -0800, Ian Rogers escreveu:
> > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > build, don't compile in libtraceevent and libtracefs support. This
> > also disables CONFIG_TRACE that controls "perf
> > trace". CONFIG_TRACEEVENT is used to control enablement in
> > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > kmem, kwork, lock, sched and timechart are removed. The majority of
> > commands continue to work including "perf test".
> 
> Had just this .rej and I fixed it up manually, testing now:

Investigating:

[acme@quaco perf]$ rpm -q libtraceevent-devel
libtraceevent-devel-1.5.3-2.fc36.x86_64
[acme@quaco perf]$
[acme@quaco perf]$ grep -i traceevent /tmp/build/perf/FEATURE-DUMP
feature-libtraceevent=1
[acme@quaco perf]$

[acme@quaco perf]$ alias m
alias m='rm -rf ~/libexec/perf-core/ ; perf stat -e cycles:u,instructions:u make -k BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
[acme@quaco perf]$

[acme@quaco perf]$ rpm -ql libtraceevent-devel | grep \.h$ | xargs grep tep_print_flag_sym
/usr/include/traceevent/event-parse.h:struct tep_print_flag_sym {
/usr/include/traceevent/event-parse.h:	struct tep_print_flag_sym	*next;
/usr/include/traceevent/event-parse.h:	struct tep_print_flag_sym	*flags;
/usr/include/traceevent/event-parse.h:	struct tep_print_flag_sym	*symbols;
[acme@quaco perf]$

util/scripting-engines/trace-event-perl.c:104:43: error: ‘struct tep_print_flag_sym’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
  104 | static void define_symbolic_values(struct tep_print_flag_sym *field,
      |                                           ^~~~~~~~~~~~~~~~~~
util/scripting-engines/trace-event-perl.c: In function ‘define_symbolic_values’:
util/scripting-engines/trace-event-perl.c:108:57: error: invalid use of undefined type ‘struct tep_print_flag_sym’
  108 |         define_symbolic_value(ev_name, field_name, field->value, field->str);
      |                                                         ^~
util/scripting-engines/trace-event-perl.c:108:71: error: invalid use of undefined type ‘struct tep_print_flag_sym’
  108 |         define_symbolic_value(ev_name, field_name, field->value, field->str);
      |                                                                       ^~
util/scripting-engines/trace-event-perl.c:109:18: error: invalid use of undefined type ‘struct tep_print_flag_sym’
  109 |         if (field->next)
      |                  ^~
util/scripting-engines/trace-event-perl.c:110:45: error: invalid use of undefined type ‘struct tep_print_flag_sym’
  110 |                 define_symbolic_values(field->next, ev_name, field_name);
      |                                             ^~
util/scripting-engines/trace-event-perl.c: At top level:
util/scripting-engines/trace-event-perl.c:162:39: error: ‘struct tep_print_flag_sym’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
  162 | static void define_flag_values(struct tep_print_flag_sym *field,
      |                                       ^~~~~~~~~~~~~~~~~~
util/scripting-engines/trace-event-perl.c: In function ‘define_flag_values’:
util/scripting-engines/trace-event-perl.c:166:53: error: invalid use of undefined type ‘struct tep_print_flag_sym’
  166 |         define_flag_value(ev_name, field_name, field->value, field->str);
      |                                                     ^~
util/scripting-engines/trace-event-perl.c:166:67: error: invalid use of undefined type ‘struct tep_print_flag_sym’
  166 |         define_flag_value(ev_name, field_name, field->value, field->str);
      |                                                                   ^~
u
 
> [acme@quaco perf]$ cat tools/perf/util/Build.rej
> --- tools/perf/util/Build
> +++ tools/perf/util/Build
> @@ -69,17 +69,17 @@ perf-y += namespaces.o
>  perf-y += comm.o
>  perf-y += thread.o
>  perf-y += thread_map.o
> -perf-y += trace-event-parse.o
>  perf-y += parse-events-flex.o
>  perf-y += parse-events-bison.o
>  perf-y += pmu.o
>  perf-y += pmu-flex.o
>  perf-y += pmu-bison.o
>  perf-y += pmu-hybrid.o
> -perf-y += trace-event-read.o
> -perf-y += trace-event-info.o
> -perf-y += trace-event-scripting.o
> -perf-y += trace-event.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
>  perf-y += svghelper.o
>  perf-y += sort.o
>  perf-y += hist.o
> [acme@quaco perf]$ 
> 
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> >  tools/perf/Build                              | 11 ++-
> >  tools/perf/Makefile.config                    | 37 +++----
> >  tools/perf/Makefile.perf                      | 99 +------------------
> >  tools/perf/arch/x86/util/Build                |  2 +-
> >  tools/perf/arch/x86/util/intel-pt.c           |  4 +
> >  tools/perf/builtin-annotate.c                 |  2 +
> >  tools/perf/builtin-inject.c                   |  8 ++
> >  tools/perf/builtin-kmem.c                     |  1 +
> >  tools/perf/builtin-kvm.c                      | 12 +--
> >  tools/perf/builtin-kwork.c                    |  1 +
> >  tools/perf/builtin-record.c                   |  2 +
> >  tools/perf/builtin-report.c                   |  9 +-
> >  tools/perf/builtin-script.c                   | 19 +++-
> >  tools/perf/builtin-timechart.c                |  1 +
> >  tools/perf/builtin-trace.c                    |  5 +-
> >  tools/perf/builtin-version.c                  |  1 +
> >  tools/perf/perf.c                             | 24 +++--
> >  .../perf/scripts/python/Perf-Trace-Util/Build |  2 +-
> >  tools/perf/tests/Build                        | 12 +--
> >  tools/perf/tests/builtin-test.c               |  6 ++
> >  tools/perf/tests/parse-events.c               | 20 ++++
> >  tools/perf/util/Build                         | 10 +-
> >  tools/perf/util/data-convert-bt.c             |  5 +-
> >  tools/perf/util/data-convert-json.c           |  9 +-
> >  tools/perf/util/evlist.c                      |  6 +-
> >  tools/perf/util/evlist.h                      |  4 +
> >  tools/perf/util/evsel.c                       | 11 ++-
> >  tools/perf/util/evsel.h                       | 12 ++-
> >  tools/perf/util/evsel_fprintf.c               |  7 +-
> >  tools/perf/util/header.c                      | 19 ++++
> >  tools/perf/util/header.h                      |  2 +
> >  tools/perf/util/intel-pt.c                    |  7 +-
> >  tools/perf/util/parse-events.c                | 15 +++
> >  tools/perf/util/parse-events.h                |  1 -
> >  tools/perf/util/python.c                      |  4 +
> >  tools/perf/util/scripting-engines/Build       |  6 +-
> >  .../scripting-engines/trace-event-python.c    |  1 +
> >  tools/perf/util/session.c                     |  2 +
> >  tools/perf/util/session.h                     |  2 +
> >  tools/perf/util/sort.c                        | 60 +++++++++--
> >  tools/perf/util/synthetic-events.c            |  6 ++
> >  tools/perf/util/trace-event-parse.c           |  2 +
> >  tools/perf/util/trace-event-read.c            |  1 +
> >  tools/perf/util/trace-event-scripting.c       |  1 +
> >  tools/perf/util/trace-event.c                 |  1 -
> >  tools/perf/util/trace-event.h                 | 11 ++-
> >  46 files changed, 312 insertions(+), 171 deletions(-)
> > 
> > diff --git a/tools/perf/Build b/tools/perf/Build
> > index 496b096153bb..edafe3cb3d07 100644
> > --- a/tools/perf/Build
> > +++ b/tools/perf/Build
> > @@ -5,7 +5,6 @@ perf-y += builtin-diff.o
> >  perf-y += builtin-evlist.o
> >  perf-y += builtin-ftrace.o
> >  perf-y += builtin-help.o
> > -perf-y += builtin-sched.o
> >  perf-y += builtin-buildid-list.o
> >  perf-y += builtin-buildid-cache.o
> >  perf-y += builtin-kallsyms.o
> > @@ -13,11 +12,8 @@ perf-y += builtin-list.o
> >  perf-y += builtin-record.o
> >  perf-y += builtin-report.o
> >  perf-y += builtin-stat.o
> > -perf-y += builtin-timechart.o
> >  perf-y += builtin-top.o
> >  perf-y += builtin-script.o
> > -perf-y += builtin-kmem.o
> > -perf-y += builtin-lock.o
> >  perf-y += builtin-kvm.o
> >  perf-y += builtin-inject.o
> >  perf-y += builtin-mem.o
> > @@ -25,7 +21,12 @@ perf-y += builtin-data.o
> >  perf-y += builtin-version.o
> >  perf-y += builtin-c2c.o
> >  perf-y += builtin-daemon.o
> > -perf-y += builtin-kwork.o
> > +
> > +perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o
> >  
> >  perf-$(CONFIG_TRACE) += builtin-trace.o
> >  perf-$(CONFIG_LIBELF) += builtin-probe.o
> > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> > index 9cc3c48f3288..b34288cb1900 100644
> > --- a/tools/perf/Makefile.config
> > +++ b/tools/perf/Makefile.config
> > @@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
> >    EXTLIBS += $(EXTLIBS_LIBUNWIND)
> >  endif
> >  
> > -ifeq ($(NO_SYSCALL_TABLE),0)
> > -  $(call detected,CONFIG_TRACE)
> > -else
> > -  ifndef NO_LIBAUDIT
> > -    $(call feature_check,libaudit)
> > -    ifneq ($(feature-libaudit), 1)
> > -      msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> > -      NO_LIBAUDIT := 1
> > -    else
> > -      CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> > -      EXTLIBS += -laudit
> > -      $(call detected,CONFIG_TRACE)
> > +ifneq ($(NO_LIBTRACEEVENT),1)
> > +  ifeq ($(NO_SYSCALL_TABLE),0)
> > +    $(call detected,CONFIG_TRACE)
> > +  else
> > +    ifndef NO_LIBAUDIT
> > +      $(call feature_check,libaudit)
> > +      ifneq ($(feature-libaudit), 1)
> > +        msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> > +        NO_LIBAUDIT := 1
> > +      else
> > +        CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> > +        EXTLIBS += -laudit
> > +        $(call detected,CONFIG_TRACE)
> > +      endif
> >      endif
> >    endif
> >  endif
> > @@ -1182,9 +1184,11 @@ ifdef LIBPFM4
> >    endif
> >  endif
> >  
> > -ifdef LIBTRACEEVENT_DYNAMIC
> > +# libtraceevent is a recommended dependency picked up from the system.
> > +ifneq ($(NO_LIBTRACEEVENT),1)
> >    $(call feature_check,libtraceevent)
> >    ifeq ($(feature-libtraceevent), 1)
> > +    CFLAGS += -DHAVE_LIBTRACEEVENT
> >      EXTLIBS += -ltraceevent
> >      LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
> >      LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> > @@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
> >      LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> >      LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
> >      CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
> > +    $(call detected,CONFIG_TRACEEVENT)
> >    else
> > -    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
> > +    dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
> >    endif
> > -endif
> >  
> > -ifdef LIBTRACEFS_DYNAMIC
> >    $(call feature_check,libtracefs)
> >    ifeq ($(feature-libtracefs), 1)
> >      EXTLIBS += -ltracefs
> > @@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
> >      LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
> >      LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
> >      CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
> > -  else
> > -    dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
> >    endif
> >  endif
> >  
> > diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> > index 6689f644782f..f0e4daeef812 100644
> > --- a/tools/perf/Makefile.perf
> > +++ b/tools/perf/Makefile.perf
> > @@ -128,10 +128,6 @@ include ../scripts/utilities.mak
> >  #
> >  # Define BUILD_BPF_SKEL to enable BPF skeletons
> >  #
> > -# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
> > -#
> > -# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
> > -#
> >  
> >  # As per kernel Makefile, avoid funny character set dependencies
> >  unexport LC_ALL
> > @@ -242,10 +238,6 @@ sub-make: fixdep
> >  else # force_fixdep
> >  
> >  LIBAPI_DIR      = $(srctree)/tools/lib/api/
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
> > -LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
> > -endif
> >  LIBBPF_DIR      = $(srctree)/tools/lib/bpf/
> >  LIBSUBCMD_DIR   = $(srctree)/tools/lib/subcmd/
> >  LIBSYMBOL_DIR   = $(srctree)/tools/lib/symbol/
> > @@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
> >  grep-libs = $(filter -l%,$(1))
> >  strip-libs = $(filter-out -l%,$(1))
> >  
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -ifneq ($(OUTPUT),)
> > -  LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
> > -else
> > -  LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
> > -endif
> > -LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
> > -LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
> > -LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> > -LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
> > -LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
> > -export LIBTRACEEVENT
> > -LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
> > -CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
> > -#
> > -# The static build has no dynsym table, so this does not work for
> > -# static build. Looks like linker starts to scream about that now
> > -# (in Fedora 26) so we need to switch it off for static build.
> > -DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
> > -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
> > -else
> > -LIBTRACEEVENT_DYNAMIC_LIST =
> > -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
> > -endif
> > -
> >  ifneq ($(OUTPUT),)
> >    LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
> >  else
> > @@ -381,11 +348,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
> >  python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
> >  
> >  PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
> > -else
> >  PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> > -endif
> >  
> >  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> >  
> > @@ -430,9 +393,6 @@ ifndef NO_LIBBPF
> >      PERFLIBS += $(LIBBPF)
> >    endif
> >  endif
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -  PERFLIBS += $(LIBTRACEEVENT)
> > -endif
> >  
> >  # We choose to avoid "if .. else if .. else .. endif endif"
> >  # because maintaining the nesting to match is a pain.  If
> > @@ -682,9 +642,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
> >  # Create python binding output directory if not already present
> >  _dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
> >  
> > -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
> > +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
> >  	$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
> > -        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
> > +        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
> >  	  $(PYTHON_WORD) util/setup.py \
> >  	  --quiet build_ext; \
> >  	cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
> > @@ -710,8 +670,8 @@ $(PERF_IN): prepare FORCE
> >  $(PMU_EVENTS_IN): FORCE prepare
> >  	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
> >  
> > -$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
> > -	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
> > +$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
> > +	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
> >  		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
> >  
> >  $(GTK_IN): FORCE prepare
> > @@ -797,10 +757,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
> >  	$(LIBSYMBOL) \
> >  	bpf-skel
> >  
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -prepare: $(LIBTRACEEVENT)
> > -endif
> > -
> >  $(OUTPUT)%.o: %.c prepare FORCE
> >  	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
> >  
> > @@ -856,38 +812,6 @@ endif
> >  
> >  $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
> >  
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
> > -
> > -$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
> > -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
> > -		DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
> > -		$@ install_headers
> > -
> > -$(LIBTRACEEVENT)-clean:
> > -	$(call QUIET_CLEAN, libtraceevent)
> > -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
> > -
> > -libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> > -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> > -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> > -		plugins
> > -
> > -libtraceevent_plugins-clean:
> > -	$(call QUIET_CLEAN, libtraceevent_plugins)
> > -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> > -
> > -$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
> > -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> > -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> > -		$(LIBTRACEEVENT_FLAGS) $@
> > -
> > -install-traceevent-plugins: libtraceevent_plugins
> > -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> > -		DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
> > -		$(LIBTRACEEVENT_FLAGS) install
> > -endif
> > -
> >  $(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
> >  	$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
> >  		DESTDIR=$(LIBAPI_DESTDIR) prefix= \
> > @@ -1095,10 +1019,6 @@ install-tests: all install-gtk
> >  
> >  install-bin: install-tools install-tests
> >  
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -install-bin: install-traceevent-plugins
> > -endif
> > -
> >  install: install-bin try-install-man
> >  
> >  install-python_ext:
> > @@ -1124,11 +1044,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
> >  $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
> >  	$(Q)$(MKDIR) -p $@
> >  
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
> > -	$(Q)$(MKDIR) -p $@
> > -endif
> > -
> >  ifdef BUILD_BPF_SKEL
> >  BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
> >  BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
> > @@ -1211,10 +1126,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
> >  	$(call QUIET_CLEAN, Documentation) \
> >  	$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
> >  
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
> > -endif
> > -
> >  #
> >  # To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
> >  # file if defined, with no further action.
> > @@ -1232,6 +1143,6 @@ FORCE:
> >  .PHONY: all install clean config-clean strip install-gtk
> >  .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
> >  .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
> > -.PHONY: libtraceevent_plugins archheaders
> > +.PHONY: archheaders
> >  
> >  endif # force_fixdep
> > diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> > index dbeb04cb336e..a92644f12eec 100644
> > --- a/tools/perf/arch/x86/util/Build
> > +++ b/tools/perf/arch/x86/util/Build
> > @@ -1,7 +1,7 @@
> >  perf-y += header.o
> >  perf-y += tsc.o
> >  perf-y += pmu.o
> > -perf-y += kvm-stat.o
> > +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> >  perf-y += perf_regs.o
> >  perf-y += topdown.o
> >  perf-y += machine.o
> > diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
> > index af102f471e9f..1e39a034cee9 100644
> > --- a/tools/perf/arch/x86/util/intel-pt.c
> > +++ b/tools/perf/arch/x86/util/intel-pt.c
> > @@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
> >  	return 0;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int intel_pt_track_switches(struct evlist *evlist)
> >  {
> >  	const char *sched_switch = "sched:sched_switch";
> > @@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)
> >  
> >  	return 0;
> >  }
> > +#endif
> >  
> >  static void intel_pt_valid_str(char *str, size_t len, u64 valid)
> >  {
> > @@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> >  					ptr->have_sched_switch = 2;
> >  			}
> >  		} else {
> > +#ifdef HAVE_LIBTRACEEVENT
> >  			err = intel_pt_track_switches(evlist);
> >  			if (err == -EPERM)
> >  				pr_debug2("Unable to select sched:sched_switch\n");
> > @@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> >  				return err;
> >  			else
> >  				ptr->have_sched_switch = 1;
> > +#endif
> >  		}
> >  	}
> >  
> > diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> > index 517d928c00e3..90458ca6933f 100644
> > --- a/tools/perf/builtin-annotate.c
> > +++ b/tools/perf/builtin-annotate.c
> > @@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
> >  			.namespaces = perf_event__process_namespaces,
> >  			.attr	= perf_event__process_attr,
> >  			.build_id = perf_event__process_build_id,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  			.tracing_data   = perf_event__process_tracing_data,
> > +#endif
> >  			.id_index	= perf_event__process_id_index,
> >  			.auxtrace_info	= perf_event__process_auxtrace_info,
> >  			.auxtrace	= perf_event__process_auxtrace,
> > diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> > index e254f18986f7..3f4e4dd5abf3 100644
> > --- a/tools/perf/builtin-inject.c
> > +++ b/tools/perf/builtin-inject.c
> > @@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
> >  	return err;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int perf_event__repipe_tracing_data(struct perf_session *session,
> >  					   union perf_event *event)
> >  {
> > @@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
> >  
> >  	return perf_event__process_tracing_data(session, event);
> >  }
> > +#endif
> >  
> >  static int dso__read_build_id(struct dso *dso)
> >  {
> > @@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
> >  	return 0;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int perf_inject__sched_stat(struct perf_tool *tool,
> >  				   union perf_event *event __maybe_unused,
> >  				   struct perf_sample *sample,
> > @@ -836,6 +839,7 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
> >  	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
> >  	return perf_event__repipe(tool, event_sw, &sample_sw, machine);
> >  }
> > +#endif
> >  
> >  static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
> >  {
> > @@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
> >  		inject->tool.mmap	  = perf_event__repipe_mmap;
> >  		inject->tool.mmap2	  = perf_event__repipe_mmap2;
> >  		inject->tool.fork	  = perf_event__repipe_fork;
> > +#ifdef HAVE_LIBTRACEEVENT
> >  		inject->tool.tracing_data = perf_event__repipe_tracing_data;
> > +#endif
> >  	}
> >  
> >  	output_data_offset = perf_session__data_offset(session->evlist);
> > @@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
> >  				evsel->handler = perf_inject__sched_switch;
> >  			} else if (!strcmp(name, "sched:sched_process_exit"))
> >  				evsel->handler = perf_inject__sched_process_exit;
> > +#ifdef HAVE_LIBTRACEEVENT
> >  			else if (!strncmp(name, "sched:sched_stat_", 17))
> >  				evsel->handler = perf_inject__sched_stat;
> > +#endif
> >  		}
> >  	} else if (inject->itrace_synth_opts.vm_time_correlation) {
> >  		session->itrace_synth_opts = &inject->itrace_synth_opts;
> > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> > index ebfab2ca1702..e20656c431a4 100644
> > --- a/tools/perf/builtin-kmem.c
> > +++ b/tools/perf/builtin-kmem.c
> > @@ -35,6 +35,7 @@
> >  #include <regex.h>
> >  
> >  #include <linux/ctype.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  static int	kmem_slab;
> >  static int	kmem_page;
> > diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
> > index 7d9ec1bac1a2..641e739c717c 100644
> > --- a/tools/perf/builtin-kvm.c
> > +++ b/tools/perf/builtin-kvm.c
> > @@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
> >  	return filename;
> >  }
> >  
> > -#ifdef HAVE_KVM_STAT_SUPPORT
> > +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >  
> >  void exit_event_get_key(struct evsel *evsel,
> >  			struct perf_sample *sample,
> > @@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
> >  		pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
> >  }
> >  
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >  static int process_lost_event(struct perf_tool *tool,
> >  			      union perf_event *event __maybe_unused,
> >  			      struct perf_sample *sample __maybe_unused,
> > @@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
> >  	return true;
> >  }
> >  
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >  /* keeping the max events to a modest level to keep
> >   * the processing of samples per mmap smooth.
> >   */
> > @@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
> >  	return kvm_events_report_vcpu(kvm);
> >  }
> >  
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >  static struct evlist *kvm_live_event_list(void)
> >  {
> >  	struct evlist *evlist;
> > @@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
> >  	if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
> >  		return kvm_events_report(&kvm, argc - 1 , argv + 1);
> >  
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >  	if (!strncmp(argv[1], "live", 4))
> >  		return kvm_events_live(&kvm, argc - 1 , argv + 1);
> >  #endif
> > @@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
> >  		return cmd_top(argc, argv);
> >  	else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
> >  		return __cmd_buildid_list(file_name, argc, argv);
> > -#ifdef HAVE_KVM_STAT_SUPPORT
> > +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >  	else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
> >  		return kvm_cmd_stat(file_name, argc, argv);
> >  #endif
> > diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> > index 0e02b8098644..dc59d75180d1 100644
> > --- a/tools/perf/builtin-kwork.c
> > +++ b/tools/perf/builtin-kwork.c
> > @@ -23,6 +23,7 @@
> >  
> >  #include <subcmd/pager.h>
> >  #include <subcmd/parse-options.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  #include <errno.h>
> >  #include <inttypes.h>
> > diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> > index b7fd7ec586fb..7e17374f6c1a 100644
> > --- a/tools/perf/builtin-record.c
> > +++ b/tools/perf/builtin-record.c
> > @@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
> >  	if (rec->no_buildid)
> >  		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (!have_tracepoints(&rec->evlist->core.entries))
> >  		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
> > +#endif
> >  
> >  	if (!rec->opts.branch_stack)
> >  		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
> > diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> > index b6d77d3da64f..2ee2ecca208e 100644
> > --- a/tools/perf/builtin-report.c
> > +++ b/tools/perf/builtin-report.c
> > @@ -67,6 +67,10 @@
> >  #include <unistd.h>
> >  #include <linux/mman.h>
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  struct report {
> >  	struct perf_tool	tool;
> >  	struct perf_session	*session;
> > @@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
> >  			.lost		 = perf_event__process_lost,
> >  			.read		 = process_read_event,
> >  			.attr		 = process_attr,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  			.tracing_data	 = perf_event__process_tracing_data,
> > +#endif
> >  			.build_id	 = perf_event__process_build_id,
> >  			.id_index	 = perf_event__process_id_index,
> >  			.auxtrace_info	 = perf_event__process_auxtrace_info,
> > @@ -1660,6 +1666,7 @@ int cmd_report(int argc, const char **argv)
> >  						  report.range_num);
> >  	}
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (session->tevent.pevent &&
> >  	    tep_set_function_resolver(session->tevent.pevent,
> >  				      machine__resolve_kernel_addr,
> > @@ -1668,7 +1675,7 @@ int cmd_report(int argc, const char **argv)
> >  		       __func__);
> >  		return -1;
> >  	}
> > -
> > +#endif
> >  	sort__setup_elide(stdout);
> >  
> >  	ret = __cmd_report(&report);
> > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> > index d7ec8c1af293..88888fb885c8 100644
> > --- a/tools/perf/builtin-script.c
> > +++ b/tools/perf/builtin-script.c
> > @@ -62,6 +62,9 @@
> >  #include "perf.h"
> >  
> >  #include <linux/ctype.h>
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> >  
> >  static char const		*script_name;
> >  static char const		*generate_script_lang;
> > @@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
> >  		perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
> >  		return;
> >  	}
> > -
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (PRINT_FIELD(TRACE) && sample->raw_data) {
> >  		event_format__fprintf(evsel->tp_format, sample->cpu,
> >  				      sample->raw_data, sample->raw_size, fp);
> >  	}
> > -
> > +#endif
> >  	if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
> >  		perf_sample__fprintf_synth(sample, evsel, fp);
> >  
> > @@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)
> >  
> >  static void setup_scripting(void)
> >  {
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	setup_perl_scripting();
> >  	setup_python_scripting();
> > +#endif
> >  }
> >  
> >  static int flush_scripting(void)
> > @@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
> >  			.fork		 = perf_event__process_fork,
> >  			.attr		 = process_attr,
> >  			.event_update   = perf_event__process_event_update,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  			.tracing_data	 = perf_event__process_tracing_data,
> > +#endif
> >  			.feature	 = process_feature_event,
> >  			.build_id	 = perf_event__process_build_id,
> >  			.id_index	 = perf_event__process_id_index,
> > @@ -4215,6 +4222,7 @@ int cmd_script(int argc, const char **argv)
> >  	else
> >  		symbol_conf.use_callchain = false;
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (session->tevent.pevent &&
> >  	    tep_set_function_resolver(session->tevent.pevent,
> >  				      machine__resolve_kernel_addr,
> > @@ -4223,7 +4231,7 @@ int cmd_script(int argc, const char **argv)
> >  		err = -1;
> >  		goto out_delete;
> >  	}
> > -
> > +#endif
> >  	if (generate_script_lang) {
> >  		struct stat perf_stat;
> >  		int input;
> > @@ -4259,9 +4267,12 @@ int cmd_script(int argc, const char **argv)
> >  			err = -ENOENT;
> >  			goto out_delete;
> >  		}
> > -
> > +#ifdef HAVE_LIBTRACEEVENT
> >  		err = scripting_ops->generate_script(session->tevent.pevent,
> >  						     "perf-script");
> > +#else
> > +		err = scripting_ops->generate_script(NULL, "perf-script");
> > +#endif
> >  		goto out_delete;
> >  	}
> >  
> > diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
> > index c36296bb7637..6c629e7d370a 100644
> > --- a/tools/perf/builtin-timechart.c
> > +++ b/tools/perf/builtin-timechart.c
> > @@ -38,6 +38,7 @@
> >  #include "util/string2.h"
> >  #include "util/tracepoint.h"
> >  #include <linux/err.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
> >  FILE *open_memstream(char **ptr, size_t *sizeloc);
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index 543c379d2a57..6909cd9f48d1 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -15,7 +15,6 @@
> >   */
> >  
> >  #include "util/record.h"
> > -#include <traceevent/event-parse.h>
> >  #include <api/fs/tracing_path.h>
> >  #include <bpf/bpf.h>
> >  #include "util/bpf_map.h"
> > @@ -80,6 +79,10 @@
> >  #include <linux/ctype.h>
> >  #include <perf/mmap.h>
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  #ifndef O_CLOEXEC
> >  # define O_CLOEXEC		02000000
> >  #endif
> > diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> > index a71f491224da..a886929ec6e5 100644
> > --- a/tools/perf/builtin-version.c
> > +++ b/tools/perf/builtin-version.c
> > @@ -82,6 +82,7 @@ static void library_status(void)
> >  	STATUS(HAVE_AIO_SUPPORT, aio);
> >  	STATUS(HAVE_ZSTD_SUPPORT, zstd);
> >  	STATUS(HAVE_LIBPFM, libpfm4);
> > +	STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
> >  }
> >  
> >  int cmd_version(int argc, const char **argv)
> > diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> > index 7af135dea1cd..82bbe0ca858b 100644
> > --- a/tools/perf/perf.c
> > +++ b/tools/perf/perf.c
> > @@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
> >  	{ "report",	cmd_report,	0 },
> >  	{ "bench",	cmd_bench,	0 },
> >  	{ "stat",	cmd_stat,	0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{ "timechart",	cmd_timechart,	0 },
> > +#endif
> >  	{ "top",	cmd_top,	0 },
> >  	{ "annotate",	cmd_annotate,	0 },
> >  	{ "version",	cmd_version,	0 },
> >  	{ "script",	cmd_script,	0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{ "sched",	cmd_sched,	0 },
> > +#endif
> >  #ifdef HAVE_LIBELF_SUPPORT
> >  	{ "probe",	cmd_probe,	0 },
> >  #endif
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{ "kmem",	cmd_kmem,	0 },
> >  	{ "lock",	cmd_lock,	0 },
> > +#endif
> >  	{ "kvm",	cmd_kvm,	0 },
> >  	{ "test",	cmd_test,	0 },
> > -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > +#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
> >  	{ "trace",	cmd_trace,	0 },
> >  #endif
> >  	{ "inject",	cmd_inject,	0 },
> > @@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
> >  	{ "data",	cmd_data,	0 },
> >  	{ "ftrace",	cmd_ftrace,	0 },
> >  	{ "daemon",	cmd_daemon,	0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{ "kwork",	cmd_kwork,	0 },
> > +#endif
> >  };
> >  
> >  struct pager_config {
> > @@ -500,14 +508,18 @@ int main(int argc, const char **argv)
> >  		argv[0] = cmd;
> >  	}
> >  	if (strstarts(cmd, "trace")) {
> > -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > -		setup_path();
> > -		argv[0] = "trace";
> > -		return cmd_trace(argc, argv);
> > -#else
> > +#ifndef HAVE_LIBTRACEEVENT
> > +		fprintf(stderr,
> > +			"trace command not available: missing libtraceevent devel package at build time.\n");
> > +		goto out;
> > +#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
> >  		fprintf(stderr,
> >  			"trace command not available: missing audit-libs devel package at build time.\n");
> >  		goto out;
> > +#else
> > +		setup_path();
> > +		argv[0] = "trace";
> > +		return cmd_trace(argc, argv);
> >  #endif
> >  	}
> >  	/* Look for flags.. */
> > diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
> > index 7d0e33ce6aba..f65625a60704 100644
> > --- a/tools/perf/scripts/python/Perf-Trace-Util/Build
> > +++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
> > @@ -1,3 +1,3 @@
> > -perf-y += Context.o
> > +perf-$(CONFIG_TRACEEVENT) += Context.o
> >  
> >  CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
> > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> > index 11b69023011b..34ebc009e05a 100644
> > --- a/tools/perf/tests/Build
> > +++ b/tools/perf/tests/Build
> > @@ -6,13 +6,13 @@ perf-y += parse-events.o
> >  perf-y += dso-data.o
> >  perf-y += attr.o
> >  perf-y += vmlinux-kallsyms.o
> > -perf-y += openat-syscall.o
> > -perf-y += openat-syscall-all-cpus.o
> > -perf-y += openat-syscall-tp-fields.o
> > -perf-y += mmap-basic.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
> > +perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
> >  perf-y += perf-record.o
> >  perf-y += evsel-roundtrip-name.o
> > -perf-y += evsel-tp-sched.o
> > +perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
> >  perf-y += fdarray.o
> >  perf-y += pmu.o
> >  perf-y += pmu-events.o
> > @@ -30,7 +30,7 @@ perf-y += task-exit.o
> >  perf-y += sw-clock.o
> >  perf-y += mmap-thread-lookup.o
> >  perf-y += thread-maps-share.o
> > -perf-y += switch-tracking.o
> > +perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
> >  perf-y += keep-tracking.o
> >  perf-y += code-reading.o
> >  perf-y += sample-parsing.o
> > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> > index 4c6ae59a4dfd..658449204ce5 100644
> > --- a/tools/perf/tests/builtin-test.c
> > +++ b/tools/perf/tests/builtin-test.c
> > @@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {
> >  
> >  static struct test_suite *generic_tests[] = {
> >  	&suite__vmlinux_matches_kallsyms,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	&suite__openat_syscall_event,
> >  	&suite__openat_syscall_event_on_all_cpus,
> >  	&suite__basic_mmap,
> > +#endif
> >  	&suite__mem,
> >  	&suite__parse_events,
> >  	&suite__expr,
> > @@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
> >  	&suite__dso_data_cache,
> >  	&suite__dso_data_reopen,
> >  	&suite__perf_evsel__roundtrip_name_test,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	&suite__perf_evsel__tp_sched_test,
> >  	&suite__syscall_openat_tp_fields,
> > +#endif
> >  	&suite__attr,
> >  	&suite__hists_link,
> >  	&suite__python_use,
> > @@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
> >  	&suite__thread_maps_share,
> >  	&suite__hists_output,
> >  	&suite__hists_cumulate,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	&suite__switch_tracking,
> > +#endif
> >  	&suite__fdarray__filter,
> >  	&suite__fdarray__add,
> >  	&suite__kmod_path__parse,
> > diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> > index 3440dd2616b0..dcbfb93287e8 100644
> > --- a/tools/perf/tests/parse-events.c
> > +++ b/tools/perf/tests/parse-events.c
> > @@ -46,6 +46,7 @@ static bool kvm_s390_create_vm_valid(void)
> >  }
> >  #endif
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int test__checkevent_tracepoint(struct evlist *evlist)
> >  {
> >  	struct evsel *evsel = evlist__first(evlist);
> > @@ -76,6 +77,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
> >  	}
> >  	return TEST_OK;
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  static int test__checkevent_raw(struct evlist *evlist)
> >  {
> > @@ -222,6 +224,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
> >  	return TEST_OK;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
> >  {
> >  	struct evsel *evsel = evlist__first(evlist);
> > @@ -252,6 +255,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
> >  
> >  	return test__checkevent_tracepoint_multi(evlist);
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  static int test__checkevent_raw_modifier(struct evlist *evlist)
> >  {
> > @@ -453,6 +457,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
> >  	return TEST_OK;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int test__checkevent_list(struct evlist *evlist)
> >  {
> >  	struct evsel *evsel = evlist__first(evlist);
> > @@ -491,6 +496,7 @@ static int test__checkevent_list(struct evlist *evlist)
> >  
> >  	return TEST_OK;
> >  }
> > +#endif
> >  
> >  static int test__checkevent_pmu_name(struct evlist *evlist)
> >  {
> > @@ -762,6 +768,7 @@ static int test__group2(struct evlist *evlist)
> >  	return TEST_OK;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int test__group3(struct evlist *evlist __maybe_unused)
> >  {
> >  	struct evsel *evsel, *leader;
> > @@ -853,6 +860,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> >  
> >  	return TEST_OK;
> >  }
> > +#endif
> >  
> >  static int test__group4(struct evlist *evlist __maybe_unused)
> >  {
> > @@ -1460,6 +1468,7 @@ static int test__sym_event_dc(struct evlist *evlist)
> >  	return TEST_OK;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int count_tracepoints(void)
> >  {
> >  	struct dirent *events_ent;
> > @@ -1513,6 +1522,7 @@ static int test__all_tracepoints(struct evlist *evlist)
> >  
> >  	return test__checkevent_tracepoint_multi(evlist);
> >  }
> > +#endif /* HAVE_LIBTRACEVENT */
> >  
> >  static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
> >  {
> > @@ -1642,6 +1652,7 @@ struct evlist_test {
> >  };
> >  
> >  static const struct evlist_test test__events[] = {
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{
> >  		.name  = "syscalls:sys_enter_openat",
> >  		.check = test__checkevent_tracepoint,
> > @@ -1652,6 +1663,7 @@ static const struct evlist_test test__events[] = {
> >  		.check = test__checkevent_tracepoint_multi,
> >  		/* 1 */
> >  	},
> > +#endif
> >  	{
> >  		.name  = "r1a",
> >  		.check = test__checkevent_raw,
> > @@ -1702,6 +1714,7 @@ static const struct evlist_test test__events[] = {
> >  		.check = test__checkevent_breakpoint_w,
> >  		/* 1 */
> >  	},
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{
> >  		.name  = "syscalls:sys_enter_openat:k",
> >  		.check = test__checkevent_tracepoint_modifier,
> > @@ -1712,6 +1725,7 @@ static const struct evlist_test test__events[] = {
> >  		.check = test__checkevent_tracepoint_multi_modifier,
> >  		/* 3 */
> >  	},
> > +#endif
> >  	{
> >  		.name  = "r1a:kp",
> >  		.check = test__checkevent_raw_modifier,
> > @@ -1757,11 +1771,13 @@ static const struct evlist_test test__events[] = {
> >  		.check = test__checkevent_breakpoint_w_modifier,
> >  		/* 2 */
> >  	},
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{
> >  		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
> >  		.check = test__checkevent_list,
> >  		/* 3 */
> >  	},
> > +#endif
> >  	{
> >  		.name  = "instructions:G",
> >  		.check = test__checkevent_exclude_host_modifier,
> > @@ -1792,11 +1808,13 @@ static const struct evlist_test test__events[] = {
> >  		.check = test__group2,
> >  		/* 9 */
> >  	},
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{
> >  		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
> >  		.check = test__group3,
> >  		/* 0 */
> >  	},
> > +#endif
> >  	{
> >  		.name  = "{cycles:u,instructions:kp}:p",
> >  		.check = test__group4,
> > @@ -1807,11 +1825,13 @@ static const struct evlist_test test__events[] = {
> >  		.check = test__group5,
> >  		/* 2 */
> >  	},
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	{
> >  		.name  = "*:*",
> >  		.check = test__all_tracepoints,
> >  		/* 3 */
> >  	},
> > +#endif
> >  	{
> >  		.name  = "{cycles,cache-misses:G}:H",
> >  		.check = test__group_gh1,
> > diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> > index ab37f588ee8b..612406311e27 100644
> > --- a/tools/perf/util/Build
> > +++ b/tools/perf/util/Build
> > @@ -69,17 +69,17 @@ perf-y += namespaces.o
> >  perf-y += comm.o
> >  perf-y += thread.o
> >  perf-y += thread_map.o
> > -perf-y += trace-event-parse.o
> >  perf-y += parse-events-flex.o
> >  perf-y += parse-events-bison.o
> >  perf-y += pmu.o
> >  perf-y += pmu-flex.o
> >  perf-y += pmu-bison.o
> >  perf-y += pmu-hybrid.o
> > -perf-y += trace-event-read.o
> > -perf-y += trace-event-info.o
> > -perf-y += trace-event-scripting.o
> > -perf-y += trace-event.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
> >  perf-y += svghelper.o
> >  perf-y += sort.o
> >  perf-y += hist.o
> > diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> > index c65cdaf6975e..8031b586e813 100644
> > --- a/tools/perf/util/data-convert-bt.c
> > +++ b/tools/perf/util/data-convert-bt.c
> > @@ -19,7 +19,6 @@
> >  #include <babeltrace/ctf-writer/event-fields.h>
> >  #include <babeltrace/ctf-ir/utils.h>
> >  #include <babeltrace/ctf/events.h>
> > -#include <traceevent/event-parse.h>
> >  #include "asm/bug.h"
> >  #include "data-convert.h"
> >  #include "session.h"
> > @@ -36,6 +35,10 @@
> >  #include "clockid.h"
> >  #include "util/sample.h"
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  #define pr_N(n, fmt, ...) \
> >  	eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
> >  
> > diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
> > index 57db59068cb6..ba9d93ce9463 100644
> > --- a/tools/perf/util/data-convert-json.c
> > +++ b/tools/perf/util/data-convert-json.c
> > @@ -27,6 +27,10 @@
> >  #include "util/thread.h"
> >  #include "util/tool.h"
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  struct convert_json {
> >  	struct perf_tool tool;
> >  	FILE *out;
> > @@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
> >  	}
> >  	output_json_format(out, false, 3, "]");
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (sample->raw_data) {
> >  		int i;
> >  		struct tep_format_field **fields;
> > @@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
> >  			free(fields);
> >  		}
> >  	}
> > -
> > +#endif
> >  	output_json_format(out, false, 2, "}");
> >  	return 0;
> >  }
> > @@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
> >  			.exit           = perf_event__process_exit,
> >  			.fork           = perf_event__process_fork,
> >  			.lost           = perf_event__process_lost,
> > +#ifdef HAVE_LIBTRACEEVENT
> >  			.tracing_data   = perf_event__process_tracing_data,
> > +#endif
> >  			.build_id       = perf_event__process_build_id,
> >  			.id_index       = perf_event__process_id_index,
> >  			.auxtrace_info  = perf_event__process_auxtrace_info,
> > diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> > index fbf3192bced9..590d4e77effc 100644
> > --- a/tools/perf/util/evlist.c
> > +++ b/tools/perf/util/evlist.c
> > @@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
> >  	return evsel;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> >  {
> >  	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
> > @@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> >  
> >  	evlist__add(evlist, evsel);
> >  	return evsel;
> > -};
> > +}
> > +#endif
> >  
> >  int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
> >  {
> > @@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
> >  	return NULL;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
> >  {
> >  	struct evsel *evsel = evsel__newtp(sys, name);
> > @@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
> >  	evlist__add(evlist, evsel);
> >  	return 0;
> >  }
> > +#endif
> >  
> >  struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
> >  {
> > diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
> > index 16734c6756b3..e5b84ead566c 100644
> > --- a/tools/perf/util/evlist.h
> > +++ b/tools/perf/util/evlist.h
> > @@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
> >  {
> >  	return evlist__add_aux_dummy(evlist, true);
> >  }
> > +#ifdef HAVE_LIBTRACEEVENT
> >  struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
> > +#endif
> >  
> >  int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
> >  			 evsel__sb_cb_t cb, void *data);
> > @@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
> >  int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
> >  void evlist__stop_sb_thread(struct evlist *evlist);
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
> > +#endif
> >  
> >  int __evlist__set_tracepoints_handlers(struct evlist *evlist,
> >  				       const struct evsel_str_handler *assocs,
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index 0f617359a82f..ca911856c4b1 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -12,7 +12,6 @@
> >  #include <linux/bitops.h>
> >  #include <api/fs/fs.h>
> >  #include <api/fs/tracing_path.h>
> > -#include <traceevent/event-parse.h>
> >  #include <linux/hw_breakpoint.h>
> >  #include <linux/perf_event.h>
> >  #include <linux/compiler.h>
> > @@ -57,6 +56,10 @@
> >  
> >  #include <linux/ctype.h>
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  struct perf_missing_features perf_missing_features;
> >  
> >  static clockid_t clockid;
> > @@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
> >  			goto out_err;
> >  	}
> >  	evsel->cgrp = cgroup__get(orig->cgrp);
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	evsel->tp_format = orig->tp_format;
> > +#endif
> >  	evsel->handler = orig->handler;
> >  	evsel->core.leader = orig->core.leader;
> >  
> > @@ -479,6 +484,7 @@ struct evsel *evsel__clone(struct evsel *orig)
> >  /*
> >   * Returns pointer with encoded error via <linux/err.h> interface.
> >   */
> > +#ifdef HAVE_LIBTRACEEVENT
> >  struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> >  {
> >  	struct evsel *evsel = zalloc(perf_evsel__object.size);
> > @@ -516,6 +522,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> >  out_err:
> >  	return ERR_PTR(err);
> >  }
> > +#endif
> >  
> >  const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
> >  	"cycles",
> > @@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
> >  	return size;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
> >  {
> >  	return tep_find_field(evsel->tp_format, name);
> > @@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
> >  
> >  	return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
> >  }
> > +#endif
> >  
> >  bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
> >  {
> > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> > index f3485799ddf9..d572be41b960 100644
> > --- a/tools/perf/util/evsel.h
> > +++ b/tools/perf/util/evsel.h
> > @@ -72,7 +72,9 @@ struct evsel {
> >  		char			*name;
> >  		char			*group_name;
> >  		const char		*pmu_name;
> > +#ifdef HAVE_LIBTRACEEVENT
> >  		struct tep_event	*tp_format;
> > +#endif
> >  		char			*filter;
> >  		unsigned long		max_events;
> >  		double			scale;
> > @@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
> >  }
> >  
> >  struct evsel *evsel__clone(struct evsel *orig);
> > -struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> >  
> >  int copy_config_terms(struct list_head *dst, struct list_head *src);
> >  void free_config_terms(struct list_head *config_terms);
> >  
> > +
> > +#ifdef HAVE_LIBTRACEEVENT
> > +struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> > +
> >  /*
> >   * Returns pointer with encoded error via <linux/err.h> interface.
> >   */
> > @@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
> >  {
> >  	return evsel__newtp_idx(sys, name, 0);
> >  }
> > +#endif
> >  
> >  struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  struct tep_event *event_format__new(const char *sys, const char *name);
> > +#endif
> >  
> >  void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
> >  void evsel__exit(struct evsel *evsel);
> > @@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);
> >  
> >  struct perf_sample;
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
> >  u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
> >  
> > @@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
> >  {
> >  	return evsel__rawptr(evsel, sample, name);
> >  }
> > +#endif
> >  
> >  struct tep_format_field;
> >  
> > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> > index 8c2ea8001329..bd22c4932d10 100644
> > --- a/tools/perf/util/evsel_fprintf.c
> > +++ b/tools/perf/util/evsel_fprintf.c
> > @@ -2,7 +2,6 @@
> >  #include <inttypes.h>
> >  #include <stdio.h>
> >  #include <stdbool.h>
> > -#include <traceevent/event-parse.h>
> >  #include "evsel.h"
> >  #include "util/evsel_fprintf.h"
> >  #include "util/event.h"
> > @@ -13,6 +12,10 @@
> >  #include "srcline.h"
> >  #include "dso.h"
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
> >  {
> >  	va_list args;
> > @@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> >  					 term, (u64)evsel->core.attr.sample_freq);
> >  	}
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (details->trace_fields) {
> >  		struct tep_format_field *field;
> >  
> > @@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> >  			field = field->next;
> >  		}
> >  	}
> > +#endif
> >  out:
> >  	fputc('\n', fp);
> >  	return ++printed;
> > diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> > index dc2ae397d400..404d816ca124 100644
> > --- a/tools/perf/util/header.c
> > +++ b/tools/perf/util/header.c
> > @@ -6,6 +6,7 @@
> >  #include <sys/types.h>
> >  #include <byteswap.h>
> >  #include <unistd.h>
> > +#include <regex.h>
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <linux/compiler.h>
> > @@ -55,6 +56,10 @@
> >  #include <linux/ctype.h>
> >  #include <internal/lib.h>
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  /*
> >   * magic2 = "PERFILE2"
> >   * must be a numerical value to let the endianness
> > @@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
> >  	return 0;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int write_tracing_data(struct feat_fd *ff,
> >  			      struct evlist *evlist)
> >  {
> > @@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,
> >  
> >  	return read_tracing_data(ff->fd, &evlist->core.entries);
> >  }
> > +#endif
> >  
> >  static int write_build_id(struct feat_fd *ff,
> >  			  struct evlist *evlist __maybe_unused)
> > @@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
> >  FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
> >  FEAT_PROCESS_STR_FUN(cpuid, cpuid);
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int process_tracing_data(struct feat_fd *ff, void *data)
> >  {
> >  	ssize_t ret = trace_report(ff->fd, data, false);
> >  
> >  	return ret < 0 ? -1 : 0;
> >  }
> > +#endif
> >  
> >  static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
> >  {
> > @@ -3366,7 +3375,9 @@ static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
> >  const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
> >  
> >  const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	FEAT_OPN(TRACING_DATA,	tracing_data,	false),
> > +#endif
> >  	FEAT_OPN(BUILD_ID,	build_id,	false),
> >  	FEAT_OPR(HOSTNAME,	hostname,	false),
> >  	FEAT_OPR(OSRELEASE,	osrelease,	false),
> > @@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
> >  	return ret <= 0 ? -1 : 0;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
> >  {
> >  	struct tep_event *event;
> > @@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
> >  
> >  	return 0;
> >  }
> > +#endif
> >  
> >  int perf_session__read_header(struct perf_session *session, int repipe_fd)
> >  {
> > @@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
> >  		lseek(fd, tmp, SEEK_SET);
> >  	}
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	perf_header__process_sections(header, fd, &session->tevent,
> >  				      perf_file_section__process);
> >  
> >  	if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
> >  		goto out_delete_evlist;
> > +#else
> > +	perf_header__process_sections(header, fd, NULL, perf_file_section__process);
> > +#endif
> >  
> >  	return 0;
> >  out_errno:
> > @@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
> >  	return 0;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  int perf_event__process_tracing_data(struct perf_session *session,
> >  				     union perf_event *event)
> >  {
> > @@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,
> >  
> >  	return size_read + padding;
> >  }
> > +#endif
> >  
> >  int perf_event__process_build_id(struct perf_session *session,
> >  				 union perf_event *event)
> > diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
> > index 2d5e601ba60f..e3861ae62172 100644
> > --- a/tools/perf/util/header.h
> > +++ b/tools/perf/util/header.h
> > @@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
> >  				     union perf_event *event,
> >  				     struct evlist **pevlist);
> >  size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
> > +#ifdef HAVE_LIBTRACEEVENT
> >  int perf_event__process_tracing_data(struct perf_session *session,
> >  				     union perf_event *event);
> > +#endif
> >  int perf_event__process_build_id(struct perf_session *session,
> >  				 union perf_event *event);
> >  bool is_perf_magic(u64 magic);
> > diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> > index e3548ddef254..6d3921627e33 100644
> > --- a/tools/perf/util/intel-pt.c
> > +++ b/tools/perf/util/intel-pt.c
> > @@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
> >  	return 1;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int intel_pt_process_switch(struct intel_pt *pt,
> >  				   struct perf_sample *sample)
> >  {
> > @@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,
> >  
> >  	return machine__set_current_tid(pt->machine, cpu, -1, tid);
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  static int intel_pt_context_switch_in(struct intel_pt *pt,
> >  				      struct perf_sample *sample)
> > @@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
> >  			return err;
> >  	}
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
> >  		err = intel_pt_process_switch(pt, sample);
> > -	else if (event->header.type == PERF_RECORD_ITRACE_START)
> > +	else
> > +#endif
> > +	if (event->header.type == PERF_RECORD_ITRACE_START)
> >  		err = intel_pt_process_itrace_start(pt, event, sample);
> >  	else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
> >  		err = intel_pt_process_aux_output_hw_id(pt, event, sample);
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index 6502cd679f57..21cce83462b3 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -445,6 +445,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
> >  	return ret;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static void tracepoint_error(struct parse_events_error *e, int err,
> >  			     const char *sys, const char *name)
> >  {
> > @@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
> >  	closedir(events_dir);
> >  	return ret;
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  #ifdef HAVE_LIBBPF_SUPPORT
> >  struct __add_bpf_event_param {
> > @@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
> >  		return config_term_common(attr, term, err);
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int config_term_tracepoint(struct perf_event_attr *attr,
> >  				  struct parse_events_term *term,
> >  				  struct parse_events_error *err)
> > @@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
> >  
> >  	return 0;
> >  }
> > +#endif
> >  
> >  static int config_attr(struct perf_event_attr *attr,
> >  		       struct list_head *head,
> > @@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> >  				struct parse_events_error *err,
> >  				struct list_head *head_config)
> >  {
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (head_config) {
> >  		struct perf_event_attr attr;
> >  
> > @@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> >  	else
> >  		return add_tracepoint_event(list, idx, sys, event,
> >  					    err, head_config);
> > +#else
> > +	(void)list;
> > +	(void)idx;
> > +	(void)sys;
> > +	(void)event;
> > +	(void)head_config;
> > +	parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
> > +				strdup("libtraceevent is necessary for tracepoint support"));
> > +	return -1;
> > +#endif
> >  }
> >  
> >  int parse_events_add_numeric(struct parse_events_state *parse_state,
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index 07df7bb7b042..428e72eaafcc 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -18,7 +18,6 @@ struct parse_events_error;
> >  struct option;
> >  struct perf_pmu;
> >  
> > -bool have_tracepoints(struct list_head *evlist);
> >  bool is_event_supported(u8 type, u64 config);
> >  
> >  const char *event_type(int type);
> > diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> > index b5941c74a0d6..728fe2f51759 100644
> > --- a/tools/perf/util/python.c
> > +++ b/tools/perf/util/python.c
> > @@ -417,6 +417,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
> >  	return ret;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static bool is_tracepoint(struct pyrf_event *pevent)
> >  {
> >  	return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
> > @@ -486,14 +487,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
> >  
> >  	return tracepoint_field(pevent, field);
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  static PyObject*
> >  pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
> >  {
> >  	PyObject *obj = NULL;
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (is_tracepoint(pevent))
> >  		obj = get_tracepoint_field(pevent, attr_name);
> > +#endif
> >  
> >  	return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
> >  }
> > diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
> > index 0f5ba28339cf..77544d2c447c 100644
> > --- a/tools/perf/util/scripting-engines/Build
> > +++ b/tools/perf/util/scripting-engines/Build
> > @@ -1,5 +1,7 @@
> > -perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> > -perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> > +ifeq ($(CONFIG_TRACEEVENT),y)
> > +  perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> > +  perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> > +endif
> >  
> >  CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
> >  
> > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> > index d685a7399ee2..fabba21919b8 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-python.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> > @@ -30,6 +30,7 @@
> >  #include <linux/bitmap.h>
> >  #include <linux/compiler.h>
> >  #include <linux/time64.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  #include "../build-id.h"
> >  #include "../counts.h"
> > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> > index 1facd4616317..7c021c6cedb9 100644
> > --- a/tools/perf/util/session.c
> > +++ b/tools/perf/util/session.c
> > @@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
> >  			evlist__delete(session->evlist);
> >  		perf_data__close(session->data);
> >  	}
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	trace_event__cleanup(&session->tevent);
> > +#endif
> >  	free(session);
> >  }
> >  
> > diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> > index be5871ea558f..ee3715e8563b 100644
> > --- a/tools/perf/util/session.h
> > +++ b/tools/perf/util/session.h
> > @@ -33,7 +33,9 @@ struct perf_session {
> >  	struct auxtrace		*auxtrace;
> >  	struct itrace_synth_opts *itrace_synth_opts;
> >  	struct list_head	auxtrace_index;
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	struct trace_event	tevent;
> > +#endif
> >  	struct perf_record_time_conv	time_conv;
> >  	bool			repipe;
> >  	bool			one_mmap;
> > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> > index 2e7330867e2e..c7a97b33e134 100644
> > --- a/tools/perf/util/sort.c
> > +++ b/tools/perf/util/sort.c
> > @@ -22,7 +22,6 @@
> >  #include "srcline.h"
> >  #include "strlist.h"
> >  #include "strbuf.h"
> > -#include <traceevent/event-parse.h>
> >  #include "mem-events.h"
> >  #include "annotate.h"
> >  #include "event.h"
> > @@ -32,6 +31,10 @@
> >  #include <linux/kernel.h>
> >  #include <linux/string.h>
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> >  regex_t		parent_regex;
> >  const char	default_parent_pattern[] = "^sys_|^do_page_fault";
> >  const char	*parent_pattern = default_parent_pattern;
> > @@ -743,6 +746,7 @@ struct sort_entry sort_time = {
> >  
> >  /* --sort trace */
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static char *get_trace_output(struct hist_entry *he)
> >  {
> >  	struct trace_seq seq;
> > @@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
> >  	.se_snprintf    = hist_entry__trace_snprintf,
> >  	.se_width_idx	= HISTC_TRACE,
> >  };
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  /* sort keys for branch stacks */
> >  
> > @@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
> >  	DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
> >  	DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
> >  	DIM(SORT_TRANSACTION, "transaction", sort_transaction),
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	DIM(SORT_TRACE, "trace", sort_trace),
> > +#endif
> >  	DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
> >  	DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
> >  	DIM(SORT_CGROUP, "cgroup", sort_cgroup),
> > @@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt)	\
> >  	return hse->se == &sort_ ## key ;			\
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  MK_SORT_ENTRY_CHK(trace)
> > +#else
> > +bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> > +{
> > +	return false;
> > +}
> > +#endif
> >  MK_SORT_ENTRY_CHK(srcline)
> >  MK_SORT_ENTRY_CHK(srcfile)
> >  MK_SORT_ENTRY_CHK(thread)
> > @@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
> >  	return 0;
> >  }
> >  
> > +#ifndef HAVE_LIBTRACEEVENT
> > +bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> > +{
> > +	return false;
> > +}
> > +bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
> > +				     struct hists *hists __maybe_unused)
> > +{
> > +	return false;
> > +}
> > +#else
> >  struct hpp_dynamic_entry {
> >  	struct perf_hpp_fmt hpp;
> >  	struct evsel *evsel;
> > @@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
> >  
> >  	return hde;
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> >  {
> > @@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> >  		new_hse = memdup(hse, sizeof(*hse));
> >  		if (new_hse)
> >  			new_fmt = &new_hse->hpp;
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	} else if (perf_hpp__is_dynamic_entry(fmt)) {
> >  		struct hpp_dynamic_entry *hde, *new_hde;
> >  
> > @@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> >  		new_hde = memdup(hde, sizeof(*hde));
> >  		if (new_hde)
> >  			new_fmt = &new_hde->hpp;
> > +#endif
> >  	} else {
> >  		new_fmt = memdup(fmt, sizeof(*fmt));
> >  	}
> > @@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
> >  	return evsel;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  static int __dynamic_dimension__add(struct evsel *evsel,
> >  				    struct tep_format_field *field,
> >  				    bool raw_trace, int level)
> > @@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
> >  	}
> >  	return ret;
> >  }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >  			     int level)
> >  {
> >  	char *str, *event_name, *field_name, *opt_name;
> >  	struct evsel *evsel;
> > -	struct tep_format_field *field;
> >  	bool raw_trace = symbol_conf.raw_trace;
> >  	int ret = 0;
> >  
> > @@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >  		raw_trace = true;
> >  	}
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (!strcmp(field_name, "trace_fields")) {
> >  		ret = add_all_dynamic_fields(evlist, raw_trace, level);
> >  		goto out;
> > @@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >  		ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
> >  		goto out;
> >  	}
> > +#endif
> >  
> >  	evsel = find_evsel(evlist, event_name);
> >  	if (evsel == NULL) {
> > @@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >  		goto out;
> >  	}
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (!strcmp(field_name, "*")) {
> >  		ret = add_evsel_fields(evsel, raw_trace, level);
> >  	} else {
> > -		field = tep_find_any_field(evsel->tp_format, field_name);
> > +		struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
> > +
> >  		if (field == NULL) {
> >  			pr_debug("Cannot find event field for %s.%s\n",
> >  				 event_name, field_name);
> > @@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >  
> >  		ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
> >  	}
> > +#else
> > +	(void)level;
> > +	(void)raw_trace;
> > +#endif /* HAVE_LIBTRACEEVENT */
> >  
> >  out:
> >  	free(str);
> > @@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> >  	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> >  		struct sort_dimension *sd = &common_sort_dimensions[i];
> >  
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >  			continue;
> >  
> >  		for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
> > -			if (!strcmp(dynamic_headers[j], sd->name))
> > +			if (sd->name && !strcmp(dynamic_headers[j], sd->name))
> >  				sort_dimension_add_dynamic_header(sd);
> >  		}
> >  
> > @@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> >  	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> >  		struct sort_dimension *sd = &bstack_sort_dimensions[i];
> >  
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >  			continue;
> >  
> >  		if (sort__mode != SORT_MODE__BRANCH)
> > @@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> >  	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> >  		struct sort_dimension *sd = &memory_sort_dimensions[i];
> >  
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >  			continue;
> >  
> >  		if (sort__mode != SORT_MODE__MEMORY)
> > @@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> >  	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> >  		struct sort_dimension *sd = &common_sort_dimensions[i];
> >  
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >  			continue;
> >  
> >  		return __sort_dimension__add_output(list, sd);
> > @@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> >  	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> >  		struct sort_dimension *sd = &bstack_sort_dimensions[i];
> >  
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >  			continue;
> >  
> >  		if (sort__mode != SORT_MODE__BRANCH)
> > @@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> >  	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> >  		struct sort_dimension *sd = &memory_sort_dimensions[i];
> >  
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >  			continue;
> >  
> >  		if (sort__mode != SORT_MODE__MEMORY)
> > @@ -3508,6 +3545,9 @@ void reset_output_field(void)
> >  
> >  static void add_key(struct strbuf *sb, const char *str, int *llen)
> >  {
> > +	if (!str)
> > +		return;
> > +
> >  	if (*llen >= 75) {
> >  		strbuf_addstr(sb, "\n\t\t\t ");
> >  		*llen = INDENT;
> > diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
> > index 0645795ff080..3ab6a92b1a6d 100644
> > --- a/tools/perf/util/synthetic-events.c
> > +++ b/tools/perf/util/synthetic-events.c
> > @@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
> >  	return err;
> >  }
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
> >  					perf_event__handler_t process)
> >  {
> > @@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
> >  
> >  	return aligned_size;
> >  }
> > +#endif
> >  
> >  int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
> >  				    perf_event__handler_t process, struct machine *machine)
> > @@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> >  	}
> >  	ret += err;
> >  
> > +#ifdef HAVE_LIBTRACEEVENT
> >  	if (have_tracepoints(&evlist->core.entries)) {
> >  		int fd = perf_data__fd(data);
> >  
> > @@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> >  		}
> >  		ret += err;
> >  	}
> > +#else
> > +	(void)data;
> > +#endif
> >  
> >  	return ret;
> >  }
> > diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
> > index c9c83a40647c..2d3c2576bab7 100644
> > --- a/tools/perf/util/trace-event-parse.c
> > +++ b/tools/perf/util/trace-event-parse.c
> > @@ -11,6 +11,8 @@
> >  #include "trace-event.h"
> >  
> >  #include <linux/ctype.h>
> > +#include <linux/kernel.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  static int get_common_field(struct scripting_context *context,
> >  			    int *offset, int *size, const char *type)
> > diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> > index 43146a4ce2fb..1162c49b8082 100644
> > --- a/tools/perf/util/trace-event-read.c
> > +++ b/tools/perf/util/trace-event-read.c
> > @@ -11,6 +11,7 @@
> >  #include <sys/stat.h>
> >  #include <sys/wait.h>
> >  #include <sys/mman.h>
> > +#include <traceevent/event-parse.h>
> >  #include <fcntl.h>
> >  #include <unistd.h>
> >  #include <errno.h>
> > diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> > index 636a010d929b..56175c53f9af 100644
> > --- a/tools/perf/util/trace-event-scripting.c
> > +++ b/tools/perf/util/trace-event-scripting.c
> > @@ -9,6 +9,7 @@
> >  #include <stdlib.h>
> >  #include <string.h>
> >  #include <errno.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  #include "debug.h"
> >  #include "trace-event.h"
> > diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
> > index b3ee651e3d91..8ad75b31e09b 100644
> > --- a/tools/perf/util/trace-event.c
> > +++ b/tools/perf/util/trace-event.c
> > @@ -1,5 +1,4 @@
> >  // SPDX-License-Identifier: GPL-2.0
> > -
> >  #include <stdio.h>
> >  #include <unistd.h>
> >  #include <stdlib.h>
> > diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> > index 8f39f5bcb2c2..add6c5d9531c 100644
> > --- a/tools/perf/util/trace-event.h
> > +++ b/tools/perf/util/trace-event.h
> > @@ -2,9 +2,11 @@
> >  #ifndef _PERF_UTIL_TRACE_EVENT_H
> >  #define _PERF_UTIL_TRACE_EVENT_H
> >  
> > -#include <traceevent/event-parse.h>
> > -#include "parse-events.h"
> > +#include <stdbool.h>
> > +#include <stdio.h>
> > +#include <linux/types.h>
> >  
> > +struct evlist;
> >  struct machine;
> >  struct perf_sample;
> >  union perf_event;
> > @@ -18,6 +20,11 @@ struct trace_event {
> >  	struct tep_plugin_list	*plugin_list;
> >  };
> >  
> > +typedef char *(tep_func_resolver_t)(void *priv,
> > +				    unsigned long long *addrp, char **modp);
> > +
> > +bool have_tracepoints(struct list_head *evlist);
> > +
> >  int trace_event__init(struct trace_event *t);
> >  void trace_event__cleanup(struct trace_event *t);
> >  int trace_event__register_resolver(struct machine *machine,
> > -- 
> > 2.39.0.rc0.267.gcb52ba06e7-goog
> 
> -- 
> 
> - Arnaldo
Arnaldo Carvalho de Melo Dec. 6, 2022, 4:23 p.m. UTC | #3
Em Tue, Dec 06, 2022 at 01:20:12PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 01:15:04PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Mon, Dec 05, 2022 at 02:59:39PM -0800, Ian Rogers escreveu:
> > > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > > build, don't compile in libtraceevent and libtracefs support. This
> > > also disables CONFIG_TRACE that controls "perf
> > > trace". CONFIG_TRACEEVENT is used to control enablement in
> > > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > > kmem, kwork, lock, sched and timechart are removed. The majority of
> > > commands continue to work including "perf test".
> > 
> > Had just this .rej and I fixed it up manually, testing now:
> 
> Investigating:
> 
> [acme@quaco perf]$ rpm -q libtraceevent-devel
> libtraceevent-devel-1.5.3-2.fc36.x86_64
> [acme@quaco perf]$
> [acme@quaco perf]$ grep -i traceevent /tmp/build/perf/FEATURE-DUMP
> feature-libtraceevent=1
> [acme@quaco perf]$
> 
> [acme@quaco perf]$ alias m
> alias m='rm -rf ~/libexec/perf-core/ ; perf stat -e cycles:u,instructions:u make -k BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> [acme@quaco perf]$
> 
> [acme@quaco perf]$ rpm -ql libtraceevent-devel | grep \.h$ | xargs grep tep_print_flag_sym
> /usr/include/traceevent/event-parse.h:struct tep_print_flag_sym {
> /usr/include/traceevent/event-parse.h:	struct tep_print_flag_sym	*next;
> /usr/include/traceevent/event-parse.h:	struct tep_print_flag_sym	*flags;
> /usr/include/traceevent/event-parse.h:	struct tep_print_flag_sym	*symbols;
> [acme@quaco perf]$
> 
> util/scripting-engines/trace-event-perl.c:104:43: error: ‘struct tep_print_flag_sym’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
>   104 | static void define_symbolic_values(struct tep_print_flag_sym *field,
>       |                                           ^~~~~~~~~~~~~~~~~~
> util/scripting-engines/trace-event-perl.c: In function ‘define_symbolic_values’:

This cured it, folding into your patch:

diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
index 5b602b6d46854133..0bacb49408f84adf 100644
--- a/tools/perf/util/scripting-engines/trace-event-perl.c
+++ b/tools/perf/util/scripting-engines/trace-event-perl.c
@@ -27,6 +27,7 @@
 #include <errno.h>
 #include <linux/bitmap.h>
 #include <linux/time64.h>
+#include <traceevent/event-parse.h>
 
 #include <stdbool.h>
 /* perl needs the following define, right after including stdbool.h */
Arnaldo Carvalho de Melo Dec. 6, 2022, 4:30 p.m. UTC | #4
Em Tue, Dec 06, 2022 at 01:23:45PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 01:20:12PM -0300, Arnaldo Carvalho de Melo escreveu:
> > 
> > util/scripting-engines/trace-event-perl.c:104:43: error: ‘struct tep_print_flag_sym’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
> >   104 | static void define_symbolic_values(struct tep_print_flag_sym *field,
> >       |                                           ^~~~~~~~~~~~~~~~~~
> > util/scripting-engines/trace-event-perl.c: In function ‘define_symbolic_values’:
> 
> This cured it, folding into your patch:
> 
> diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> index 5b602b6d46854133..0bacb49408f84adf 100644
> --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> @@ -27,6 +27,7 @@
>  #include <errno.h>
>  #include <linux/bitmap.h>
>  #include <linux/time64.h>
> +#include <traceevent/event-parse.h>
>  
>  #include <stdbool.h>
>  /* perl needs the following define, right after including stdbool.h */

Building with NO_LIBTRACEEVENT=1 I get:

  CC      /tmp/build/perf/util/cap.o
util/data-convert-bt.c: In function ‘get_tracepoint_field_type’:
util/data-convert-bt.c:194:36: error: invalid use of undefined type ‘struct tep_format_field’
  194 |         unsigned long flags = field->flags;
      |                                    ^~
util/data-convert-bt.c:196:21: error: ‘TEP_FIELD_IS_STRING’ undeclared (first use in this function)
  196 |         if (flags & TEP_FIELD_IS_STRING)
      |                     ^~~~~~~~~~~~~~~~~~~
util/data-convert-bt.c:196:21: note: each undeclared identifier is reported only once for each function it appears in
util/data-convert-bt.c:199:23: error: ‘TEP_FIELD_IS_SIGNED’ undeclared (first use in this function)
  199 |         if (!(flags & TEP_FIELD_IS_SIGNED)) {
      |                       ^~~~~~~~~~~~~~~~~~~
util/data-convert-bt.c:201:29: error: ‘TEP_FIELD_IS_LONG’ undeclared (first use in this function)
  201 |                 if (flags & TEP_FIELD_IS_LONG || flags & TEP_FIELD_IS_POINTER)
      |                             ^~~~~~~~~~~~~~~~~


working on it...
Arnaldo Carvalho de Melo Dec. 6, 2022, 4:37 p.m. UTC | #5
Em Tue, Dec 06, 2022 at 01:30:33PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 01:23:45PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Tue, Dec 06, 2022 at 01:20:12PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > 
> > > util/scripting-engines/trace-event-perl.c:104:43: error: ‘struct tep_print_flag_sym’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
> > >   104 | static void define_symbolic_values(struct tep_print_flag_sym *field,
> > >       |                                           ^~~~~~~~~~~~~~~~~~
> > > util/scripting-engines/trace-event-perl.c: In function ‘define_symbolic_values’:
> > 
> > This cured it, folding into your patch:
> > 
> > diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> > index 5b602b6d46854133..0bacb49408f84adf 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> > @@ -27,6 +27,7 @@
> >  #include <errno.h>
> >  #include <linux/bitmap.h>
> >  #include <linux/time64.h>
> > +#include <traceevent/event-parse.h>
> >  
> >  #include <stdbool.h>
> >  /* perl needs the following define, right after including stdbool.h */
> 
> Building with NO_LIBTRACEEVENT=1 I get:
> 
>   CC      /tmp/build/perf/util/cap.o
> util/data-convert-bt.c: In function ‘get_tracepoint_field_type’:
> util/data-convert-bt.c:194:36: error: invalid use of undefined type ‘struct tep_format_field’
>   194 |         unsigned long flags = field->flags;
>       |                                    ^~
> util/data-convert-bt.c:196:21: error: ‘TEP_FIELD_IS_STRING’ undeclared (first use in this function)
>   196 |         if (flags & TEP_FIELD_IS_STRING)
>       |                     ^~~~~~~~~~~~~~~~~~~
> util/data-convert-bt.c:196:21: note: each undeclared identifier is reported only once for each function it appears in
> util/data-convert-bt.c:199:23: error: ‘TEP_FIELD_IS_SIGNED’ undeclared (first use in this function)
>   199 |         if (!(flags & TEP_FIELD_IS_SIGNED)) {
>       |                       ^~~~~~~~~~~~~~~~~~~
> util/data-convert-bt.c:201:29: error: ‘TEP_FIELD_IS_LONG’ undeclared (first use in this function)
>   201 |                 if (flags & TEP_FIELD_IS_LONG || flags & TEP_FIELD_IS_POINTER)
>       |                             ^~~~~~~~~~~~~~~~~
> 
> 
> working on it...

Below makes it progress a bit, now to look at the perl Context stuff.

diff --git a/tools/perf/builtin-data.c b/tools/perf/builtin-data.c
index c22d82d2a73c4d96..b2a9a3b7f68d7f6f 100644
--- a/tools/perf/builtin-data.c
+++ b/tools/perf/builtin-data.c
@@ -78,12 +78,13 @@ static int cmd_data_convert(int argc, const char **argv)
 		return bt_convert__perf2json(input_name, to_json, &opts);
 
 	if (to_ctf) {
-#ifdef HAVE_LIBBABELTRACE_SUPPORT
+#if defined(HAVE_LIBBABELTRACE_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 		return bt_convert__perf2ctf(input_name, to_ctf, &opts);
 #else
 		pr_err("The libbabeltrace support is not compiled in. perf should be "
 		       "compiled with environment variables LIBBABELTRACE=1 and "
-		       "LIBBABELTRACE_DIR=/path/to/libbabeltrace/\n");
+		       "LIBBABELTRACE_DIR=/path/to/libbabeltrace/.\n"
+		       "Check also if libbtraceevent devel files are available.\n");
 		return -1;
 #endif
 	}
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index c7993fb025cf180f..255bc751d19452f2 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -189,7 +189,10 @@ perf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
 perf-$(CONFIG_LIBUNWIND_X86)      += libunwind/x86_32.o
 perf-$(CONFIG_LIBUNWIND_AARCH64)  += libunwind/arm64.o
 
-perf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
+ifeq ($(CONFIG_TRACEEVENT),y)
+  perf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
+endif
+
 perf-y += data-convert-json.o
 
 perf-y += scripting-engines/
Arnaldo Carvalho de Melo Dec. 6, 2022, 4:41 p.m. UTC | #6
Em Tue, Dec 06, 2022 at 01:37:27PM -0300, Arnaldo Carvalho de Melo escreveu:
> 
> Below makes it progress a bit, now to look at the perl Context stuff.
> 

Add this to the mix:

diff --git a/tools/perf/Build b/tools/perf/Build
index edafe3cb3d075f00..c11ac63be7f755df 100644
--- a/tools/perf/Build
+++ b/tools/perf/Build
@@ -52,7 +52,7 @@ CFLAGS_builtin-report.o          += -DDOCDIR="BUILD_STR($(srcdir_SQ)/Documentation)"
 perf-y += util/
 perf-y += arch/
 perf-y += ui/
-perf-y += scripts/
+perf-$(CONFIG_TRACEEVENT) += scripts/
 perf-$(CONFIG_TRACE) += trace/beauty/

 gtk-y += ui/gtk/


 Now to look at the BUILD_BPF_SKEL=1 kaboom:

 [acme@quaco perf]$ alias m
alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
[acme@quaco perf]$ m
make: Entering directory '/home/acme/git/perf/tools/perf'
  BUILD:   Doing 'make -j8' parallel build
  <SNIP>
/usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
/home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
/usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
/home/acme/git/perf/tools/perf/util/bpf_lock_contention.c:156: undefined reference to `is_lock_function'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile.perf:674: /tmp/build/perf/perf] Error 1
make[1]: *** [Makefile.perf:236: sub-make] Error 2
make: *** [Makefile:113: install-bin] Error 2
make: Leaving directory '/home/acme/git/perf/tools/perf'
[acme@quaco perf]$
Arnaldo Carvalho de Melo Dec. 6, 2022, 5:01 p.m. UTC | #7
Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
>  Now to look at the BUILD_BPF_SKEL=1 kaboom:
> 
>  [acme@quaco perf]$ alias m
> alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> [acme@quaco perf]$ m
> make: Entering directory '/home/acme/git/perf/tools/perf'
>   BUILD:   Doing 'make -j8' parallel build
>   <SNIP>
> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
> /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
> /home/acme/git/perf/tools/perf/util/bpf_lock_contention.c:156: undefined reference to `is_lock_function'
> collect2: error: ld returned 1 exit status

I'm adding this as a prep patch, before the 'use libtraceevent from the
system' one:

commit 8beb33f2d34d4b37c6638004fef1345bc97804fe
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Tue Dec 6 13:49:04 2022 -0300

    machine: Adopt is_lock_function() from builtin-lock.c
    
    It is used in bpf_lock_contention.c and builtin-lock.c will be made
    CONFIG_LIBTRACEEVENT=y conditional, so move it to machine.c, that is
    always available.
    
    This makes those 4 global variables for sched and lock text start and
    end to move to 'struct machine' too, as conceivably we can have that
    info for several machine instances, say some 'perf diff' like tool.
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: bpf@vger.kernel.org
    Link: http://lore.kernel.org/lkml/
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index 0d280093b19a55d4..15ce6358f12799e0 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -67,11 +67,6 @@ static enum {
 	LOCK_AGGR_CALLER,
 } aggr_mode = LOCK_AGGR_ADDR;
 
-static u64 sched_text_start;
-static u64 sched_text_end;
-static u64 lock_text_start;
-static u64 lock_text_end;
-
 static struct thread_stat *thread_stat_find(u32 tid)
 {
 	struct rb_node *node;
@@ -854,55 +849,6 @@ static int report_lock_release_event(struct evsel *evsel,
 	return 0;
 }
 
-bool is_lock_function(struct machine *machine, u64 addr)
-{
-	if (!sched_text_start) {
-		struct map *kmap;
-		struct symbol *sym;
-
-		sym = machine__find_kernel_symbol_by_name(machine,
-							  "__sched_text_start",
-							  &kmap);
-		if (!sym) {
-			/* to avoid retry */
-			sched_text_start = 1;
-			return false;
-		}
-
-		sched_text_start = kmap->unmap_ip(kmap, sym->start);
-
-		/* should not fail from here */
-		sym = machine__find_kernel_symbol_by_name(machine,
-							  "__sched_text_end",
-							  &kmap);
-		sched_text_end = kmap->unmap_ip(kmap, sym->start);
-
-		sym = machine__find_kernel_symbol_by_name(machine,
-							  "__lock_text_start",
-							  &kmap);
-		lock_text_start = kmap->unmap_ip(kmap, sym->start);
-
-		sym = machine__find_kernel_symbol_by_name(machine,
-							  "__lock_text_end",
-							  &kmap);
-		lock_text_end = kmap->unmap_ip(kmap, sym->start);
-	}
-
-	/* failed to get kernel symbols */
-	if (sched_text_start == 1)
-		return false;
-
-	/* mutex and rwsem functions are in sched text section */
-	if (sched_text_start <= addr && addr < sched_text_end)
-		return true;
-
-	/* spinlock functions are in lock text section */
-	if (lock_text_start <= addr && addr < lock_text_end)
-		return true;
-
-	return false;
-}
-
 static int get_symbol_name_offset(struct map *map, struct symbol *sym, u64 ip,
 				  char *buf, int size)
 {
@@ -961,7 +907,7 @@ static int lock_contention_caller(struct evsel *evsel, struct perf_sample *sampl
 			goto next;
 
 		sym = node->ms.sym;
-		if (sym && !is_lock_function(machine, node->ip)) {
+		if (sym && !machine__is_lock_function(machine, node->ip)) {
 			get_symbol_name_offset(node->ms.map, sym, node->ip,
 					       buf, size);
 			return 0;
@@ -1007,7 +953,7 @@ static u64 callchain_id(struct evsel *evsel, struct perf_sample *sample)
 		if (++skip <= stack_skip)
 			goto next;
 
-		if (node->ms.sym && is_lock_function(machine, node->ip))
+		if (node->ms.sym && machine__is_lock_function(machine, node->ip))
 			goto next;
 
 		hash ^= hash_long((unsigned long)node->ip, 64);
diff --git a/tools/perf/util/bpf_lock_contention.c b/tools/perf/util/bpf_lock_contention.c
index 4db9ad3d50c41ac7..f4ebb9a2e3809a7f 100644
--- a/tools/perf/util/bpf_lock_contention.c
+++ b/tools/perf/util/bpf_lock_contention.c
@@ -153,7 +153,7 @@ int lock_contention_read(struct lock_contention *con)
 		bpf_map_lookup_elem(stack, &key, stack_trace);
 
 		/* skip lock internal functions */
-		while (is_lock_function(machine, stack_trace[idx]) &&
+		while (machine__is_lock_function(machine, stack_trace[idx]) &&
 		       idx < con->max_stack - 1)
 			idx++;
 
diff --git a/tools/perf/util/lock-contention.h b/tools/perf/util/lock-contention.h
index e3c061b1795ba377..a2346875098dca03 100644
--- a/tools/perf/util/lock-contention.h
+++ b/tools/perf/util/lock-contention.h
@@ -145,6 +145,4 @@ static inline int lock_contention_read(struct lock_contention *con __maybe_unuse
 
 #endif  /* HAVE_BPF_SKEL */
 
-bool is_lock_function(struct machine *machine, u64 addr);
-
 #endif  /* PERF_LOCK_CONTENTION_H */
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 76316e459c3de9c4..803c9d1803dd26ef 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -3336,3 +3336,43 @@ int machine__for_each_kernel_map(struct machine *machine, machine__map_t fn, voi
 	}
 	return err;
 }
+
+bool machine__is_lock_function(struct machine *machine, u64 addr)
+{
+	if (!machine->sched.text_start) {
+		struct map *kmap;
+		struct symbol *sym = machine__find_kernel_symbol_by_name(machine, "__sched_text_start", &kmap);
+
+		if (!sym) {
+			/* to avoid retry */
+			machine->sched.text_start = 1;
+			return false;
+		}
+
+		machine->sched.text_start = kmap->unmap_ip(kmap, sym->start);
+
+		/* should not fail from here */
+		sym = machine__find_kernel_symbol_by_name(machine, "__sched_text_end", &kmap);
+		machine->sched.text_end = kmap->unmap_ip(kmap, sym->start);
+
+		sym = machine__find_kernel_symbol_by_name(machine, "__lock_text_start", &kmap);
+		machine->lock.text_start = kmap->unmap_ip(kmap, sym->start);
+
+		sym = machine__find_kernel_symbol_by_name(machine, "__lock_text_end", &kmap);
+		machine->lock.text_end = kmap->unmap_ip(kmap, sym->start);
+	}
+
+	/* failed to get kernel symbols */
+	if (machine->sched.text_start == 1)
+		return false;
+
+	/* mutex and rwsem functions are in sched text section */
+	if (machine->sched.text_start <= addr && addr < machine->sched.text_end)
+		return true;
+
+	/* spinlock functions are in lock text section */
+	if (machine->lock.text_start <= addr && addr < machine->lock.text_end)
+		return true;
+
+	return false;
+}
diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h
index 6267c1d6f2321128..d034ecaf89c193ea 100644
--- a/tools/perf/util/machine.h
+++ b/tools/perf/util/machine.h
@@ -56,6 +56,10 @@ struct machine {
 	struct maps	  *kmaps;
 	struct map	  *vmlinux_map;
 	u64		  kernel_start;
+	struct {
+		u64	  text_start;
+		u64	  text_end;
+	} sched, lock;
 	pid_t		  *current_tid;
 	size_t		  current_tid_sz;
 	union { /* Tool specific area */
@@ -212,6 +216,7 @@ static inline bool machine__is_host(struct machine *machine)
 	return machine ? machine->pid == HOST_KERNEL_ID : false;
 }
 
+bool machine__is_lock_function(struct machine *machine, u64 addr);
 bool machine__is(struct machine *machine, const char *arch);
 bool machine__normalized_is(struct machine *machine, const char *arch);
 int machine__nr_cpus_avail(struct machine *machine);
Arnaldo Carvalho de Melo Dec. 6, 2022, 5:07 p.m. UTC | #8
Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
> >  Now to look at the BUILD_BPF_SKEL=1 kaboom:
> > 
> >  [acme@quaco perf]$ alias m
> > alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> > [acme@quaco perf]$ m
> > make: Entering directory '/home/acme/git/perf/tools/perf'
> >   BUILD:   Doing 'make -j8' parallel build
> >   <SNIP>
> > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
> > /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
> > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':

For that bpf_kwork.c see below. Now to see why the python binding is not
building, I guess is unrelated and you have some other outstanding
patch?

[acme@quaco perf]$ git diff
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 255bc751d19452f2..c97093f47c990b45 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -153,8 +153,12 @@ perf-$(CONFIG_PERF_BPF_SKEL) += bpf_counter.o
 perf-$(CONFIG_PERF_BPF_SKEL) += bpf_counter_cgroup.o
 perf-$(CONFIG_PERF_BPF_SKEL) += bpf_ftrace.o
 perf-$(CONFIG_PERF_BPF_SKEL) += bpf_off_cpu.o
-perf-$(CONFIG_PERF_BPF_SKEL) += bpf_kwork.o
 perf-$(CONFIG_PERF_BPF_SKEL) += bpf_lock_contention.o
+
+ifeq ($(CONFIG_TRACEEVENT),y)
+  perf-$(CONFIG_PERF_BPF_SKEL) += bpf_kwork.o
+endif
+
 perf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
 perf-$(CONFIG_LIBELF) += symbol-elf.o
 perf-$(CONFIG_LIBELF) += probe-file.o
[acme@quaco perf]$ m
make: Entering directory '/home/acme/git/perf/tools/perf'
  BUILD:   Doing 'make -j8' parallel build
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/msr-index.h' differs from latest version at 'arch/x86/include/asm/msr-index.h'
diff -u tools/arch/x86/include/asm/msr-index.h arch/x86/include/asm/msr-index.h
Warning: Kernel ABI header at 'tools/arch/arm64/include/uapi/asm/perf_regs.h' differs from latest version at 'arch/arm64/include/uapi/asm/perf_regs.h'
diff -u tools/arch/arm64/include/uapi/asm/perf_regs.h arch/arm64/include/uapi/asm/perf_regs.h
Warning: Kernel ABI header at 'tools/arch/arm64/include/asm/cputype.h' differs from latest version at 'arch/arm64/include/asm/cputype.h'
diff -u tools/arch/arm64/include/asm/cputype.h arch/arm64/include/asm/cputype.h
Warning: Kernel ABI header at 'tools/perf/arch/powerpc/entry/syscalls/syscall.tbl' differs from latest version at 'arch/powerpc/kernel/syscalls/syscall.tbl'
diff -u tools/perf/arch/powerpc/entry/syscalls/syscall.tbl arch/powerpc/kernel/syscalls/syscall.tbl
Makefile.config:1138: No openjdk development package found, please install JDK package, e.g. openjdk-8-jdk, java-1.8.0-openjdk-devel

  INSTALL libsubcmd_headers
  INSTALL libapi_headers
  INSTALL libsymbol_headers
  INSTALL libperf_headers
  GEN     /tmp/build/perf/python/perf.so
  INSTALL libbpf_headers
  INSTALL binaries
  INSTALL tests
  INSTALL perf-read-vdso32
  INSTALL libexec
  INSTALL bpf-examples
  INSTALL perf-archive
  INSTALL perf-iostat
  INSTALL strace/groups
  INSTALL perl-scripts
  INSTALL python-scripts
  INSTALL dlfilters
  INSTALL perf_completion-script
  INSTALL perf-tip
make: Leaving directory '/home/acme/git/perf/tools/perf'
 14: 'import perf' in python                                         : FAILED!
[acme@quaco perf]$
Arnaldo Carvalho de Melo Dec. 6, 2022, 5:13 p.m. UTC | #9
Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
> > >  Now to look at the BUILD_BPF_SKEL=1 kaboom:
> > > 
> > >  [acme@quaco perf]$ alias m
> > > alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> > > [acme@quaco perf]$ m
> > > make: Entering directory '/home/acme/git/perf/tools/perf'
> > >   BUILD:   Doing 'make -j8' parallel build
> > >   <SNIP>
> > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
> > > /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
> > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
> 
> For that bpf_kwork.c see below. Now to see why the python binding is not
> building, I guess is unrelated and you have some other outstanding
> patch?

Its related:

[acme@quaco perf]$ perf test -v python
Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
 14: 'import perf' in python                                         :
--- start ---
test child forked, pid 1669872
python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
test child finished with -1
---- end ----
'import perf' in python: FAILED!
[acme@quaco perf]$

Now checking why NO_LIBTRACEEVENT=1 fails with this...

[acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
tools/perf/util/trace-event.c:	tep_unload_plugins(t->plugin_list, t->pevent);
[acme@quaco perf]$

[acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
util/trace-event.c
[acme@quaco perf]$

Trying to fix...
Arnaldo Carvalho de Melo Dec. 6, 2022, 5:31 p.m. UTC | #10
Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > >  Now to look at the BUILD_BPF_SKEL=1 kaboom:
> > > > 
> > > >  [acme@quaco perf]$ alias m
> > > > alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> > > > [acme@quaco perf]$ m
> > > > make: Entering directory '/home/acme/git/perf/tools/perf'
> > > >   BUILD:   Doing 'make -j8' parallel build
> > > >   <SNIP>
> > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
> > > > /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
> > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
> > 
> > For that bpf_kwork.c see below. Now to see why the python binding is not
> > building, I guess is unrelated and you have some other outstanding
> > patch?
> 
> Its related:
> 
> [acme@quaco perf]$ perf test -v python
> Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
>  14: 'import perf' in python                                         :
> --- start ---
> test child forked, pid 1669872
> python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
> test child finished with -1
> ---- end ----
> 'import perf' in python: FAILED!
> [acme@quaco perf]$
> 
> Now checking why NO_LIBTRACEEVENT=1 fails with this...
> 
> [acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
> tools/perf/util/trace-event.c:	tep_unload_plugins(t->plugin_list, t->pevent);
> [acme@quaco perf]$
> 
> [acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
> util/trace-event.c
> [acme@quaco perf]$
> 
> Trying to fix...

I'm missing some detail, this isn't working, util/trace-event.c is still
being built and linked.

The python binding should be usable without tracepoints, in fact its
first usage was just to have access to the perf metaevents, see 
tools/perf/python/twatch.py.

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index f0e4daeef8120853..5bd67d54d036f281 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -348,6 +348,10 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
 python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
 
 PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
+ifneq ($(CONFIG_TRACEEVENT),y)
+  PYTHON_EXT_SRCS := $(call filter-out,$(PYTHON_EXT_SRCS),util/trace-event.c)
+endif
+
 PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
 
 SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 728fe2f51759eb0d..72088aec2857b316 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -1330,6 +1330,9 @@ static struct {
 static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
 				  PyObject *args, PyObject *kwargs)
 {
+#ifndef HAVE_LIBTRACEEVENT
+	return NULL;
+#else
 	struct tep_event *tp_format;
 	static char *kwlist[] = { "sys", "name", NULL };
 	char *sys  = NULL;
@@ -1344,6 +1347,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
 		return _PyLong_FromLong(-1);
 
 	return _PyLong_FromLong(tp_format->id);
+#endif // HAVE_LIBTRACEEVENT
 }
 
 static PyMethodDef perf__methods[] = {
Ian Rogers Dec. 6, 2022, 10:22 p.m. UTC | #11
On Tue, Dec 6, 2022 at 9:31 AM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>
> Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > > Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > > >  Now to look at the BUILD_BPF_SKEL=1 kaboom:
> > > > >
> > > > >  [acme@quaco perf]$ alias m
> > > > > alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> > > > > [acme@quaco perf]$ m
> > > > > make: Entering directory '/home/acme/git/perf/tools/perf'
> > > > >   BUILD:   Doing 'make -j8' parallel build
> > > > >   <SNIP>
> > > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
> > > > > /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
> > > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
> > >
> > > For that bpf_kwork.c see below. Now to see why the python binding is not
> > > building, I guess is unrelated and you have some other outstanding
> > > patch?
> >
> > Its related:
> >
> > [acme@quaco perf]$ perf test -v python
> > Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
> >  14: 'import perf' in python                                         :
> > --- start ---
> > test child forked, pid 1669872
> > python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> > ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
> > test child finished with -1
> > ---- end ----
> > 'import perf' in python: FAILED!
> > [acme@quaco perf]$
> >
> > Now checking why NO_LIBTRACEEVENT=1 fails with this...
> >
> > [acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
> > tools/perf/util/trace-event.c:        tep_unload_plugins(t->plugin_list, t->pevent);
> > [acme@quaco perf]$
> >
> > [acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
> > util/trace-event.c
> > [acme@quaco perf]$
> >
> > Trying to fix...
>
> I'm missing some detail, this isn't working, util/trace-event.c is still
> being built and linked.
>
> The python binding should be usable without tracepoints, in fact its
> first usage was just to have access to the perf metaevents, see
> tools/perf/python/twatch.py.

You're right. I'd assumed that if you were disabling libtraceevent
then you'd also disable python. To fix the issue above you can do:

--- a/tools/perf/util/python-ext-sources
+++ b/tools/perf/util/python-ext-sources
@@ -30,7 +30,6 @@ util/rblist.c
util/counts.c
util/print_binary.c
util/strlist.c
-util/trace-event.c
../lib/rbtree.c
util/string.c
util/symbol_fprintf.c

but this needs making conditional (possibly in setup.py) on whether
libtraceevent is present or not.

Thanks,
Ian

> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index f0e4daeef8120853..5bd67d54d036f281 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -348,6 +348,10 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
>  python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
>
>  PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> +ifneq ($(CONFIG_TRACEEVENT),y)
> +  PYTHON_EXT_SRCS := $(call filter-out,$(PYTHON_EXT_SRCS),util/trace-event.c)
> +endif
> +
>  PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
>
>  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index 728fe2f51759eb0d..72088aec2857b316 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -1330,6 +1330,9 @@ static struct {
>  static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>                                   PyObject *args, PyObject *kwargs)
>  {
> +#ifndef HAVE_LIBTRACEEVENT
> +       return NULL;
> +#else
>         struct tep_event *tp_format;
>         static char *kwlist[] = { "sys", "name", NULL };
>         char *sys  = NULL;
> @@ -1344,6 +1347,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>                 return _PyLong_FromLong(-1);
>
>         return _PyLong_FromLong(tp_format->id);
> +#endif // HAVE_LIBTRACEEVENT
>  }
>
>  static PyMethodDef perf__methods[] = {
Athira Rajeev Dec. 7, 2022, 1:33 p.m. UTC | #12
> On 06-Dec-2022, at 4:29 AM, Ian Rogers <irogers@google.com> wrote:
> 
> Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> build, don't compile in libtraceevent and libtracefs support. This
> also disables CONFIG_TRACE that controls "perf
> trace". CONFIG_TRACEEVENT is used to control enablement in
> Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> kmem, kwork, lock, sched and timechart are removed. The majority of
> commands continue to work including "perf test".
> 
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/perf/Build                              | 11 ++-
> tools/perf/Makefile.config                    | 37 +++----
> tools/perf/Makefile.perf                      | 99 +------------------
> tools/perf/arch/x86/util/Build                |  2 +-
> tools/perf/arch/x86/util/intel-pt.c           |  4 +
> tools/perf/builtin-annotate.c                 |  2 +
> tools/perf/builtin-inject.c                   |  8 ++
> tools/perf/builtin-kmem.c                     |  1 +
> tools/perf/builtin-kvm.c                      | 12 +--
> tools/perf/builtin-kwork.c                    |  1 +
> tools/perf/builtin-record.c                   |  2 +
> tools/perf/builtin-report.c                   |  9 +-
> tools/perf/builtin-script.c                   | 19 +++-
> tools/perf/builtin-timechart.c                |  1 +
> tools/perf/builtin-trace.c                    |  5 +-
> tools/perf/builtin-version.c                  |  1 +
> tools/perf/perf.c                             | 24 +++--
> .../perf/scripts/python/Perf-Trace-Util/Build |  2 +-
> tools/perf/tests/Build                        | 12 +--
> tools/perf/tests/builtin-test.c               |  6 ++
> tools/perf/tests/parse-events.c               | 20 ++++
> tools/perf/util/Build                         | 10 +-
> tools/perf/util/data-convert-bt.c             |  5 +-
> tools/perf/util/data-convert-json.c           |  9 +-
> tools/perf/util/evlist.c                      |  6 +-
> tools/perf/util/evlist.h                      |  4 +
> tools/perf/util/evsel.c                       | 11 ++-
> tools/perf/util/evsel.h                       | 12 ++-
> tools/perf/util/evsel_fprintf.c               |  7 +-
> tools/perf/util/header.c                      | 19 ++++
> tools/perf/util/header.h                      |  2 +
> tools/perf/util/intel-pt.c                    |  7 +-
> tools/perf/util/parse-events.c                | 15 +++
> tools/perf/util/parse-events.h                |  1 -
> tools/perf/util/python.c                      |  4 +
> tools/perf/util/scripting-engines/Build       |  6 +-
> .../scripting-engines/trace-event-python.c    |  1 +
> tools/perf/util/session.c                     |  2 +
> tools/perf/util/session.h                     |  2 +
> tools/perf/util/sort.c                        | 60 +++++++++--
> tools/perf/util/synthetic-events.c            |  6 ++
> tools/perf/util/trace-event-parse.c           |  2 +
> tools/perf/util/trace-event-read.c            |  1 +
> tools/perf/util/trace-event-scripting.c       |  1 +
> tools/perf/util/trace-event.c                 |  1 -
> tools/perf/util/trace-event.h                 | 11 ++-
> 46 files changed, 312 insertions(+), 171 deletions(-)
> 
> diff --git a/tools/perf/Build b/tools/perf/Build
> index 496b096153bb..edafe3cb3d07 100644
> --- a/tools/perf/Build
> +++ b/tools/perf/Build
> @@ -5,7 +5,6 @@ perf-y += builtin-diff.o
> perf-y += builtin-evlist.o
> perf-y += builtin-ftrace.o
> perf-y += builtin-help.o
> -perf-y += builtin-sched.o
> perf-y += builtin-buildid-list.o
> perf-y += builtin-buildid-cache.o
> perf-y += builtin-kallsyms.o
> @@ -13,11 +12,8 @@ perf-y += builtin-list.o
> perf-y += builtin-record.o
> perf-y += builtin-report.o
> perf-y += builtin-stat.o
> -perf-y += builtin-timechart.o
> perf-y += builtin-top.o
> perf-y += builtin-script.o
> -perf-y += builtin-kmem.o
> -perf-y += builtin-lock.o
> perf-y += builtin-kvm.o
> perf-y += builtin-inject.o
> perf-y += builtin-mem.o
> @@ -25,7 +21,12 @@ perf-y += builtin-data.o
> perf-y += builtin-version.o
> perf-y += builtin-c2c.o
> perf-y += builtin-daemon.o
> -perf-y += builtin-kwork.o
> +
> +perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o
> 
> perf-$(CONFIG_TRACE) += builtin-trace.o
> perf-$(CONFIG_LIBELF) += builtin-probe.o
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 9cc3c48f3288..b34288cb1900 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
>   EXTLIBS += $(EXTLIBS_LIBUNWIND)
> endif
> 
> -ifeq ($(NO_SYSCALL_TABLE),0)
> -  $(call detected,CONFIG_TRACE)
> -else
> -  ifndef NO_LIBAUDIT
> -    $(call feature_check,libaudit)
> -    ifneq ($(feature-libaudit), 1)
> -      msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> -      NO_LIBAUDIT := 1
> -    else
> -      CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> -      EXTLIBS += -laudit
> -      $(call detected,CONFIG_TRACE)
> +ifneq ($(NO_LIBTRACEEVENT),1)
> +  ifeq ($(NO_SYSCALL_TABLE),0)
> +    $(call detected,CONFIG_TRACE)
> +  else
> +    ifndef NO_LIBAUDIT
> +      $(call feature_check,libaudit)
> +      ifneq ($(feature-libaudit), 1)
> +        msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> +        NO_LIBAUDIT := 1
> +      else
> +        CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> +        EXTLIBS += -laudit
> +        $(call detected,CONFIG_TRACE)
> +      endif
>     endif
>   endif
> endif
> @@ -1182,9 +1184,11 @@ ifdef LIBPFM4
>   endif
> endif
> 
> -ifdef LIBTRACEEVENT_DYNAMIC
> +# libtraceevent is a recommended dependency picked up from the system.
> +ifneq ($(NO_LIBTRACEEVENT),1)
>   $(call feature_check,libtraceevent)
>   ifeq ($(feature-libtraceevent), 1)
> +    CFLAGS += -DHAVE_LIBTRACEEVENT
>     EXTLIBS += -ltraceevent
>     LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
>     LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> @@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
>     LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
>     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
>     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
> +    $(call detected,CONFIG_TRACEEVENT)
>   else
> -    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
> +    dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
>   endif
> -endif
> 
> -ifdef LIBTRACEFS_DYNAMIC
>   $(call feature_check,libtracefs)
>   ifeq ($(feature-libtracefs), 1)
>     EXTLIBS += -ltracefs
> @@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
>     LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
>     LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
>     CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
> -  else
> -    dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
>   endif
> endif
> 
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index 6689f644782f..f0e4daeef812 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -128,10 +128,6 @@ include ../scripts/utilities.mak
> #
> # Define BUILD_BPF_SKEL to enable BPF skeletons
> #
> -# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
> -#
> -# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
> -#
> 
> # As per kernel Makefile, avoid funny character set dependencies
> unexport LC_ALL
> @@ -242,10 +238,6 @@ sub-make: fixdep
> else # force_fixdep
> 
> LIBAPI_DIR      = $(srctree)/tools/lib/api/
> -ifndef LIBTRACEEVENT_DYNAMIC
> -LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
> -LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
> -endif

Hi Ian, Arnaldo

With this change, does it implies that the traceevent in "tools/lib/traceevent" is not
going to be used hereafter ?

I am seeing this compile error in a system with libtracevent installed:

util/evsel.c: In function 'evsel__rawptr':
util/evsel.c:2787:36: error: 'TEP_FIELD_IS_RELATIVE' undeclared (first use in this function); did you mean 'TEP_FIELD_IS_FLAG'?
 2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
      |                                    ^~~~~~~~~~~~~~~~~~~~~
      |                                    TEP_FIELD_IS_FLAG
util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in


The system has libtraceevent and its devel installed.
But TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
Whereas it is there in header file in tools/lib/traceevent


# grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
# grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
	TEP_FIELD_IS_RELATIVE	= 256,

# rpm -qa|grep libtraceevent
libtraceevent-1.1.1-8.el9.ppc64le
libtraceevent-devel-1.1.1-8.el9.ppc64le

How we can handle this ?


Thanks
Athira

> LIBBPF_DIR      = $(srctree)/tools/lib/bpf/
> LIBSUBCMD_DIR   = $(srctree)/tools/lib/subcmd/
> LIBSYMBOL_DIR   = $(srctree)/tools/lib/symbol/
> @@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
> grep-libs = $(filter -l%,$(1))
> strip-libs = $(filter-out -l%,$(1))
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -ifneq ($(OUTPUT),)
> -  LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
> -else
> -  LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
> -endif
> -LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
> -LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
> -LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
> -LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
> -export LIBTRACEEVENT
> -LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
> -CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
> -#
> -# The static build has no dynsym table, so this does not work for
> -# static build. Looks like linker starts to scream about that now
> -# (in Fedora 26) so we need to switch it off for static build.
> -DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
> -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
> -else
> -LIBTRACEEVENT_DYNAMIC_LIST =
> -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
> -endif
> -
> ifneq ($(OUTPUT),)
>   LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
> else
> @@ -381,11 +348,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
> python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
> 
> PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> -ifndef LIBTRACEEVENT_DYNAMIC
> -PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
> -else
> PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> -endif
> 
> SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> 
> @@ -430,9 +393,6 @@ ifndef NO_LIBBPF
>     PERFLIBS += $(LIBBPF)
>   endif
> endif
> -ifndef LIBTRACEEVENT_DYNAMIC
> -  PERFLIBS += $(LIBTRACEEVENT)
> -endif
> 
> # We choose to avoid "if .. else if .. else .. endif endif"
> # because maintaining the nesting to match is a pain.  If
> @@ -682,9 +642,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
> # Create python binding output directory if not already present
> _dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
> 
> -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
> +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
> 	$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
> -        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
> +        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
> 	  $(PYTHON_WORD) util/setup.py \
> 	  --quiet build_ext; \
> 	cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
> @@ -710,8 +670,8 @@ $(PERF_IN): prepare FORCE
> $(PMU_EVENTS_IN): FORCE prepare
> 	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
> 
> -$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
> -	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
> +$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
> +	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
> 		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
> 
> $(GTK_IN): FORCE prepare
> @@ -797,10 +757,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
> 	$(LIBSYMBOL) \
> 	bpf-skel
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -prepare: $(LIBTRACEEVENT)
> -endif
> -
> $(OUTPUT)%.o: %.c prepare FORCE
> 	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
> 
> @@ -856,38 +812,6 @@ endif
> 
> $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
> -
> -$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
> -		$@ install_headers
> -
> -$(LIBTRACEEVENT)-clean:
> -	$(call QUIET_CLEAN, libtraceevent)
> -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
> -
> -libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> -		plugins
> -
> -libtraceevent_plugins-clean:
> -	$(call QUIET_CLEAN, libtraceevent_plugins)
> -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -
> -$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> -		$(LIBTRACEEVENT_FLAGS) $@
> -
> -install-traceevent-plugins: libtraceevent_plugins
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
> -		$(LIBTRACEEVENT_FLAGS) install
> -endif
> -
> $(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
> 	$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
> 		DESTDIR=$(LIBAPI_DESTDIR) prefix= \
> @@ -1095,10 +1019,6 @@ install-tests: all install-gtk
> 
> install-bin: install-tools install-tests
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -install-bin: install-traceevent-plugins
> -endif
> -
> install: install-bin try-install-man
> 
> install-python_ext:
> @@ -1124,11 +1044,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
> $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
> 	$(Q)$(MKDIR) -p $@
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
> -	$(Q)$(MKDIR) -p $@
> -endif
> -
> ifdef BUILD_BPF_SKEL
> BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
> BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
> @@ -1211,10 +1126,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
> 	$(call QUIET_CLEAN, Documentation) \
> 	$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
> -endif
> -
> #
> # To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
> # file if defined, with no further action.
> @@ -1232,6 +1143,6 @@ FORCE:
> .PHONY: all install clean config-clean strip install-gtk
> .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
> .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
> -.PHONY: libtraceevent_plugins archheaders
> +.PHONY: archheaders
> 
> endif # force_fixdep
> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> index dbeb04cb336e..a92644f12eec 100644
> --- a/tools/perf/arch/x86/util/Build
> +++ b/tools/perf/arch/x86/util/Build
> @@ -1,7 +1,7 @@
> perf-y += header.o
> perf-y += tsc.o
> perf-y += pmu.o
> -perf-y += kvm-stat.o
> +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> perf-y += perf_regs.o
> perf-y += topdown.o
> perf-y += machine.o
> diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
> index af102f471e9f..1e39a034cee9 100644
> --- a/tools/perf/arch/x86/util/intel-pt.c
> +++ b/tools/perf/arch/x86/util/intel-pt.c
> @@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
> 	return 0;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int intel_pt_track_switches(struct evlist *evlist)
> {
> 	const char *sched_switch = "sched:sched_switch";
> @@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)
> 
> 	return 0;
> }
> +#endif
> 
> static void intel_pt_valid_str(char *str, size_t len, u64 valid)
> {
> @@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> 					ptr->have_sched_switch = 2;
> 			}
> 		} else {
> +#ifdef HAVE_LIBTRACEEVENT
> 			err = intel_pt_track_switches(evlist);
> 			if (err == -EPERM)
> 				pr_debug2("Unable to select sched:sched_switch\n");
> @@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> 				return err;
> 			else
> 				ptr->have_sched_switch = 1;
> +#endif
> 		}
> 	}
> 
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 517d928c00e3..90458ca6933f 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
> 			.namespaces = perf_event__process_namespaces,
> 			.attr	= perf_event__process_attr,
> 			.build_id = perf_event__process_build_id,
> +#ifdef HAVE_LIBTRACEEVENT
> 			.tracing_data   = perf_event__process_tracing_data,
> +#endif
> 			.id_index	= perf_event__process_id_index,
> 			.auxtrace_info	= perf_event__process_auxtrace_info,
> 			.auxtrace	= perf_event__process_auxtrace,
> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> index e254f18986f7..3f4e4dd5abf3 100644
> --- a/tools/perf/builtin-inject.c
> +++ b/tools/perf/builtin-inject.c
> @@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
> 	return err;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int perf_event__repipe_tracing_data(struct perf_session *session,
> 					   union perf_event *event)
> {
> @@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
> 
> 	return perf_event__process_tracing_data(session, event);
> }
> +#endif
> 
> static int dso__read_build_id(struct dso *dso)
> {
> @@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
> 	return 0;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int perf_inject__sched_stat(struct perf_tool *tool,
> 				   union perf_event *event __maybe_unused,
> 				   struct perf_sample *sample,
> @@ -836,6 +839,7 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
> 	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
> 	return perf_event__repipe(tool, event_sw, &sample_sw, machine);
> }
> +#endif
> 
> static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
> {
> @@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
> 		inject->tool.mmap	  = perf_event__repipe_mmap;
> 		inject->tool.mmap2	  = perf_event__repipe_mmap2;
> 		inject->tool.fork	  = perf_event__repipe_fork;
> +#ifdef HAVE_LIBTRACEEVENT
> 		inject->tool.tracing_data = perf_event__repipe_tracing_data;
> +#endif
> 	}
> 
> 	output_data_offset = perf_session__data_offset(session->evlist);
> @@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
> 				evsel->handler = perf_inject__sched_switch;
> 			} else if (!strcmp(name, "sched:sched_process_exit"))
> 				evsel->handler = perf_inject__sched_process_exit;
> +#ifdef HAVE_LIBTRACEEVENT
> 			else if (!strncmp(name, "sched:sched_stat_", 17))
> 				evsel->handler = perf_inject__sched_stat;
> +#endif
> 		}
> 	} else if (inject->itrace_synth_opts.vm_time_correlation) {
> 		session->itrace_synth_opts = &inject->itrace_synth_opts;
> diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> index ebfab2ca1702..e20656c431a4 100644
> --- a/tools/perf/builtin-kmem.c
> +++ b/tools/perf/builtin-kmem.c
> @@ -35,6 +35,7 @@
> #include <regex.h>
> 
> #include <linux/ctype.h>
> +#include <traceevent/event-parse.h>
> 
> static int	kmem_slab;
> static int	kmem_page;
> diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
> index 7d9ec1bac1a2..641e739c717c 100644
> --- a/tools/perf/builtin-kvm.c
> +++ b/tools/perf/builtin-kvm.c
> @@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
> 	return filename;
> }
> 
> -#ifdef HAVE_KVM_STAT_SUPPORT
> +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> 
> void exit_event_get_key(struct evsel *evsel,
> 			struct perf_sample *sample,
> @@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
> 		pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
> }
> 
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> static int process_lost_event(struct perf_tool *tool,
> 			      union perf_event *event __maybe_unused,
> 			      struct perf_sample *sample __maybe_unused,
> @@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
> 	return true;
> }
> 
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> /* keeping the max events to a modest level to keep
>  * the processing of samples per mmap smooth.
>  */
> @@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
> 	return kvm_events_report_vcpu(kvm);
> }
> 
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> static struct evlist *kvm_live_event_list(void)
> {
> 	struct evlist *evlist;
> @@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
> 	if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
> 		return kvm_events_report(&kvm, argc - 1 , argv + 1);
> 
> -#ifdef HAVE_TIMERFD_SUPPORT
> +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> 	if (!strncmp(argv[1], "live", 4))
> 		return kvm_events_live(&kvm, argc - 1 , argv + 1);
> #endif
> @@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
> 		return cmd_top(argc, argv);
> 	else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
> 		return __cmd_buildid_list(file_name, argc, argv);
> -#ifdef HAVE_KVM_STAT_SUPPORT
> +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> 	else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
> 		return kvm_cmd_stat(file_name, argc, argv);
> #endif
> diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> index 0e02b8098644..dc59d75180d1 100644
> --- a/tools/perf/builtin-kwork.c
> +++ b/tools/perf/builtin-kwork.c
> @@ -23,6 +23,7 @@
> 
> #include <subcmd/pager.h>
> #include <subcmd/parse-options.h>
> +#include <traceevent/event-parse.h>
> 
> #include <errno.h>
> #include <inttypes.h>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index b7fd7ec586fb..7e17374f6c1a 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
> 	if (rec->no_buildid)
> 		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (!have_tracepoints(&rec->evlist->core.entries))
> 		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
> +#endif
> 
> 	if (!rec->opts.branch_stack)
> 		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index b6d77d3da64f..2ee2ecca208e 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -67,6 +67,10 @@
> #include <unistd.h>
> #include <linux/mman.h>
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> struct report {
> 	struct perf_tool	tool;
> 	struct perf_session	*session;
> @@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
> 			.lost		 = perf_event__process_lost,
> 			.read		 = process_read_event,
> 			.attr		 = process_attr,
> +#ifdef HAVE_LIBTRACEEVENT
> 			.tracing_data	 = perf_event__process_tracing_data,
> +#endif
> 			.build_id	 = perf_event__process_build_id,
> 			.id_index	 = perf_event__process_id_index,
> 			.auxtrace_info	 = perf_event__process_auxtrace_info,
> @@ -1660,6 +1666,7 @@ int cmd_report(int argc, const char **argv)
> 						  report.range_num);
> 	}
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (session->tevent.pevent &&
> 	    tep_set_function_resolver(session->tevent.pevent,
> 				      machine__resolve_kernel_addr,
> @@ -1668,7 +1675,7 @@ int cmd_report(int argc, const char **argv)
> 		       __func__);
> 		return -1;
> 	}
> -
> +#endif
> 	sort__setup_elide(stdout);
> 
> 	ret = __cmd_report(&report);
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index d7ec8c1af293..88888fb885c8 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -62,6 +62,9 @@
> #include "perf.h"
> 
> #include <linux/ctype.h>
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> 
> static char const		*script_name;
> static char const		*generate_script_lang;
> @@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
> 		perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
> 		return;
> 	}
> -
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (PRINT_FIELD(TRACE) && sample->raw_data) {
> 		event_format__fprintf(evsel->tp_format, sample->cpu,
> 				      sample->raw_data, sample->raw_size, fp);
> 	}
> -
> +#endif
> 	if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
> 		perf_sample__fprintf_synth(sample, evsel, fp);
> 
> @@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)
> 
> static void setup_scripting(void)
> {
> +#ifdef HAVE_LIBTRACEEVENT
> 	setup_perl_scripting();
> 	setup_python_scripting();
> +#endif
> }
> 
> static int flush_scripting(void)
> @@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
> 			.fork		 = perf_event__process_fork,
> 			.attr		 = process_attr,
> 			.event_update   = perf_event__process_event_update,
> +#ifdef HAVE_LIBTRACEEVENT
> 			.tracing_data	 = perf_event__process_tracing_data,
> +#endif
> 			.feature	 = process_feature_event,
> 			.build_id	 = perf_event__process_build_id,
> 			.id_index	 = perf_event__process_id_index,
> @@ -4215,6 +4222,7 @@ int cmd_script(int argc, const char **argv)
> 	else
> 		symbol_conf.use_callchain = false;
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (session->tevent.pevent &&
> 	    tep_set_function_resolver(session->tevent.pevent,
> 				      machine__resolve_kernel_addr,
> @@ -4223,7 +4231,7 @@ int cmd_script(int argc, const char **argv)
> 		err = -1;
> 		goto out_delete;
> 	}
> -
> +#endif
> 	if (generate_script_lang) {
> 		struct stat perf_stat;
> 		int input;
> @@ -4259,9 +4267,12 @@ int cmd_script(int argc, const char **argv)
> 			err = -ENOENT;
> 			goto out_delete;
> 		}
> -
> +#ifdef HAVE_LIBTRACEEVENT
> 		err = scripting_ops->generate_script(session->tevent.pevent,
> 						     "perf-script");
> +#else
> +		err = scripting_ops->generate_script(NULL, "perf-script");
> +#endif
> 		goto out_delete;
> 	}
> 
> diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
> index c36296bb7637..6c629e7d370a 100644
> --- a/tools/perf/builtin-timechart.c
> +++ b/tools/perf/builtin-timechart.c
> @@ -38,6 +38,7 @@
> #include "util/string2.h"
> #include "util/tracepoint.h"
> #include <linux/err.h>
> +#include <traceevent/event-parse.h>
> 
> #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
> FILE *open_memstream(char **ptr, size_t *sizeloc);
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 543c379d2a57..6909cd9f48d1 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -15,7 +15,6 @@
>  */
> 
> #include "util/record.h"
> -#include <traceevent/event-parse.h>
> #include <api/fs/tracing_path.h>
> #include <bpf/bpf.h>
> #include "util/bpf_map.h"
> @@ -80,6 +79,10 @@
> #include <linux/ctype.h>
> #include <perf/mmap.h>
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> #ifndef O_CLOEXEC
> # define O_CLOEXEC		02000000
> #endif
> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> index a71f491224da..a886929ec6e5 100644
> --- a/tools/perf/builtin-version.c
> +++ b/tools/perf/builtin-version.c
> @@ -82,6 +82,7 @@ static void library_status(void)
> 	STATUS(HAVE_AIO_SUPPORT, aio);
> 	STATUS(HAVE_ZSTD_SUPPORT, zstd);
> 	STATUS(HAVE_LIBPFM, libpfm4);
> +	STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
> }
> 
> int cmd_version(int argc, const char **argv)
> diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> index 7af135dea1cd..82bbe0ca858b 100644
> --- a/tools/perf/perf.c
> +++ b/tools/perf/perf.c
> @@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
> 	{ "report",	cmd_report,	0 },
> 	{ "bench",	cmd_bench,	0 },
> 	{ "stat",	cmd_stat,	0 },
> +#ifdef HAVE_LIBTRACEEVENT
> 	{ "timechart",	cmd_timechart,	0 },
> +#endif
> 	{ "top",	cmd_top,	0 },
> 	{ "annotate",	cmd_annotate,	0 },
> 	{ "version",	cmd_version,	0 },
> 	{ "script",	cmd_script,	0 },
> +#ifdef HAVE_LIBTRACEEVENT
> 	{ "sched",	cmd_sched,	0 },
> +#endif
> #ifdef HAVE_LIBELF_SUPPORT
> 	{ "probe",	cmd_probe,	0 },
> #endif
> +#ifdef HAVE_LIBTRACEEVENT
> 	{ "kmem",	cmd_kmem,	0 },
> 	{ "lock",	cmd_lock,	0 },
> +#endif
> 	{ "kvm",	cmd_kvm,	0 },
> 	{ "test",	cmd_test,	0 },
> -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> +#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
> 	{ "trace",	cmd_trace,	0 },
> #endif
> 	{ "inject",	cmd_inject,	0 },
> @@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
> 	{ "data",	cmd_data,	0 },
> 	{ "ftrace",	cmd_ftrace,	0 },
> 	{ "daemon",	cmd_daemon,	0 },
> +#ifdef HAVE_LIBTRACEEVENT
> 	{ "kwork",	cmd_kwork,	0 },
> +#endif
> };
> 
> struct pager_config {
> @@ -500,14 +508,18 @@ int main(int argc, const char **argv)
> 		argv[0] = cmd;
> 	}
> 	if (strstarts(cmd, "trace")) {
> -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> -		setup_path();
> -		argv[0] = "trace";
> -		return cmd_trace(argc, argv);
> -#else
> +#ifndef HAVE_LIBTRACEEVENT
> +		fprintf(stderr,
> +			"trace command not available: missing libtraceevent devel package at build time.\n");
> +		goto out;
> +#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
> 		fprintf(stderr,
> 			"trace command not available: missing audit-libs devel package at build time.\n");
> 		goto out;
> +#else
> +		setup_path();
> +		argv[0] = "trace";
> +		return cmd_trace(argc, argv);
> #endif
> 	}
> 	/* Look for flags.. */
> diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
> index 7d0e33ce6aba..f65625a60704 100644
> --- a/tools/perf/scripts/python/Perf-Trace-Util/Build
> +++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
> @@ -1,3 +1,3 @@
> -perf-y += Context.o
> +perf-$(CONFIG_TRACEEVENT) += Context.o
> 
> CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
> diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> index 11b69023011b..34ebc009e05a 100644
> --- a/tools/perf/tests/Build
> +++ b/tools/perf/tests/Build
> @@ -6,13 +6,13 @@ perf-y += parse-events.o
> perf-y += dso-data.o
> perf-y += attr.o
> perf-y += vmlinux-kallsyms.o
> -perf-y += openat-syscall.o
> -perf-y += openat-syscall-all-cpus.o
> -perf-y += openat-syscall-tp-fields.o
> -perf-y += mmap-basic.o
> +perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
> +perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
> +perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
> +perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
> perf-y += perf-record.o
> perf-y += evsel-roundtrip-name.o
> -perf-y += evsel-tp-sched.o
> +perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
> perf-y += fdarray.o
> perf-y += pmu.o
> perf-y += pmu-events.o
> @@ -30,7 +30,7 @@ perf-y += task-exit.o
> perf-y += sw-clock.o
> perf-y += mmap-thread-lookup.o
> perf-y += thread-maps-share.o
> -perf-y += switch-tracking.o
> +perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
> perf-y += keep-tracking.o
> perf-y += code-reading.o
> perf-y += sample-parsing.o
> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index 4c6ae59a4dfd..658449204ce5 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
> @@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {
> 
> static struct test_suite *generic_tests[] = {
> 	&suite__vmlinux_matches_kallsyms,
> +#ifdef HAVE_LIBTRACEEVENT
> 	&suite__openat_syscall_event,
> 	&suite__openat_syscall_event_on_all_cpus,
> 	&suite__basic_mmap,
> +#endif
> 	&suite__mem,
> 	&suite__parse_events,
> 	&suite__expr,
> @@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
> 	&suite__dso_data_cache,
> 	&suite__dso_data_reopen,
> 	&suite__perf_evsel__roundtrip_name_test,
> +#ifdef HAVE_LIBTRACEEVENT
> 	&suite__perf_evsel__tp_sched_test,
> 	&suite__syscall_openat_tp_fields,
> +#endif
> 	&suite__attr,
> 	&suite__hists_link,
> 	&suite__python_use,
> @@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
> 	&suite__thread_maps_share,
> 	&suite__hists_output,
> 	&suite__hists_cumulate,
> +#ifdef HAVE_LIBTRACEEVENT
> 	&suite__switch_tracking,
> +#endif
> 	&suite__fdarray__filter,
> 	&suite__fdarray__add,
> 	&suite__kmod_path__parse,
> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> index 3440dd2616b0..dcbfb93287e8 100644
> --- a/tools/perf/tests/parse-events.c
> +++ b/tools/perf/tests/parse-events.c
> @@ -46,6 +46,7 @@ static bool kvm_s390_create_vm_valid(void)
> }
> #endif
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int test__checkevent_tracepoint(struct evlist *evlist)
> {
> 	struct evsel *evsel = evlist__first(evlist);
> @@ -76,6 +77,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
> 	}
> 	return TEST_OK;
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> static int test__checkevent_raw(struct evlist *evlist)
> {
> @@ -222,6 +224,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
> 	return TEST_OK;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
> {
> 	struct evsel *evsel = evlist__first(evlist);
> @@ -252,6 +255,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
> 
> 	return test__checkevent_tracepoint_multi(evlist);
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> static int test__checkevent_raw_modifier(struct evlist *evlist)
> {
> @@ -453,6 +457,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
> 	return TEST_OK;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int test__checkevent_list(struct evlist *evlist)
> {
> 	struct evsel *evsel = evlist__first(evlist);
> @@ -491,6 +496,7 @@ static int test__checkevent_list(struct evlist *evlist)
> 
> 	return TEST_OK;
> }
> +#endif
> 
> static int test__checkevent_pmu_name(struct evlist *evlist)
> {
> @@ -762,6 +768,7 @@ static int test__group2(struct evlist *evlist)
> 	return TEST_OK;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int test__group3(struct evlist *evlist __maybe_unused)
> {
> 	struct evsel *evsel, *leader;
> @@ -853,6 +860,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> 
> 	return TEST_OK;
> }
> +#endif
> 
> static int test__group4(struct evlist *evlist __maybe_unused)
> {
> @@ -1460,6 +1468,7 @@ static int test__sym_event_dc(struct evlist *evlist)
> 	return TEST_OK;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int count_tracepoints(void)
> {
> 	struct dirent *events_ent;
> @@ -1513,6 +1522,7 @@ static int test__all_tracepoints(struct evlist *evlist)
> 
> 	return test__checkevent_tracepoint_multi(evlist);
> }
> +#endif /* HAVE_LIBTRACEVENT */
> 
> static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
> {
> @@ -1642,6 +1652,7 @@ struct evlist_test {
> };
> 
> static const struct evlist_test test__events[] = {
> +#ifdef HAVE_LIBTRACEEVENT
> 	{
> 		.name  = "syscalls:sys_enter_openat",
> 		.check = test__checkevent_tracepoint,
> @@ -1652,6 +1663,7 @@ static const struct evlist_test test__events[] = {
> 		.check = test__checkevent_tracepoint_multi,
> 		/* 1 */
> 	},
> +#endif
> 	{
> 		.name  = "r1a",
> 		.check = test__checkevent_raw,
> @@ -1702,6 +1714,7 @@ static const struct evlist_test test__events[] = {
> 		.check = test__checkevent_breakpoint_w,
> 		/* 1 */
> 	},
> +#ifdef HAVE_LIBTRACEEVENT
> 	{
> 		.name  = "syscalls:sys_enter_openat:k",
> 		.check = test__checkevent_tracepoint_modifier,
> @@ -1712,6 +1725,7 @@ static const struct evlist_test test__events[] = {
> 		.check = test__checkevent_tracepoint_multi_modifier,
> 		/* 3 */
> 	},
> +#endif
> 	{
> 		.name  = "r1a:kp",
> 		.check = test__checkevent_raw_modifier,
> @@ -1757,11 +1771,13 @@ static const struct evlist_test test__events[] = {
> 		.check = test__checkevent_breakpoint_w_modifier,
> 		/* 2 */
> 	},
> +#ifdef HAVE_LIBTRACEEVENT
> 	{
> 		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
> 		.check = test__checkevent_list,
> 		/* 3 */
> 	},
> +#endif
> 	{
> 		.name  = "instructions:G",
> 		.check = test__checkevent_exclude_host_modifier,
> @@ -1792,11 +1808,13 @@ static const struct evlist_test test__events[] = {
> 		.check = test__group2,
> 		/* 9 */
> 	},
> +#ifdef HAVE_LIBTRACEEVENT
> 	{
> 		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
> 		.check = test__group3,
> 		/* 0 */
> 	},
> +#endif
> 	{
> 		.name  = "{cycles:u,instructions:kp}:p",
> 		.check = test__group4,
> @@ -1807,11 +1825,13 @@ static const struct evlist_test test__events[] = {
> 		.check = test__group5,
> 		/* 2 */
> 	},
> +#ifdef HAVE_LIBTRACEEVENT
> 	{
> 		.name  = "*:*",
> 		.check = test__all_tracepoints,
> 		/* 3 */
> 	},
> +#endif
> 	{
> 		.name  = "{cycles,cache-misses:G}:H",
> 		.check = test__group_gh1,
> diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> index ab37f588ee8b..612406311e27 100644
> --- a/tools/perf/util/Build
> +++ b/tools/perf/util/Build
> @@ -69,17 +69,17 @@ perf-y += namespaces.o
> perf-y += comm.o
> perf-y += thread.o
> perf-y += thread_map.o
> -perf-y += trace-event-parse.o
> perf-y += parse-events-flex.o
> perf-y += parse-events-bison.o
> perf-y += pmu.o
> perf-y += pmu-flex.o
> perf-y += pmu-bison.o
> perf-y += pmu-hybrid.o
> -perf-y += trace-event-read.o
> -perf-y += trace-event-info.o
> -perf-y += trace-event-scripting.o
> -perf-y += trace-event.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
> +perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
> perf-y += svghelper.o
> perf-y += sort.o
> perf-y += hist.o
> diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> index c65cdaf6975e..8031b586e813 100644
> --- a/tools/perf/util/data-convert-bt.c
> +++ b/tools/perf/util/data-convert-bt.c
> @@ -19,7 +19,6 @@
> #include <babeltrace/ctf-writer/event-fields.h>
> #include <babeltrace/ctf-ir/utils.h>
> #include <babeltrace/ctf/events.h>
> -#include <traceevent/event-parse.h>
> #include "asm/bug.h"
> #include "data-convert.h"
> #include "session.h"
> @@ -36,6 +35,10 @@
> #include "clockid.h"
> #include "util/sample.h"
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> #define pr_N(n, fmt, ...) \
> 	eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
> 
> diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
> index 57db59068cb6..ba9d93ce9463 100644
> --- a/tools/perf/util/data-convert-json.c
> +++ b/tools/perf/util/data-convert-json.c
> @@ -27,6 +27,10 @@
> #include "util/thread.h"
> #include "util/tool.h"
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> struct convert_json {
> 	struct perf_tool tool;
> 	FILE *out;
> @@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
> 	}
> 	output_json_format(out, false, 3, "]");
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (sample->raw_data) {
> 		int i;
> 		struct tep_format_field **fields;
> @@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
> 			free(fields);
> 		}
> 	}
> -
> +#endif
> 	output_json_format(out, false, 2, "}");
> 	return 0;
> }
> @@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
> 			.exit           = perf_event__process_exit,
> 			.fork           = perf_event__process_fork,
> 			.lost           = perf_event__process_lost,
> +#ifdef HAVE_LIBTRACEEVENT
> 			.tracing_data   = perf_event__process_tracing_data,
> +#endif
> 			.build_id       = perf_event__process_build_id,
> 			.id_index       = perf_event__process_id_index,
> 			.auxtrace_info  = perf_event__process_auxtrace_info,
> diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> index fbf3192bced9..590d4e77effc 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
> 	return evsel;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> {
> 	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
> @@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> 
> 	evlist__add(evlist, evsel);
> 	return evsel;
> -};
> +}
> +#endif
> 
> int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
> {
> @@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
> 	return NULL;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
> {
> 	struct evsel *evsel = evsel__newtp(sys, name);
> @@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
> 	evlist__add(evlist, evsel);
> 	return 0;
> }
> +#endif
> 
> struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
> {
> diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
> index 16734c6756b3..e5b84ead566c 100644
> --- a/tools/perf/util/evlist.h
> +++ b/tools/perf/util/evlist.h
> @@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
> {
> 	return evlist__add_aux_dummy(evlist, true);
> }
> +#ifdef HAVE_LIBTRACEEVENT
> struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
> +#endif
> 
> int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
> 			 evsel__sb_cb_t cb, void *data);
> @@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
> int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
> void evlist__stop_sb_thread(struct evlist *evlist);
> 
> +#ifdef HAVE_LIBTRACEEVENT
> int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
> +#endif
> 
> int __evlist__set_tracepoints_handlers(struct evlist *evlist,
> 				       const struct evsel_str_handler *assocs,
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 0f617359a82f..ca911856c4b1 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -12,7 +12,6 @@
> #include <linux/bitops.h>
> #include <api/fs/fs.h>
> #include <api/fs/tracing_path.h>
> -#include <traceevent/event-parse.h>
> #include <linux/hw_breakpoint.h>
> #include <linux/perf_event.h>
> #include <linux/compiler.h>
> @@ -57,6 +56,10 @@
> 
> #include <linux/ctype.h>
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> struct perf_missing_features perf_missing_features;
> 
> static clockid_t clockid;
> @@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
> 			goto out_err;
> 	}
> 	evsel->cgrp = cgroup__get(orig->cgrp);
> +#ifdef HAVE_LIBTRACEEVENT
> 	evsel->tp_format = orig->tp_format;
> +#endif
> 	evsel->handler = orig->handler;
> 	evsel->core.leader = orig->core.leader;
> 
> @@ -479,6 +484,7 @@ struct evsel *evsel__clone(struct evsel *orig)
> /*
>  * Returns pointer with encoded error via <linux/err.h> interface.
>  */
> +#ifdef HAVE_LIBTRACEEVENT
> struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> {
> 	struct evsel *evsel = zalloc(perf_evsel__object.size);
> @@ -516,6 +522,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> out_err:
> 	return ERR_PTR(err);
> }
> +#endif
> 
> const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
> 	"cycles",
> @@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
> 	return size;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
> {
> 	return tep_find_field(evsel->tp_format, name);
> @@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
> 
> 	return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
> }
> +#endif
> 
> bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
> {
> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> index f3485799ddf9..d572be41b960 100644
> --- a/tools/perf/util/evsel.h
> +++ b/tools/perf/util/evsel.h
> @@ -72,7 +72,9 @@ struct evsel {
> 		char			*name;
> 		char			*group_name;
> 		const char		*pmu_name;
> +#ifdef HAVE_LIBTRACEEVENT
> 		struct tep_event	*tp_format;
> +#endif
> 		char			*filter;
> 		unsigned long		max_events;
> 		double			scale;
> @@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
> }
> 
> struct evsel *evsel__clone(struct evsel *orig);
> -struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> 
> int copy_config_terms(struct list_head *dst, struct list_head *src);
> void free_config_terms(struct list_head *config_terms);
> 
> +
> +#ifdef HAVE_LIBTRACEEVENT
> +struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> +
> /*
>  * Returns pointer with encoded error via <linux/err.h> interface.
>  */
> @@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
> {
> 	return evsel__newtp_idx(sys, name, 0);
> }
> +#endif
> 
> struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
> 
> +#ifdef HAVE_LIBTRACEEVENT
> struct tep_event *event_format__new(const char *sys, const char *name);
> +#endif
> 
> void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
> void evsel__exit(struct evsel *evsel);
> @@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);
> 
> struct perf_sample;
> 
> +#ifdef HAVE_LIBTRACEEVENT
> void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
> u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
> 
> @@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
> {
> 	return evsel__rawptr(evsel, sample, name);
> }
> +#endif
> 
> struct tep_format_field;
> 
> diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> index 8c2ea8001329..bd22c4932d10 100644
> --- a/tools/perf/util/evsel_fprintf.c
> +++ b/tools/perf/util/evsel_fprintf.c
> @@ -2,7 +2,6 @@
> #include <inttypes.h>
> #include <stdio.h>
> #include <stdbool.h>
> -#include <traceevent/event-parse.h>
> #include "evsel.h"
> #include "util/evsel_fprintf.h"
> #include "util/event.h"
> @@ -13,6 +12,10 @@
> #include "srcline.h"
> #include "dso.h"
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
> {
> 	va_list args;
> @@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> 					 term, (u64)evsel->core.attr.sample_freq);
> 	}
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (details->trace_fields) {
> 		struct tep_format_field *field;
> 
> @@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> 			field = field->next;
> 		}
> 	}
> +#endif
> out:
> 	fputc('\n', fp);
> 	return ++printed;
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index dc2ae397d400..404d816ca124 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -6,6 +6,7 @@
> #include <sys/types.h>
> #include <byteswap.h>
> #include <unistd.h>
> +#include <regex.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <linux/compiler.h>
> @@ -55,6 +56,10 @@
> #include <linux/ctype.h>
> #include <internal/lib.h>
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> /*
>  * magic2 = "PERFILE2"
>  * must be a numerical value to let the endianness
> @@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
> 	return 0;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int write_tracing_data(struct feat_fd *ff,
> 			      struct evlist *evlist)
> {
> @@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,
> 
> 	return read_tracing_data(ff->fd, &evlist->core.entries);
> }
> +#endif
> 
> static int write_build_id(struct feat_fd *ff,
> 			  struct evlist *evlist __maybe_unused)
> @@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
> FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
> FEAT_PROCESS_STR_FUN(cpuid, cpuid);
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int process_tracing_data(struct feat_fd *ff, void *data)
> {
> 	ssize_t ret = trace_report(ff->fd, data, false);
> 
> 	return ret < 0 ? -1 : 0;
> }
> +#endif
> 
> static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
> {
> @@ -3366,7 +3375,9 @@ static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
> const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
> 
> const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
> +#ifdef HAVE_LIBTRACEEVENT
> 	FEAT_OPN(TRACING_DATA,	tracing_data,	false),
> +#endif
> 	FEAT_OPN(BUILD_ID,	build_id,	false),
> 	FEAT_OPR(HOSTNAME,	hostname,	false),
> 	FEAT_OPR(OSRELEASE,	osrelease,	false),
> @@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
> 	return ret <= 0 ? -1 : 0;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
> {
> 	struct tep_event *event;
> @@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
> 
> 	return 0;
> }
> +#endif
> 
> int perf_session__read_header(struct perf_session *session, int repipe_fd)
> {
> @@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
> 		lseek(fd, tmp, SEEK_SET);
> 	}
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	perf_header__process_sections(header, fd, &session->tevent,
> 				      perf_file_section__process);
> 
> 	if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
> 		goto out_delete_evlist;
> +#else
> +	perf_header__process_sections(header, fd, NULL, perf_file_section__process);
> +#endif
> 
> 	return 0;
> out_errno:
> @@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
> 	return 0;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> int perf_event__process_tracing_data(struct perf_session *session,
> 				     union perf_event *event)
> {
> @@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,
> 
> 	return size_read + padding;
> }
> +#endif
> 
> int perf_event__process_build_id(struct perf_session *session,
> 				 union perf_event *event)
> diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
> index 2d5e601ba60f..e3861ae62172 100644
> --- a/tools/perf/util/header.h
> +++ b/tools/perf/util/header.h
> @@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
> 				     union perf_event *event,
> 				     struct evlist **pevlist);
> size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
> +#ifdef HAVE_LIBTRACEEVENT
> int perf_event__process_tracing_data(struct perf_session *session,
> 				     union perf_event *event);
> +#endif
> int perf_event__process_build_id(struct perf_session *session,
> 				 union perf_event *event);
> bool is_perf_magic(u64 magic);
> diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> index e3548ddef254..6d3921627e33 100644
> --- a/tools/perf/util/intel-pt.c
> +++ b/tools/perf/util/intel-pt.c
> @@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
> 	return 1;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int intel_pt_process_switch(struct intel_pt *pt,
> 				   struct perf_sample *sample)
> {
> @@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,
> 
> 	return machine__set_current_tid(pt->machine, cpu, -1, tid);
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> static int intel_pt_context_switch_in(struct intel_pt *pt,
> 				      struct perf_sample *sample)
> @@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
> 			return err;
> 	}
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
> 		err = intel_pt_process_switch(pt, sample);
> -	else if (event->header.type == PERF_RECORD_ITRACE_START)
> +	else
> +#endif
> +	if (event->header.type == PERF_RECORD_ITRACE_START)
> 		err = intel_pt_process_itrace_start(pt, event, sample);
> 	else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
> 		err = intel_pt_process_aux_output_hw_id(pt, event, sample);
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 6502cd679f57..21cce83462b3 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -445,6 +445,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
> 	return ret;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static void tracepoint_error(struct parse_events_error *e, int err,
> 			     const char *sys, const char *name)
> {
> @@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
> 	closedir(events_dir);
> 	return ret;
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> #ifdef HAVE_LIBBPF_SUPPORT
> struct __add_bpf_event_param {
> @@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
> 		return config_term_common(attr, term, err);
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int config_term_tracepoint(struct perf_event_attr *attr,
> 				  struct parse_events_term *term,
> 				  struct parse_events_error *err)
> @@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
> 
> 	return 0;
> }
> +#endif
> 
> static int config_attr(struct perf_event_attr *attr,
> 		       struct list_head *head,
> @@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> 				struct parse_events_error *err,
> 				struct list_head *head_config)
> {
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (head_config) {
> 		struct perf_event_attr attr;
> 
> @@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> 	else
> 		return add_tracepoint_event(list, idx, sys, event,
> 					    err, head_config);
> +#else
> +	(void)list;
> +	(void)idx;
> +	(void)sys;
> +	(void)event;
> +	(void)head_config;
> +	parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
> +				strdup("libtraceevent is necessary for tracepoint support"));
> +	return -1;
> +#endif
> }
> 
> int parse_events_add_numeric(struct parse_events_state *parse_state,
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index 07df7bb7b042..428e72eaafcc 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -18,7 +18,6 @@ struct parse_events_error;
> struct option;
> struct perf_pmu;
> 
> -bool have_tracepoints(struct list_head *evlist);
> bool is_event_supported(u8 type, u64 config);
> 
> const char *event_type(int type);
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index b5941c74a0d6..728fe2f51759 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -417,6 +417,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
> 	return ret;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static bool is_tracepoint(struct pyrf_event *pevent)
> {
> 	return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
> @@ -486,14 +487,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
> 
> 	return tracepoint_field(pevent, field);
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> static PyObject*
> pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
> {
> 	PyObject *obj = NULL;
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (is_tracepoint(pevent))
> 		obj = get_tracepoint_field(pevent, attr_name);
> +#endif
> 
> 	return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
> }
> diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
> index 0f5ba28339cf..77544d2c447c 100644
> --- a/tools/perf/util/scripting-engines/Build
> +++ b/tools/perf/util/scripting-engines/Build
> @@ -1,5 +1,7 @@
> -perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> -perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> +ifeq ($(CONFIG_TRACEEVENT),y)
> +  perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> +  perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> +endif
> 
> CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
> 
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index d685a7399ee2..fabba21919b8 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -30,6 +30,7 @@
> #include <linux/bitmap.h>
> #include <linux/compiler.h>
> #include <linux/time64.h>
> +#include <traceevent/event-parse.h>
> 
> #include "../build-id.h"
> #include "../counts.h"
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 1facd4616317..7c021c6cedb9 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
> 			evlist__delete(session->evlist);
> 		perf_data__close(session->data);
> 	}
> +#ifdef HAVE_LIBTRACEEVENT
> 	trace_event__cleanup(&session->tevent);
> +#endif
> 	free(session);
> }
> 
> diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> index be5871ea558f..ee3715e8563b 100644
> --- a/tools/perf/util/session.h
> +++ b/tools/perf/util/session.h
> @@ -33,7 +33,9 @@ struct perf_session {
> 	struct auxtrace		*auxtrace;
> 	struct itrace_synth_opts *itrace_synth_opts;
> 	struct list_head	auxtrace_index;
> +#ifdef HAVE_LIBTRACEEVENT
> 	struct trace_event	tevent;
> +#endif
> 	struct perf_record_time_conv	time_conv;
> 	bool			repipe;
> 	bool			one_mmap;
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index 2e7330867e2e..c7a97b33e134 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -22,7 +22,6 @@
> #include "srcline.h"
> #include "strlist.h"
> #include "strbuf.h"
> -#include <traceevent/event-parse.h>
> #include "mem-events.h"
> #include "annotate.h"
> #include "event.h"
> @@ -32,6 +31,10 @@
> #include <linux/kernel.h>
> #include <linux/string.h>
> 
> +#ifdef HAVE_LIBTRACEEVENT
> +#include <traceevent/event-parse.h>
> +#endif
> +
> regex_t		parent_regex;
> const char	default_parent_pattern[] = "^sys_|^do_page_fault";
> const char	*parent_pattern = default_parent_pattern;
> @@ -743,6 +746,7 @@ struct sort_entry sort_time = {
> 
> /* --sort trace */
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static char *get_trace_output(struct hist_entry *he)
> {
> 	struct trace_seq seq;
> @@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
> 	.se_snprintf    = hist_entry__trace_snprintf,
> 	.se_width_idx	= HISTC_TRACE,
> };
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> /* sort keys for branch stacks */
> 
> @@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
> 	DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
> 	DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
> 	DIM(SORT_TRANSACTION, "transaction", sort_transaction),
> +#ifdef HAVE_LIBTRACEEVENT
> 	DIM(SORT_TRACE, "trace", sort_trace),
> +#endif
> 	DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
> 	DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
> 	DIM(SORT_CGROUP, "cgroup", sort_cgroup),
> @@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt)	\
> 	return hse->se == &sort_ ## key ;			\
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> MK_SORT_ENTRY_CHK(trace)
> +#else
> +bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> +{
> +	return false;
> +}
> +#endif
> MK_SORT_ENTRY_CHK(srcline)
> MK_SORT_ENTRY_CHK(srcfile)
> MK_SORT_ENTRY_CHK(thread)
> @@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
> 	return 0;
> }
> 
> +#ifndef HAVE_LIBTRACEEVENT
> +bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> +{
> +	return false;
> +}
> +bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
> +				     struct hists *hists __maybe_unused)
> +{
> +	return false;
> +}
> +#else
> struct hpp_dynamic_entry {
> 	struct perf_hpp_fmt hpp;
> 	struct evsel *evsel;
> @@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
> 
> 	return hde;
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> {
> @@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> 		new_hse = memdup(hse, sizeof(*hse));
> 		if (new_hse)
> 			new_fmt = &new_hse->hpp;
> +#ifdef HAVE_LIBTRACEEVENT
> 	} else if (perf_hpp__is_dynamic_entry(fmt)) {
> 		struct hpp_dynamic_entry *hde, *new_hde;
> 
> @@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> 		new_hde = memdup(hde, sizeof(*hde));
> 		if (new_hde)
> 			new_fmt = &new_hde->hpp;
> +#endif
> 	} else {
> 		new_fmt = memdup(fmt, sizeof(*fmt));
> 	}
> @@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
> 	return evsel;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> static int __dynamic_dimension__add(struct evsel *evsel,
> 				    struct tep_format_field *field,
> 				    bool raw_trace, int level)
> @@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
> 	}
> 	return ret;
> }
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> 			     int level)
> {
> 	char *str, *event_name, *field_name, *opt_name;
> 	struct evsel *evsel;
> -	struct tep_format_field *field;
> 	bool raw_trace = symbol_conf.raw_trace;
> 	int ret = 0;
> 
> @@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> 		raw_trace = true;
> 	}
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (!strcmp(field_name, "trace_fields")) {
> 		ret = add_all_dynamic_fields(evlist, raw_trace, level);
> 		goto out;
> @@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> 		ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
> 		goto out;
> 	}
> +#endif
> 
> 	evsel = find_evsel(evlist, event_name);
> 	if (evsel == NULL) {
> @@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> 		goto out;
> 	}
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (!strcmp(field_name, "*")) {
> 		ret = add_evsel_fields(evsel, raw_trace, level);
> 	} else {
> -		field = tep_find_any_field(evsel->tp_format, field_name);
> +		struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
> +
> 		if (field == NULL) {
> 			pr_debug("Cannot find event field for %s.%s\n",
> 				 event_name, field_name);
> @@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> 
> 		ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
> 	}
> +#else
> +	(void)level;
> +	(void)raw_trace;
> +#endif /* HAVE_LIBTRACEEVENT */
> 
> out:
> 	free(str);
> @@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> 	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> 		struct sort_dimension *sd = &common_sort_dimensions[i];
> 
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> 			continue;
> 
> 		for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
> -			if (!strcmp(dynamic_headers[j], sd->name))
> +			if (sd->name && !strcmp(dynamic_headers[j], sd->name))
> 				sort_dimension_add_dynamic_header(sd);
> 		}
> 
> @@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> 		struct sort_dimension *sd = &bstack_sort_dimensions[i];
> 
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> 			continue;
> 
> 		if (sort__mode != SORT_MODE__BRANCH)
> @@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> 	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> 		struct sort_dimension *sd = &memory_sort_dimensions[i];
> 
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> 			continue;
> 
> 		if (sort__mode != SORT_MODE__MEMORY)
> @@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> 	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> 		struct sort_dimension *sd = &common_sort_dimensions[i];
> 
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> 			continue;
> 
> 		return __sort_dimension__add_output(list, sd);
> @@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> 		struct sort_dimension *sd = &bstack_sort_dimensions[i];
> 
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> 			continue;
> 
> 		if (sort__mode != SORT_MODE__BRANCH)
> @@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> 	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> 		struct sort_dimension *sd = &memory_sort_dimensions[i];
> 
> -		if (strncasecmp(tok, sd->name, strlen(tok)))
> +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> 			continue;
> 
> 		if (sort__mode != SORT_MODE__MEMORY)
> @@ -3508,6 +3545,9 @@ void reset_output_field(void)
> 
> static void add_key(struct strbuf *sb, const char *str, int *llen)
> {
> +	if (!str)
> +		return;
> +
> 	if (*llen >= 75) {
> 		strbuf_addstr(sb, "\n\t\t\t ");
> 		*llen = INDENT;
> diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
> index 0645795ff080..3ab6a92b1a6d 100644
> --- a/tools/perf/util/synthetic-events.c
> +++ b/tools/perf/util/synthetic-events.c
> @@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
> 	return err;
> }
> 
> +#ifdef HAVE_LIBTRACEEVENT
> int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
> 					perf_event__handler_t process)
> {
> @@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
> 
> 	return aligned_size;
> }
> +#endif
> 
> int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
> 				    perf_event__handler_t process, struct machine *machine)
> @@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> 	}
> 	ret += err;
> 
> +#ifdef HAVE_LIBTRACEEVENT
> 	if (have_tracepoints(&evlist->core.entries)) {
> 		int fd = perf_data__fd(data);
> 
> @@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> 		}
> 		ret += err;
> 	}
> +#else
> +	(void)data;
> +#endif
> 
> 	return ret;
> }
> diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
> index c9c83a40647c..2d3c2576bab7 100644
> --- a/tools/perf/util/trace-event-parse.c
> +++ b/tools/perf/util/trace-event-parse.c
> @@ -11,6 +11,8 @@
> #include "trace-event.h"
> 
> #include <linux/ctype.h>
> +#include <linux/kernel.h>
> +#include <traceevent/event-parse.h>
> 
> static int get_common_field(struct scripting_context *context,
> 			    int *offset, int *size, const char *type)
> diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> index 43146a4ce2fb..1162c49b8082 100644
> --- a/tools/perf/util/trace-event-read.c
> +++ b/tools/perf/util/trace-event-read.c
> @@ -11,6 +11,7 @@
> #include <sys/stat.h>
> #include <sys/wait.h>
> #include <sys/mman.h>
> +#include <traceevent/event-parse.h>
> #include <fcntl.h>
> #include <unistd.h>
> #include <errno.h>
> diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> index 636a010d929b..56175c53f9af 100644
> --- a/tools/perf/util/trace-event-scripting.c
> +++ b/tools/perf/util/trace-event-scripting.c
> @@ -9,6 +9,7 @@
> #include <stdlib.h>
> #include <string.h>
> #include <errno.h>
> +#include <traceevent/event-parse.h>
> 
> #include "debug.h"
> #include "trace-event.h"
> diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
> index b3ee651e3d91..8ad75b31e09b 100644
> --- a/tools/perf/util/trace-event.c
> +++ b/tools/perf/util/trace-event.c
> @@ -1,5 +1,4 @@
> // SPDX-License-Identifier: GPL-2.0
> -
> #include <stdio.h>
> #include <unistd.h>
> #include <stdlib.h>
> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> index 8f39f5bcb2c2..add6c5d9531c 100644
> --- a/tools/perf/util/trace-event.h
> +++ b/tools/perf/util/trace-event.h
> @@ -2,9 +2,11 @@
> #ifndef _PERF_UTIL_TRACE_EVENT_H
> #define _PERF_UTIL_TRACE_EVENT_H
> 
> -#include <traceevent/event-parse.h>
> -#include "parse-events.h"
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <linux/types.h>
> 
> +struct evlist;
> struct machine;
> struct perf_sample;
> union perf_event;
> @@ -18,6 +20,11 @@ struct trace_event {
> 	struct tep_plugin_list	*plugin_list;
> };
> 
> +typedef char *(tep_func_resolver_t)(void *priv,
> +				    unsigned long long *addrp, char **modp);
> +
> +bool have_tracepoints(struct list_head *evlist);
> +
> int trace_event__init(struct trace_event *t);
> void trace_event__cleanup(struct trace_event *t);
> int trace_event__register_resolver(struct machine *machine,
> -- 
> 2.39.0.rc0.267.gcb52ba06e7-goog
>
Athira Rajeev Dec. 7, 2022, 1:38 p.m. UTC | #13
> On 06-Dec-2022, at 11:01 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> 
> Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
>> Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
>>> Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>> Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>> Now to look at the BUILD_BPF_SKEL=1 kaboom:
>>>>> 
>>>>> [acme@quaco perf]$ alias m
>>>>> alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
>>>>> [acme@quaco perf]$ m
>>>>> make: Entering directory '/home/acme/git/perf/tools/perf'
>>>>>  BUILD:   Doing 'make -j8' parallel build
>>>>>  <SNIP>
>>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
>>>>> /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
>>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
>>> 
>>> For that bpf_kwork.c see below. Now to see why the python binding is not
>>> building, I guess is unrelated and you have some other outstanding
>>> patch?
>> 
>> Its related:
>> 
>> [acme@quaco perf]$ perf test -v python
>> Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
>> 14: 'import perf' in python                                         :
>> --- start ---
>> test child forked, pid 1669872
>> python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
>> Traceback (most recent call last):
>>  File "<stdin>", line 1, in <module>
>> ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
>> test child finished with -1
>> ---- end ----
>> 'import perf' in python: FAILED!
>> [acme@quaco perf]$
>> 
>> Now checking why NO_LIBTRACEEVENT=1 fails with this...
>> 
>> [acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
>> tools/perf/util/trace-event.c:	tep_unload_plugins(t->plugin_list, t->pevent);
>> [acme@quaco perf]$
>> 
>> [acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
>> util/trace-event.c
>> [acme@quaco perf]$
>> 
>> Trying to fix...
> 
> I'm missing some detail, this isn't working, util/trace-event.c is still
> being built and linked.

Hi,

Observed similar issue with “builtin-trace.c”

In system without libtraceevent-devel, I could still see builtin-trace trying to get
compiled and hitting error. In my understanding, CONFIG_TRACE will be
disabled when libtraceevent is not present and hence builtin-trace should be disabled
which I am not seeing.

# rpm -qa|grep libtraceevent
libtraceevent-1.2.1-1.el8.ppc64le

# grep -i traceevent FEATURE-DUMP 
feature-libtraceevent=0

Snippet from make logs:

builtin-trace.c:266:50: error: dereferencing pointer to incomplete type 'struct tep_format_field'
  return __tp_field__init_uint(field, format_field->size, format_field->offset, needs_swap);
                                                  ^~
builtin-trace.c: In function 'evsel__syscall_arg_fmt':
builtin-trace.c:361:25: error: 'struct evsel' has no member named 'tp_format'
   et->fmt = calloc(evsel->tp_format->format.nr_fields, sizeof(struct syscall_arg_fmt));


Thanks
Athira

> 
> The python binding should be usable without tracepoints, in fact its
> first usage was just to have access to the perf metaevents, see 
> tools/perf/python/twatch.py.
> 
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index f0e4daeef8120853..5bd67d54d036f281 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -348,6 +348,10 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
> python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
> 
> PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> +ifneq ($(CONFIG_TRACEEVENT),y)
> +  PYTHON_EXT_SRCS := $(call filter-out,$(PYTHON_EXT_SRCS),util/trace-event.c)
> +endif
> +
> PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> 
> SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index 728fe2f51759eb0d..72088aec2857b316 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -1330,6 +1330,9 @@ static struct {
> static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
> 				  PyObject *args, PyObject *kwargs)
> {
> +#ifndef HAVE_LIBTRACEEVENT
> +	return NULL;
> +#else
> 	struct tep_event *tp_format;
> 	static char *kwlist[] = { "sys", "name", NULL };
> 	char *sys  = NULL;
> @@ -1344,6 +1347,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
> 		return _PyLong_FromLong(-1);
> 
> 	return _PyLong_FromLong(tp_format->id);
> +#endif // HAVE_LIBTRACEEVENT
> }
> 
> static PyMethodDef perf__methods[] = {
Athira Rajeev Dec. 7, 2022, 1:46 p.m. UTC | #14
> On 06-Dec-2022, at 4:29 AM, Ian Rogers <irogers@google.com> wrote:
> 
> Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> build, don't compile in libtraceevent and libtracefs support. This
> also disables CONFIG_TRACE that controls "perf
> trace". CONFIG_TRACEEVENT is used to control enablement in
> Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> kmem, kwork, lock, sched and timechart are removed. The majority of
> commands continue to work including "perf test".
> 
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/perf/Build                              | 11 ++-
> tools/perf/Makefile.config                    | 37 +++----
> tools/perf/Makefile.perf                      | 99 +------------------
> tools/perf/arch/x86/util/Build                |  2 +-
> tools/perf/arch/x86/util/intel-pt.c           |  4 +
> tools/perf/builtin-annotate.c                 |  2 +
> tools/perf/builtin-inject.c                   |  8 ++
> tools/perf/builtin-kmem.c                     |  1 +
> tools/perf/builtin-kvm.c                      | 12 +--
> tools/perf/builtin-kwork.c                    |  1 +
> tools/perf/builtin-record.c                   |  2 +
> tools/perf/builtin-report.c                   |  9 +-
> tools/perf/builtin-script.c                   | 19 +++-
> tools/perf/builtin-timechart.c                |  1 +
> tools/perf/builtin-trace.c                    |  5 +-
> tools/perf/builtin-version.c                  |  1 +
> tools/perf/perf.c                             | 24 +++--
> .../perf/scripts/python/Perf-Trace-Util/Build |  2 +-
> tools/perf/tests/Build                        | 12 +--
> tools/perf/tests/builtin-test.c               |  6 ++
> tools/perf/tests/parse-events.c               | 20 ++++
> tools/perf/util/Build                         | 10 +-
> tools/perf/util/data-convert-bt.c             |  5 +-
> tools/perf/util/data-convert-json.c           |  9 +-
> tools/perf/util/evlist.c                      |  6 +-
> tools/perf/util/evlist.h                      |  4 +
> tools/perf/util/evsel.c                       | 11 ++-
> tools/perf/util/evsel.h                       | 12 ++-
> tools/perf/util/evsel_fprintf.c               |  7 +-
> tools/perf/util/header.c                      | 19 ++++
> tools/perf/util/header.h                      |  2 +
> tools/perf/util/intel-pt.c                    |  7 +-
> tools/perf/util/parse-events.c                | 15 +++
> tools/perf/util/parse-events.h                |  1 -
> tools/perf/util/python.c                      |  4 +
> tools/perf/util/scripting-engines/Build       |  6 +-
> .../scripting-engines/trace-event-python.c    |  1 +
> tools/perf/util/session.c                     |  2 +
> tools/perf/util/session.h                     |  2 +
> tools/perf/util/sort.c                        | 60 +++++++++--
> tools/perf/util/synthetic-events.c            |  6 ++
> tools/perf/util/trace-event-parse.c           |  2 +
> tools/perf/util/trace-event-read.c            |  1 +
> tools/perf/util/trace-event-scripting.c       |  1 +
> tools/perf/util/trace-event.c                 |  1 -
> tools/perf/util/trace-event.h                 | 11 ++-
> 46 files changed, 312 insertions(+), 171 deletions(-)
> 
> diff --git a/tools/perf/Build b/tools/perf/Build
> index 496b096153bb..edafe3cb3d07 100644
> --- a/tools/perf/Build
> +++ b/tools/perf/Build
> @@ -5,7 +5,6 @@ perf-y += builtin-diff.o
> perf-y += builtin-evlist.o
> perf-y += builtin-ftrace.o
> perf-y += builtin-help.o
> -perf-y += builtin-sched.o
> perf-y += builtin-buildid-list.o
> perf-y += builtin-buildid-cache.o
> perf-y += builtin-kallsyms.o
> @@ -13,11 +12,8 @@ perf-y += builtin-list.o
> perf-y += builtin-record.o
> perf-y += builtin-report.o
> perf-y += builtin-stat.o
> -perf-y += builtin-timechart.o
> perf-y += builtin-top.o
> perf-y += builtin-script.o
> -perf-y += builtin-kmem.o
> -perf-y += builtin-lock.o
> perf-y += builtin-kvm.o
> perf-y += builtin-inject.o
> perf-y += builtin-mem.o
> @@ -25,7 +21,12 @@ perf-y += builtin-data.o
> perf-y += builtin-version.o
> perf-y += builtin-c2c.o
> perf-y += builtin-daemon.o
> -perf-y += builtin-kwork.o
> +
> +perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
> +perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o
> 
> perf-$(CONFIG_TRACE) += builtin-trace.o
> perf-$(CONFIG_LIBELF) += builtin-probe.o
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 9cc3c48f3288..b34288cb1900 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
>   EXTLIBS += $(EXTLIBS_LIBUNWIND)
> endif
> 
> -ifeq ($(NO_SYSCALL_TABLE),0)
> -  $(call detected,CONFIG_TRACE)
> -else
> -  ifndef NO_LIBAUDIT
> -    $(call feature_check,libaudit)
> -    ifneq ($(feature-libaudit), 1)
> -      msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> -      NO_LIBAUDIT := 1
> -    else
> -      CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> -      EXTLIBS += -laudit
> -      $(call detected,CONFIG_TRACE)
> +ifneq ($(NO_LIBTRACEEVENT),1)
> +  ifeq ($(NO_SYSCALL_TABLE),0)
> +    $(call detected,CONFIG_TRACE)
> +  else
> +    ifndef NO_LIBAUDIT
> +      $(call feature_check,libaudit)
> +      ifneq ($(feature-libaudit), 1)
> +        msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> +        NO_LIBAUDIT := 1
> +      else
> +        CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> +        EXTLIBS += -laudit
> +        $(call detected,CONFIG_TRACE)
> +      endif
>     endif
>   endif
> endif
> @@ -1182,9 +1184,11 @@ ifdef LIBPFM4
>   endif
> endif
> 
> -ifdef LIBTRACEEVENT_DYNAMIC
> +# libtraceevent is a recommended dependency picked up from the system.
> +ifneq ($(NO_LIBTRACEEVENT),1)
>   $(call feature_check,libtraceevent)
>   ifeq ($(feature-libtraceevent), 1)
> +    CFLAGS += -DHAVE_LIBTRACEEVENT
>     EXTLIBS += -ltraceevent
>     LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
>     LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> @@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
>     LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
>     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
>     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
> +    $(call detected,CONFIG_TRACEEVENT)
>   else
> -    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
> +    dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
>   endif
> -endif
> 
> -ifdef LIBTRACEFS_DYNAMIC
>   $(call feature_check,libtracefs)
>   ifeq ($(feature-libtracefs), 1)
>     EXTLIBS += -ltracefs
> @@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
>     LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
>     LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
>     CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
> -  else
> -    dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
>   endif
> endif
> 
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index 6689f644782f..f0e4daeef812 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -128,10 +128,6 @@ include ../scripts/utilities.mak
> #
> # Define BUILD_BPF_SKEL to enable BPF skeletons
> #
> -# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
> -#
> -# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
> -#
> 
> # As per kernel Makefile, avoid funny character set dependencies
> unexport LC_ALL
> @@ -242,10 +238,6 @@ sub-make: fixdep
> else # force_fixdep
> 
> LIBAPI_DIR      = $(srctree)/tools/lib/api/
> -ifndef LIBTRACEEVENT_DYNAMIC
> -LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
> -LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
> -endif
> LIBBPF_DIR      = $(srctree)/tools/lib/bpf/
> LIBSUBCMD_DIR   = $(srctree)/tools/lib/subcmd/
> LIBSYMBOL_DIR   = $(srctree)/tools/lib/symbol/
> @@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
> grep-libs = $(filter -l%,$(1))
> strip-libs = $(filter-out -l%,$(1))
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -ifneq ($(OUTPUT),)
> -  LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
> -else
> -  LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
> -endif
> -LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
> -LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
> -LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
> -LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
> -export LIBTRACEEVENT
> -LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
> -CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
> -#
> -# The static build has no dynsym table, so this does not work for
> -# static build. Looks like linker starts to scream about that now
> -# (in Fedora 26) so we need to switch it off for static build.
> -DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
> -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
> -else
> -LIBTRACEEVENT_DYNAMIC_LIST =
> -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
> -endif
> -
> ifneq ($(OUTPUT),)
>   LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
> else
> @@ -381,11 +348,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
> python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
> 
> PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> -ifndef LIBTRACEEVENT_DYNAMIC
> -PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
> -else
> PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> -endif
> 
> SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> 
> @@ -430,9 +393,6 @@ ifndef NO_LIBBPF
>     PERFLIBS += $(LIBBPF)
>   endif
> endif
> -ifndef LIBTRACEEVENT_DYNAMIC
> -  PERFLIBS += $(LIBTRACEEVENT)
> -endif
> 
> # We choose to avoid "if .. else if .. else .. endif endif"
> # because maintaining the nesting to match is a pain.  If
> @@ -682,9 +642,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
> # Create python binding output directory if not already present
> _dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
> 
> -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
> +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
> 	$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
> -        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
> +        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
> 	  $(PYTHON_WORD) util/setup.py \
> 	  --quiet build_ext; \
> 	cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
> @@ -710,8 +670,8 @@ $(PERF_IN): prepare FORCE
> $(PMU_EVENTS_IN): FORCE prepare
> 	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
> 
> -$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
> -	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
> +$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
> +	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
> 		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
> 
> $(GTK_IN): FORCE prepare
> @@ -797,10 +757,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
> 	$(LIBSYMBOL) \
> 	bpf-skel
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -prepare: $(LIBTRACEEVENT)
> -endif
> -
> $(OUTPUT)%.o: %.c prepare FORCE
> 	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
> 
> @@ -856,38 +812,6 @@ endif
> 
> $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
> -
> -$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
> -		$@ install_headers
> -
> -$(LIBTRACEEVENT)-clean:
> -	$(call QUIET_CLEAN, libtraceevent)
> -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
> -
> -libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> -		plugins
> -
> -libtraceevent_plugins-clean:
> -	$(call QUIET_CLEAN, libtraceevent_plugins)
> -	$(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> -
> -$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> -		$(LIBTRACEEVENT_FLAGS) $@
> -
> -install-traceevent-plugins: libtraceevent_plugins
> -	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> -		DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
> -		$(LIBTRACEEVENT_FLAGS) install
> -endif
> -
> $(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
> 	$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
> 		DESTDIR=$(LIBAPI_DESTDIR) prefix= \
> @@ -1095,10 +1019,6 @@ install-tests: all install-gtk
> 
> install-bin: install-tools install-tests
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -install-bin: install-traceevent-plugins
> -endif
> -
> install: install-bin try-install-man
> 
> install-python_ext:
> @@ -1124,11 +1044,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
> $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
> 	$(Q)$(MKDIR) -p $@
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
> -	$(Q)$(MKDIR) -p $@
> -endif
> -
> ifdef BUILD_BPF_SKEL
> BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
> BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
> @@ -1211,10 +1126,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
> 	$(call QUIET_CLEAN, Documentation) \
> 	$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
> 
> -ifndef LIBTRACEEVENT_DYNAMIC
> -clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
> -endif
> -
> #
> # To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
> # file if defined, with no further action.
> @@ -1232,6 +1143,6 @@ FORCE:
> .PHONY: all install clean config-clean strip install-gtk
> .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
> .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
> -.PHONY: libtraceevent_plugins archheaders
> +.PHONY: archheaders
> 
> endif # force_fixdep
> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> index dbeb04cb336e..a92644f12eec 100644
> --- a/tools/perf/arch/x86/util/Build
> +++ b/tools/perf/arch/x86/util/Build
> @@ -1,7 +1,7 @@
> perf-y += header.o
> perf-y += tsc.o
> perf-y += pmu.o
> -perf-y += kvm-stat.o
> +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o

Hi,

Observed build failure in powerpc with NO_LIBTRACEEVENT due to kvm-stat.c compile fail.
CONFIG_TRACEEVENT  check is also needed in arch/powerpc/util/Build to fix this. Patch below:

From e06f020f66435649c10fb7d391922f687d5b8206 Mon Sep 17 00:00:00 2001
From: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Date: Wed, 7 Dec 2022 16:46:30 +0530
Subject: [PATCH] tools/perf/arch/powerpc: Disable kvm-stat when traceevent is
 disabled
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

commit 407bb16c1a32 ("perf build: Use libtraceevent from the system")
disables libtraceevent support when f libtraceevent isn't installed
or NO_LIBTRACEEVENT=1 is passed. Commit added CONFIG_TRACEEVENT check
for kvm-stat in x86/util/Build. But same has to be added in powerpc
as well. Otherwise build will fail as below:

	#make NO_LIBTRACEEVENT=1
	arch/powerpc/util/kvm-stat.c: In function 'hcall_event_get_key':
arch/powerpc/util/kvm-stat.c:42:20: error: implicit declaration of function 'evsel__intval'; did you mean 'evsel__env'? [-Werror=implicit-function-declaration]
   42 |         key->key = evsel__intval(evsel, sample, "req");
      |                    ^~~~~~~~~~~~~
      |                    evsel__env

Patch adds the check for CONFIG_TRACEEVENT in powerpc/util/Build.

Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
---
 tools/perf/arch/powerpc/util/Build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
index 0115f3166568..71e57f28abda 100644
--- a/tools/perf/arch/powerpc/util/Build
+++ b/tools/perf/arch/powerpc/util/Build
@@ -1,5 +1,5 @@
 perf-y += header.o
-perf-y += kvm-stat.o
+perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
 perf-y += perf_regs.o
 perf-y += mem-events.o
 perf-y += sym-handling.o
Arnaldo Carvalho de Melo Dec. 7, 2022, 2:21 p.m. UTC | #15
Em Tue, Dec 06, 2022 at 02:22:15PM -0800, Ian Rogers escreveu:
> On Tue, Dec 6, 2022 at 9:31 AM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
> > I'm missing some detail, this isn't working, util/trace-event.c is still
> > being built and linked.

> > The python binding should be usable without tracepoints, in fact its
> > first usage was just to have access to the perf metaevents, see
> > tools/perf/python/twatch.py.

> You're right. I'd assumed that if you were disabling libtraceevent
> then you'd also disable python. To fix the issue above you can do:

> --- a/tools/perf/util/python-ext-sources
> +++ b/tools/perf/util/python-ext-sources
> @@ -30,7 +30,6 @@ util/rblist.c
> util/counts.c
> util/print_binary.c
> util/strlist.c
> -util/trace-event.c
> ../lib/rbtree.c
> util/string.c
> util/symbol_fprintf.c

> but this needs making conditional (possibly in setup.py) on whether
> libtraceevent is present or not.

Ok, I fixed this by removing the util/trace-event.c file at setup.py
time, and removing it from the list of dependencies for python.so build,
etc.

With what I have at tmp.perf/core I'm being able to build with
combinations of:

- Having or not libtraceevent-devel installed

- Using NO_LIBTRACEEVENT=1

- The default build

All mixed up, but I wasn't so judicious so far, we need to add an entry
with NO_LIBTRACEVENT=1 to tools/perf/tests/, etc.

One thing I'm doing now is testing with the container builds, and I'm
afraid we have to delay deleting the in-kernel old copy of
tools/lib/traceevent till distros that don't ship libtraceevent as a
separate package are EOLed.

We need in those cases to fallback to tools/lib/traceevent/, with a
warning probably.

I'm now updating my container build recipes to install
libtraceevent-devel, when available, which isn't the case, for instance,
for almalinux:8, the first I tried updating.

Please take a look at:

https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/commit/?h=tmp.perf/core

The HEAD for that branch has the list of changes I made to get this
going.

Also I have the feeling the warning about libtraceevent not being
available should be made more proeminent and detailed in what gets
removed if this new, important dependency isn't met...

I agree removing libtraceevent and adding yet another dependency to
building perf is important since the libtraceevent maintainers took the
decision of having it moved away from the kernel sources, but since this
has been a no-brainer for so long, the fallout of this decision may be
noticeable.

At least by now we have clear markings of where libtraceevent is used.

Thanks,

- Arnaldo
Arnaldo Carvalho de Melo Dec. 7, 2022, 2:31 p.m. UTC | #16
Em Wed, Dec 07, 2022 at 11:21:18AM -0300, Arnaldo Carvalho de Melo escreveu:
> One thing I'm doing now is testing with the container builds, and I'm
> afraid we have to delay deleting the in-kernel old copy of
> tools/lib/traceevent till distros that don't ship libtraceevent as a
> separate package are EOLed.
> 
> We need in those cases to fallback to tools/lib/traceevent/, with a
> warning probably.
> 
> I'm now updating my container build recipes to install
> libtraceevent-devel, when available, which isn't the case, for instance,
> for almalinux:8, the first I tried updating.

No distro I tested so far has a package for libtracevent in is default
repositories:

almalinux 8 and 9 and the recently released Alpine Linux 3.17 (at least
I hadn't a recipe for that one, will try with edge).

- Arnaldo
Arnaldo Carvalho de Melo Dec. 7, 2022, 2:33 p.m. UTC | #17
Em Wed, Dec 07, 2022 at 11:31:38AM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Wed, Dec 07, 2022 at 11:21:18AM -0300, Arnaldo Carvalho de Melo escreveu:
> > One thing I'm doing now is testing with the container builds, and I'm
> > afraid we have to delay deleting the in-kernel old copy of
> > tools/lib/traceevent till distros that don't ship libtraceevent as a
> > separate package are EOLed.
> > 
> > We need in those cases to fallback to tools/lib/traceevent/, with a
> > warning probably.
> > 
> > I'm now updating my container build recipes to install
> > libtraceevent-devel, when available, which isn't the case, for instance,
> > for almalinux:8, the first I tried updating.
> 
> No distro I tested so far has a package for libtracevent in is default
> repositories:
> 
> almalinux 8 and 9 and the recently released Alpine Linux 3.17 (at least
> I hadn't a recipe for that one, will try with edge).

No luck:

[perfbuilder@five edge]$ db
acmel/linux-perf-tools-build-alpine:edge
STEP 1/8: FROM alpine:edge
STEP 2/8: MAINTAINER Arnaldo Carvalho de Melo <acme@kernel.org>
STEP 3/8: RUN apk add --no-cache 	make gcc g++ flex bison curl 	bc findutils libcap-dev 	mandoc clang clang-dev llvm llvm-dev 	libc-dev linux-headers libdwarf-dev musl-obstack-dev argp-standalone 	elfutils-dev openssl-dev slang-dev 	gtk+3.0-dev perl-dev python3-dev py3-setuptools binutils-dev xz-dev 	numactl-dev libunwind-dev zstd-dev libcap-dev openjdk8 xmlto asciidoc cmake asciidoc xmlto 	libtraceevent-dev
fetch https://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
ERROR: unable to select packages:
  libtraceevent-dev (no such package):
    required by: world[libtraceevent-dev]
error building at STEP "RUN apk add --no-cache 	make gcc g++ flex bison curl 	bc findutils libcap-dev 	mandoc clang clang-dev llvm llvm-dev 	libc-dev linux-headers libdwarf-dev musl-obstack-dev argp-standalone 	elfutils-dev openssl-dev slang-dev 	gtk+3.0-dev perl-dev python3-dev py3-setuptools binutils-dev xz-dev 	numactl-dev libunwind-dev zstd-dev libcap-dev openjdk8 xmlto asciidoc cmake asciidoc xmlto 	libtraceevent-dev": error while running runtime: exit status 1
[perfbuilder@five edge]$ vi Dockerfile
[perfbuilder@five edge]$ db
acmel/linux-perf-tools-build-alpine:edge
STEP 1/8: FROM alpine:edge
STEP 2/8: MAINTAINER Arnaldo Carvalho de Melo <acme@kernel.org>
STEP 3/8: RUN apk add --no-cache 	make gcc g++ flex bison curl 	bc findutils libcap-dev 	mandoc clang clang-dev llvm llvm-dev 	libc-dev linux-headers libdwarf-dev musl-obstack-dev argp-standalone 	elfutils-dev openssl-dev slang-dev 	gtk+3.0-dev perl-dev python3-dev py3-setuptools binutils-dev xz-dev 	numactl-dev libunwind-dev zstd-dev libcap-dev openjdk8 xmlto asciidoc cmake asciidoc xmlto 	traceevent-dev
fetch https://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
ERROR: unable to select packages:
  traceevent-dev (no such package):
    required by: world[traceevent-dev]
error building at STEP "RUN apk add --no-cache 	make gcc g++ flex bison curl 	bc findutils libcap-dev 	mandoc clang clang-dev llvm llvm-dev 	libc-dev linux-headers libdwarf-dev musl-obstack-dev argp-standalone 	elfutils-dev openssl-dev slang-dev 	gtk+3.0-dev perl-dev python3-dev py3-setuptools binutils-dev xz-dev 	numactl-dev libunwind-dev zstd-dev libcap-dev openjdk8 xmlto asciidoc cmake asciidoc xmlto 	traceevent-dev": error while running runtime: exit status 1
[perfbuilder@five edge]$
Arnaldo Carvalho de Melo Dec. 7, 2022, 2:37 p.m. UTC | #18
Em Wed, Dec 07, 2022 at 11:21:18AM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Dec 06, 2022 at 02:22:15PM -0800, Ian Rogers escreveu:
> > On Tue, Dec 6, 2022 at 9:31 AM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > > Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > I'm missing some detail, this isn't working, util/trace-event.c is still
> > > being built and linked.
> 
> > > The python binding should be usable without tracepoints, in fact its
> > > first usage was just to have access to the perf metaevents, see
> > > tools/perf/python/twatch.py.
> 
> > You're right. I'd assumed that if you were disabling libtraceevent
> > then you'd also disable python. To fix the issue above you can do:
> 
> > --- a/tools/perf/util/python-ext-sources
> > +++ b/tools/perf/util/python-ext-sources
> > @@ -30,7 +30,6 @@ util/rblist.c
> > util/counts.c
> > util/print_binary.c
> > util/strlist.c
> > -util/trace-event.c
> > ../lib/rbtree.c
> > util/string.c
> > util/symbol_fprintf.c
> 
> > but this needs making conditional (possibly in setup.py) on whether
> > libtraceevent is present or not.
> 
> Ok, I fixed this by removing the util/trace-event.c file at setup.py
> time, and removing it from the list of dependencies for python.so build,
> etc.
> 
> With what I have at tmp.perf/core I'm being able to build with
> combinations of:
> 
> - Having or not libtraceevent-devel installed
> 
> - Using NO_LIBTRACEEVENT=1
> 
> - The default build

cross building reveals some more:

  22    11.70 debian:experimental-x-arm64   : FAIL gcc version 12.2.0 (Debian 12.2.0-9)
    arch/arm64/util/kvm-stat.c: In function 'event_get_key':
    arch/arm64/util/kvm-stat.c:30:20: error: implicit declaration of function 'evsel__intval'; did you mean 'evsel__env'? [-Werror=implicit-function-declaration]
       30 |         key->key = evsel__intval(evsel, sample, kvm_exit_reason);
          |                    ^~~~~~~~~~~~~
          |                    evsel__env
    cc1: all warnings being treated as errors
    make[5]: *** [/git/perf-6.1.0-rc6/tools/build/Makefile.build:139: util] Error 2
    make[4]: *** [/git/perf-6.1.0-rc6/tools/build/Makefile.build:139: arm64] Error 2
    make[3]: *** [/git/perf-6.1.0-rc6/tools/build/Makefile.build:139: arch] Error 2

	I'll conditionalise tha one as well...

- Arnaldo
Steven Rostedt Dec. 7, 2022, 2:39 p.m. UTC | #19
On Wed, 7 Dec 2022 11:31:38 -0300
Arnaldo Carvalho de Melo <acme@kernel.org> wrote:

> No distro I tested so far has a package for libtracevent in is default
> repositories:

Not sure what you mean by "default repository".

At least on Debian testing, I have libtraceevent-dev available.

-- Steve
Arnaldo Carvalho de Melo Dec. 7, 2022, 4:02 p.m. UTC | #20
Em Wed, Dec 07, 2022 at 09:39:58AM -0500, Steven Rostedt escreveu:
> On Wed, 7 Dec 2022 11:31:38 -0300
> Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> 
> > No distro I tested so far has a package for libtracevent in is default
> > repositories:
> 
> Not sure what you mean by "default repository".
> 
> At least on Debian testing, I have libtraceevent-dev available.

Right, I'm talking about non-bleeding edge, distros that are still
supported. I'm still checking, fedora is ok all the way back to 33, wrt
having libtraceevent available.

- Arnaldo
Ian Rogers Dec. 7, 2022, 4:16 p.m. UTC | #21
On Wed, Dec 7, 2022 at 5:46 AM Athira Rajeev
<atrajeev@linux.vnet.ibm.com> wrote:
>
>
>
> > On 06-Dec-2022, at 4:29 AM, Ian Rogers <irogers@google.com> wrote:
> >
> > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > build, don't compile in libtraceevent and libtracefs support. This
> > also disables CONFIG_TRACE that controls "perf
> > trace". CONFIG_TRACEEVENT is used to control enablement in
> > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > kmem, kwork, lock, sched and timechart are removed. The majority of
> > commands continue to work including "perf test".
> >
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> > tools/perf/Build                              | 11 ++-
> > tools/perf/Makefile.config                    | 37 +++----
> > tools/perf/Makefile.perf                      | 99 +------------------
> > tools/perf/arch/x86/util/Build                |  2 +-
> > tools/perf/arch/x86/util/intel-pt.c           |  4 +
> > tools/perf/builtin-annotate.c                 |  2 +
> > tools/perf/builtin-inject.c                   |  8 ++
> > tools/perf/builtin-kmem.c                     |  1 +
> > tools/perf/builtin-kvm.c                      | 12 +--
> > tools/perf/builtin-kwork.c                    |  1 +
> > tools/perf/builtin-record.c                   |  2 +
> > tools/perf/builtin-report.c                   |  9 +-
> > tools/perf/builtin-script.c                   | 19 +++-
> > tools/perf/builtin-timechart.c                |  1 +
> > tools/perf/builtin-trace.c                    |  5 +-
> > tools/perf/builtin-version.c                  |  1 +
> > tools/perf/perf.c                             | 24 +++--
> > .../perf/scripts/python/Perf-Trace-Util/Build |  2 +-
> > tools/perf/tests/Build                        | 12 +--
> > tools/perf/tests/builtin-test.c               |  6 ++
> > tools/perf/tests/parse-events.c               | 20 ++++
> > tools/perf/util/Build                         | 10 +-
> > tools/perf/util/data-convert-bt.c             |  5 +-
> > tools/perf/util/data-convert-json.c           |  9 +-
> > tools/perf/util/evlist.c                      |  6 +-
> > tools/perf/util/evlist.h                      |  4 +
> > tools/perf/util/evsel.c                       | 11 ++-
> > tools/perf/util/evsel.h                       | 12 ++-
> > tools/perf/util/evsel_fprintf.c               |  7 +-
> > tools/perf/util/header.c                      | 19 ++++
> > tools/perf/util/header.h                      |  2 +
> > tools/perf/util/intel-pt.c                    |  7 +-
> > tools/perf/util/parse-events.c                | 15 +++
> > tools/perf/util/parse-events.h                |  1 -
> > tools/perf/util/python.c                      |  4 +
> > tools/perf/util/scripting-engines/Build       |  6 +-
> > .../scripting-engines/trace-event-python.c    |  1 +
> > tools/perf/util/session.c                     |  2 +
> > tools/perf/util/session.h                     |  2 +
> > tools/perf/util/sort.c                        | 60 +++++++++--
> > tools/perf/util/synthetic-events.c            |  6 ++
> > tools/perf/util/trace-event-parse.c           |  2 +
> > tools/perf/util/trace-event-read.c            |  1 +
> > tools/perf/util/trace-event-scripting.c       |  1 +
> > tools/perf/util/trace-event.c                 |  1 -
> > tools/perf/util/trace-event.h                 | 11 ++-
> > 46 files changed, 312 insertions(+), 171 deletions(-)
> >
> > diff --git a/tools/perf/Build b/tools/perf/Build
> > index 496b096153bb..edafe3cb3d07 100644
> > --- a/tools/perf/Build
> > +++ b/tools/perf/Build
> > @@ -5,7 +5,6 @@ perf-y += builtin-diff.o
> > perf-y += builtin-evlist.o
> > perf-y += builtin-ftrace.o
> > perf-y += builtin-help.o
> > -perf-y += builtin-sched.o
> > perf-y += builtin-buildid-list.o
> > perf-y += builtin-buildid-cache.o
> > perf-y += builtin-kallsyms.o
> > @@ -13,11 +12,8 @@ perf-y += builtin-list.o
> > perf-y += builtin-record.o
> > perf-y += builtin-report.o
> > perf-y += builtin-stat.o
> > -perf-y += builtin-timechart.o
> > perf-y += builtin-top.o
> > perf-y += builtin-script.o
> > -perf-y += builtin-kmem.o
> > -perf-y += builtin-lock.o
> > perf-y += builtin-kvm.o
> > perf-y += builtin-inject.o
> > perf-y += builtin-mem.o
> > @@ -25,7 +21,12 @@ perf-y += builtin-data.o
> > perf-y += builtin-version.o
> > perf-y += builtin-c2c.o
> > perf-y += builtin-daemon.o
> > -perf-y += builtin-kwork.o
> > +
> > +perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
> > +perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o
> >
> > perf-$(CONFIG_TRACE) += builtin-trace.o
> > perf-$(CONFIG_LIBELF) += builtin-probe.o
> > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> > index 9cc3c48f3288..b34288cb1900 100644
> > --- a/tools/perf/Makefile.config
> > +++ b/tools/perf/Makefile.config
> > @@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
> >   EXTLIBS += $(EXTLIBS_LIBUNWIND)
> > endif
> >
> > -ifeq ($(NO_SYSCALL_TABLE),0)
> > -  $(call detected,CONFIG_TRACE)
> > -else
> > -  ifndef NO_LIBAUDIT
> > -    $(call feature_check,libaudit)
> > -    ifneq ($(feature-libaudit), 1)
> > -      msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> > -      NO_LIBAUDIT := 1
> > -    else
> > -      CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> > -      EXTLIBS += -laudit
> > -      $(call detected,CONFIG_TRACE)
> > +ifneq ($(NO_LIBTRACEEVENT),1)
> > +  ifeq ($(NO_SYSCALL_TABLE),0)
> > +    $(call detected,CONFIG_TRACE)
> > +  else
> > +    ifndef NO_LIBAUDIT
> > +      $(call feature_check,libaudit)
> > +      ifneq ($(feature-libaudit), 1)
> > +        msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
> > +        NO_LIBAUDIT := 1
> > +      else
> > +        CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
> > +        EXTLIBS += -laudit
> > +        $(call detected,CONFIG_TRACE)
> > +      endif
> >     endif
> >   endif
> > endif
> > @@ -1182,9 +1184,11 @@ ifdef LIBPFM4
> >   endif
> > endif
> >
> > -ifdef LIBTRACEEVENT_DYNAMIC
> > +# libtraceevent is a recommended dependency picked up from the system.
> > +ifneq ($(NO_LIBTRACEEVENT),1)
> >   $(call feature_check,libtraceevent)
> >   ifeq ($(feature-libtraceevent), 1)
> > +    CFLAGS += -DHAVE_LIBTRACEEVENT
> >     EXTLIBS += -ltraceevent
> >     LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
> >     LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> > @@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
> >     LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
> >     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
> >     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
> > +    $(call detected,CONFIG_TRACEEVENT)
> >   else
> > -    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
> > +    dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
> >   endif
> > -endif
> >
> > -ifdef LIBTRACEFS_DYNAMIC
> >   $(call feature_check,libtracefs)
> >   ifeq ($(feature-libtracefs), 1)
> >     EXTLIBS += -ltracefs
> > @@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
> >     LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
> >     LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
> >     CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
> > -  else
> > -    dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
> >   endif
> > endif
> >
> > diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> > index 6689f644782f..f0e4daeef812 100644
> > --- a/tools/perf/Makefile.perf
> > +++ b/tools/perf/Makefile.perf
> > @@ -128,10 +128,6 @@ include ../scripts/utilities.mak
> > #
> > # Define BUILD_BPF_SKEL to enable BPF skeletons
> > #
> > -# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
> > -#
> > -# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
> > -#
> >
> > # As per kernel Makefile, avoid funny character set dependencies
> > unexport LC_ALL
> > @@ -242,10 +238,6 @@ sub-make: fixdep
> > else # force_fixdep
> >
> > LIBAPI_DIR      = $(srctree)/tools/lib/api/
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
> > -LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
> > -endif
> > LIBBPF_DIR      = $(srctree)/tools/lib/bpf/
> > LIBSUBCMD_DIR   = $(srctree)/tools/lib/subcmd/
> > LIBSYMBOL_DIR   = $(srctree)/tools/lib/symbol/
> > @@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
> > grep-libs = $(filter -l%,$(1))
> > strip-libs = $(filter-out -l%,$(1))
> >
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -ifneq ($(OUTPUT),)
> > -  LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
> > -else
> > -  LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
> > -endif
> > -LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
> > -LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
> > -LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> > -LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
> > -LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
> > -export LIBTRACEEVENT
> > -LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
> > -CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
> > -#
> > -# The static build has no dynsym table, so this does not work for
> > -# static build. Looks like linker starts to scream about that now
> > -# (in Fedora 26) so we need to switch it off for static build.
> > -DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
> > -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
> > -else
> > -LIBTRACEEVENT_DYNAMIC_LIST =
> > -LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
> > -endif
> > -
> > ifneq ($(OUTPUT),)
> >   LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
> > else
> > @@ -381,11 +348,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
> > python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
> >
> > PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
> > -else
> > PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> > -endif
> >
> > SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> >
> > @@ -430,9 +393,6 @@ ifndef NO_LIBBPF
> >     PERFLIBS += $(LIBBPF)
> >   endif
> > endif
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -  PERFLIBS += $(LIBTRACEEVENT)
> > -endif
> >
> > # We choose to avoid "if .. else if .. else .. endif endif"
> > # because maintaining the nesting to match is a pain.  If
> > @@ -682,9 +642,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
> > # Create python binding output directory if not already present
> > _dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
> >
> > -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
> > +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
> >       $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
> > -        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
> > +        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
> >         $(PYTHON_WORD) util/setup.py \
> >         --quiet build_ext; \
> >       cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
> > @@ -710,8 +670,8 @@ $(PERF_IN): prepare FORCE
> > $(PMU_EVENTS_IN): FORCE prepare
> >       $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
> >
> > -$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
> > -     $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
> > +$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
> > +     $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
> >               $(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
> >
> > $(GTK_IN): FORCE prepare
> > @@ -797,10 +757,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
> >       $(LIBSYMBOL) \
> >       bpf-skel
> >
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -prepare: $(LIBTRACEEVENT)
> > -endif
> > -
> > $(OUTPUT)%.o: %.c prepare FORCE
> >       $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
> >
> > @@ -856,38 +812,6 @@ endif
> >
> > $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
> >
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
> > -
> > -$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
> > -     $(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
> > -             DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
> > -             $@ install_headers
> > -
> > -$(LIBTRACEEVENT)-clean:
> > -     $(call QUIET_CLEAN, libtraceevent)
> > -     $(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
> > -
> > -libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> > -     $(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> > -             DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> > -             plugins
> > -
> > -libtraceevent_plugins-clean:
> > -     $(call QUIET_CLEAN, libtraceevent_plugins)
> > -     $(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
> > -
> > -$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
> > -     $(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> > -             DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
> > -             $(LIBTRACEEVENT_FLAGS) $@
> > -
> > -install-traceevent-plugins: libtraceevent_plugins
> > -     $(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
> > -             DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
> > -             $(LIBTRACEEVENT_FLAGS) install
> > -endif
> > -
> > $(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
> >       $(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
> >               DESTDIR=$(LIBAPI_DESTDIR) prefix= \
> > @@ -1095,10 +1019,6 @@ install-tests: all install-gtk
> >
> > install-bin: install-tools install-tests
> >
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -install-bin: install-traceevent-plugins
> > -endif
> > -
> > install: install-bin try-install-man
> >
> > install-python_ext:
> > @@ -1124,11 +1044,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
> > $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
> >       $(Q)$(MKDIR) -p $@
> >
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
> > -     $(Q)$(MKDIR) -p $@
> > -endif
> > -
> > ifdef BUILD_BPF_SKEL
> > BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
> > BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
> > @@ -1211,10 +1126,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
> >       $(call QUIET_CLEAN, Documentation) \
> >       $(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
> >
> > -ifndef LIBTRACEEVENT_DYNAMIC
> > -clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
> > -endif
> > -
> > #
> > # To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
> > # file if defined, with no further action.
> > @@ -1232,6 +1143,6 @@ FORCE:
> > .PHONY: all install clean config-clean strip install-gtk
> > .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
> > .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
> > -.PHONY: libtraceevent_plugins archheaders
> > +.PHONY: archheaders
> >
> > endif # force_fixdep
> > diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> > index dbeb04cb336e..a92644f12eec 100644
> > --- a/tools/perf/arch/x86/util/Build
> > +++ b/tools/perf/arch/x86/util/Build
> > @@ -1,7 +1,7 @@
> > perf-y += header.o
> > perf-y += tsc.o
> > perf-y += pmu.o
> > -perf-y += kvm-stat.o
> > +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>
> Hi,
>
> Observed build failure in powerpc with NO_LIBTRACEEVENT due to kvm-stat.c compile fail.
> CONFIG_TRACEEVENT  check is also needed in arch/powerpc/util/Build to fix this. Patch below:
>
> From e06f020f66435649c10fb7d391922f687d5b8206 Mon Sep 17 00:00:00 2001
> From: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> Date: Wed, 7 Dec 2022 16:46:30 +0530
> Subject: [PATCH] tools/perf/arch/powerpc: Disable kvm-stat when traceevent is
>  disabled
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> commit 407bb16c1a32 ("perf build: Use libtraceevent from the system")
> disables libtraceevent support when f libtraceevent isn't installed
> or NO_LIBTRACEEVENT=1 is passed. Commit added CONFIG_TRACEEVENT check
> for kvm-stat in x86/util/Build. But same has to be added in powerpc
> as well. Otherwise build will fail as below:
>
>         #make NO_LIBTRACEEVENT=1
>         arch/powerpc/util/kvm-stat.c: In function 'hcall_event_get_key':
> arch/powerpc/util/kvm-stat.c:42:20: error: implicit declaration of function 'evsel__intval'; did you mean 'evsel__env'? [-Werror=implicit-function-declaration]
>    42 |         key->key = evsel__intval(evsel, sample, "req");
>       |                    ^~~~~~~~~~~~~
>       |                    evsel__env
>
> Patch adds the check for CONFIG_TRACEEVENT in powerpc/util/Build.
>
> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>

Sorry for missing this.

Acked-by: Ian Rogers <irogers@google.com>

Thanks,
Ian

> ---
>  tools/perf/arch/powerpc/util/Build | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
> index 0115f3166568..71e57f28abda 100644
> --- a/tools/perf/arch/powerpc/util/Build
> +++ b/tools/perf/arch/powerpc/util/Build
> @@ -1,5 +1,5 @@
>  perf-y += header.o
> -perf-y += kvm-stat.o
> +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>  perf-y += perf_regs.o
>  perf-y += mem-events.o
>  perf-y += sym-handling.o
> --
> 2.31.1
>
>
> I couldn't functionally check "perf kvm stat"  after this change since there are build issues remaining.
>
> Thanks
> Athira
>
> > perf-y += perf_regs.o
> > perf-y += topdown.o
> > perf-y += machine.o
> > diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
> > index af102f471e9f..1e39a034cee9 100644
> > --- a/tools/perf/arch/x86/util/intel-pt.c
> > +++ b/tools/perf/arch/x86/util/intel-pt.c
> > @@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
> >       return 0;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int intel_pt_track_switches(struct evlist *evlist)
> > {
> >       const char *sched_switch = "sched:sched_switch";
> > @@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)
> >
> >       return 0;
> > }
> > +#endif
> >
> > static void intel_pt_valid_str(char *str, size_t len, u64 valid)
> > {
> > @@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> >                                       ptr->have_sched_switch = 2;
> >                       }
> >               } else {
> > +#ifdef HAVE_LIBTRACEEVENT
> >                       err = intel_pt_track_switches(evlist);
> >                       if (err == -EPERM)
> >                               pr_debug2("Unable to select sched:sched_switch\n");
> > @@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> >                               return err;
> >                       else
> >                               ptr->have_sched_switch = 1;
> > +#endif
> >               }
> >       }
> >
> > diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> > index 517d928c00e3..90458ca6933f 100644
> > --- a/tools/perf/builtin-annotate.c
> > +++ b/tools/perf/builtin-annotate.c
> > @@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
> >                       .namespaces = perf_event__process_namespaces,
> >                       .attr   = perf_event__process_attr,
> >                       .build_id = perf_event__process_build_id,
> > +#ifdef HAVE_LIBTRACEEVENT
> >                       .tracing_data   = perf_event__process_tracing_data,
> > +#endif
> >                       .id_index       = perf_event__process_id_index,
> >                       .auxtrace_info  = perf_event__process_auxtrace_info,
> >                       .auxtrace       = perf_event__process_auxtrace,
> > diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> > index e254f18986f7..3f4e4dd5abf3 100644
> > --- a/tools/perf/builtin-inject.c
> > +++ b/tools/perf/builtin-inject.c
> > @@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
> >       return err;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int perf_event__repipe_tracing_data(struct perf_session *session,
> >                                          union perf_event *event)
> > {
> > @@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
> >
> >       return perf_event__process_tracing_data(session, event);
> > }
> > +#endif
> >
> > static int dso__read_build_id(struct dso *dso)
> > {
> > @@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
> >       return 0;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int perf_inject__sched_stat(struct perf_tool *tool,
> >                                  union perf_event *event __maybe_unused,
> >                                  struct perf_sample *sample,
> > @@ -836,6 +839,7 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
> >       build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
> >       return perf_event__repipe(tool, event_sw, &sample_sw, machine);
> > }
> > +#endif
> >
> > static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
> > {
> > @@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
> >               inject->tool.mmap         = perf_event__repipe_mmap;
> >               inject->tool.mmap2        = perf_event__repipe_mmap2;
> >               inject->tool.fork         = perf_event__repipe_fork;
> > +#ifdef HAVE_LIBTRACEEVENT
> >               inject->tool.tracing_data = perf_event__repipe_tracing_data;
> > +#endif
> >       }
> >
> >       output_data_offset = perf_session__data_offset(session->evlist);
> > @@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
> >                               evsel->handler = perf_inject__sched_switch;
> >                       } else if (!strcmp(name, "sched:sched_process_exit"))
> >                               evsel->handler = perf_inject__sched_process_exit;
> > +#ifdef HAVE_LIBTRACEEVENT
> >                       else if (!strncmp(name, "sched:sched_stat_", 17))
> >                               evsel->handler = perf_inject__sched_stat;
> > +#endif
> >               }
> >       } else if (inject->itrace_synth_opts.vm_time_correlation) {
> >               session->itrace_synth_opts = &inject->itrace_synth_opts;
> > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> > index ebfab2ca1702..e20656c431a4 100644
> > --- a/tools/perf/builtin-kmem.c
> > +++ b/tools/perf/builtin-kmem.c
> > @@ -35,6 +35,7 @@
> > #include <regex.h>
> >
> > #include <linux/ctype.h>
> > +#include <traceevent/event-parse.h>
> >
> > static int    kmem_slab;
> > static int    kmem_page;
> > diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
> > index 7d9ec1bac1a2..641e739c717c 100644
> > --- a/tools/perf/builtin-kvm.c
> > +++ b/tools/perf/builtin-kvm.c
> > @@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
> >       return filename;
> > }
> >
> > -#ifdef HAVE_KVM_STAT_SUPPORT
> > +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >
> > void exit_event_get_key(struct evsel *evsel,
> >                       struct perf_sample *sample,
> > @@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
> >               pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
> > }
> >
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > static int process_lost_event(struct perf_tool *tool,
> >                             union perf_event *event __maybe_unused,
> >                             struct perf_sample *sample __maybe_unused,
> > @@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
> >       return true;
> > }
> >
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > /* keeping the max events to a modest level to keep
> >  * the processing of samples per mmap smooth.
> >  */
> > @@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
> >       return kvm_events_report_vcpu(kvm);
> > }
> >
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > static struct evlist *kvm_live_event_list(void)
> > {
> >       struct evlist *evlist;
> > @@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
> >       if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
> >               return kvm_events_report(&kvm, argc - 1 , argv + 1);
> >
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >       if (!strncmp(argv[1], "live", 4))
> >               return kvm_events_live(&kvm, argc - 1 , argv + 1);
> > #endif
> > @@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
> >               return cmd_top(argc, argv);
> >       else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
> >               return __cmd_buildid_list(file_name, argc, argv);
> > -#ifdef HAVE_KVM_STAT_SUPPORT
> > +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> >       else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
> >               return kvm_cmd_stat(file_name, argc, argv);
> > #endif
> > diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> > index 0e02b8098644..dc59d75180d1 100644
> > --- a/tools/perf/builtin-kwork.c
> > +++ b/tools/perf/builtin-kwork.c
> > @@ -23,6 +23,7 @@
> >
> > #include <subcmd/pager.h>
> > #include <subcmd/parse-options.h>
> > +#include <traceevent/event-parse.h>
> >
> > #include <errno.h>
> > #include <inttypes.h>
> > diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> > index b7fd7ec586fb..7e17374f6c1a 100644
> > --- a/tools/perf/builtin-record.c
> > +++ b/tools/perf/builtin-record.c
> > @@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
> >       if (rec->no_buildid)
> >               perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (!have_tracepoints(&rec->evlist->core.entries))
> >               perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
> > +#endif
> >
> >       if (!rec->opts.branch_stack)
> >               perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
> > diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> > index b6d77d3da64f..2ee2ecca208e 100644
> > --- a/tools/perf/builtin-report.c
> > +++ b/tools/perf/builtin-report.c
> > @@ -67,6 +67,10 @@
> > #include <unistd.h>
> > #include <linux/mman.h>
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > struct report {
> >       struct perf_tool        tool;
> >       struct perf_session     *session;
> > @@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
> >                       .lost            = perf_event__process_lost,
> >                       .read            = process_read_event,
> >                       .attr            = process_attr,
> > +#ifdef HAVE_LIBTRACEEVENT
> >                       .tracing_data    = perf_event__process_tracing_data,
> > +#endif
> >                       .build_id        = perf_event__process_build_id,
> >                       .id_index        = perf_event__process_id_index,
> >                       .auxtrace_info   = perf_event__process_auxtrace_info,
> > @@ -1660,6 +1666,7 @@ int cmd_report(int argc, const char **argv)
> >                                                 report.range_num);
> >       }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (session->tevent.pevent &&
> >           tep_set_function_resolver(session->tevent.pevent,
> >                                     machine__resolve_kernel_addr,
> > @@ -1668,7 +1675,7 @@ int cmd_report(int argc, const char **argv)
> >                      __func__);
> >               return -1;
> >       }
> > -
> > +#endif
> >       sort__setup_elide(stdout);
> >
> >       ret = __cmd_report(&report);
> > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> > index d7ec8c1af293..88888fb885c8 100644
> > --- a/tools/perf/builtin-script.c
> > +++ b/tools/perf/builtin-script.c
> > @@ -62,6 +62,9 @@
> > #include "perf.h"
> >
> > #include <linux/ctype.h>
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> >
> > static char const             *script_name;
> > static char const             *generate_script_lang;
> > @@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
> >               perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
> >               return;
> >       }
> > -
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (PRINT_FIELD(TRACE) && sample->raw_data) {
> >               event_format__fprintf(evsel->tp_format, sample->cpu,
> >                                     sample->raw_data, sample->raw_size, fp);
> >       }
> > -
> > +#endif
> >       if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
> >               perf_sample__fprintf_synth(sample, evsel, fp);
> >
> > @@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)
> >
> > static void setup_scripting(void)
> > {
> > +#ifdef HAVE_LIBTRACEEVENT
> >       setup_perl_scripting();
> >       setup_python_scripting();
> > +#endif
> > }
> >
> > static int flush_scripting(void)
> > @@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
> >                       .fork            = perf_event__process_fork,
> >                       .attr            = process_attr,
> >                       .event_update   = perf_event__process_event_update,
> > +#ifdef HAVE_LIBTRACEEVENT
> >                       .tracing_data    = perf_event__process_tracing_data,
> > +#endif
> >                       .feature         = process_feature_event,
> >                       .build_id        = perf_event__process_build_id,
> >                       .id_index        = perf_event__process_id_index,
> > @@ -4215,6 +4222,7 @@ int cmd_script(int argc, const char **argv)
> >       else
> >               symbol_conf.use_callchain = false;
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (session->tevent.pevent &&
> >           tep_set_function_resolver(session->tevent.pevent,
> >                                     machine__resolve_kernel_addr,
> > @@ -4223,7 +4231,7 @@ int cmd_script(int argc, const char **argv)
> >               err = -1;
> >               goto out_delete;
> >       }
> > -
> > +#endif
> >       if (generate_script_lang) {
> >               struct stat perf_stat;
> >               int input;
> > @@ -4259,9 +4267,12 @@ int cmd_script(int argc, const char **argv)
> >                       err = -ENOENT;
> >                       goto out_delete;
> >               }
> > -
> > +#ifdef HAVE_LIBTRACEEVENT
> >               err = scripting_ops->generate_script(session->tevent.pevent,
> >                                                    "perf-script");
> > +#else
> > +             err = scripting_ops->generate_script(NULL, "perf-script");
> > +#endif
> >               goto out_delete;
> >       }
> >
> > diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
> > index c36296bb7637..6c629e7d370a 100644
> > --- a/tools/perf/builtin-timechart.c
> > +++ b/tools/perf/builtin-timechart.c
> > @@ -38,6 +38,7 @@
> > #include "util/string2.h"
> > #include "util/tracepoint.h"
> > #include <linux/err.h>
> > +#include <traceevent/event-parse.h>
> >
> > #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
> > FILE *open_memstream(char **ptr, size_t *sizeloc);
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index 543c379d2a57..6909cd9f48d1 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -15,7 +15,6 @@
> >  */
> >
> > #include "util/record.h"
> > -#include <traceevent/event-parse.h>
> > #include <api/fs/tracing_path.h>
> > #include <bpf/bpf.h>
> > #include "util/bpf_map.h"
> > @@ -80,6 +79,10 @@
> > #include <linux/ctype.h>
> > #include <perf/mmap.h>
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > #ifndef O_CLOEXEC
> > # define O_CLOEXEC            02000000
> > #endif
> > diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> > index a71f491224da..a886929ec6e5 100644
> > --- a/tools/perf/builtin-version.c
> > +++ b/tools/perf/builtin-version.c
> > @@ -82,6 +82,7 @@ static void library_status(void)
> >       STATUS(HAVE_AIO_SUPPORT, aio);
> >       STATUS(HAVE_ZSTD_SUPPORT, zstd);
> >       STATUS(HAVE_LIBPFM, libpfm4);
> > +     STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
> > }
> >
> > int cmd_version(int argc, const char **argv)
> > diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> > index 7af135dea1cd..82bbe0ca858b 100644
> > --- a/tools/perf/perf.c
> > +++ b/tools/perf/perf.c
> > @@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
> >       { "report",     cmd_report,     0 },
> >       { "bench",      cmd_bench,      0 },
> >       { "stat",       cmd_stat,       0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       { "timechart",  cmd_timechart,  0 },
> > +#endif
> >       { "top",        cmd_top,        0 },
> >       { "annotate",   cmd_annotate,   0 },
> >       { "version",    cmd_version,    0 },
> >       { "script",     cmd_script,     0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       { "sched",      cmd_sched,      0 },
> > +#endif
> > #ifdef HAVE_LIBELF_SUPPORT
> >       { "probe",      cmd_probe,      0 },
> > #endif
> > +#ifdef HAVE_LIBTRACEEVENT
> >       { "kmem",       cmd_kmem,       0 },
> >       { "lock",       cmd_lock,       0 },
> > +#endif
> >       { "kvm",        cmd_kvm,        0 },
> >       { "test",       cmd_test,       0 },
> > -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > +#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
> >       { "trace",      cmd_trace,      0 },
> > #endif
> >       { "inject",     cmd_inject,     0 },
> > @@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
> >       { "data",       cmd_data,       0 },
> >       { "ftrace",     cmd_ftrace,     0 },
> >       { "daemon",     cmd_daemon,     0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       { "kwork",      cmd_kwork,      0 },
> > +#endif
> > };
> >
> > struct pager_config {
> > @@ -500,14 +508,18 @@ int main(int argc, const char **argv)
> >               argv[0] = cmd;
> >       }
> >       if (strstarts(cmd, "trace")) {
> > -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > -             setup_path();
> > -             argv[0] = "trace";
> > -             return cmd_trace(argc, argv);
> > -#else
> > +#ifndef HAVE_LIBTRACEEVENT
> > +             fprintf(stderr,
> > +                     "trace command not available: missing libtraceevent devel package at build time.\n");
> > +             goto out;
> > +#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
> >               fprintf(stderr,
> >                       "trace command not available: missing audit-libs devel package at build time.\n");
> >               goto out;
> > +#else
> > +             setup_path();
> > +             argv[0] = "trace";
> > +             return cmd_trace(argc, argv);
> > #endif
> >       }
> >       /* Look for flags.. */
> > diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
> > index 7d0e33ce6aba..f65625a60704 100644
> > --- a/tools/perf/scripts/python/Perf-Trace-Util/Build
> > +++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
> > @@ -1,3 +1,3 @@
> > -perf-y += Context.o
> > +perf-$(CONFIG_TRACEEVENT) += Context.o
> >
> > CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
> > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> > index 11b69023011b..34ebc009e05a 100644
> > --- a/tools/perf/tests/Build
> > +++ b/tools/perf/tests/Build
> > @@ -6,13 +6,13 @@ perf-y += parse-events.o
> > perf-y += dso-data.o
> > perf-y += attr.o
> > perf-y += vmlinux-kallsyms.o
> > -perf-y += openat-syscall.o
> > -perf-y += openat-syscall-all-cpus.o
> > -perf-y += openat-syscall-tp-fields.o
> > -perf-y += mmap-basic.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
> > +perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
> > perf-y += perf-record.o
> > perf-y += evsel-roundtrip-name.o
> > -perf-y += evsel-tp-sched.o
> > +perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
> > perf-y += fdarray.o
> > perf-y += pmu.o
> > perf-y += pmu-events.o
> > @@ -30,7 +30,7 @@ perf-y += task-exit.o
> > perf-y += sw-clock.o
> > perf-y += mmap-thread-lookup.o
> > perf-y += thread-maps-share.o
> > -perf-y += switch-tracking.o
> > +perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
> > perf-y += keep-tracking.o
> > perf-y += code-reading.o
> > perf-y += sample-parsing.o
> > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> > index 4c6ae59a4dfd..658449204ce5 100644
> > --- a/tools/perf/tests/builtin-test.c
> > +++ b/tools/perf/tests/builtin-test.c
> > @@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {
> >
> > static struct test_suite *generic_tests[] = {
> >       &suite__vmlinux_matches_kallsyms,
> > +#ifdef HAVE_LIBTRACEEVENT
> >       &suite__openat_syscall_event,
> >       &suite__openat_syscall_event_on_all_cpus,
> >       &suite__basic_mmap,
> > +#endif
> >       &suite__mem,
> >       &suite__parse_events,
> >       &suite__expr,
> > @@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
> >       &suite__dso_data_cache,
> >       &suite__dso_data_reopen,
> >       &suite__perf_evsel__roundtrip_name_test,
> > +#ifdef HAVE_LIBTRACEEVENT
> >       &suite__perf_evsel__tp_sched_test,
> >       &suite__syscall_openat_tp_fields,
> > +#endif
> >       &suite__attr,
> >       &suite__hists_link,
> >       &suite__python_use,
> > @@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
> >       &suite__thread_maps_share,
> >       &suite__hists_output,
> >       &suite__hists_cumulate,
> > +#ifdef HAVE_LIBTRACEEVENT
> >       &suite__switch_tracking,
> > +#endif
> >       &suite__fdarray__filter,
> >       &suite__fdarray__add,
> >       &suite__kmod_path__parse,
> > diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> > index 3440dd2616b0..dcbfb93287e8 100644
> > --- a/tools/perf/tests/parse-events.c
> > +++ b/tools/perf/tests/parse-events.c
> > @@ -46,6 +46,7 @@ static bool kvm_s390_create_vm_valid(void)
> > }
> > #endif
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__checkevent_tracepoint(struct evlist *evlist)
> > {
> >       struct evsel *evsel = evlist__first(evlist);
> > @@ -76,6 +77,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
> >       }
> >       return TEST_OK;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > static int test__checkevent_raw(struct evlist *evlist)
> > {
> > @@ -222,6 +224,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
> >       return TEST_OK;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
> > {
> >       struct evsel *evsel = evlist__first(evlist);
> > @@ -252,6 +255,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
> >
> >       return test__checkevent_tracepoint_multi(evlist);
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > static int test__checkevent_raw_modifier(struct evlist *evlist)
> > {
> > @@ -453,6 +457,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
> >       return TEST_OK;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__checkevent_list(struct evlist *evlist)
> > {
> >       struct evsel *evsel = evlist__first(evlist);
> > @@ -491,6 +496,7 @@ static int test__checkevent_list(struct evlist *evlist)
> >
> >       return TEST_OK;
> > }
> > +#endif
> >
> > static int test__checkevent_pmu_name(struct evlist *evlist)
> > {
> > @@ -762,6 +768,7 @@ static int test__group2(struct evlist *evlist)
> >       return TEST_OK;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__group3(struct evlist *evlist __maybe_unused)
> > {
> >       struct evsel *evsel, *leader;
> > @@ -853,6 +860,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> >
> >       return TEST_OK;
> > }
> > +#endif
> >
> > static int test__group4(struct evlist *evlist __maybe_unused)
> > {
> > @@ -1460,6 +1468,7 @@ static int test__sym_event_dc(struct evlist *evlist)
> >       return TEST_OK;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int count_tracepoints(void)
> > {
> >       struct dirent *events_ent;
> > @@ -1513,6 +1522,7 @@ static int test__all_tracepoints(struct evlist *evlist)
> >
> >       return test__checkevent_tracepoint_multi(evlist);
> > }
> > +#endif /* HAVE_LIBTRACEVENT */
> >
> > static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
> > {
> > @@ -1642,6 +1652,7 @@ struct evlist_test {
> > };
> >
> > static const struct evlist_test test__events[] = {
> > +#ifdef HAVE_LIBTRACEEVENT
> >       {
> >               .name  = "syscalls:sys_enter_openat",
> >               .check = test__checkevent_tracepoint,
> > @@ -1652,6 +1663,7 @@ static const struct evlist_test test__events[] = {
> >               .check = test__checkevent_tracepoint_multi,
> >               /* 1 */
> >       },
> > +#endif
> >       {
> >               .name  = "r1a",
> >               .check = test__checkevent_raw,
> > @@ -1702,6 +1714,7 @@ static const struct evlist_test test__events[] = {
> >               .check = test__checkevent_breakpoint_w,
> >               /* 1 */
> >       },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       {
> >               .name  = "syscalls:sys_enter_openat:k",
> >               .check = test__checkevent_tracepoint_modifier,
> > @@ -1712,6 +1725,7 @@ static const struct evlist_test test__events[] = {
> >               .check = test__checkevent_tracepoint_multi_modifier,
> >               /* 3 */
> >       },
> > +#endif
> >       {
> >               .name  = "r1a:kp",
> >               .check = test__checkevent_raw_modifier,
> > @@ -1757,11 +1771,13 @@ static const struct evlist_test test__events[] = {
> >               .check = test__checkevent_breakpoint_w_modifier,
> >               /* 2 */
> >       },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       {
> >               .name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
> >               .check = test__checkevent_list,
> >               /* 3 */
> >       },
> > +#endif
> >       {
> >               .name  = "instructions:G",
> >               .check = test__checkevent_exclude_host_modifier,
> > @@ -1792,11 +1808,13 @@ static const struct evlist_test test__events[] = {
> >               .check = test__group2,
> >               /* 9 */
> >       },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       {
> >               .name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
> >               .check = test__group3,
> >               /* 0 */
> >       },
> > +#endif
> >       {
> >               .name  = "{cycles:u,instructions:kp}:p",
> >               .check = test__group4,
> > @@ -1807,11 +1825,13 @@ static const struct evlist_test test__events[] = {
> >               .check = test__group5,
> >               /* 2 */
> >       },
> > +#ifdef HAVE_LIBTRACEEVENT
> >       {
> >               .name  = "*:*",
> >               .check = test__all_tracepoints,
> >               /* 3 */
> >       },
> > +#endif
> >       {
> >               .name  = "{cycles,cache-misses:G}:H",
> >               .check = test__group_gh1,
> > diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> > index ab37f588ee8b..612406311e27 100644
> > --- a/tools/perf/util/Build
> > +++ b/tools/perf/util/Build
> > @@ -69,17 +69,17 @@ perf-y += namespaces.o
> > perf-y += comm.o
> > perf-y += thread.o
> > perf-y += thread_map.o
> > -perf-y += trace-event-parse.o
> > perf-y += parse-events-flex.o
> > perf-y += parse-events-bison.o
> > perf-y += pmu.o
> > perf-y += pmu-flex.o
> > perf-y += pmu-bison.o
> > perf-y += pmu-hybrid.o
> > -perf-y += trace-event-read.o
> > -perf-y += trace-event-info.o
> > -perf-y += trace-event-scripting.o
> > -perf-y += trace-event.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
> > perf-y += svghelper.o
> > perf-y += sort.o
> > perf-y += hist.o
> > diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> > index c65cdaf6975e..8031b586e813 100644
> > --- a/tools/perf/util/data-convert-bt.c
> > +++ b/tools/perf/util/data-convert-bt.c
> > @@ -19,7 +19,6 @@
> > #include <babeltrace/ctf-writer/event-fields.h>
> > #include <babeltrace/ctf-ir/utils.h>
> > #include <babeltrace/ctf/events.h>
> > -#include <traceevent/event-parse.h>
> > #include "asm/bug.h"
> > #include "data-convert.h"
> > #include "session.h"
> > @@ -36,6 +35,10 @@
> > #include "clockid.h"
> > #include "util/sample.h"
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > #define pr_N(n, fmt, ...) \
> >       eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
> >
> > diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
> > index 57db59068cb6..ba9d93ce9463 100644
> > --- a/tools/perf/util/data-convert-json.c
> > +++ b/tools/perf/util/data-convert-json.c
> > @@ -27,6 +27,10 @@
> > #include "util/thread.h"
> > #include "util/tool.h"
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > struct convert_json {
> >       struct perf_tool tool;
> >       FILE *out;
> > @@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
> >       }
> >       output_json_format(out, false, 3, "]");
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (sample->raw_data) {
> >               int i;
> >               struct tep_format_field **fields;
> > @@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
> >                       free(fields);
> >               }
> >       }
> > -
> > +#endif
> >       output_json_format(out, false, 2, "}");
> >       return 0;
> > }
> > @@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
> >                       .exit           = perf_event__process_exit,
> >                       .fork           = perf_event__process_fork,
> >                       .lost           = perf_event__process_lost,
> > +#ifdef HAVE_LIBTRACEEVENT
> >                       .tracing_data   = perf_event__process_tracing_data,
> > +#endif
> >                       .build_id       = perf_event__process_build_id,
> >                       .id_index       = perf_event__process_id_index,
> >                       .auxtrace_info  = perf_event__process_auxtrace_info,
> > diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> > index fbf3192bced9..590d4e77effc 100644
> > --- a/tools/perf/util/evlist.c
> > +++ b/tools/perf/util/evlist.c
> > @@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
> >       return evsel;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> > {
> >       struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
> > @@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> >
> >       evlist__add(evlist, evsel);
> >       return evsel;
> > -};
> > +}
> > +#endif
> >
> > int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
> > {
> > @@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
> >       return NULL;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
> > {
> >       struct evsel *evsel = evsel__newtp(sys, name);
> > @@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
> >       evlist__add(evlist, evsel);
> >       return 0;
> > }
> > +#endif
> >
> > struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
> > {
> > diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
> > index 16734c6756b3..e5b84ead566c 100644
> > --- a/tools/perf/util/evlist.h
> > +++ b/tools/perf/util/evlist.h
> > @@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
> > {
> >       return evlist__add_aux_dummy(evlist, true);
> > }
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
> > +#endif
> >
> > int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
> >                        evsel__sb_cb_t cb, void *data);
> > @@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
> > int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
> > void evlist__stop_sb_thread(struct evlist *evlist);
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
> > +#endif
> >
> > int __evlist__set_tracepoints_handlers(struct evlist *evlist,
> >                                      const struct evsel_str_handler *assocs,
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index 0f617359a82f..ca911856c4b1 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -12,7 +12,6 @@
> > #include <linux/bitops.h>
> > #include <api/fs/fs.h>
> > #include <api/fs/tracing_path.h>
> > -#include <traceevent/event-parse.h>
> > #include <linux/hw_breakpoint.h>
> > #include <linux/perf_event.h>
> > #include <linux/compiler.h>
> > @@ -57,6 +56,10 @@
> >
> > #include <linux/ctype.h>
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > struct perf_missing_features perf_missing_features;
> >
> > static clockid_t clockid;
> > @@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
> >                       goto out_err;
> >       }
> >       evsel->cgrp = cgroup__get(orig->cgrp);
> > +#ifdef HAVE_LIBTRACEEVENT
> >       evsel->tp_format = orig->tp_format;
> > +#endif
> >       evsel->handler = orig->handler;
> >       evsel->core.leader = orig->core.leader;
> >
> > @@ -479,6 +484,7 @@ struct evsel *evsel__clone(struct evsel *orig)
> > /*
> >  * Returns pointer with encoded error via <linux/err.h> interface.
> >  */
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> > {
> >       struct evsel *evsel = zalloc(perf_evsel__object.size);
> > @@ -516,6 +522,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> > out_err:
> >       return ERR_PTR(err);
> > }
> > +#endif
> >
> > const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
> >       "cycles",
> > @@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
> >       return size;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
> > {
> >       return tep_find_field(evsel->tp_format, name);
> > @@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
> >
> >       return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
> > }
> > +#endif
> >
> > bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
> > {
> > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> > index f3485799ddf9..d572be41b960 100644
> > --- a/tools/perf/util/evsel.h
> > +++ b/tools/perf/util/evsel.h
> > @@ -72,7 +72,9 @@ struct evsel {
> >               char                    *name;
> >               char                    *group_name;
> >               const char              *pmu_name;
> > +#ifdef HAVE_LIBTRACEEVENT
> >               struct tep_event        *tp_format;
> > +#endif
> >               char                    *filter;
> >               unsigned long           max_events;
> >               double                  scale;
> > @@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
> > }
> >
> > struct evsel *evsel__clone(struct evsel *orig);
> > -struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> >
> > int copy_config_terms(struct list_head *dst, struct list_head *src);
> > void free_config_terms(struct list_head *config_terms);
> >
> > +
> > +#ifdef HAVE_LIBTRACEEVENT
> > +struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> > +
> > /*
> >  * Returns pointer with encoded error via <linux/err.h> interface.
> >  */
> > @@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
> > {
> >       return evsel__newtp_idx(sys, name, 0);
> > }
> > +#endif
> >
> > struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct tep_event *event_format__new(const char *sys, const char *name);
> > +#endif
> >
> > void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
> > void evsel__exit(struct evsel *evsel);
> > @@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);
> >
> > struct perf_sample;
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
> > u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
> >
> > @@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
> > {
> >       return evsel__rawptr(evsel, sample, name);
> > }
> > +#endif
> >
> > struct tep_format_field;
> >
> > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> > index 8c2ea8001329..bd22c4932d10 100644
> > --- a/tools/perf/util/evsel_fprintf.c
> > +++ b/tools/perf/util/evsel_fprintf.c
> > @@ -2,7 +2,6 @@
> > #include <inttypes.h>
> > #include <stdio.h>
> > #include <stdbool.h>
> > -#include <traceevent/event-parse.h>
> > #include "evsel.h"
> > #include "util/evsel_fprintf.h"
> > #include "util/event.h"
> > @@ -13,6 +12,10 @@
> > #include "srcline.h"
> > #include "dso.h"
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
> > {
> >       va_list args;
> > @@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> >                                        term, (u64)evsel->core.attr.sample_freq);
> >       }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (details->trace_fields) {
> >               struct tep_format_field *field;
> >
> > @@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> >                       field = field->next;
> >               }
> >       }
> > +#endif
> > out:
> >       fputc('\n', fp);
> >       return ++printed;
> > diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> > index dc2ae397d400..404d816ca124 100644
> > --- a/tools/perf/util/header.c
> > +++ b/tools/perf/util/header.c
> > @@ -6,6 +6,7 @@
> > #include <sys/types.h>
> > #include <byteswap.h>
> > #include <unistd.h>
> > +#include <regex.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <linux/compiler.h>
> > @@ -55,6 +56,10 @@
> > #include <linux/ctype.h>
> > #include <internal/lib.h>
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > /*
> >  * magic2 = "PERFILE2"
> >  * must be a numerical value to let the endianness
> > @@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
> >       return 0;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int write_tracing_data(struct feat_fd *ff,
> >                             struct evlist *evlist)
> > {
> > @@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,
> >
> >       return read_tracing_data(ff->fd, &evlist->core.entries);
> > }
> > +#endif
> >
> > static int write_build_id(struct feat_fd *ff,
> >                         struct evlist *evlist __maybe_unused)
> > @@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
> > FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
> > FEAT_PROCESS_STR_FUN(cpuid, cpuid);
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int process_tracing_data(struct feat_fd *ff, void *data)
> > {
> >       ssize_t ret = trace_report(ff->fd, data, false);
> >
> >       return ret < 0 ? -1 : 0;
> > }
> > +#endif
> >
> > static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
> > {
> > @@ -3366,7 +3375,9 @@ static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
> > const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
> >
> > const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
> > +#ifdef HAVE_LIBTRACEEVENT
> >       FEAT_OPN(TRACING_DATA,  tracing_data,   false),
> > +#endif
> >       FEAT_OPN(BUILD_ID,      build_id,       false),
> >       FEAT_OPR(HOSTNAME,      hostname,       false),
> >       FEAT_OPR(OSRELEASE,     osrelease,      false),
> > @@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
> >       return ret <= 0 ? -1 : 0;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
> > {
> >       struct tep_event *event;
> > @@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
> >
> >       return 0;
> > }
> > +#endif
> >
> > int perf_session__read_header(struct perf_session *session, int repipe_fd)
> > {
> > @@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
> >               lseek(fd, tmp, SEEK_SET);
> >       }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       perf_header__process_sections(header, fd, &session->tevent,
> >                                     perf_file_section__process);
> >
> >       if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
> >               goto out_delete_evlist;
> > +#else
> > +     perf_header__process_sections(header, fd, NULL, perf_file_section__process);
> > +#endif
> >
> >       return 0;
> > out_errno:
> > @@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
> >       return 0;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > int perf_event__process_tracing_data(struct perf_session *session,
> >                                    union perf_event *event)
> > {
> > @@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,
> >
> >       return size_read + padding;
> > }
> > +#endif
> >
> > int perf_event__process_build_id(struct perf_session *session,
> >                                union perf_event *event)
> > diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
> > index 2d5e601ba60f..e3861ae62172 100644
> > --- a/tools/perf/util/header.h
> > +++ b/tools/perf/util/header.h
> > @@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
> >                                    union perf_event *event,
> >                                    struct evlist **pevlist);
> > size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
> > +#ifdef HAVE_LIBTRACEEVENT
> > int perf_event__process_tracing_data(struct perf_session *session,
> >                                    union perf_event *event);
> > +#endif
> > int perf_event__process_build_id(struct perf_session *session,
> >                                union perf_event *event);
> > bool is_perf_magic(u64 magic);
> > diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> > index e3548ddef254..6d3921627e33 100644
> > --- a/tools/perf/util/intel-pt.c
> > +++ b/tools/perf/util/intel-pt.c
> > @@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
> >       return 1;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int intel_pt_process_switch(struct intel_pt *pt,
> >                                  struct perf_sample *sample)
> > {
> > @@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,
> >
> >       return machine__set_current_tid(pt->machine, cpu, -1, tid);
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > static int intel_pt_context_switch_in(struct intel_pt *pt,
> >                                     struct perf_sample *sample)
> > @@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
> >                       return err;
> >       }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
> >               err = intel_pt_process_switch(pt, sample);
> > -     else if (event->header.type == PERF_RECORD_ITRACE_START)
> > +     else
> > +#endif
> > +     if (event->header.type == PERF_RECORD_ITRACE_START)
> >               err = intel_pt_process_itrace_start(pt, event, sample);
> >       else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
> >               err = intel_pt_process_aux_output_hw_id(pt, event, sample);
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index 6502cd679f57..21cce83462b3 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -445,6 +445,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
> >       return ret;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static void tracepoint_error(struct parse_events_error *e, int err,
> >                            const char *sys, const char *name)
> > {
> > @@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
> >       closedir(events_dir);
> >       return ret;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > #ifdef HAVE_LIBBPF_SUPPORT
> > struct __add_bpf_event_param {
> > @@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
> >               return config_term_common(attr, term, err);
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int config_term_tracepoint(struct perf_event_attr *attr,
> >                                 struct parse_events_term *term,
> >                                 struct parse_events_error *err)
> > @@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
> >
> >       return 0;
> > }
> > +#endif
> >
> > static int config_attr(struct perf_event_attr *attr,
> >                      struct list_head *head,
> > @@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> >                               struct parse_events_error *err,
> >                               struct list_head *head_config)
> > {
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (head_config) {
> >               struct perf_event_attr attr;
> >
> > @@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> >       else
> >               return add_tracepoint_event(list, idx, sys, event,
> >                                           err, head_config);
> > +#else
> > +     (void)list;
> > +     (void)idx;
> > +     (void)sys;
> > +     (void)event;
> > +     (void)head_config;
> > +     parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
> > +                             strdup("libtraceevent is necessary for tracepoint support"));
> > +     return -1;
> > +#endif
> > }
> >
> > int parse_events_add_numeric(struct parse_events_state *parse_state,
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index 07df7bb7b042..428e72eaafcc 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -18,7 +18,6 @@ struct parse_events_error;
> > struct option;
> > struct perf_pmu;
> >
> > -bool have_tracepoints(struct list_head *evlist);
> > bool is_event_supported(u8 type, u64 config);
> >
> > const char *event_type(int type);
> > diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> > index b5941c74a0d6..728fe2f51759 100644
> > --- a/tools/perf/util/python.c
> > +++ b/tools/perf/util/python.c
> > @@ -417,6 +417,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
> >       return ret;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static bool is_tracepoint(struct pyrf_event *pevent)
> > {
> >       return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
> > @@ -486,14 +487,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
> >
> >       return tracepoint_field(pevent, field);
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > static PyObject*
> > pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
> > {
> >       PyObject *obj = NULL;
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (is_tracepoint(pevent))
> >               obj = get_tracepoint_field(pevent, attr_name);
> > +#endif
> >
> >       return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
> > }
> > diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
> > index 0f5ba28339cf..77544d2c447c 100644
> > --- a/tools/perf/util/scripting-engines/Build
> > +++ b/tools/perf/util/scripting-engines/Build
> > @@ -1,5 +1,7 @@
> > -perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> > -perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> > +ifeq ($(CONFIG_TRACEEVENT),y)
> > +  perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> > +  perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> > +endif
> >
> > CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
> >
> > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> > index d685a7399ee2..fabba21919b8 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-python.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> > @@ -30,6 +30,7 @@
> > #include <linux/bitmap.h>
> > #include <linux/compiler.h>
> > #include <linux/time64.h>
> > +#include <traceevent/event-parse.h>
> >
> > #include "../build-id.h"
> > #include "../counts.h"
> > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> > index 1facd4616317..7c021c6cedb9 100644
> > --- a/tools/perf/util/session.c
> > +++ b/tools/perf/util/session.c
> > @@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
> >                       evlist__delete(session->evlist);
> >               perf_data__close(session->data);
> >       }
> > +#ifdef HAVE_LIBTRACEEVENT
> >       trace_event__cleanup(&session->tevent);
> > +#endif
> >       free(session);
> > }
> >
> > diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> > index be5871ea558f..ee3715e8563b 100644
> > --- a/tools/perf/util/session.h
> > +++ b/tools/perf/util/session.h
> > @@ -33,7 +33,9 @@ struct perf_session {
> >       struct auxtrace         *auxtrace;
> >       struct itrace_synth_opts *itrace_synth_opts;
> >       struct list_head        auxtrace_index;
> > +#ifdef HAVE_LIBTRACEEVENT
> >       struct trace_event      tevent;
> > +#endif
> >       struct perf_record_time_conv    time_conv;
> >       bool                    repipe;
> >       bool                    one_mmap;
> > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> > index 2e7330867e2e..c7a97b33e134 100644
> > --- a/tools/perf/util/sort.c
> > +++ b/tools/perf/util/sort.c
> > @@ -22,7 +22,6 @@
> > #include "srcline.h"
> > #include "strlist.h"
> > #include "strbuf.h"
> > -#include <traceevent/event-parse.h>
> > #include "mem-events.h"
> > #include "annotate.h"
> > #include "event.h"
> > @@ -32,6 +31,10 @@
> > #include <linux/kernel.h>
> > #include <linux/string.h>
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > regex_t               parent_regex;
> > const char    default_parent_pattern[] = "^sys_|^do_page_fault";
> > const char    *parent_pattern = default_parent_pattern;
> > @@ -743,6 +746,7 @@ struct sort_entry sort_time = {
> >
> > /* --sort trace */
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static char *get_trace_output(struct hist_entry *he)
> > {
> >       struct trace_seq seq;
> > @@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
> >       .se_snprintf    = hist_entry__trace_snprintf,
> >       .se_width_idx   = HISTC_TRACE,
> > };
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > /* sort keys for branch stacks */
> >
> > @@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
> >       DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
> >       DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
> >       DIM(SORT_TRANSACTION, "transaction", sort_transaction),
> > +#ifdef HAVE_LIBTRACEEVENT
> >       DIM(SORT_TRACE, "trace", sort_trace),
> > +#endif
> >       DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
> >       DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
> >       DIM(SORT_CGROUP, "cgroup", sort_cgroup),
> > @@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt)  \
> >       return hse->se == &sort_ ## key ;                       \
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > MK_SORT_ENTRY_CHK(trace)
> > +#else
> > +bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> > +{
> > +     return false;
> > +}
> > +#endif
> > MK_SORT_ENTRY_CHK(srcline)
> > MK_SORT_ENTRY_CHK(srcfile)
> > MK_SORT_ENTRY_CHK(thread)
> > @@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
> >       return 0;
> > }
> >
> > +#ifndef HAVE_LIBTRACEEVENT
> > +bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> > +{
> > +     return false;
> > +}
> > +bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
> > +                                  struct hists *hists __maybe_unused)
> > +{
> > +     return false;
> > +}
> > +#else
> > struct hpp_dynamic_entry {
> >       struct perf_hpp_fmt hpp;
> >       struct evsel *evsel;
> > @@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
> >
> >       return hde;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> > {
> > @@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> >               new_hse = memdup(hse, sizeof(*hse));
> >               if (new_hse)
> >                       new_fmt = &new_hse->hpp;
> > +#ifdef HAVE_LIBTRACEEVENT
> >       } else if (perf_hpp__is_dynamic_entry(fmt)) {
> >               struct hpp_dynamic_entry *hde, *new_hde;
> >
> > @@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> >               new_hde = memdup(hde, sizeof(*hde));
> >               if (new_hde)
> >                       new_fmt = &new_hde->hpp;
> > +#endif
> >       } else {
> >               new_fmt = memdup(fmt, sizeof(*fmt));
> >       }
> > @@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
> >       return evsel;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int __dynamic_dimension__add(struct evsel *evsel,
> >                                   struct tep_format_field *field,
> >                                   bool raw_trace, int level)
> > @@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
> >       }
> >       return ret;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >                            int level)
> > {
> >       char *str, *event_name, *field_name, *opt_name;
> >       struct evsel *evsel;
> > -     struct tep_format_field *field;
> >       bool raw_trace = symbol_conf.raw_trace;
> >       int ret = 0;
> >
> > @@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >               raw_trace = true;
> >       }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (!strcmp(field_name, "trace_fields")) {
> >               ret = add_all_dynamic_fields(evlist, raw_trace, level);
> >               goto out;
> > @@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >               ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
> >               goto out;
> >       }
> > +#endif
> >
> >       evsel = find_evsel(evlist, event_name);
> >       if (evsel == NULL) {
> > @@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >               goto out;
> >       }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (!strcmp(field_name, "*")) {
> >               ret = add_evsel_fields(evsel, raw_trace, level);
> >       } else {
> > -             field = tep_find_any_field(evsel->tp_format, field_name);
> > +             struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
> > +
> >               if (field == NULL) {
> >                       pr_debug("Cannot find event field for %s.%s\n",
> >                                event_name, field_name);
> > @@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >
> >               ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
> >       }
> > +#else
> > +     (void)level;
> > +     (void)raw_trace;
> > +#endif /* HAVE_LIBTRACEEVENT */
> >
> > out:
> >       free(str);
> > @@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> >       for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> >               struct sort_dimension *sd = &common_sort_dimensions[i];
> >
> > -             if (strncasecmp(tok, sd->name, strlen(tok)))
> > +             if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >                       continue;
> >
> >               for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
> > -                     if (!strcmp(dynamic_headers[j], sd->name))
> > +                     if (sd->name && !strcmp(dynamic_headers[j], sd->name))
> >                               sort_dimension_add_dynamic_header(sd);
> >               }
> >
> > @@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> >       for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> >               struct sort_dimension *sd = &bstack_sort_dimensions[i];
> >
> > -             if (strncasecmp(tok, sd->name, strlen(tok)))
> > +             if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >                       continue;
> >
> >               if (sort__mode != SORT_MODE__BRANCH)
> > @@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> >       for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> >               struct sort_dimension *sd = &memory_sort_dimensions[i];
> >
> > -             if (strncasecmp(tok, sd->name, strlen(tok)))
> > +             if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >                       continue;
> >
> >               if (sort__mode != SORT_MODE__MEMORY)
> > @@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> >       for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> >               struct sort_dimension *sd = &common_sort_dimensions[i];
> >
> > -             if (strncasecmp(tok, sd->name, strlen(tok)))
> > +             if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >                       continue;
> >
> >               return __sort_dimension__add_output(list, sd);
> > @@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> >       for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> >               struct sort_dimension *sd = &bstack_sort_dimensions[i];
> >
> > -             if (strncasecmp(tok, sd->name, strlen(tok)))
> > +             if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >                       continue;
> >
> >               if (sort__mode != SORT_MODE__BRANCH)
> > @@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> >       for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> >               struct sort_dimension *sd = &memory_sort_dimensions[i];
> >
> > -             if (strncasecmp(tok, sd->name, strlen(tok)))
> > +             if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> >                       continue;
> >
> >               if (sort__mode != SORT_MODE__MEMORY)
> > @@ -3508,6 +3545,9 @@ void reset_output_field(void)
> >
> > static void add_key(struct strbuf *sb, const char *str, int *llen)
> > {
> > +     if (!str)
> > +             return;
> > +
> >       if (*llen >= 75) {
> >               strbuf_addstr(sb, "\n\t\t\t ");
> >               *llen = INDENT;
> > diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
> > index 0645795ff080..3ab6a92b1a6d 100644
> > --- a/tools/perf/util/synthetic-events.c
> > +++ b/tools/perf/util/synthetic-events.c
> > @@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
> >       return err;
> > }
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> > int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
> >                                       perf_event__handler_t process)
> > {
> > @@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
> >
> >       return aligned_size;
> > }
> > +#endif
> >
> > int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
> >                                   perf_event__handler_t process, struct machine *machine)
> > @@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> >       }
> >       ret += err;
> >
> > +#ifdef HAVE_LIBTRACEEVENT
> >       if (have_tracepoints(&evlist->core.entries)) {
> >               int fd = perf_data__fd(data);
> >
> > @@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> >               }
> >               ret += err;
> >       }
> > +#else
> > +     (void)data;
> > +#endif
> >
> >       return ret;
> > }
> > diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
> > index c9c83a40647c..2d3c2576bab7 100644
> > --- a/tools/perf/util/trace-event-parse.c
> > +++ b/tools/perf/util/trace-event-parse.c
> > @@ -11,6 +11,8 @@
> > #include "trace-event.h"
> >
> > #include <linux/ctype.h>
> > +#include <linux/kernel.h>
> > +#include <traceevent/event-parse.h>
> >
> > static int get_common_field(struct scripting_context *context,
> >                           int *offset, int *size, const char *type)
> > diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> > index 43146a4ce2fb..1162c49b8082 100644
> > --- a/tools/perf/util/trace-event-read.c
> > +++ b/tools/perf/util/trace-event-read.c
> > @@ -11,6 +11,7 @@
> > #include <sys/stat.h>
> > #include <sys/wait.h>
> > #include <sys/mman.h>
> > +#include <traceevent/event-parse.h>
> > #include <fcntl.h>
> > #include <unistd.h>
> > #include <errno.h>
> > diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> > index 636a010d929b..56175c53f9af 100644
> > --- a/tools/perf/util/trace-event-scripting.c
> > +++ b/tools/perf/util/trace-event-scripting.c
> > @@ -9,6 +9,7 @@
> > #include <stdlib.h>
> > #include <string.h>
> > #include <errno.h>
> > +#include <traceevent/event-parse.h>
> >
> > #include "debug.h"
> > #include "trace-event.h"
> > diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
> > index b3ee651e3d91..8ad75b31e09b 100644
> > --- a/tools/perf/util/trace-event.c
> > +++ b/tools/perf/util/trace-event.c
> > @@ -1,5 +1,4 @@
> > // SPDX-License-Identifier: GPL-2.0
> > -
> > #include <stdio.h>
> > #include <unistd.h>
> > #include <stdlib.h>
> > diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> > index 8f39f5bcb2c2..add6c5d9531c 100644
> > --- a/tools/perf/util/trace-event.h
> > +++ b/tools/perf/util/trace-event.h
> > @@ -2,9 +2,11 @@
> > #ifndef _PERF_UTIL_TRACE_EVENT_H
> > #define _PERF_UTIL_TRACE_EVENT_H
> >
> > -#include <traceevent/event-parse.h>
> > -#include "parse-events.h"
> > +#include <stdbool.h>
> > +#include <stdio.h>
> > +#include <linux/types.h>
> >
> > +struct evlist;
> > struct machine;
> > struct perf_sample;
> > union perf_event;
> > @@ -18,6 +20,11 @@ struct trace_event {
> >       struct tep_plugin_list  *plugin_list;
> > };
> >
> > +typedef char *(tep_func_resolver_t)(void *priv,
> > +                                 unsigned long long *addrp, char **modp);
> > +
> > +bool have_tracepoints(struct list_head *evlist);
> > +
> > int trace_event__init(struct trace_event *t);
> > void trace_event__cleanup(struct trace_event *t);
> > int trace_event__register_resolver(struct machine *machine,
> > --
> > 2.39.0.rc0.267.gcb52ba06e7-goog
> >
>
Arnaldo Carvalho de Melo Dec. 7, 2022, 4:52 p.m. UTC | #22
Em Wed, Dec 07, 2022 at 07:16:00PM +0530, Athira Rajeev escreveu:
> Observed build failure in powerpc with NO_LIBTRACEEVENT due to kvm-stat.c compile fail.
> CONFIG_TRACEEVENT  check is also needed in arch/powerpc/util/Build to fix this. Patch below:
> 
> From e06f020f66435649c10fb7d391922f687d5b8206 Mon Sep 17 00:00:00 2001
> From: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> Date: Wed, 7 Dec 2022 16:46:30 +0530
> Subject: [PATCH] tools/perf/arch/powerpc: Disable kvm-stat when traceevent is
>  disabled
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
> 
> commit 407bb16c1a32 ("perf build: Use libtraceevent from the system")
> disables libtraceevent support when f libtraceevent isn't installed
> or NO_LIBTRACEEVENT=1 is passed. Commit added CONFIG_TRACEEVENT check
> for kvm-stat in x86/util/Build. But same has to be added in powerpc
> as well. Otherwise build will fail as below:
> 
> 	#make NO_LIBTRACEEVENT=1
> 	arch/powerpc/util/kvm-stat.c: In function 'hcall_event_get_key':
> arch/powerpc/util/kvm-stat.c:42:20: error: implicit declaration of function 'evsel__intval'; did you mean 'evsel__env'? [-Werror=implicit-function-declaration]
>    42 |         key->key = evsel__intval(evsel, sample, "req");
>       |                    ^~~~~~~~~~~~~
>       |                    evsel__env
> 
> Patch adds the check for CONFIG_TRACEEVENT in powerpc/util/Build.

Ok, folding this together with my changes to Ian's patch, so that we try
to keep bisectability widely.

- Arnaldo
 
> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> ---
>  tools/perf/arch/powerpc/util/Build | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
> index 0115f3166568..71e57f28abda 100644
> --- a/tools/perf/arch/powerpc/util/Build
> +++ b/tools/perf/arch/powerpc/util/Build
> @@ -1,5 +1,5 @@
>  perf-y += header.o
> -perf-y += kvm-stat.o
> +perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>  perf-y += perf_regs.o
>  perf-y += mem-events.o
>  perf-y += sym-handling.o
> -- 
> 2.31.1
> 
> 
> I couldn't functionally check "perf kvm stat"  after this change since there are build issues remaining.
> 
> Thanks
> Athira
> 
> > perf-y += perf_regs.o
> > perf-y += topdown.o
> > perf-y += machine.o
> > diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
> > index af102f471e9f..1e39a034cee9 100644
> > --- a/tools/perf/arch/x86/util/intel-pt.c
> > +++ b/tools/perf/arch/x86/util/intel-pt.c
> > @@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
> > 	return 0;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int intel_pt_track_switches(struct evlist *evlist)
> > {
> > 	const char *sched_switch = "sched:sched_switch";
> > @@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)
> > 
> > 	return 0;
> > }
> > +#endif
> > 
> > static void intel_pt_valid_str(char *str, size_t len, u64 valid)
> > {
> > @@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> > 					ptr->have_sched_switch = 2;
> > 			}
> > 		} else {
> > +#ifdef HAVE_LIBTRACEEVENT
> > 			err = intel_pt_track_switches(evlist);
> > 			if (err == -EPERM)
> > 				pr_debug2("Unable to select sched:sched_switch\n");
> > @@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
> > 				return err;
> > 			else
> > 				ptr->have_sched_switch = 1;
> > +#endif
> > 		}
> > 	}
> > 
> > diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> > index 517d928c00e3..90458ca6933f 100644
> > --- a/tools/perf/builtin-annotate.c
> > +++ b/tools/perf/builtin-annotate.c
> > @@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
> > 			.namespaces = perf_event__process_namespaces,
> > 			.attr	= perf_event__process_attr,
> > 			.build_id = perf_event__process_build_id,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 			.tracing_data   = perf_event__process_tracing_data,
> > +#endif
> > 			.id_index	= perf_event__process_id_index,
> > 			.auxtrace_info	= perf_event__process_auxtrace_info,
> > 			.auxtrace	= perf_event__process_auxtrace,
> > diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> > index e254f18986f7..3f4e4dd5abf3 100644
> > --- a/tools/perf/builtin-inject.c
> > +++ b/tools/perf/builtin-inject.c
> > @@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
> > 	return err;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int perf_event__repipe_tracing_data(struct perf_session *session,
> > 					   union perf_event *event)
> > {
> > @@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
> > 
> > 	return perf_event__process_tracing_data(session, event);
> > }
> > +#endif
> > 
> > static int dso__read_build_id(struct dso *dso)
> > {
> > @@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
> > 	return 0;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int perf_inject__sched_stat(struct perf_tool *tool,
> > 				   union perf_event *event __maybe_unused,
> > 				   struct perf_sample *sample,
> > @@ -836,6 +839,7 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
> > 	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
> > 	return perf_event__repipe(tool, event_sw, &sample_sw, machine);
> > }
> > +#endif
> > 
> > static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
> > {
> > @@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
> > 		inject->tool.mmap	  = perf_event__repipe_mmap;
> > 		inject->tool.mmap2	  = perf_event__repipe_mmap2;
> > 		inject->tool.fork	  = perf_event__repipe_fork;
> > +#ifdef HAVE_LIBTRACEEVENT
> > 		inject->tool.tracing_data = perf_event__repipe_tracing_data;
> > +#endif
> > 	}
> > 
> > 	output_data_offset = perf_session__data_offset(session->evlist);
> > @@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
> > 				evsel->handler = perf_inject__sched_switch;
> > 			} else if (!strcmp(name, "sched:sched_process_exit"))
> > 				evsel->handler = perf_inject__sched_process_exit;
> > +#ifdef HAVE_LIBTRACEEVENT
> > 			else if (!strncmp(name, "sched:sched_stat_", 17))
> > 				evsel->handler = perf_inject__sched_stat;
> > +#endif
> > 		}
> > 	} else if (inject->itrace_synth_opts.vm_time_correlation) {
> > 		session->itrace_synth_opts = &inject->itrace_synth_opts;
> > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> > index ebfab2ca1702..e20656c431a4 100644
> > --- a/tools/perf/builtin-kmem.c
> > +++ b/tools/perf/builtin-kmem.c
> > @@ -35,6 +35,7 @@
> > #include <regex.h>
> > 
> > #include <linux/ctype.h>
> > +#include <traceevent/event-parse.h>
> > 
> > static int	kmem_slab;
> > static int	kmem_page;
> > diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
> > index 7d9ec1bac1a2..641e739c717c 100644
> > --- a/tools/perf/builtin-kvm.c
> > +++ b/tools/perf/builtin-kvm.c
> > @@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
> > 	return filename;
> > }
> > 
> > -#ifdef HAVE_KVM_STAT_SUPPORT
> > +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > 
> > void exit_event_get_key(struct evsel *evsel,
> > 			struct perf_sample *sample,
> > @@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
> > 		pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
> > }
> > 
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > static int process_lost_event(struct perf_tool *tool,
> > 			      union perf_event *event __maybe_unused,
> > 			      struct perf_sample *sample __maybe_unused,
> > @@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
> > 	return true;
> > }
> > 
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > /* keeping the max events to a modest level to keep
> >  * the processing of samples per mmap smooth.
> >  */
> > @@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
> > 	return kvm_events_report_vcpu(kvm);
> > }
> > 
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > static struct evlist *kvm_live_event_list(void)
> > {
> > 	struct evlist *evlist;
> > @@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
> > 	if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
> > 		return kvm_events_report(&kvm, argc - 1 , argv + 1);
> > 
> > -#ifdef HAVE_TIMERFD_SUPPORT
> > +#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > 	if (!strncmp(argv[1], "live", 4))
> > 		return kvm_events_live(&kvm, argc - 1 , argv + 1);
> > #endif
> > @@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
> > 		return cmd_top(argc, argv);
> > 	else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
> > 		return __cmd_buildid_list(file_name, argc, argv);
> > -#ifdef HAVE_KVM_STAT_SUPPORT
> > +#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
> > 	else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
> > 		return kvm_cmd_stat(file_name, argc, argv);
> > #endif
> > diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> > index 0e02b8098644..dc59d75180d1 100644
> > --- a/tools/perf/builtin-kwork.c
> > +++ b/tools/perf/builtin-kwork.c
> > @@ -23,6 +23,7 @@
> > 
> > #include <subcmd/pager.h>
> > #include <subcmd/parse-options.h>
> > +#include <traceevent/event-parse.h>
> > 
> > #include <errno.h>
> > #include <inttypes.h>
> > diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> > index b7fd7ec586fb..7e17374f6c1a 100644
> > --- a/tools/perf/builtin-record.c
> > +++ b/tools/perf/builtin-record.c
> > @@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
> > 	if (rec->no_buildid)
> > 		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (!have_tracepoints(&rec->evlist->core.entries))
> > 		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
> > +#endif
> > 
> > 	if (!rec->opts.branch_stack)
> > 		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
> > diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> > index b6d77d3da64f..2ee2ecca208e 100644
> > --- a/tools/perf/builtin-report.c
> > +++ b/tools/perf/builtin-report.c
> > @@ -67,6 +67,10 @@
> > #include <unistd.h>
> > #include <linux/mman.h>
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > struct report {
> > 	struct perf_tool	tool;
> > 	struct perf_session	*session;
> > @@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
> > 			.lost		 = perf_event__process_lost,
> > 			.read		 = process_read_event,
> > 			.attr		 = process_attr,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 			.tracing_data	 = perf_event__process_tracing_data,
> > +#endif
> > 			.build_id	 = perf_event__process_build_id,
> > 			.id_index	 = perf_event__process_id_index,
> > 			.auxtrace_info	 = perf_event__process_auxtrace_info,
> > @@ -1660,6 +1666,7 @@ int cmd_report(int argc, const char **argv)
> > 						  report.range_num);
> > 	}
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (session->tevent.pevent &&
> > 	    tep_set_function_resolver(session->tevent.pevent,
> > 				      machine__resolve_kernel_addr,
> > @@ -1668,7 +1675,7 @@ int cmd_report(int argc, const char **argv)
> > 		       __func__);
> > 		return -1;
> > 	}
> > -
> > +#endif
> > 	sort__setup_elide(stdout);
> > 
> > 	ret = __cmd_report(&report);
> > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> > index d7ec8c1af293..88888fb885c8 100644
> > --- a/tools/perf/builtin-script.c
> > +++ b/tools/perf/builtin-script.c
> > @@ -62,6 +62,9 @@
> > #include "perf.h"
> > 
> > #include <linux/ctype.h>
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > 
> > static char const		*script_name;
> > static char const		*generate_script_lang;
> > @@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
> > 		perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
> > 		return;
> > 	}
> > -
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (PRINT_FIELD(TRACE) && sample->raw_data) {
> > 		event_format__fprintf(evsel->tp_format, sample->cpu,
> > 				      sample->raw_data, sample->raw_size, fp);
> > 	}
> > -
> > +#endif
> > 	if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
> > 		perf_sample__fprintf_synth(sample, evsel, fp);
> > 
> > @@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)
> > 
> > static void setup_scripting(void)
> > {
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	setup_perl_scripting();
> > 	setup_python_scripting();
> > +#endif
> > }
> > 
> > static int flush_scripting(void)
> > @@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
> > 			.fork		 = perf_event__process_fork,
> > 			.attr		 = process_attr,
> > 			.event_update   = perf_event__process_event_update,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 			.tracing_data	 = perf_event__process_tracing_data,
> > +#endif
> > 			.feature	 = process_feature_event,
> > 			.build_id	 = perf_event__process_build_id,
> > 			.id_index	 = perf_event__process_id_index,
> > @@ -4215,6 +4222,7 @@ int cmd_script(int argc, const char **argv)
> > 	else
> > 		symbol_conf.use_callchain = false;
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (session->tevent.pevent &&
> > 	    tep_set_function_resolver(session->tevent.pevent,
> > 				      machine__resolve_kernel_addr,
> > @@ -4223,7 +4231,7 @@ int cmd_script(int argc, const char **argv)
> > 		err = -1;
> > 		goto out_delete;
> > 	}
> > -
> > +#endif
> > 	if (generate_script_lang) {
> > 		struct stat perf_stat;
> > 		int input;
> > @@ -4259,9 +4267,12 @@ int cmd_script(int argc, const char **argv)
> > 			err = -ENOENT;
> > 			goto out_delete;
> > 		}
> > -
> > +#ifdef HAVE_LIBTRACEEVENT
> > 		err = scripting_ops->generate_script(session->tevent.pevent,
> > 						     "perf-script");
> > +#else
> > +		err = scripting_ops->generate_script(NULL, "perf-script");
> > +#endif
> > 		goto out_delete;
> > 	}
> > 
> > diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
> > index c36296bb7637..6c629e7d370a 100644
> > --- a/tools/perf/builtin-timechart.c
> > +++ b/tools/perf/builtin-timechart.c
> > @@ -38,6 +38,7 @@
> > #include "util/string2.h"
> > #include "util/tracepoint.h"
> > #include <linux/err.h>
> > +#include <traceevent/event-parse.h>
> > 
> > #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
> > FILE *open_memstream(char **ptr, size_t *sizeloc);
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index 543c379d2a57..6909cd9f48d1 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -15,7 +15,6 @@
> >  */
> > 
> > #include "util/record.h"
> > -#include <traceevent/event-parse.h>
> > #include <api/fs/tracing_path.h>
> > #include <bpf/bpf.h>
> > #include "util/bpf_map.h"
> > @@ -80,6 +79,10 @@
> > #include <linux/ctype.h>
> > #include <perf/mmap.h>
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > #ifndef O_CLOEXEC
> > # define O_CLOEXEC		02000000
> > #endif
> > diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> > index a71f491224da..a886929ec6e5 100644
> > --- a/tools/perf/builtin-version.c
> > +++ b/tools/perf/builtin-version.c
> > @@ -82,6 +82,7 @@ static void library_status(void)
> > 	STATUS(HAVE_AIO_SUPPORT, aio);
> > 	STATUS(HAVE_ZSTD_SUPPORT, zstd);
> > 	STATUS(HAVE_LIBPFM, libpfm4);
> > +	STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
> > }
> > 
> > int cmd_version(int argc, const char **argv)
> > diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> > index 7af135dea1cd..82bbe0ca858b 100644
> > --- a/tools/perf/perf.c
> > +++ b/tools/perf/perf.c
> > @@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
> > 	{ "report",	cmd_report,	0 },
> > 	{ "bench",	cmd_bench,	0 },
> > 	{ "stat",	cmd_stat,	0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{ "timechart",	cmd_timechart,	0 },
> > +#endif
> > 	{ "top",	cmd_top,	0 },
> > 	{ "annotate",	cmd_annotate,	0 },
> > 	{ "version",	cmd_version,	0 },
> > 	{ "script",	cmd_script,	0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{ "sched",	cmd_sched,	0 },
> > +#endif
> > #ifdef HAVE_LIBELF_SUPPORT
> > 	{ "probe",	cmd_probe,	0 },
> > #endif
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{ "kmem",	cmd_kmem,	0 },
> > 	{ "lock",	cmd_lock,	0 },
> > +#endif
> > 	{ "kvm",	cmd_kvm,	0 },
> > 	{ "test",	cmd_test,	0 },
> > -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > +#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
> > 	{ "trace",	cmd_trace,	0 },
> > #endif
> > 	{ "inject",	cmd_inject,	0 },
> > @@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
> > 	{ "data",	cmd_data,	0 },
> > 	{ "ftrace",	cmd_ftrace,	0 },
> > 	{ "daemon",	cmd_daemon,	0 },
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{ "kwork",	cmd_kwork,	0 },
> > +#endif
> > };
> > 
> > struct pager_config {
> > @@ -500,14 +508,18 @@ int main(int argc, const char **argv)
> > 		argv[0] = cmd;
> > 	}
> > 	if (strstarts(cmd, "trace")) {
> > -#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > -		setup_path();
> > -		argv[0] = "trace";
> > -		return cmd_trace(argc, argv);
> > -#else
> > +#ifndef HAVE_LIBTRACEEVENT
> > +		fprintf(stderr,
> > +			"trace command not available: missing libtraceevent devel package at build time.\n");
> > +		goto out;
> > +#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
> > 		fprintf(stderr,
> > 			"trace command not available: missing audit-libs devel package at build time.\n");
> > 		goto out;
> > +#else
> > +		setup_path();
> > +		argv[0] = "trace";
> > +		return cmd_trace(argc, argv);
> > #endif
> > 	}
> > 	/* Look for flags.. */
> > diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
> > index 7d0e33ce6aba..f65625a60704 100644
> > --- a/tools/perf/scripts/python/Perf-Trace-Util/Build
> > +++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
> > @@ -1,3 +1,3 @@
> > -perf-y += Context.o
> > +perf-$(CONFIG_TRACEEVENT) += Context.o
> > 
> > CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
> > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> > index 11b69023011b..34ebc009e05a 100644
> > --- a/tools/perf/tests/Build
> > +++ b/tools/perf/tests/Build
> > @@ -6,13 +6,13 @@ perf-y += parse-events.o
> > perf-y += dso-data.o
> > perf-y += attr.o
> > perf-y += vmlinux-kallsyms.o
> > -perf-y += openat-syscall.o
> > -perf-y += openat-syscall-all-cpus.o
> > -perf-y += openat-syscall-tp-fields.o
> > -perf-y += mmap-basic.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
> > +perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
> > +perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
> > perf-y += perf-record.o
> > perf-y += evsel-roundtrip-name.o
> > -perf-y += evsel-tp-sched.o
> > +perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
> > perf-y += fdarray.o
> > perf-y += pmu.o
> > perf-y += pmu-events.o
> > @@ -30,7 +30,7 @@ perf-y += task-exit.o
> > perf-y += sw-clock.o
> > perf-y += mmap-thread-lookup.o
> > perf-y += thread-maps-share.o
> > -perf-y += switch-tracking.o
> > +perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
> > perf-y += keep-tracking.o
> > perf-y += code-reading.o
> > perf-y += sample-parsing.o
> > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> > index 4c6ae59a4dfd..658449204ce5 100644
> > --- a/tools/perf/tests/builtin-test.c
> > +++ b/tools/perf/tests/builtin-test.c
> > @@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {
> > 
> > static struct test_suite *generic_tests[] = {
> > 	&suite__vmlinux_matches_kallsyms,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	&suite__openat_syscall_event,
> > 	&suite__openat_syscall_event_on_all_cpus,
> > 	&suite__basic_mmap,
> > +#endif
> > 	&suite__mem,
> > 	&suite__parse_events,
> > 	&suite__expr,
> > @@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
> > 	&suite__dso_data_cache,
> > 	&suite__dso_data_reopen,
> > 	&suite__perf_evsel__roundtrip_name_test,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	&suite__perf_evsel__tp_sched_test,
> > 	&suite__syscall_openat_tp_fields,
> > +#endif
> > 	&suite__attr,
> > 	&suite__hists_link,
> > 	&suite__python_use,
> > @@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
> > 	&suite__thread_maps_share,
> > 	&suite__hists_output,
> > 	&suite__hists_cumulate,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	&suite__switch_tracking,
> > +#endif
> > 	&suite__fdarray__filter,
> > 	&suite__fdarray__add,
> > 	&suite__kmod_path__parse,
> > diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> > index 3440dd2616b0..dcbfb93287e8 100644
> > --- a/tools/perf/tests/parse-events.c
> > +++ b/tools/perf/tests/parse-events.c
> > @@ -46,6 +46,7 @@ static bool kvm_s390_create_vm_valid(void)
> > }
> > #endif
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__checkevent_tracepoint(struct evlist *evlist)
> > {
> > 	struct evsel *evsel = evlist__first(evlist);
> > @@ -76,6 +77,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
> > 	}
> > 	return TEST_OK;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > static int test__checkevent_raw(struct evlist *evlist)
> > {
> > @@ -222,6 +224,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
> > 	return TEST_OK;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
> > {
> > 	struct evsel *evsel = evlist__first(evlist);
> > @@ -252,6 +255,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
> > 
> > 	return test__checkevent_tracepoint_multi(evlist);
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > static int test__checkevent_raw_modifier(struct evlist *evlist)
> > {
> > @@ -453,6 +457,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
> > 	return TEST_OK;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__checkevent_list(struct evlist *evlist)
> > {
> > 	struct evsel *evsel = evlist__first(evlist);
> > @@ -491,6 +496,7 @@ static int test__checkevent_list(struct evlist *evlist)
> > 
> > 	return TEST_OK;
> > }
> > +#endif
> > 
> > static int test__checkevent_pmu_name(struct evlist *evlist)
> > {
> > @@ -762,6 +768,7 @@ static int test__group2(struct evlist *evlist)
> > 	return TEST_OK;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int test__group3(struct evlist *evlist __maybe_unused)
> > {
> > 	struct evsel *evsel, *leader;
> > @@ -853,6 +860,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> > 
> > 	return TEST_OK;
> > }
> > +#endif
> > 
> > static int test__group4(struct evlist *evlist __maybe_unused)
> > {
> > @@ -1460,6 +1468,7 @@ static int test__sym_event_dc(struct evlist *evlist)
> > 	return TEST_OK;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int count_tracepoints(void)
> > {
> > 	struct dirent *events_ent;
> > @@ -1513,6 +1522,7 @@ static int test__all_tracepoints(struct evlist *evlist)
> > 
> > 	return test__checkevent_tracepoint_multi(evlist);
> > }
> > +#endif /* HAVE_LIBTRACEVENT */
> > 
> > static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
> > {
> > @@ -1642,6 +1652,7 @@ struct evlist_test {
> > };
> > 
> > static const struct evlist_test test__events[] = {
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{
> > 		.name  = "syscalls:sys_enter_openat",
> > 		.check = test__checkevent_tracepoint,
> > @@ -1652,6 +1663,7 @@ static const struct evlist_test test__events[] = {
> > 		.check = test__checkevent_tracepoint_multi,
> > 		/* 1 */
> > 	},
> > +#endif
> > 	{
> > 		.name  = "r1a",
> > 		.check = test__checkevent_raw,
> > @@ -1702,6 +1714,7 @@ static const struct evlist_test test__events[] = {
> > 		.check = test__checkevent_breakpoint_w,
> > 		/* 1 */
> > 	},
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{
> > 		.name  = "syscalls:sys_enter_openat:k",
> > 		.check = test__checkevent_tracepoint_modifier,
> > @@ -1712,6 +1725,7 @@ static const struct evlist_test test__events[] = {
> > 		.check = test__checkevent_tracepoint_multi_modifier,
> > 		/* 3 */
> > 	},
> > +#endif
> > 	{
> > 		.name  = "r1a:kp",
> > 		.check = test__checkevent_raw_modifier,
> > @@ -1757,11 +1771,13 @@ static const struct evlist_test test__events[] = {
> > 		.check = test__checkevent_breakpoint_w_modifier,
> > 		/* 2 */
> > 	},
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{
> > 		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
> > 		.check = test__checkevent_list,
> > 		/* 3 */
> > 	},
> > +#endif
> > 	{
> > 		.name  = "instructions:G",
> > 		.check = test__checkevent_exclude_host_modifier,
> > @@ -1792,11 +1808,13 @@ static const struct evlist_test test__events[] = {
> > 		.check = test__group2,
> > 		/* 9 */
> > 	},
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{
> > 		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
> > 		.check = test__group3,
> > 		/* 0 */
> > 	},
> > +#endif
> > 	{
> > 		.name  = "{cycles:u,instructions:kp}:p",
> > 		.check = test__group4,
> > @@ -1807,11 +1825,13 @@ static const struct evlist_test test__events[] = {
> > 		.check = test__group5,
> > 		/* 2 */
> > 	},
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	{
> > 		.name  = "*:*",
> > 		.check = test__all_tracepoints,
> > 		/* 3 */
> > 	},
> > +#endif
> > 	{
> > 		.name  = "{cycles,cache-misses:G}:H",
> > 		.check = test__group_gh1,
> > diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> > index ab37f588ee8b..612406311e27 100644
> > --- a/tools/perf/util/Build
> > +++ b/tools/perf/util/Build
> > @@ -69,17 +69,17 @@ perf-y += namespaces.o
> > perf-y += comm.o
> > perf-y += thread.o
> > perf-y += thread_map.o
> > -perf-y += trace-event-parse.o
> > perf-y += parse-events-flex.o
> > perf-y += parse-events-bison.o
> > perf-y += pmu.o
> > perf-y += pmu-flex.o
> > perf-y += pmu-bison.o
> > perf-y += pmu-hybrid.o
> > -perf-y += trace-event-read.o
> > -perf-y += trace-event-info.o
> > -perf-y += trace-event-scripting.o
> > -perf-y += trace-event.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
> > +perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
> > perf-y += svghelper.o
> > perf-y += sort.o
> > perf-y += hist.o
> > diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> > index c65cdaf6975e..8031b586e813 100644
> > --- a/tools/perf/util/data-convert-bt.c
> > +++ b/tools/perf/util/data-convert-bt.c
> > @@ -19,7 +19,6 @@
> > #include <babeltrace/ctf-writer/event-fields.h>
> > #include <babeltrace/ctf-ir/utils.h>
> > #include <babeltrace/ctf/events.h>
> > -#include <traceevent/event-parse.h>
> > #include "asm/bug.h"
> > #include "data-convert.h"
> > #include "session.h"
> > @@ -36,6 +35,10 @@
> > #include "clockid.h"
> > #include "util/sample.h"
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > #define pr_N(n, fmt, ...) \
> > 	eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
> > 
> > diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
> > index 57db59068cb6..ba9d93ce9463 100644
> > --- a/tools/perf/util/data-convert-json.c
> > +++ b/tools/perf/util/data-convert-json.c
> > @@ -27,6 +27,10 @@
> > #include "util/thread.h"
> > #include "util/tool.h"
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > struct convert_json {
> > 	struct perf_tool tool;
> > 	FILE *out;
> > @@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
> > 	}
> > 	output_json_format(out, false, 3, "]");
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (sample->raw_data) {
> > 		int i;
> > 		struct tep_format_field **fields;
> > @@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
> > 			free(fields);
> > 		}
> > 	}
> > -
> > +#endif
> > 	output_json_format(out, false, 2, "}");
> > 	return 0;
> > }
> > @@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
> > 			.exit           = perf_event__process_exit,
> > 			.fork           = perf_event__process_fork,
> > 			.lost           = perf_event__process_lost,
> > +#ifdef HAVE_LIBTRACEEVENT
> > 			.tracing_data   = perf_event__process_tracing_data,
> > +#endif
> > 			.build_id       = perf_event__process_build_id,
> > 			.id_index       = perf_event__process_id_index,
> > 			.auxtrace_info  = perf_event__process_auxtrace_info,
> > diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> > index fbf3192bced9..590d4e77effc 100644
> > --- a/tools/perf/util/evlist.c
> > +++ b/tools/perf/util/evlist.c
> > @@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
> > 	return evsel;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> > {
> > 	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
> > @@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
> > 
> > 	evlist__add(evlist, evsel);
> > 	return evsel;
> > -};
> > +}
> > +#endif
> > 
> > int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
> > {
> > @@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
> > 	return NULL;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
> > {
> > 	struct evsel *evsel = evsel__newtp(sys, name);
> > @@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
> > 	evlist__add(evlist, evsel);
> > 	return 0;
> > }
> > +#endif
> > 
> > struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
> > {
> > diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
> > index 16734c6756b3..e5b84ead566c 100644
> > --- a/tools/perf/util/evlist.h
> > +++ b/tools/perf/util/evlist.h
> > @@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
> > {
> > 	return evlist__add_aux_dummy(evlist, true);
> > }
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
> > +#endif
> > 
> > int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
> > 			 evsel__sb_cb_t cb, void *data);
> > @@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
> > int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
> > void evlist__stop_sb_thread(struct evlist *evlist);
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
> > +#endif
> > 
> > int __evlist__set_tracepoints_handlers(struct evlist *evlist,
> > 				       const struct evsel_str_handler *assocs,
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index 0f617359a82f..ca911856c4b1 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -12,7 +12,6 @@
> > #include <linux/bitops.h>
> > #include <api/fs/fs.h>
> > #include <api/fs/tracing_path.h>
> > -#include <traceevent/event-parse.h>
> > #include <linux/hw_breakpoint.h>
> > #include <linux/perf_event.h>
> > #include <linux/compiler.h>
> > @@ -57,6 +56,10 @@
> > 
> > #include <linux/ctype.h>
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > struct perf_missing_features perf_missing_features;
> > 
> > static clockid_t clockid;
> > @@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
> > 			goto out_err;
> > 	}
> > 	evsel->cgrp = cgroup__get(orig->cgrp);
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	evsel->tp_format = orig->tp_format;
> > +#endif
> > 	evsel->handler = orig->handler;
> > 	evsel->core.leader = orig->core.leader;
> > 
> > @@ -479,6 +484,7 @@ struct evsel *evsel__clone(struct evsel *orig)
> > /*
> >  * Returns pointer with encoded error via <linux/err.h> interface.
> >  */
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> > {
> > 	struct evsel *evsel = zalloc(perf_evsel__object.size);
> > @@ -516,6 +522,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
> > out_err:
> > 	return ERR_PTR(err);
> > }
> > +#endif
> > 
> > const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
> > 	"cycles",
> > @@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
> > 	return size;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
> > {
> > 	return tep_find_field(evsel->tp_format, name);
> > @@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
> > 
> > 	return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
> > }
> > +#endif
> > 
> > bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
> > {
> > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> > index f3485799ddf9..d572be41b960 100644
> > --- a/tools/perf/util/evsel.h
> > +++ b/tools/perf/util/evsel.h
> > @@ -72,7 +72,9 @@ struct evsel {
> > 		char			*name;
> > 		char			*group_name;
> > 		const char		*pmu_name;
> > +#ifdef HAVE_LIBTRACEEVENT
> > 		struct tep_event	*tp_format;
> > +#endif
> > 		char			*filter;
> > 		unsigned long		max_events;
> > 		double			scale;
> > @@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
> > }
> > 
> > struct evsel *evsel__clone(struct evsel *orig);
> > -struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> > 
> > int copy_config_terms(struct list_head *dst, struct list_head *src);
> > void free_config_terms(struct list_head *config_terms);
> > 
> > +
> > +#ifdef HAVE_LIBTRACEEVENT
> > +struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
> > +
> > /*
> >  * Returns pointer with encoded error via <linux/err.h> interface.
> >  */
> > @@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
> > {
> > 	return evsel__newtp_idx(sys, name, 0);
> > }
> > +#endif
> > 
> > struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > struct tep_event *event_format__new(const char *sys, const char *name);
> > +#endif
> > 
> > void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
> > void evsel__exit(struct evsel *evsel);
> > @@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);
> > 
> > struct perf_sample;
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
> > u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
> > 
> > @@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
> > {
> > 	return evsel__rawptr(evsel, sample, name);
> > }
> > +#endif
> > 
> > struct tep_format_field;
> > 
> > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> > index 8c2ea8001329..bd22c4932d10 100644
> > --- a/tools/perf/util/evsel_fprintf.c
> > +++ b/tools/perf/util/evsel_fprintf.c
> > @@ -2,7 +2,6 @@
> > #include <inttypes.h>
> > #include <stdio.h>
> > #include <stdbool.h>
> > -#include <traceevent/event-parse.h>
> > #include "evsel.h"
> > #include "util/evsel_fprintf.h"
> > #include "util/event.h"
> > @@ -13,6 +12,10 @@
> > #include "srcline.h"
> > #include "dso.h"
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
> > {
> > 	va_list args;
> > @@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> > 					 term, (u64)evsel->core.attr.sample_freq);
> > 	}
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (details->trace_fields) {
> > 		struct tep_format_field *field;
> > 
> > @@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> > 			field = field->next;
> > 		}
> > 	}
> > +#endif
> > out:
> > 	fputc('\n', fp);
> > 	return ++printed;
> > diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> > index dc2ae397d400..404d816ca124 100644
> > --- a/tools/perf/util/header.c
> > +++ b/tools/perf/util/header.c
> > @@ -6,6 +6,7 @@
> > #include <sys/types.h>
> > #include <byteswap.h>
> > #include <unistd.h>
> > +#include <regex.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <linux/compiler.h>
> > @@ -55,6 +56,10 @@
> > #include <linux/ctype.h>
> > #include <internal/lib.h>
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > /*
> >  * magic2 = "PERFILE2"
> >  * must be a numerical value to let the endianness
> > @@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
> > 	return 0;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int write_tracing_data(struct feat_fd *ff,
> > 			      struct evlist *evlist)
> > {
> > @@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,
> > 
> > 	return read_tracing_data(ff->fd, &evlist->core.entries);
> > }
> > +#endif
> > 
> > static int write_build_id(struct feat_fd *ff,
> > 			  struct evlist *evlist __maybe_unused)
> > @@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
> > FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
> > FEAT_PROCESS_STR_FUN(cpuid, cpuid);
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int process_tracing_data(struct feat_fd *ff, void *data)
> > {
> > 	ssize_t ret = trace_report(ff->fd, data, false);
> > 
> > 	return ret < 0 ? -1 : 0;
> > }
> > +#endif
> > 
> > static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
> > {
> > @@ -3366,7 +3375,9 @@ static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
> > const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
> > 
> > const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	FEAT_OPN(TRACING_DATA,	tracing_data,	false),
> > +#endif
> > 	FEAT_OPN(BUILD_ID,	build_id,	false),
> > 	FEAT_OPR(HOSTNAME,	hostname,	false),
> > 	FEAT_OPR(OSRELEASE,	osrelease,	false),
> > @@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
> > 	return ret <= 0 ? -1 : 0;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
> > {
> > 	struct tep_event *event;
> > @@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
> > 
> > 	return 0;
> > }
> > +#endif
> > 
> > int perf_session__read_header(struct perf_session *session, int repipe_fd)
> > {
> > @@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
> > 		lseek(fd, tmp, SEEK_SET);
> > 	}
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	perf_header__process_sections(header, fd, &session->tevent,
> > 				      perf_file_section__process);
> > 
> > 	if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
> > 		goto out_delete_evlist;
> > +#else
> > +	perf_header__process_sections(header, fd, NULL, perf_file_section__process);
> > +#endif
> > 
> > 	return 0;
> > out_errno:
> > @@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
> > 	return 0;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > int perf_event__process_tracing_data(struct perf_session *session,
> > 				     union perf_event *event)
> > {
> > @@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,
> > 
> > 	return size_read + padding;
> > }
> > +#endif
> > 
> > int perf_event__process_build_id(struct perf_session *session,
> > 				 union perf_event *event)
> > diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
> > index 2d5e601ba60f..e3861ae62172 100644
> > --- a/tools/perf/util/header.h
> > +++ b/tools/perf/util/header.h
> > @@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
> > 				     union perf_event *event,
> > 				     struct evlist **pevlist);
> > size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
> > +#ifdef HAVE_LIBTRACEEVENT
> > int perf_event__process_tracing_data(struct perf_session *session,
> > 				     union perf_event *event);
> > +#endif
> > int perf_event__process_build_id(struct perf_session *session,
> > 				 union perf_event *event);
> > bool is_perf_magic(u64 magic);
> > diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> > index e3548ddef254..6d3921627e33 100644
> > --- a/tools/perf/util/intel-pt.c
> > +++ b/tools/perf/util/intel-pt.c
> > @@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
> > 	return 1;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int intel_pt_process_switch(struct intel_pt *pt,
> > 				   struct perf_sample *sample)
> > {
> > @@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,
> > 
> > 	return machine__set_current_tid(pt->machine, cpu, -1, tid);
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > static int intel_pt_context_switch_in(struct intel_pt *pt,
> > 				      struct perf_sample *sample)
> > @@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
> > 			return err;
> > 	}
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
> > 		err = intel_pt_process_switch(pt, sample);
> > -	else if (event->header.type == PERF_RECORD_ITRACE_START)
> > +	else
> > +#endif
> > +	if (event->header.type == PERF_RECORD_ITRACE_START)
> > 		err = intel_pt_process_itrace_start(pt, event, sample);
> > 	else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
> > 		err = intel_pt_process_aux_output_hw_id(pt, event, sample);
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index 6502cd679f57..21cce83462b3 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -445,6 +445,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
> > 	return ret;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static void tracepoint_error(struct parse_events_error *e, int err,
> > 			     const char *sys, const char *name)
> > {
> > @@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
> > 	closedir(events_dir);
> > 	return ret;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > #ifdef HAVE_LIBBPF_SUPPORT
> > struct __add_bpf_event_param {
> > @@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
> > 		return config_term_common(attr, term, err);
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int config_term_tracepoint(struct perf_event_attr *attr,
> > 				  struct parse_events_term *term,
> > 				  struct parse_events_error *err)
> > @@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
> > 
> > 	return 0;
> > }
> > +#endif
> > 
> > static int config_attr(struct perf_event_attr *attr,
> > 		       struct list_head *head,
> > @@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> > 				struct parse_events_error *err,
> > 				struct list_head *head_config)
> > {
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (head_config) {
> > 		struct perf_event_attr attr;
> > 
> > @@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
> > 	else
> > 		return add_tracepoint_event(list, idx, sys, event,
> > 					    err, head_config);
> > +#else
> > +	(void)list;
> > +	(void)idx;
> > +	(void)sys;
> > +	(void)event;
> > +	(void)head_config;
> > +	parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
> > +				strdup("libtraceevent is necessary for tracepoint support"));
> > +	return -1;
> > +#endif
> > }
> > 
> > int parse_events_add_numeric(struct parse_events_state *parse_state,
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index 07df7bb7b042..428e72eaafcc 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -18,7 +18,6 @@ struct parse_events_error;
> > struct option;
> > struct perf_pmu;
> > 
> > -bool have_tracepoints(struct list_head *evlist);
> > bool is_event_supported(u8 type, u64 config);
> > 
> > const char *event_type(int type);
> > diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> > index b5941c74a0d6..728fe2f51759 100644
> > --- a/tools/perf/util/python.c
> > +++ b/tools/perf/util/python.c
> > @@ -417,6 +417,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
> > 	return ret;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static bool is_tracepoint(struct pyrf_event *pevent)
> > {
> > 	return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
> > @@ -486,14 +487,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
> > 
> > 	return tracepoint_field(pevent, field);
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > static PyObject*
> > pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
> > {
> > 	PyObject *obj = NULL;
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (is_tracepoint(pevent))
> > 		obj = get_tracepoint_field(pevent, attr_name);
> > +#endif
> > 
> > 	return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
> > }
> > diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
> > index 0f5ba28339cf..77544d2c447c 100644
> > --- a/tools/perf/util/scripting-engines/Build
> > +++ b/tools/perf/util/scripting-engines/Build
> > @@ -1,5 +1,7 @@
> > -perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> > -perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> > +ifeq ($(CONFIG_TRACEEVENT),y)
> > +  perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
> > +  perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
> > +endif
> > 
> > CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
> > 
> > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> > index d685a7399ee2..fabba21919b8 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-python.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> > @@ -30,6 +30,7 @@
> > #include <linux/bitmap.h>
> > #include <linux/compiler.h>
> > #include <linux/time64.h>
> > +#include <traceevent/event-parse.h>
> > 
> > #include "../build-id.h"
> > #include "../counts.h"
> > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> > index 1facd4616317..7c021c6cedb9 100644
> > --- a/tools/perf/util/session.c
> > +++ b/tools/perf/util/session.c
> > @@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
> > 			evlist__delete(session->evlist);
> > 		perf_data__close(session->data);
> > 	}
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	trace_event__cleanup(&session->tevent);
> > +#endif
> > 	free(session);
> > }
> > 
> > diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> > index be5871ea558f..ee3715e8563b 100644
> > --- a/tools/perf/util/session.h
> > +++ b/tools/perf/util/session.h
> > @@ -33,7 +33,9 @@ struct perf_session {
> > 	struct auxtrace		*auxtrace;
> > 	struct itrace_synth_opts *itrace_synth_opts;
> > 	struct list_head	auxtrace_index;
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	struct trace_event	tevent;
> > +#endif
> > 	struct perf_record_time_conv	time_conv;
> > 	bool			repipe;
> > 	bool			one_mmap;
> > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> > index 2e7330867e2e..c7a97b33e134 100644
> > --- a/tools/perf/util/sort.c
> > +++ b/tools/perf/util/sort.c
> > @@ -22,7 +22,6 @@
> > #include "srcline.h"
> > #include "strlist.h"
> > #include "strbuf.h"
> > -#include <traceevent/event-parse.h>
> > #include "mem-events.h"
> > #include "annotate.h"
> > #include "event.h"
> > @@ -32,6 +31,10 @@
> > #include <linux/kernel.h>
> > #include <linux/string.h>
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > +#include <traceevent/event-parse.h>
> > +#endif
> > +
> > regex_t		parent_regex;
> > const char	default_parent_pattern[] = "^sys_|^do_page_fault";
> > const char	*parent_pattern = default_parent_pattern;
> > @@ -743,6 +746,7 @@ struct sort_entry sort_time = {
> > 
> > /* --sort trace */
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static char *get_trace_output(struct hist_entry *he)
> > {
> > 	struct trace_seq seq;
> > @@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
> > 	.se_snprintf    = hist_entry__trace_snprintf,
> > 	.se_width_idx	= HISTC_TRACE,
> > };
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > /* sort keys for branch stacks */
> > 
> > @@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
> > 	DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
> > 	DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
> > 	DIM(SORT_TRANSACTION, "transaction", sort_transaction),
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	DIM(SORT_TRACE, "trace", sort_trace),
> > +#endif
> > 	DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
> > 	DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
> > 	DIM(SORT_CGROUP, "cgroup", sort_cgroup),
> > @@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt)	\
> > 	return hse->se == &sort_ ## key ;			\
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > MK_SORT_ENTRY_CHK(trace)
> > +#else
> > +bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> > +{
> > +	return false;
> > +}
> > +#endif
> > MK_SORT_ENTRY_CHK(srcline)
> > MK_SORT_ENTRY_CHK(srcfile)
> > MK_SORT_ENTRY_CHK(thread)
> > @@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
> > 	return 0;
> > }
> > 
> > +#ifndef HAVE_LIBTRACEEVENT
> > +bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
> > +{
> > +	return false;
> > +}
> > +bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
> > +				     struct hists *hists __maybe_unused)
> > +{
> > +	return false;
> > +}
> > +#else
> > struct hpp_dynamic_entry {
> > 	struct perf_hpp_fmt hpp;
> > 	struct evsel *evsel;
> > @@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
> > 
> > 	return hde;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> > {
> > @@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> > 		new_hse = memdup(hse, sizeof(*hse));
> > 		if (new_hse)
> > 			new_fmt = &new_hse->hpp;
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	} else if (perf_hpp__is_dynamic_entry(fmt)) {
> > 		struct hpp_dynamic_entry *hde, *new_hde;
> > 
> > @@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
> > 		new_hde = memdup(hde, sizeof(*hde));
> > 		if (new_hde)
> > 			new_fmt = &new_hde->hpp;
> > +#endif
> > 	} else {
> > 		new_fmt = memdup(fmt, sizeof(*fmt));
> > 	}
> > @@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
> > 	return evsel;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > static int __dynamic_dimension__add(struct evsel *evsel,
> > 				    struct tep_format_field *field,
> > 				    bool raw_trace, int level)
> > @@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
> > 	}
> > 	return ret;
> > }
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> > 			     int level)
> > {
> > 	char *str, *event_name, *field_name, *opt_name;
> > 	struct evsel *evsel;
> > -	struct tep_format_field *field;
> > 	bool raw_trace = symbol_conf.raw_trace;
> > 	int ret = 0;
> > 
> > @@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> > 		raw_trace = true;
> > 	}
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (!strcmp(field_name, "trace_fields")) {
> > 		ret = add_all_dynamic_fields(evlist, raw_trace, level);
> > 		goto out;
> > @@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> > 		ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
> > 		goto out;
> > 	}
> > +#endif
> > 
> > 	evsel = find_evsel(evlist, event_name);
> > 	if (evsel == NULL) {
> > @@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> > 		goto out;
> > 	}
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (!strcmp(field_name, "*")) {
> > 		ret = add_evsel_fields(evsel, raw_trace, level);
> > 	} else {
> > -		field = tep_find_any_field(evsel->tp_format, field_name);
> > +		struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
> > +
> > 		if (field == NULL) {
> > 			pr_debug("Cannot find event field for %s.%s\n",
> > 				 event_name, field_name);
> > @@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> > 
> > 		ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
> > 	}
> > +#else
> > +	(void)level;
> > +	(void)raw_trace;
> > +#endif /* HAVE_LIBTRACEEVENT */
> > 
> > out:
> > 	free(str);
> > @@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> > 	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> > 		struct sort_dimension *sd = &common_sort_dimensions[i];
> > 
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> > 			continue;
> > 
> > 		for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
> > -			if (!strcmp(dynamic_headers[j], sd->name))
> > +			if (sd->name && !strcmp(dynamic_headers[j], sd->name))
> > 				sort_dimension_add_dynamic_header(sd);
> > 		}
> > 
> > @@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> > 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> > 		struct sort_dimension *sd = &bstack_sort_dimensions[i];
> > 
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> > 			continue;
> > 
> > 		if (sort__mode != SORT_MODE__BRANCH)
> > @@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
> > 	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> > 		struct sort_dimension *sd = &memory_sort_dimensions[i];
> > 
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> > 			continue;
> > 
> > 		if (sort__mode != SORT_MODE__MEMORY)
> > @@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> > 	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
> > 		struct sort_dimension *sd = &common_sort_dimensions[i];
> > 
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> > 			continue;
> > 
> > 		return __sort_dimension__add_output(list, sd);
> > @@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> > 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
> > 		struct sort_dimension *sd = &bstack_sort_dimensions[i];
> > 
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> > 			continue;
> > 
> > 		if (sort__mode != SORT_MODE__BRANCH)
> > @@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
> > 	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
> > 		struct sort_dimension *sd = &memory_sort_dimensions[i];
> > 
> > -		if (strncasecmp(tok, sd->name, strlen(tok)))
> > +		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
> > 			continue;
> > 
> > 		if (sort__mode != SORT_MODE__MEMORY)
> > @@ -3508,6 +3545,9 @@ void reset_output_field(void)
> > 
> > static void add_key(struct strbuf *sb, const char *str, int *llen)
> > {
> > +	if (!str)
> > +		return;
> > +
> > 	if (*llen >= 75) {
> > 		strbuf_addstr(sb, "\n\t\t\t ");
> > 		*llen = INDENT;
> > diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
> > index 0645795ff080..3ab6a92b1a6d 100644
> > --- a/tools/perf/util/synthetic-events.c
> > +++ b/tools/perf/util/synthetic-events.c
> > @@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
> > 	return err;
> > }
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
> > 					perf_event__handler_t process)
> > {
> > @@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
> > 
> > 	return aligned_size;
> > }
> > +#endif
> > 
> > int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
> > 				    perf_event__handler_t process, struct machine *machine)
> > @@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> > 	}
> > 	ret += err;
> > 
> > +#ifdef HAVE_LIBTRACEEVENT
> > 	if (have_tracepoints(&evlist->core.entries)) {
> > 		int fd = perf_data__fd(data);
> > 
> > @@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
> > 		}
> > 		ret += err;
> > 	}
> > +#else
> > +	(void)data;
> > +#endif
> > 
> > 	return ret;
> > }
> > diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
> > index c9c83a40647c..2d3c2576bab7 100644
> > --- a/tools/perf/util/trace-event-parse.c
> > +++ b/tools/perf/util/trace-event-parse.c
> > @@ -11,6 +11,8 @@
> > #include "trace-event.h"
> > 
> > #include <linux/ctype.h>
> > +#include <linux/kernel.h>
> > +#include <traceevent/event-parse.h>
> > 
> > static int get_common_field(struct scripting_context *context,
> > 			    int *offset, int *size, const char *type)
> > diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> > index 43146a4ce2fb..1162c49b8082 100644
> > --- a/tools/perf/util/trace-event-read.c
> > +++ b/tools/perf/util/trace-event-read.c
> > @@ -11,6 +11,7 @@
> > #include <sys/stat.h>
> > #include <sys/wait.h>
> > #include <sys/mman.h>
> > +#include <traceevent/event-parse.h>
> > #include <fcntl.h>
> > #include <unistd.h>
> > #include <errno.h>
> > diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> > index 636a010d929b..56175c53f9af 100644
> > --- a/tools/perf/util/trace-event-scripting.c
> > +++ b/tools/perf/util/trace-event-scripting.c
> > @@ -9,6 +9,7 @@
> > #include <stdlib.h>
> > #include <string.h>
> > #include <errno.h>
> > +#include <traceevent/event-parse.h>
> > 
> > #include "debug.h"
> > #include "trace-event.h"
> > diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
> > index b3ee651e3d91..8ad75b31e09b 100644
> > --- a/tools/perf/util/trace-event.c
> > +++ b/tools/perf/util/trace-event.c
> > @@ -1,5 +1,4 @@
> > // SPDX-License-Identifier: GPL-2.0
> > -
> > #include <stdio.h>
> > #include <unistd.h>
> > #include <stdlib.h>
> > diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> > index 8f39f5bcb2c2..add6c5d9531c 100644
> > --- a/tools/perf/util/trace-event.h
> > +++ b/tools/perf/util/trace-event.h
> > @@ -2,9 +2,11 @@
> > #ifndef _PERF_UTIL_TRACE_EVENT_H
> > #define _PERF_UTIL_TRACE_EVENT_H
> > 
> > -#include <traceevent/event-parse.h>
> > -#include "parse-events.h"
> > +#include <stdbool.h>
> > +#include <stdio.h>
> > +#include <linux/types.h>
> > 
> > +struct evlist;
> > struct machine;
> > struct perf_sample;
> > union perf_event;
> > @@ -18,6 +20,11 @@ struct trace_event {
> > 	struct tep_plugin_list	*plugin_list;
> > };
> > 
> > +typedef char *(tep_func_resolver_t)(void *priv,
> > +				    unsigned long long *addrp, char **modp);
> > +
> > +bool have_tracepoints(struct list_head *evlist);
> > +
> > int trace_event__init(struct trace_event *t);
> > void trace_event__cleanup(struct trace_event *t);
> > int trace_event__register_resolver(struct machine *machine,
> > -- 
> > 2.39.0.rc0.267.gcb52ba06e7-goog
> >
Arnaldo Carvalho de Melo Dec. 7, 2022, 4:56 p.m. UTC | #23
Em Wed, Dec 07, 2022 at 01:02:09PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Wed, Dec 07, 2022 at 09:39:58AM -0500, Steven Rostedt escreveu:
> > On Wed, 7 Dec 2022 11:31:38 -0300
> > Arnaldo Carvalho de Melo <acme@kernel.org> wrote:

> > > No distro I tested so far has a package for libtracevent in is default
> > > repositories:

> > Not sure what you mean by "default repository".

> > At least on Debian testing, I have libtraceevent-dev available.

> Right, I'm talking about non-bleeding edge, distros that are still
> supported. I'm still checking, fedora is ok all the way back to 33, wrt
> having libtraceevent available.

And in some places libtraceevent is available, but then:

  73     6.88 ubuntu:22.04                  : FAIL gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
          |                                    ^~~~~~~~~~~~~~~~~~~~~
          |                                    TEP_FIELD_IS_FLAG

Still need to look how to cover these.

- Arnaldo
Ian Rogers Dec. 7, 2022, 5 p.m. UTC | #24
On Wed, Dec 7, 2022 at 8:02 AM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>
> Em Wed, Dec 07, 2022 at 09:39:58AM -0500, Steven Rostedt escreveu:
> > On Wed, 7 Dec 2022 11:31:38 -0300
> > Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> >
> > > No distro I tested so far has a package for libtracevent in is default
> > > repositories:
> >
> > Not sure what you mean by "default repository".
> >
> > At least on Debian testing, I have libtraceevent-dev available.
>
> Right, I'm talking about non-bleeding edge, distros that are still
> supported. I'm still checking, fedora is ok all the way back to 33, wrt
> having libtraceevent available.
>
> - Arnaldo

I think this is both similar to the python2 issue and different. With
python we now have a build time dependency on having at least Python
3.6 if you want json events. With this change you need the system to
have libtraceevent if you want to have various commands like perf
sched, perf trace, etc. Losing entire commands with this change is
more than happened with the Python 3.6 dependency. With the python
issue, you can fix the build issue by installing Python 3.6 and with
this issue you can fix it by installing libtraceevent-devel. In both
cases you can install via a package manager, but given you are likely
building the perf tool from source, you can also build both python and
libtraceevent from source. Saying that an old distro is broken by this
change, or the Python 3.6 change, I think is too strong and we're in
danger of holding things back for a very small (possibly 0) set of
people. They'd have to be upset about building from source on an old
distro, then losing the less commonly used commands of perf sched,
perf trace, etc. and be unwilling to build libtraceevent from source.
Given they are building the perf tool from source I just can't imagine
they'd be too upset about building libtraceevent from source.

I think a problem with both changes is that the build time warning
given isn't loud enough. Perhaps we can make it that at build time we
$(error for these recommended dependencies, unless NO_JEVENTS=1 or
NO_LIBTRACEEVENT=1 are added. Losing functionality and just having a
small $(warning seems error prone and likely to cause functionality to
be accidentally lost.

Thanks,
Ian
Arnaldo Carvalho de Melo Dec. 7, 2022, 5:27 p.m. UTC | #25
Em Wed, Dec 07, 2022 at 07:08:28PM +0530, Athira Rajeev escreveu:
> 
> 
> > On 06-Dec-2022, at 11:01 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > 
> > Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
> >> Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
> >>> Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
> >>>> Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
> >>>>> Now to look at the BUILD_BPF_SKEL=1 kaboom:
> >>>>> 
> >>>>> [acme@quaco perf]$ alias m
> >>>>> alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
> >>>>> [acme@quaco perf]$ m
> >>>>> make: Entering directory '/home/acme/git/perf/tools/perf'
> >>>>>  BUILD:   Doing 'make -j8' parallel build
> >>>>>  <SNIP>
> >>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
> >>>>> /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
> >>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
> >>> 
> >>> For that bpf_kwork.c see below. Now to see why the python binding is not
> >>> building, I guess is unrelated and you have some other outstanding
> >>> patch?
> >> 
> >> Its related:
> >> 
> >> [acme@quaco perf]$ perf test -v python
> >> Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
> >> 14: 'import perf' in python                                         :
> >> --- start ---
> >> test child forked, pid 1669872
> >> python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
> >> Traceback (most recent call last):
> >>  File "<stdin>", line 1, in <module>
> >> ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
> >> test child finished with -1
> >> ---- end ----
> >> 'import perf' in python: FAILED!
> >> [acme@quaco perf]$
> >> 
> >> Now checking why NO_LIBTRACEEVENT=1 fails with this...
> >> 
> >> [acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
> >> tools/perf/util/trace-event.c:	tep_unload_plugins(t->plugin_list, t->pevent);
> >> [acme@quaco perf]$
> >> 
> >> [acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
> >> util/trace-event.c
> >> [acme@quaco perf]$
> >> 
> >> Trying to fix...
> > 
> > I'm missing some detail, this isn't working, util/trace-event.c is still
> > being built and linked.
> 
> Hi,
> 
> Observed similar issue with “builtin-trace.c”
> 
> In system without libtraceevent-devel, I could still see builtin-trace trying to get
> compiled and hitting error. In my understanding, CONFIG_TRACE will be
> disabled when libtraceevent is not present and hence builtin-trace should be disabled
> which I am not seeing.
> 
> # rpm -qa|grep libtraceevent
> libtraceevent-1.2.1-1.el8.ppc64le
> 
> # grep -i traceevent FEATURE-DUMP 
> feature-libtraceevent=0
> 
> Snippet from make logs:
> 
> builtin-trace.c:266:50: error: dereferencing pointer to incomplete type 'struct tep_format_field'
>   return __tp_field__init_uint(field, format_field->size, format_field->offset, needs_swap);
>                                                   ^~
> builtin-trace.c: In function 'evsel__syscall_arg_fmt':
> builtin-trace.c:361:25: error: 'struct evsel' has no member named 'tp_format'
>    et->fmt = calloc(evsel->tp_format->format.nr_fields, sizeof(struct syscall_arg_fmt));
> 

Can you try again? tmp.perf/core? That "tmp." part means its a force
pushed branch, so I just force pushed with some arch specific fixes, now
I'm down to (removing the successful builds and unrelated failures, now
related to libbpf's F_DUPFD_CLOEXEC kaboom):

   5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
          |                                    ^~~~~~~~~~~~~~~~~~~~~
          |                                    TEP_FIELD_IS_FLAG
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
    error: command '/usr/bin/gcc' failed with exit code 1

  7     7.18 fedora:35                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
          |                                    ^~~~~~~~~~~~~~~~~~~~~
          |                                    TEP_FIELD_IS_FLAG
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
    error: command '/usr/bin/gcc' failed with exit code 1

  14     8.49 ubuntu:18.04-x-s390           : FAIL gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
    tests/parse-events.c:1893:12: error: 'test__checkevent_tracepoint' undeclared here (not in a function); did you mean 'test__checkevent_breakpoint'?
       .check = test__checkevent_tracepoint,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
                test__checkevent_breakpoint
    /git/perf-6.1.0-rc6/tools/build/Makefile.build:139: recipe for target 'tests' failed
    make[3]: *** [tests] Error 2
  16     6.38 ubuntu:22.04                  : FAIL gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
          |                                    ^~~~~~~~~~~~~~~~~~~~~
          |                                    TEP_FIELD_IS_FLAG
    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
    error: command '/usr/bin/gcc' failed with exit code 1


 
> Thanks
> Athira
> 
> > 
> > The python binding should be usable without tracepoints, in fact its
> > first usage was just to have access to the perf metaevents, see 
> > tools/perf/python/twatch.py.
> > 
> > diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> > index f0e4daeef8120853..5bd67d54d036f281 100644
> > --- a/tools/perf/Makefile.perf
> > +++ b/tools/perf/Makefile.perf
> > @@ -348,6 +348,10 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
> > python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
> > 
> > PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
> > +ifneq ($(CONFIG_TRACEEVENT),y)
> > +  PYTHON_EXT_SRCS := $(call filter-out,$(PYTHON_EXT_SRCS),util/trace-event.c)
> > +endif
> > +
> > PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
> > 
> > SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
> > diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> > index 728fe2f51759eb0d..72088aec2857b316 100644
> > --- a/tools/perf/util/python.c
> > +++ b/tools/perf/util/python.c
> > @@ -1330,6 +1330,9 @@ static struct {
> > static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
> > 				  PyObject *args, PyObject *kwargs)
> > {
> > +#ifndef HAVE_LIBTRACEEVENT
> > +	return NULL;
> > +#else
> > 	struct tep_event *tp_format;
> > 	static char *kwlist[] = { "sys", "name", NULL };
> > 	char *sys  = NULL;
> > @@ -1344,6 +1347,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
> > 		return _PyLong_FromLong(-1);
> > 
> > 	return _PyLong_FromLong(tp_format->id);
> > +#endif // HAVE_LIBTRACEEVENT
> > }
> > 
> > static PyMethodDef perf__methods[] = {
Arnaldo Carvalho de Melo Dec. 7, 2022, 5:31 p.m. UTC | #26
Em Wed, Dec 07, 2022 at 02:27:33PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Wed, Dec 07, 2022 at 07:08:28PM +0530, Athira Rajeev escreveu:
> > > On 06-Dec-2022, at 11:01 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> Can you try again? tmp.perf/core? That "tmp." part means its a force
> pushed branch, so I just force pushed with some arch specific fixes, now
> I'm down to (removing the successful builds and unrelated failures, now
> related to libbpf's F_DUPFD_CLOEXEC kaboom):
> 
>   14     8.49 ubuntu:18.04-x-s390           : FAIL gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
>     tests/parse-events.c:1893:12: error: 'test__checkevent_tracepoint' undeclared here (not in a function); did you mean 'test__checkevent_breakpoint'?
>        .check = test__checkevent_tracepoint,
>                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>                 test__checkevent_breakpoint
>     /git/perf-6.1.0-rc6/tools/build/Makefile.build:139: recipe for target 'tests' failed
>     make[3]: *** [tests] Error 2

This should fix the above:


⬢[acme@toolbox perf]$ vim tools/perf/tests/parse-events.c
⬢[acme@toolbox perf]$ git diff
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index dcbfb93287e80e78..bebb677682deff98 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -1887,7 +1887,7 @@ static const struct evlist_test test__events[] = {
                .check = test__checkevent_breakpoint_len_rw_modifier,
                /* 4 */
        },
-#if defined(__s390x__)
+#if defined(__s390x__) and defined(HAVE_LIBTRACEEVENT)
        {
                .name  = "kvm-s390:kvm_s390_create_vm",
                .check = test__checkevent_tracepoint,
⬢[acme@toolbox perf]$
Arnaldo Carvalho de Melo Dec. 7, 2022, 5:43 p.m. UTC | #27
Em Wed, Dec 07, 2022 at 02:31:35PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Wed, Dec 07, 2022 at 02:27:33PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Wed, Dec 07, 2022 at 07:08:28PM +0530, Athira Rajeev escreveu:
> > > > On 06-Dec-2022, at 11:01 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > Can you try again? tmp.perf/core? That "tmp." part means its a force
> > pushed branch, so I just force pushed with some arch specific fixes, now
> > I'm down to (removing the successful builds and unrelated failures, now
> > related to libbpf's F_DUPFD_CLOEXEC kaboom):
> > 
> >   14     8.49 ubuntu:18.04-x-s390           : FAIL gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
> >     tests/parse-events.c:1893:12: error: 'test__checkevent_tracepoint' undeclared here (not in a function); did you mean 'test__checkevent_breakpoint'?
> >        .check = test__checkevent_tracepoint,
> >                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> >                 test__checkevent_breakpoint
> >     /git/perf-6.1.0-rc6/tools/build/Makefile.build:139: recipe for target 'tests' failed
> >     make[3]: *** [tests] Error 2
> 
> This should fix the above:
> 
> 
> ⬢[acme@toolbox perf]$ vim tools/perf/tests/parse-events.c
> ⬢[acme@toolbox perf]$ git diff
> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> index dcbfb93287e80e78..bebb677682deff98 100644
> --- a/tools/perf/tests/parse-events.c
> +++ b/tools/perf/tests/parse-events.c
> @@ -1887,7 +1887,7 @@ static const struct evlist_test test__events[] = {
>                 .check = test__checkevent_breakpoint_len_rw_modifier,
>                 /* 4 */
>         },
> -#if defined(__s390x__)
> +#if defined(__s390x__) and defined(HAVE_LIBTRACEEVENT)

s/and/&&/g

>         {
>                 .name  = "kvm-s390:kvm_s390_create_vm",
>                 .check = test__checkevent_tracepoint,
> ⬢[acme@toolbox perf]$
Athira Rajeev Dec. 8, 2022, 6:51 a.m. UTC | #28
> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> 
> Em Wed, Dec 07, 2022 at 07:08:28PM +0530, Athira Rajeev escreveu:
>> 
>> 
>>> On 06-Dec-2022, at 11:01 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>> 
>>> Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>> Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>> Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>>> Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>>>> Now to look at the BUILD_BPF_SKEL=1 kaboom:
>>>>>>> 
>>>>>>> [acme@quaco perf]$ alias m
>>>>>>> alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
>>>>>>> [acme@quaco perf]$ m
>>>>>>> make: Entering directory '/home/acme/git/perf/tools/perf'
>>>>>>> BUILD:   Doing 'make -j8' parallel build
>>>>>>> <SNIP>
>>>>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
>>>>>>> /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
>>>>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
>>>>> 
>>>>> For that bpf_kwork.c see below. Now to see why the python binding is not
>>>>> building, I guess is unrelated and you have some other outstanding
>>>>> patch?
>>>> 
>>>> Its related:
>>>> 
>>>> [acme@quaco perf]$ perf test -v python
>>>> Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
>>>> 14: 'import perf' in python                                         :
>>>> --- start ---
>>>> test child forked, pid 1669872
>>>> python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
>>>> Traceback (most recent call last):
>>>> File "<stdin>", line 1, in <module>
>>>> ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
>>>> test child finished with -1
>>>> ---- end ----
>>>> 'import perf' in python: FAILED!
>>>> [acme@quaco perf]$
>>>> 
>>>> Now checking why NO_LIBTRACEEVENT=1 fails with this...
>>>> 
>>>> [acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
>>>> tools/perf/util/trace-event.c:	tep_unload_plugins(t->plugin_list, t->pevent);
>>>> [acme@quaco perf]$
>>>> 
>>>> [acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
>>>> util/trace-event.c
>>>> [acme@quaco perf]$
>>>> 
>>>> Trying to fix...
>>> 
>>> I'm missing some detail, this isn't working, util/trace-event.c is still
>>> being built and linked.
>> 
>> Hi,
>> 
>> Observed similar issue with “builtin-trace.c”
>> 
>> In system without libtraceevent-devel, I could still see builtin-trace trying to get
>> compiled and hitting error. In my understanding, CONFIG_TRACE will be
>> disabled when libtraceevent is not present and hence builtin-trace should be disabled
>> which I am not seeing.
>> 
>> # rpm -qa|grep libtraceevent
>> libtraceevent-1.2.1-1.el8.ppc64le
>> 
>> # grep -i traceevent FEATURE-DUMP 
>> feature-libtraceevent=0
>> 
>> Snippet from make logs:
>> 
>> builtin-trace.c:266:50: error: dereferencing pointer to incomplete type 'struct tep_format_field'
>>  return __tp_field__init_uint(field, format_field->size, format_field->offset, needs_swap);
>>                                                  ^~
>> builtin-trace.c: In function 'evsel__syscall_arg_fmt':
>> builtin-trace.c:361:25: error: 'struct evsel' has no member named 'tp_format'
>>   et->fmt = calloc(evsel->tp_format->format.nr_fields, sizeof(struct syscall_arg_fmt));
>> 
> 
> Can you try again? tmp.perf/core? That "tmp." part means its a force
> pushed branch, so I just force pushed with some arch specific fixes, now
> I'm down to (removing the successful builds and unrelated failures, now
> related to libbpf's F_DUPFD_CLOEXEC kaboom):

Ok Arnaldo, Sure, I will check with updated branch


> 
>   5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
>     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>          |                                    ^~~~~~~~~~~~~~~~~~~~~
>          |                                    TEP_FIELD_IS_FLAG

I observed same issue as updated here: 
https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/

Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
whereas it is there in header file in tools/lib/traceevent

# grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
# grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
	TEP_FIELD_IS_RELATIVE	= 256,


Thanks
Athira
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
>    error: command '/usr/bin/gcc' failed with exit code 1
> 
>  7     7.18 fedora:35                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
>     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>          |                                    ^~~~~~~~~~~~~~~~~~~~~
>          |                                    TEP_FIELD_IS_FLAG
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
>    error: command '/usr/bin/gcc' failed with exit code 1
> 
>  14     8.49 ubuntu:18.04-x-s390           : FAIL gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
>    tests/parse-events.c:1893:12: error: 'test__checkevent_tracepoint' undeclared here (not in a function); did you mean 'test__checkevent_breakpoint'?
>       .check = test__checkevent_tracepoint,
>                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>                test__checkevent_breakpoint
>    /git/perf-6.1.0-rc6/tools/build/Makefile.build:139: recipe for target 'tests' failed
>    make[3]: *** [tests] Error 2
>  16     6.38 ubuntu:22.04                  : FAIL gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
>     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>          |                                    ^~~~~~~~~~~~~~~~~~~~~
>          |                                    TEP_FIELD_IS_FLAG
>    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
>    error: command '/usr/bin/gcc' failed with exit code 1
> 
> 
> 
>> Thanks
>> Athira
>> 
>>> 
>>> The python binding should be usable without tracepoints, in fact its
>>> first usage was just to have access to the perf metaevents, see 
>>> tools/perf/python/twatch.py.
>>> 
>>> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
>>> index f0e4daeef8120853..5bd67d54d036f281 100644
>>> --- a/tools/perf/Makefile.perf
>>> +++ b/tools/perf/Makefile.perf
>>> @@ -348,6 +348,10 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
>>> python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
>>> 
>>> PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
>>> +ifneq ($(CONFIG_TRACEEVENT),y)
>>> +  PYTHON_EXT_SRCS := $(call filter-out,$(PYTHON_EXT_SRCS),util/trace-event.c)
>>> +endif
>>> +
>>> PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
>>> 
>>> SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
>>> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
>>> index 728fe2f51759eb0d..72088aec2857b316 100644
>>> --- a/tools/perf/util/python.c
>>> +++ b/tools/perf/util/python.c
>>> @@ -1330,6 +1330,9 @@ static struct {
>>> static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>>> 				  PyObject *args, PyObject *kwargs)
>>> {
>>> +#ifndef HAVE_LIBTRACEEVENT
>>> +	return NULL;
>>> +#else
>>> 	struct tep_event *tp_format;
>>> 	static char *kwlist[] = { "sys", "name", NULL };
>>> 	char *sys  = NULL;
>>> @@ -1344,6 +1347,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>>> 		return _PyLong_FromLong(-1);
>>> 
>>> 	return _PyLong_FromLong(tp_format->id);
>>> +#endif // HAVE_LIBTRACEEVENT
>>> }
>>> 
>>> static PyMethodDef perf__methods[] = {
> 
> -- 
> 
> - Arnaldo
Arnaldo Carvalho de Melo Dec. 8, 2022, 10:04 p.m. UTC | #29
Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
> > On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > Can you try again? tmp.perf/core? That "tmp." part means its a force
> > pushed branch, so I just force pushed with some arch specific fixes, now
> > I'm down to (removing the successful builds and unrelated failures, now
> > related to libbpf's F_DUPFD_CLOEXEC kaboom):

> Ok Arnaldo, Sure, I will check with updated branch

> >   5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> >     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >          |                                    ^~~~~~~~~~~~~~~~~~~~~
> >          |                                    TEP_FIELD_IS_FLAG

> I observed same issue as updated here: 
> https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/

> Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
> whereas it is there in header file in tools/lib/traceevent

> # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
> # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
> 	TEP_FIELD_IS_RELATIVE	= 256,

Right, I had noticed that as well, so as a prep patch I'm adding the
patch below, before Ian's. Please check and provide an
Acked-by/Tested-by/Reviewed-by if possible.

- Arnaldo

commit d288f6c03038e8f14f0b53bd4ccc03f664c8c744
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Thu Dec 8 18:26:05 2022 -0300

    perf tools: Add test to check if libtracevent has TEP_FIELD_IS_RELATIVE
    
    Some distros have older versions of libtraceevent where
    TEP_FIELD_IS_RELATIVE and its associated semantics are not present, so
    we need to test for its presence and cope when it isn't present when
    building with LIBTRACEEVENT_DYNAMIC=1.
    
    Reported-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>,
    Cc: Stephane Eranian <eranian@google.com>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
index 38f8851bd7cbdb0e..c6c9b7c7723d4290 100644
--- a/tools/build/Makefile.feature
+++ b/tools/build/Makefile.feature
@@ -71,7 +71,8 @@ FEATURE_TESTS_BASIC :=                  \
         libzstd				\
         disassembler-four-args		\
         disassembler-init-styled	\
-        file-handle
+        file-handle			\
+        libtraceevent-tep_field_is_relative
 
 # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
 # of all feature tests
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index 690fe97be1904399..b568be802dc873ed 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -81,7 +81,8 @@ FILES=                                          \
          test-libzstd.bin			\
          test-clang-bpf-co-re.bin		\
          test-file-handle.bin			\
-         test-libpfm4.bin
+         test-libpfm4.bin			\
+         test-libtraceevent-tep_field_is_relative
 
 FILES := $(addprefix $(OUTPUT),$(FILES))
 
@@ -92,7 +93,7 @@ all: $(FILES)
 __BUILD = $(CC) $(CFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.c,$(@F)) $(LDFLAGS)
   BUILD = $(__BUILD) > $(@:.bin=.make.output) 2>&1
   BUILD_BFD = $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl
-  BUILD_ALL = $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -lslang $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl -lz -llzma -lzstd -lcap
+  BUILD_ALL = $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -lslang $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl -lz -llzma -lzstd -lcap -ltraceevent
 
 __BUILDXX = $(CXX) $(CXXFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.cpp,$(@F)) $(LDFLAGS)
   BUILDXX = $(__BUILDXX) > $(@:.bin=.make.output) 2>&1
@@ -159,6 +160,9 @@ $(OUTPUT)test-dwarf_getlocations.bin:
 $(OUTPUT)test-libelf-getphdrnum.bin:
 	$(BUILD) -lelf
 
+$(OUTPUT)test-libtraceevent-tep_field_is_relative.bin:
+	$(BUILD) -ltraceevent
+
 $(OUTPUT)test-libelf-gelf_getnote.bin:
 	$(BUILD) -lelf
 
diff --git a/tools/build/feature/test-libtraceevent-tep_field_is_relative.c b/tools/build/feature/test-libtraceevent-tep_field_is_relative.c
new file mode 100644
index 0000000000000000..b0664d727d1bf452
--- /dev/null
+++ b/tools/build/feature/test-libtraceevent-tep_field_is_relative.c
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <traceevent/event-parse.h>
+
+int main(void)
+{
+	return TEP_FIELD_IS_RELATIVE;
+}
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 9cc3c48f32881c8b..3d0694bece5ed08b 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -1192,9 +1192,14 @@ ifdef LIBTRACEEVENT_DYNAMIC
     LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
-  else
-    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
+    $(call feature_check,libtraceevent-tep_field_is_relative)
+    ifeq ($(feature-libtraceevent-tep_field_is_relative), 1)
+      CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
+    endif
   endif
+else
+  # Its the in-kernel tools/lib/traceevent/, so we _have_ TEP_FIELD_IS_RELATIVE
+  CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 endif
 
 ifdef LIBTRACEFS_DYNAMIC
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 543c379d2a57a05a..e38c3b4fc5a69160 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -2726,8 +2726,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
 				offset = format_field__intval(field, sample, evsel->needs_swap);
 				syscall_arg.len = offset >> 16;
 				offset &= 0xffff;
-				if (field->flags & TEP_FIELD_IS_RELATIVE)
-					offset += field->offset + field->size;
+				offset += traceevent__field_adjust_relative_offset(field);
 			}
 
 			val = (uintptr_t)(sample->raw_data + offset);
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index c65cdaf6975eddeb..955b2a110c7f0b33 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -319,8 +319,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
 		offset = tmp_val;
 		len = offset >> 16;
 		offset &= 0xffff;
-		if (flags & TEP_FIELD_IS_RELATIVE)
-			offset += fmtf->offset + fmtf->size;
+		offset += traceevent__field_adjust_relative_offset(fmtf);
 	}
 
 	if (flags & TEP_FIELD_IS_ARRAY) {
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 0f617359a82f2891..45a4090c78337b4d 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2776,8 +2776,7 @@ void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char
 	if (field->flags & TEP_FIELD_IS_DYNAMIC) {
 		offset = *(int *)(sample->raw_data + field->offset);
 		offset &= 0xffff;
-		if (field->flags & TEP_FIELD_IS_RELATIVE)
-			offset += field->offset + field->size;
+		offset += traceevent__field_adjust_relative_offset(field);
 	}
 
 	return sample->raw_data + offset;
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index b5941c74a0d64e10..e46d6de537b1c448 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -439,8 +439,7 @@ tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
 			offset  = val;
 			len     = offset >> 16;
 			offset &= 0xffff;
-			if (field->flags & TEP_FIELD_IS_RELATIVE)
-				offset += field->offset + field->size;
+			offset += traceevent__field_adjust_relative_offset(field);
 		}
 		if (field->flags & TEP_FIELD_IS_STRING &&
 		    is_printable_array(data + offset, len)) {
diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
index 5b602b6d46854133..05814d0c99a43171 100644
--- a/tools/perf/util/scripting-engines/trace-event-perl.c
+++ b/tools/perf/util/scripting-engines/trace-event-perl.c
@@ -392,8 +392,7 @@ static void perl_process_tracepoint(struct perf_sample *sample,
 			if (field->flags & TEP_FIELD_IS_DYNAMIC) {
 				offset = *(int *)(data + field->offset);
 				offset &= 0xffff;
-				if (field->flags & TEP_FIELD_IS_RELATIVE)
-					offset += field->offset + field->size;
+				offset += traceevent__field_adjust_relative_offset(field);
 			} else
 				offset = field->offset;
 			XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index d685a7399ee2e6c1..4bceba8dde6e05a0 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -993,8 +993,7 @@ static void python_process_tracepoint(struct perf_sample *sample,
 				offset  = val;
 				len     = offset >> 16;
 				offset &= 0xffff;
-				if (field->flags & TEP_FIELD_IS_RELATIVE)
-					offset += field->offset + field->size;
+				offset += traceevent__field_adjust_relative_offset(field);
 			}
 			if (field->flags & TEP_FIELD_IS_STRING &&
 			    is_printable_array(data + offset, len)) {
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 2e7330867e2efd42..dbabe83be43f6095 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -23,6 +23,7 @@
 #include "strlist.h"
 #include "strbuf.h"
 #include <traceevent/event-parse.h>
+#include "trace-event.h"
 #include "mem-events.h"
 #include "annotate.h"
 #include "event.h"
@@ -2543,9 +2544,7 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
 		tep_read_number_field(field, a->raw_data, &dyn);
 		offset = dyn & 0xffff;
 		size = (dyn >> 16) & 0xffff;
-		if (field->flags & TEP_FIELD_IS_RELATIVE)
-			offset += field->offset + field->size;
-
+		offset += traceevent__field_adjust_relative_offset(field);
 		/* record max width for output */
 		if (size > hde->dynamic_len)
 			hde->dynamic_len = size;
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 8f39f5bcb2c268fd..78246e6fb25a620b 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -2,6 +2,7 @@
 #ifndef _PERF_UTIL_TRACE_EVENT_H
 #define _PERF_UTIL_TRACE_EVENT_H
 
+#include <linux/compiler.h>
 #include <traceevent/event-parse.h>
 #include "parse-events.h"
 
@@ -129,4 +130,14 @@ int common_lock_depth(struct scripting_context *context);
 #define SAMPLE_FLAGS_BUF_SIZE 64
 int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz);
 
+
+static inline int traceevent__field_adjust_relative_offset(struct tep_format_field *field __maybe_unused)
+{
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
+	if (field->flags & TEP_FIELD_IS_RELATIVE)
+		return field->offset + field->size;
+#endif
+	return 0;
+}
+
 #endif /* _PERF_UTIL_TRACE_EVENT_H */
Arnaldo Carvalho de Melo Dec. 8, 2022, 10:32 p.m. UTC | #30
Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
> > > On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > > Can you try again? tmp.perf/core? That "tmp." part means its a force
> > > pushed branch, so I just force pushed with some arch specific fixes, now
> > > I'm down to (removing the successful builds and unrelated failures, now
> > > related to libbpf's F_DUPFD_CLOEXEC kaboom):
> 
> > Ok Arnaldo, Sure, I will check with updated branch
> 
> > >   5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> > >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> > >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> > >     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> > >          |                                    ^~~~~~~~~~~~~~~~~~~~~
> > >          |                                    TEP_FIELD_IS_FLAG
> 
> > I observed same issue as updated here: 
> > https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
> 
> > Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
> > whereas it is there in header file in tools/lib/traceevent
> 
> > # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
> > # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
> > 	TEP_FIELD_IS_RELATIVE	= 256,
> 
> Right, I had noticed that as well, so as a prep patch I'm adding the
> patch below, before Ian's. Please check and provide an
> Acked-by/Tested-by/Reviewed-by if possible.

I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
it before and had already tested it this way multiple times, I'm pushing
this to tmp/perf.core.

- Arnaldo

commit a0ec3ef4590e7e82339b6f318e671a6b69fd94e8
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Thu Dec 8 19:28:58 2022 -0300

    perf tools: Add test to check if libtracevent has TEP_FIELD_IS_RELATIVE
    
    Some distros have older versions of libtraceevent where
    TEP_FIELD_IS_RELATIVE and its associated semantics are not present, so
    we need to test for its presence and cope when it isn't present when
    building with LIBTRACEEVENT_DYNAMIC=1.
    
    Reported-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>,
    Cc: Stephane Eranian <eranian@google.com>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
index 38f8851bd7cbdb0e..c6c9b7c7723d4290 100644
--- a/tools/build/Makefile.feature
+++ b/tools/build/Makefile.feature
@@ -71,7 +71,8 @@ FEATURE_TESTS_BASIC :=                  \
         libzstd				\
         disassembler-four-args		\
         disassembler-init-styled	\
-        file-handle
+        file-handle			\
+        libtraceevent-tep_field_is_relative
 
 # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
 # of all feature tests
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index 690fe97be1904399..24246df35ac30eeb 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -81,7 +81,8 @@ FILES=                                          \
          test-libzstd.bin			\
          test-clang-bpf-co-re.bin		\
          test-file-handle.bin			\
-         test-libpfm4.bin
+         test-libpfm4.bin			\
+         test-libtraceevent-tep_field_is_relative
 
 FILES := $(addprefix $(OUTPUT),$(FILES))
 
@@ -159,6 +160,9 @@ $(OUTPUT)test-dwarf_getlocations.bin:
 $(OUTPUT)test-libelf-getphdrnum.bin:
 	$(BUILD) -lelf
 
+$(OUTPUT)test-libtraceevent-tep_field_is_relative.bin:
+	$(BUILD) -ltraceevent
+
 $(OUTPUT)test-libelf-gelf_getnote.bin:
 	$(BUILD) -lelf
 
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 680228e19c1aabdb..e29975664f06bd61 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -1197,6 +1197,10 @@ ifneq ($(NO_LIBTRACEEVENT),1)
     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
     $(call detected,CONFIG_LIBTRACEEVENT)
+    $(call feature_check,libtraceevent-tep_field_is_relative)
+    ifeq ($(feature-libtraceevent-tep_field_is_relative), 1)
+      CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
+    endif
   else
     dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev/libtraceevent-devel)
   endif
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 6909cd9f48d11644..c9802ab549d7782f 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -2729,8 +2729,10 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
 				offset = format_field__intval(field, sample, evsel->needs_swap);
 				syscall_arg.len = offset >> 16;
 				offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 				if (field->flags & TEP_FIELD_IS_RELATIVE)
 					offset += field->offset + field->size;
+#endif
 			}
 
 			val = (uintptr_t)(sample->raw_data + offset);
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index 8031b586e81384e7..b842273458b862bd 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -322,8 +322,10 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
 		offset = tmp_val;
 		len = offset >> 16;
 		offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 		if (flags & TEP_FIELD_IS_RELATIVE)
 			offset += fmtf->offset + fmtf->size;
+#endif
 	}
 
 	if (flags & TEP_FIELD_IS_ARRAY) {
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index ca911856c4b1d3c8..77b2cf5a214ec1e4 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2784,8 +2784,10 @@ void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char
 	if (field->flags & TEP_FIELD_IS_DYNAMIC) {
 		offset = *(int *)(sample->raw_data + field->offset);
 		offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 		if (field->flags & TEP_FIELD_IS_RELATIVE)
 			offset += field->offset + field->size;
+#endif
 	}
 
 	return sample->raw_data + offset;
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 6fb84b7455b8392d..7320f7f777fe0e56 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -442,8 +442,10 @@ tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
 			offset  = val;
 			len     = offset >> 16;
 			offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 			if (field->flags & TEP_FIELD_IS_RELATIVE)
 				offset += field->offset + field->size;
+#endif
 		}
 		if (field->flags & TEP_FIELD_IS_STRING &&
 		    is_printable_array(data + offset, len)) {
diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
index 0bacb49408f84adf..c097b7934fd4ebe9 100644
--- a/tools/perf/util/scripting-engines/trace-event-perl.c
+++ b/tools/perf/util/scripting-engines/trace-event-perl.c
@@ -393,8 +393,10 @@ static void perl_process_tracepoint(struct perf_sample *sample,
 			if (field->flags & TEP_FIELD_IS_DYNAMIC) {
 				offset = *(int *)(data + field->offset);
 				offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 				if (field->flags & TEP_FIELD_IS_RELATIVE)
 					offset += field->offset + field->size;
+#endif
 			} else
 				offset = field->offset;
 			XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index fabba21919b8fa51..e930f5f1f36d2831 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -994,8 +994,10 @@ static void python_process_tracepoint(struct perf_sample *sample,
 				offset  = val;
 				len     = offset >> 16;
 				offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 				if (field->flags & TEP_FIELD_IS_RELATIVE)
 					offset += field->offset + field->size;
+#endif
 			}
 			if (field->flags & TEP_FIELD_IS_STRING &&
 			    is_printable_array(data + offset, len)) {
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index c7a97b33e13477e1..0ecc2cb137920d2d 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -2568,9 +2568,10 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
 		tep_read_number_field(field, a->raw_data, &dyn);
 		offset = dyn & 0xffff;
 		size = (dyn >> 16) & 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
 		if (field->flags & TEP_FIELD_IS_RELATIVE)
 			offset += field->offset + field->size;
-
+#endif
 		/* record max width for output */
 		if (size > hde->dynamic_len)
 			hde->dynamic_len = size;
Ian Rogers Dec. 8, 2022, 11 p.m. UTC | #31
On Thu, Dec 8, 2022 at 2:32 PM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>
> Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
> > > > On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > > > Can you try again? tmp.perf/core? That "tmp." part means its a force
> > > > pushed branch, so I just force pushed with some arch specific fixes, now
> > > > I'm down to (removing the successful builds and unrelated failures, now
> > > > related to libbpf's F_DUPFD_CLOEXEC kaboom):
> >
> > > Ok Arnaldo, Sure, I will check with updated branch
> >
> > > >   5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> > > >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> > > >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> > > >     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> > > >          |                                    ^~~~~~~~~~~~~~~~~~~~~
> > > >          |                                    TEP_FIELD_IS_FLAG
> >
> > > I observed same issue as updated here:
> > > https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
> >
> > > Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
> > > whereas it is there in header file in tools/lib/traceevent
> >
> > > # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
> > > # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
> > >     TEP_FIELD_IS_RELATIVE   = 256,
> >
> > Right, I had noticed that as well, so as a prep patch I'm adding the
> > patch below, before Ian's. Please check and provide an
> > Acked-by/Tested-by/Reviewed-by if possible.
>
> I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
> it before and had already tested it this way multiple times, I'm pushing
> this to tmp/perf.core.
>
> - Arnaldo
>
> commit a0ec3ef4590e7e82339b6f318e671a6b69fd94e8
> Author: Arnaldo Carvalho de Melo <acme@redhat.com>
> Date:   Thu Dec 8 19:28:58 2022 -0300
>
>     perf tools: Add test to check if libtracevent has TEP_FIELD_IS_RELATIVE
>

Could HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE be a version rather
than feature check, something like:

#define MAKE_LIBTRACEEVENT_VERSION(maj, mid, min) (maj * 255 *255 +
mid * 255 + min)
#define HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
(LIBTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)

Note, we have LIBTRACEEVENT_VERSION computed in Makefile.config by way
of pkg-config.

Thanks,
Ian

>     Some distros have older versions of libtraceevent where
>     TEP_FIELD_IS_RELATIVE and its associated semantics are not present, so
>     we need to test for its presence and cope when it isn't present when
>     building with LIBTRACEEVENT_DYNAMIC=1.
>
>     Reported-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
>     Cc: Adrian Hunter <adrian.hunter@intel.com>
>     Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
>     Cc: Ian Rogers <irogers@google.com>
>     Cc: Ingo Molnar <mingo@redhat.com>
>     Cc: Jiri Olsa <jolsa@kernel.org>
>     Cc: Mark Rutland <mark.rutland@arm.com>
>     Cc: Namhyung Kim <namhyung@kernel.org>
>     Cc: Nick Desaulniers <ndesaulniers@google.com>
>     Cc: Peter Zijlstra <peterz@infradead.org>,
>     Cc: Stephane Eranian <eranian@google.com>
>     Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
>
> diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
> index 38f8851bd7cbdb0e..c6c9b7c7723d4290 100644
> --- a/tools/build/Makefile.feature
> +++ b/tools/build/Makefile.feature
> @@ -71,7 +71,8 @@ FEATURE_TESTS_BASIC :=                  \
>          libzstd                                \
>          disassembler-four-args         \
>          disassembler-init-styled       \
> -        file-handle
> +        file-handle                    \
> +        libtraceevent-tep_field_is_relative
>
>  # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
>  # of all feature tests
> diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
> index 690fe97be1904399..24246df35ac30eeb 100644
> --- a/tools/build/feature/Makefile
> +++ b/tools/build/feature/Makefile
> @@ -81,7 +81,8 @@ FILES=                                          \
>           test-libzstd.bin                      \
>           test-clang-bpf-co-re.bin              \
>           test-file-handle.bin                  \
> -         test-libpfm4.bin
> +         test-libpfm4.bin                      \
> +         test-libtraceevent-tep_field_is_relative
>
>  FILES := $(addprefix $(OUTPUT),$(FILES))
>
> @@ -159,6 +160,9 @@ $(OUTPUT)test-dwarf_getlocations.bin:
>  $(OUTPUT)test-libelf-getphdrnum.bin:
>         $(BUILD) -lelf
>
> +$(OUTPUT)test-libtraceevent-tep_field_is_relative.bin:
> +       $(BUILD) -ltraceevent
> +
>  $(OUTPUT)test-libelf-gelf_getnote.bin:
>         $(BUILD) -lelf
>
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 680228e19c1aabdb..e29975664f06bd61 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -1197,6 +1197,10 @@ ifneq ($(NO_LIBTRACEEVENT),1)
>      LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
>      CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
>      $(call detected,CONFIG_LIBTRACEEVENT)
> +    $(call feature_check,libtraceevent-tep_field_is_relative)
> +    ifeq ($(feature-libtraceevent-tep_field_is_relative), 1)
> +      CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> +    endif
>    else
>      dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev/libtraceevent-devel)
>    endif
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 6909cd9f48d11644..c9802ab549d7782f 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -2729,8 +2729,10 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
>                                 offset = format_field__intval(field, sample, evsel->needs_swap);
>                                 syscall_arg.len = offset >> 16;
>                                 offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>                                         offset += field->offset + field->size;
> +#endif
>                         }
>
>                         val = (uintptr_t)(sample->raw_data + offset);
> diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> index 8031b586e81384e7..b842273458b862bd 100644
> --- a/tools/perf/util/data-convert-bt.c
> +++ b/tools/perf/util/data-convert-bt.c
> @@ -322,8 +322,10 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
>                 offset = tmp_val;
>                 len = offset >> 16;
>                 offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                 if (flags & TEP_FIELD_IS_RELATIVE)
>                         offset += fmtf->offset + fmtf->size;
> +#endif
>         }
>
>         if (flags & TEP_FIELD_IS_ARRAY) {
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index ca911856c4b1d3c8..77b2cf5a214ec1e4 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -2784,8 +2784,10 @@ void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char
>         if (field->flags & TEP_FIELD_IS_DYNAMIC) {
>                 offset = *(int *)(sample->raw_data + field->offset);
>                 offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>                         offset += field->offset + field->size;
> +#endif
>         }
>
>         return sample->raw_data + offset;
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index 6fb84b7455b8392d..7320f7f777fe0e56 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -442,8 +442,10 @@ tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
>                         offset  = val;
>                         len     = offset >> 16;
>                         offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                         if (field->flags & TEP_FIELD_IS_RELATIVE)
>                                 offset += field->offset + field->size;
> +#endif
>                 }
>                 if (field->flags & TEP_FIELD_IS_STRING &&
>                     is_printable_array(data + offset, len)) {
> diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> index 0bacb49408f84adf..c097b7934fd4ebe9 100644
> --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> @@ -393,8 +393,10 @@ static void perl_process_tracepoint(struct perf_sample *sample,
>                         if (field->flags & TEP_FIELD_IS_DYNAMIC) {
>                                 offset = *(int *)(data + field->offset);
>                                 offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>                                         offset += field->offset + field->size;
> +#endif
>                         } else
>                                 offset = field->offset;
>                         XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index fabba21919b8fa51..e930f5f1f36d2831 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -994,8 +994,10 @@ static void python_process_tracepoint(struct perf_sample *sample,
>                                 offset  = val;
>                                 len     = offset >> 16;
>                                 offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>                                         offset += field->offset + field->size;
> +#endif
>                         }
>                         if (field->flags & TEP_FIELD_IS_STRING &&
>                             is_printable_array(data + offset, len)) {
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index c7a97b33e13477e1..0ecc2cb137920d2d 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -2568,9 +2568,10 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
>                 tep_read_number_field(field, a->raw_data, &dyn);
>                 offset = dyn & 0xffff;
>                 size = (dyn >> 16) & 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>                         offset += field->offset + field->size;
> -
> +#endif
>                 /* record max width for output */
>                 if (size > hde->dynamic_len)
>                         hde->dynamic_len = size;
Ian Rogers Dec. 8, 2022, 11:05 p.m. UTC | #32
On Thu, Dec 8, 2022 at 3:00 PM Ian Rogers <irogers@google.com> wrote:
>
> On Thu, Dec 8, 2022 at 2:32 PM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> >
> > Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
> > > > > On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > > > > Can you try again? tmp.perf/core? That "tmp." part means its a force
> > > > > pushed branch, so I just force pushed with some arch specific fixes, now
> > > > > I'm down to (removing the successful builds and unrelated failures, now
> > > > > related to libbpf's F_DUPFD_CLOEXEC kaboom):
> > >
> > > > Ok Arnaldo, Sure, I will check with updated branch
> > >
> > > > >   5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> > > > >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> > > > >    /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> > > > >     2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> > > > >          |                                    ^~~~~~~~~~~~~~~~~~~~~
> > > > >          |                                    TEP_FIELD_IS_FLAG
> > >
> > > > I observed same issue as updated here:
> > > > https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
> > >
> > > > Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
> > > > whereas it is there in header file in tools/lib/traceevent
> > >
> > > > # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
> > > > # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
> > > >     TEP_FIELD_IS_RELATIVE   = 256,
> > >
> > > Right, I had noticed that as well, so as a prep patch I'm adding the
> > > patch below, before Ian's. Please check and provide an
> > > Acked-by/Tested-by/Reviewed-by if possible.
> >
> > I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
> > it before and had already tested it this way multiple times, I'm pushing
> > this to tmp/perf.core.
> >
> > - Arnaldo
> >
> > commit a0ec3ef4590e7e82339b6f318e671a6b69fd94e8
> > Author: Arnaldo Carvalho de Melo <acme@redhat.com>
> > Date:   Thu Dec 8 19:28:58 2022 -0300
> >
> >     perf tools: Add test to check if libtracevent has TEP_FIELD_IS_RELATIVE
> >
>
> Could HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE be a version rather
> than feature check, something like:
>
> #define MAKE_LIBTRACEEVENT_VERSION(maj, mid, min) (maj * 255 *255 +
> mid * 255 + min)
> #define HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> (LIBTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)
>
> Note, we have LIBTRACEEVENT_VERSION computed in Makefile.config by way
> of pkg-config.
>
> Thanks,
> Ian

LIBTRACEEVENT_VERSION had a workaround if pkg-config wasn't present to
default to 1.1.0 for its use in:
https://lore.kernel.org/linux-perf-users/20210923001024.550263-4-irogers@google.com/
We should un-revert that change now the -Itools/lib issue is resolved
(1.1 traceevent headers compiled against newer system libtraceevent
library).

Thanks,
Ian

> >     Some distros have older versions of libtraceevent where
> >     TEP_FIELD_IS_RELATIVE and its associated semantics are not present, so
> >     we need to test for its presence and cope when it isn't present when
> >     building with LIBTRACEEVENT_DYNAMIC=1.
> >
> >     Reported-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
> >     Cc: Adrian Hunter <adrian.hunter@intel.com>
> >     Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> >     Cc: Ian Rogers <irogers@google.com>
> >     Cc: Ingo Molnar <mingo@redhat.com>
> >     Cc: Jiri Olsa <jolsa@kernel.org>
> >     Cc: Mark Rutland <mark.rutland@arm.com>
> >     Cc: Namhyung Kim <namhyung@kernel.org>
> >     Cc: Nick Desaulniers <ndesaulniers@google.com>
> >     Cc: Peter Zijlstra <peterz@infradead.org>,
> >     Cc: Stephane Eranian <eranian@google.com>
> >     Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> >
> > diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
> > index 38f8851bd7cbdb0e..c6c9b7c7723d4290 100644
> > --- a/tools/build/Makefile.feature
> > +++ b/tools/build/Makefile.feature
> > @@ -71,7 +71,8 @@ FEATURE_TESTS_BASIC :=                  \
> >          libzstd                                \
> >          disassembler-four-args         \
> >          disassembler-init-styled       \
> > -        file-handle
> > +        file-handle                    \
> > +        libtraceevent-tep_field_is_relative
> >
> >  # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
> >  # of all feature tests
> > diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
> > index 690fe97be1904399..24246df35ac30eeb 100644
> > --- a/tools/build/feature/Makefile
> > +++ b/tools/build/feature/Makefile
> > @@ -81,7 +81,8 @@ FILES=                                          \
> >           test-libzstd.bin                      \
> >           test-clang-bpf-co-re.bin              \
> >           test-file-handle.bin                  \
> > -         test-libpfm4.bin
> > +         test-libpfm4.bin                      \
> > +         test-libtraceevent-tep_field_is_relative
> >
> >  FILES := $(addprefix $(OUTPUT),$(FILES))
> >
> > @@ -159,6 +160,9 @@ $(OUTPUT)test-dwarf_getlocations.bin:
> >  $(OUTPUT)test-libelf-getphdrnum.bin:
> >         $(BUILD) -lelf
> >
> > +$(OUTPUT)test-libtraceevent-tep_field_is_relative.bin:
> > +       $(BUILD) -ltraceevent
> > +
> >  $(OUTPUT)test-libelf-gelf_getnote.bin:
> >         $(BUILD) -lelf
> >
> > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> > index 680228e19c1aabdb..e29975664f06bd61 100644
> > --- a/tools/perf/Makefile.config
> > +++ b/tools/perf/Makefile.config
> > @@ -1197,6 +1197,10 @@ ifneq ($(NO_LIBTRACEEVENT),1)
> >      LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
> >      CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
> >      $(call detected,CONFIG_LIBTRACEEVENT)
> > +    $(call feature_check,libtraceevent-tep_field_is_relative)
> > +    ifeq ($(feature-libtraceevent-tep_field_is_relative), 1)
> > +      CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> > +    endif
> >    else
> >      dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev/libtraceevent-devel)
> >    endif
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index 6909cd9f48d11644..c9802ab549d7782f 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -2729,8 +2729,10 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
> >                                 offset = format_field__intval(field, sample, evsel->needs_swap);
> >                                 syscall_arg.len = offset >> 16;
> >                                 offset &= 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >                                         offset += field->offset + field->size;
> > +#endif
> >                         }
> >
> >                         val = (uintptr_t)(sample->raw_data + offset);
> > diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> > index 8031b586e81384e7..b842273458b862bd 100644
> > --- a/tools/perf/util/data-convert-bt.c
> > +++ b/tools/perf/util/data-convert-bt.c
> > @@ -322,8 +322,10 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
> >                 offset = tmp_val;
> >                 len = offset >> 16;
> >                 offset &= 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                 if (flags & TEP_FIELD_IS_RELATIVE)
> >                         offset += fmtf->offset + fmtf->size;
> > +#endif
> >         }
> >
> >         if (flags & TEP_FIELD_IS_ARRAY) {
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index ca911856c4b1d3c8..77b2cf5a214ec1e4 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -2784,8 +2784,10 @@ void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char
> >         if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> >                 offset = *(int *)(sample->raw_data + field->offset);
> >                 offset &= 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >                         offset += field->offset + field->size;
> > +#endif
> >         }
> >
> >         return sample->raw_data + offset;
> > diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> > index 6fb84b7455b8392d..7320f7f777fe0e56 100644
> > --- a/tools/perf/util/python.c
> > +++ b/tools/perf/util/python.c
> > @@ -442,8 +442,10 @@ tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
> >                         offset  = val;
> >                         len     = offset >> 16;
> >                         offset &= 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                         if (field->flags & TEP_FIELD_IS_RELATIVE)
> >                                 offset += field->offset + field->size;
> > +#endif
> >                 }
> >                 if (field->flags & TEP_FIELD_IS_STRING &&
> >                     is_printable_array(data + offset, len)) {
> > diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> > index 0bacb49408f84adf..c097b7934fd4ebe9 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> > @@ -393,8 +393,10 @@ static void perl_process_tracepoint(struct perf_sample *sample,
> >                         if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> >                                 offset = *(int *)(data + field->offset);
> >                                 offset &= 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >                                         offset += field->offset + field->size;
> > +#endif
> >                         } else
> >                                 offset = field->offset;
> >                         XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
> > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> > index fabba21919b8fa51..e930f5f1f36d2831 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-python.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> > @@ -994,8 +994,10 @@ static void python_process_tracepoint(struct perf_sample *sample,
> >                                 offset  = val;
> >                                 len     = offset >> 16;
> >                                 offset &= 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >                                         offset += field->offset + field->size;
> > +#endif
> >                         }
> >                         if (field->flags & TEP_FIELD_IS_STRING &&
> >                             is_printable_array(data + offset, len)) {
> > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> > index c7a97b33e13477e1..0ecc2cb137920d2d 100644
> > --- a/tools/perf/util/sort.c
> > +++ b/tools/perf/util/sort.c
> > @@ -2568,9 +2568,10 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
> >                 tep_read_number_field(field, a->raw_data, &dyn);
> >                 offset = dyn & 0xffff;
> >                 size = (dyn >> 16) & 0xffff;
> > +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >                         offset += field->offset + field->size;
> > -
> > +#endif
> >                 /* record max width for output */
> >                 if (size > hde->dynamic_len)
> >                         hde->dynamic_len = size;
Athira Rajeev Dec. 9, 2022, 6:34 a.m. UTC | #33
> On 09-Dec-2022, at 4:02 AM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> 
> Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
>> Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
>>>> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>>> Can you try again? tmp.perf/core? That "tmp." part means its a force
>>>> pushed branch, so I just force pushed with some arch specific fixes, now
>>>> I'm down to (removing the successful builds and unrelated failures, now
>>>> related to libbpf's F_DUPFD_CLOEXEC kaboom):
>> 
>>> Ok Arnaldo, Sure, I will check with updated branch
>> 
>>>>  5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
>>>>   /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
>>>>   /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
>>>>    2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>>>>         |                                    ^~~~~~~~~~~~~~~~~~~~~
>>>>         |                                    TEP_FIELD_IS_FLAG
>> 
>>> I observed same issue as updated here: 
>>> https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
>> 
>>> Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
>>> whereas it is there in header file in tools/lib/traceevent
>> 
>>> # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
>>> # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
>>> 	TEP_FIELD_IS_RELATIVE	= 256,
>> 
>> Right, I had noticed that as well, so as a prep patch I'm adding the
>> patch below, before Ian's. Please check and provide an
>> Acked-by/Tested-by/Reviewed-by if possible.
> 
> I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
> it before and had already tested it this way multiple times, I'm pushing
> this to tmp/perf.core.
> 
> - Arnaldo


Hi Arnaldo, Ian

Thanks for the fixes.

Since we changed “CONFIG_TRACEEVENT” to “CONFIG_LIBTRACEEVENT”, 
below change is also needed in “arch/powerpc/util/Build”

diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
index 71e57f28abda..9889245c555c 100644
--- a/tools/perf/arch/powerpc/util/Build
+++ b/tools/perf/arch/powerpc/util/Build
@@ -1,5 +1,5 @@
 perf-y += header.o
-perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
+perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
 perf-y += perf_regs.o
 perf-y += mem-events.o
 perf-y += sym-handling.o

With this change, I could successfully compile in these environment:
- Without libtraceevent-devel installed
- With libtraceevent-devel installed
- With “make NO_LIBTRACEEVENT=1”

With above change,
Acked-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>

Thanks
Athira

> 
> commit a0ec3ef4590e7e82339b6f318e671a6b69fd94e8
> Author: Arnaldo Carvalho de Melo <acme@redhat.com>
> Date:   Thu Dec 8 19:28:58 2022 -0300
> 
>    perf tools: Add test to check if libtracevent has TEP_FIELD_IS_RELATIVE
> 
>    Some distros have older versions of libtraceevent where
>    TEP_FIELD_IS_RELATIVE and its associated semantics are not present, so
>    we need to test for its presence and cope when it isn't present when
>    building with LIBTRACEEVENT_DYNAMIC=1.
> 
>    Reported-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
>    Cc: Adrian Hunter <adrian.hunter@intel.com>
>    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
>    Cc: Ian Rogers <irogers@google.com>
>    Cc: Ingo Molnar <mingo@redhat.com>
>    Cc: Jiri Olsa <jolsa@kernel.org>
>    Cc: Mark Rutland <mark.rutland@arm.com>
>    Cc: Namhyung Kim <namhyung@kernel.org>
>    Cc: Nick Desaulniers <ndesaulniers@google.com>
>    Cc: Peter Zijlstra <peterz@infradead.org>,
>    Cc: Stephane Eranian <eranian@google.com>
>    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> 
> diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
> index 38f8851bd7cbdb0e..c6c9b7c7723d4290 100644
> --- a/tools/build/Makefile.feature
> +++ b/tools/build/Makefile.feature
> @@ -71,7 +71,8 @@ FEATURE_TESTS_BASIC :=                  \
>         libzstd				\
>         disassembler-four-args		\
>         disassembler-init-styled	\
> -        file-handle
> +        file-handle			\
> +        libtraceevent-tep_field_is_relative
> 
> # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
> # of all feature tests
> diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
> index 690fe97be1904399..24246df35ac30eeb 100644
> --- a/tools/build/feature/Makefile
> +++ b/tools/build/feature/Makefile
> @@ -81,7 +81,8 @@ FILES=                                          \
>          test-libzstd.bin			\
>          test-clang-bpf-co-re.bin		\
>          test-file-handle.bin			\
> -         test-libpfm4.bin
> +         test-libpfm4.bin			\
> +         test-libtraceevent-tep_field_is_relative
> 
> FILES := $(addprefix $(OUTPUT),$(FILES))
> 
> @@ -159,6 +160,9 @@ $(OUTPUT)test-dwarf_getlocations.bin:
> $(OUTPUT)test-libelf-getphdrnum.bin:
> 	$(BUILD) -lelf
> 
> +$(OUTPUT)test-libtraceevent-tep_field_is_relative.bin:
> +	$(BUILD) -ltraceevent
> +
> $(OUTPUT)test-libelf-gelf_getnote.bin:
> 	$(BUILD) -lelf
> 
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 680228e19c1aabdb..e29975664f06bd61 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -1197,6 +1197,10 @@ ifneq ($(NO_LIBTRACEEVENT),1)
>     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
>     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
>     $(call detected,CONFIG_LIBTRACEEVENT)
> +    $(call feature_check,libtraceevent-tep_field_is_relative)
> +    ifeq ($(feature-libtraceevent-tep_field_is_relative), 1)
> +      CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> +    endif
>   else
>     dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev/libtraceevent-devel)
>   endif
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 6909cd9f48d11644..c9802ab549d7782f 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -2729,8 +2729,10 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
> 				offset = format_field__intval(field, sample, evsel->needs_swap);
> 				syscall_arg.len = offset >> 16;
> 				offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 				if (field->flags & TEP_FIELD_IS_RELATIVE)
> 					offset += field->offset + field->size;
> +#endif
> 			}
> 
> 			val = (uintptr_t)(sample->raw_data + offset);
> diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> index 8031b586e81384e7..b842273458b862bd 100644
> --- a/tools/perf/util/data-convert-bt.c
> +++ b/tools/perf/util/data-convert-bt.c
> @@ -322,8 +322,10 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
> 		offset = tmp_val;
> 		len = offset >> 16;
> 		offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 		if (flags & TEP_FIELD_IS_RELATIVE)
> 			offset += fmtf->offset + fmtf->size;
> +#endif
> 	}
> 
> 	if (flags & TEP_FIELD_IS_ARRAY) {
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index ca911856c4b1d3c8..77b2cf5a214ec1e4 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -2784,8 +2784,10 @@ void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char
> 	if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> 		offset = *(int *)(sample->raw_data + field->offset);
> 		offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 		if (field->flags & TEP_FIELD_IS_RELATIVE)
> 			offset += field->offset + field->size;
> +#endif
> 	}
> 
> 	return sample->raw_data + offset;
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index 6fb84b7455b8392d..7320f7f777fe0e56 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -442,8 +442,10 @@ tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
> 			offset  = val;
> 			len     = offset >> 16;
> 			offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 			if (field->flags & TEP_FIELD_IS_RELATIVE)
> 				offset += field->offset + field->size;
> +#endif
> 		}
> 		if (field->flags & TEP_FIELD_IS_STRING &&
> 		    is_printable_array(data + offset, len)) {
> diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> index 0bacb49408f84adf..c097b7934fd4ebe9 100644
> --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> @@ -393,8 +393,10 @@ static void perl_process_tracepoint(struct perf_sample *sample,
> 			if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> 				offset = *(int *)(data + field->offset);
> 				offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 				if (field->flags & TEP_FIELD_IS_RELATIVE)
> 					offset += field->offset + field->size;
> +#endif
> 			} else
> 				offset = field->offset;
> 			XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index fabba21919b8fa51..e930f5f1f36d2831 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -994,8 +994,10 @@ static void python_process_tracepoint(struct perf_sample *sample,
> 				offset  = val;
> 				len     = offset >> 16;
> 				offset &= 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 				if (field->flags & TEP_FIELD_IS_RELATIVE)
> 					offset += field->offset + field->size;
> +#endif
> 			}
> 			if (field->flags & TEP_FIELD_IS_STRING &&
> 			    is_printable_array(data + offset, len)) {
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index c7a97b33e13477e1..0ecc2cb137920d2d 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -2568,9 +2568,10 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
> 		tep_read_number_field(field, a->raw_data, &dyn);
> 		offset = dyn & 0xffff;
> 		size = (dyn >> 16) & 0xffff;
> +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> 		if (field->flags & TEP_FIELD_IS_RELATIVE)
> 			offset += field->offset + field->size;
> -
> +#endif
> 		/* record max width for output */
> 		if (size > hde->dynamic_len)
> 			hde->dynamic_len = size;
Arnaldo Carvalho de Melo Dec. 12, 2022, 1:51 p.m. UTC | #34
Em Fri, Dec 09, 2022 at 12:04:18PM +0530, Athira Rajeev escreveu:
> 
> 
> > On 09-Dec-2022, at 4:02 AM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > 
> > Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
> >> Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
> >>>> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> >>>> Can you try again? tmp.perf/core? That "tmp." part means its a force
> >>>> pushed branch, so I just force pushed with some arch specific fixes, now
> >>>> I'm down to (removing the successful builds and unrelated failures, now
> >>>> related to libbpf's F_DUPFD_CLOEXEC kaboom):
> >> 
> >>> Ok Arnaldo, Sure, I will check with updated branch
> >> 
> >>>>  5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> >>>>   /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> >>>>   /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> >>>>    2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >>>>         |                                    ^~~~~~~~~~~~~~~~~~~~~
> >>>>         |                                    TEP_FIELD_IS_FLAG
> >> 
> >>> I observed same issue as updated here: 
> >>> https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
> >> 
> >>> Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
> >>> whereas it is there in header file in tools/lib/traceevent
> >> 
> >>> # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
> >>> # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
> >>> 	TEP_FIELD_IS_RELATIVE	= 256,
> >> 
> >> Right, I had noticed that as well, so as a prep patch I'm adding the
> >> patch below, before Ian's. Please check and provide an
> >> Acked-by/Tested-by/Reviewed-by if possible.
> > 
> > I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
> > it before and had already tested it this way multiple times, I'm pushing
> > this to tmp/perf.core.
> > 
> > - Arnaldo
> 
> 
> Hi Arnaldo, Ian
> 
> Thanks for the fixes.
> 
> Since we changed “CONFIG_TRACEEVENT” to “CONFIG_LIBTRACEEVENT”, 
> below change is also needed in “arch/powerpc/util/Build”
> 
> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
> index 71e57f28abda..9889245c555c 100644
> --- a/tools/perf/arch/powerpc/util/Build
> +++ b/tools/perf/arch/powerpc/util/Build
> @@ -1,5 +1,5 @@
>  perf-y += header.o
> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
>  perf-y += perf_regs.o
>  perf-y += mem-events.o
>  perf-y += sym-handling.o
> 
> With this change, I could successfully compile in these environment:
> - Without libtraceevent-devel installed
> - With libtraceevent-devel installed
> - With “make NO_LIBTRACEEVENT=1”
> 
> With above change,
> Acked-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>

I did that and the same thing for other architectures, thanks for
testing!

I'll now give a try at implementing it without
tools/build/feature/test-libtraceevent-tep_field_is_relative.c, using
just the version of libtraceevent, as Ian suggested.

It would be great if you could test it again then,

Thanks,

- Arnaldo


diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
index 88553c578ed7a1c4..78ef7115be3d91a7 100644
--- a/tools/perf/arch/arm64/util/Build
+++ b/tools/perf/arch/arm64/util/Build
@@ -3,7 +3,7 @@ perf-y += machine.o
 perf-y += perf_regs.o
 perf-y += tsc.o
 perf-y += pmu.o
-perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
+perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
 perf-$(CONFIG_DWARF)     += dwarf-regs.o
 perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
 perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
index 71e57f28abdac7e9..9889245c555c4cfb 100644
--- a/tools/perf/arch/powerpc/util/Build
+++ b/tools/perf/arch/powerpc/util/Build
@@ -1,5 +1,5 @@
 perf-y += header.o
-perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
+perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
 perf-y += perf_regs.o
 perf-y += mem-events.o
 perf-y += sym-handling.o
diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
index aa8a5f05c9cb4706..db68840869979f2c 100644
--- a/tools/perf/arch/s390/util/Build
+++ b/tools/perf/arch/s390/util/Build
@@ -1,5 +1,5 @@
 perf-y += header.o
-perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
+perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
 perf-y += perf_regs.o
 
 perf-$(CONFIG_DWARF) += dwarf-regs.o
Arnaldo Carvalho de Melo Dec. 12, 2022, 2:13 p.m. UTC | #35
Em Thu, Dec 08, 2022 at 03:05:29PM -0800, Ian Rogers escreveu:
> On Thu, Dec 8, 2022 at 3:00 PM Ian Rogers <irogers@google.com> wrote:
> > On Thu, Dec 8, 2022 at 2:32 PM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > > commit a0ec3ef4590e7e82339b6f318e671a6b69fd94e8
> > > Author: Arnaldo Carvalho de Melo <acme@redhat.com>
> > > Date:   Thu Dec 8 19:28:58 2022 -0300

> > >     perf tools: Add test to check if libtracevent has TEP_FIELD_IS_RELATIVE

> > Could HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE be a version rather
> > than feature check, something like:

> > #define MAKE_LIBTRACEEVENT_VERSION(maj, mid, min) (maj * 255 *255 +
> > mid * 255 + min)
> > #define HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> > (LIBTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)

> > Note, we have LIBTRACEEVENT_VERSION computed in Makefile.config by way
> > of pkg-config.
 
> LIBTRACEEVENT_VERSION had a workaround if pkg-config wasn't present to
> default to 1.1.0 for its use in:
> https://lore.kernel.org/linux-perf-users/20210923001024.550263-4-irogers@google.com/
> We should un-revert that change now the -Itools/lib issue is resolved
> (1.1 traceevent headers compiled against newer system libtraceevent
> library).

Can you please send that un-revert as a proper patch?

Meanwhile, I came up with this quick hack on top of what I had, seems to
be enough, will test it with systems with libtraceevent <= 1.5.0, where
TEP_FIELD_IS_RELATIVE was introduced.

Will do it after removing the tools/build/feature/ TEP_FIELD_IS_RELATIVE
big hammer check.

- Arnaldo

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index e29975664f06bd61..52a4dc029111c1e2 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -1197,8 +1197,8 @@ ifneq ($(NO_LIBTRACEEVENT),1)
     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
     $(call detected,CONFIG_LIBTRACEEVENT)
-    $(call feature_check,libtraceevent-tep_field_is_relative)
-    ifeq ($(feature-libtraceevent-tep_field_is_relative), 1)
+    LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE := $(shell expr 1 \* 255 \* 255 + 5 \* 255 + 0) # 1.5.0
+    ifeq ($(shell test $(LIBTRACEEVENT_VERSION_CPP) -gt $(LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE); echo $$?),0)
       CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
     endif
   else
Arnaldo Carvalho de Melo Dec. 12, 2022, 2:28 p.m. UTC | #36
Hi,

	Just added this to the mix to fix a the python binding:

diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py
index 34fceda3af3a9b26..e80ffbbfacfb8cc0 100644
--- a/tools/perf/util/setup.py
+++ b/tools/perf/util/setup.py
@@ -63,15 +63,18 @@ libperf = getenv('LIBPERF')
 ext_sources = [f.strip() for f in open('util/python-ext-sources')
                                if len(f.strip()) > 0 and f[0] != '#']
 
-if not '-DHAVE_LIBTRACEEVENT' in cflags:
+extra_libraries = []
+
+if '-DHAVE_LIBTRACEEVENT' in cflags:
+    extra_libraries += [ 'traceevent' ]
+else:
     ext_sources.remove('util/trace-event.c')
 
 # use full paths with source files
 ext_sources = list(map(lambda x: '%s/%s' % (src_perf, x) , ext_sources))
 
-extra_libraries = []
 if '-DHAVE_LIBNUMA_SUPPORT' in cflags:
-    extra_libraries = [ 'numa' ]
+    extra_libraries += [ 'numa' ]
 if '-DHAVE_LIBCAP_SUPPORT' in cflags:
     extra_libraries += [ 'cap' ]
 
⬢[acme@toolbox perf]$ ldd /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
	linux-vdso.so.1 (0x00007fffa59f8000)
	libunwind-x86_64.so.8 => /lib64/libunwind-x86_64.so.8 (0x00007fb4fde98000)
	libunwind.so.8 => /lib64/libunwind.so.8 (0x00007fb4fde7f000)
	liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fb4fde54000)
	libtraceevent.so.1 => /lib64/libtraceevent.so.1 (0x00007fb4fde2e000)
	libnuma.so.1 => /lib64/libnuma.so.1 (0x00007fb4fde20000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007fb4fde16000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fb4fdc00000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb4fdbe0000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fb4fdf13000)
⬢[acme@toolbox perf]$ perf test python
 19: 'import perf' in python                                         : Ok
⬢[acme@toolbox perf]$
Athira Rajeev Dec. 13, 2022, 9:53 a.m. UTC | #37
> On 12-Dec-2022, at 7:21 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> 
> Em Fri, Dec 09, 2022 at 12:04:18PM +0530, Athira Rajeev escreveu:
>> 
>> 
>>> On 09-Dec-2022, at 4:02 AM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>> 
>>> Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>> Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
>>>>>> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>>>>> Can you try again? tmp.perf/core? That "tmp." part means its a force
>>>>>> pushed branch, so I just force pushed with some arch specific fixes, now
>>>>>> I'm down to (removing the successful builds and unrelated failures, now
>>>>>> related to libbpf's F_DUPFD_CLOEXEC kaboom):
>>>> 
>>>>> Ok Arnaldo, Sure, I will check with updated branch
>>>> 
>>>>>> 5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
>>>>>>  /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
>>>>>>  /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
>>>>>>   2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>>>>>>        |                                    ^~~~~~~~~~~~~~~~~~~~~
>>>>>>        |                                    TEP_FIELD_IS_FLAG
>>>> 
>>>>> I observed same issue as updated here: 
>>>>> https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
>>>> 
>>>>> Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
>>>>> whereas it is there in header file in tools/lib/traceevent
>>>> 
>>>>> # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
>>>>> # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
>>>>> 	TEP_FIELD_IS_RELATIVE	= 256,
>>>> 
>>>> Right, I had noticed that as well, so as a prep patch I'm adding the
>>>> patch below, before Ian's. Please check and provide an
>>>> Acked-by/Tested-by/Reviewed-by if possible.
>>> 
>>> I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
>>> it before and had already tested it this way multiple times, I'm pushing
>>> this to tmp/perf.core.
>>> 
>>> - Arnaldo
>> 
>> 
>> Hi Arnaldo, Ian
>> 
>> Thanks for the fixes.
>> 
>> Since we changed “CONFIG_TRACEEVENT” to “CONFIG_LIBTRACEEVENT”, 
>> below change is also needed in “arch/powerpc/util/Build”
>> 
>> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
>> index 71e57f28abda..9889245c555c 100644
>> --- a/tools/perf/arch/powerpc/util/Build
>> +++ b/tools/perf/arch/powerpc/util/Build
>> @@ -1,5 +1,5 @@
>> perf-y += header.o
>> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
>> perf-y += perf_regs.o
>> perf-y += mem-events.o
>> perf-y += sym-handling.o
>> 
>> With this change, I could successfully compile in these environment:
>> - Without libtraceevent-devel installed
>> - With libtraceevent-devel installed
>> - With “make NO_LIBTRACEEVENT=1”
>> 
>> With above change,
>> Acked-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> 
> I did that and the same thing for other architectures, thanks for
> testing!
> 
> I'll now give a try at implementing it without
> tools/build/feature/test-libtraceevent-tep_field_is_relative.c, using
> just the version of libtraceevent, as Ian suggested.
> 
> It would be great if you could test it again then,
> 

Sure Arnaldo, I will test with updated code.

Thanks
Athira

> Thanks,
> 
> - Arnaldo
> 
> 
> diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
> index 88553c578ed7a1c4..78ef7115be3d91a7 100644
> --- a/tools/perf/arch/arm64/util/Build
> +++ b/tools/perf/arch/arm64/util/Build
> @@ -3,7 +3,7 @@ perf-y += machine.o
> perf-y += perf_regs.o
> perf-y += tsc.o
> perf-y += pmu.o
> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> perf-$(CONFIG_DWARF)     += dwarf-regs.o
> perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
> perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
> index 71e57f28abdac7e9..9889245c555c4cfb 100644
> --- a/tools/perf/arch/powerpc/util/Build
> +++ b/tools/perf/arch/powerpc/util/Build
> @@ -1,5 +1,5 @@
> perf-y += header.o
> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> perf-y += perf_regs.o
> perf-y += mem-events.o
> perf-y += sym-handling.o
> diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
> index aa8a5f05c9cb4706..db68840869979f2c 100644
> --- a/tools/perf/arch/s390/util/Build
> +++ b/tools/perf/arch/s390/util/Build
> @@ -1,5 +1,5 @@
> perf-y += header.o
> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> perf-y += perf_regs.o
> 
> perf-$(CONFIG_DWARF) += dwarf-regs.o
Ian Rogers Dec. 13, 2022, 10:09 p.m. UTC | #38
On Tue, Dec 13, 2022 at 1:53 AM Athira Rajeev
<atrajeev@linux.vnet.ibm.com> wrote:
>
>
>
> > On 12-Dec-2022, at 7:21 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> >
> > Em Fri, Dec 09, 2022 at 12:04:18PM +0530, Athira Rajeev escreveu:
> >>
> >>
> >>> On 09-Dec-2022, at 4:02 AM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> >>>
> >>> Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
> >>>> Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
> >>>>>> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> >>>>>> Can you try again? tmp.perf/core? That "tmp." part means its a force
> >>>>>> pushed branch, so I just force pushed with some arch specific fixes, now
> >>>>>> I'm down to (removing the successful builds and unrelated failures, now
> >>>>>> related to libbpf's F_DUPFD_CLOEXEC kaboom):
> >>>>
> >>>>> Ok Arnaldo, Sure, I will check with updated branch
> >>>>
> >>>>>> 5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> >>>>>>  /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> >>>>>>  /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> >>>>>>   2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
> >>>>>>        |                                    ^~~~~~~~~~~~~~~~~~~~~
> >>>>>>        |                                    TEP_FIELD_IS_FLAG
> >>>>
> >>>>> I observed same issue as updated here:
> >>>>> https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
> >>>>
> >>>>> Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
> >>>>> whereas it is there in header file in tools/lib/traceevent
> >>>>
> >>>>> # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
> >>>>> # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
> >>>>>   TEP_FIELD_IS_RELATIVE   = 256,
> >>>>
> >>>> Right, I had noticed that as well, so as a prep patch I'm adding the
> >>>> patch below, before Ian's. Please check and provide an
> >>>> Acked-by/Tested-by/Reviewed-by if possible.
> >>>
> >>> I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
> >>> it before and had already tested it this way multiple times, I'm pushing
> >>> this to tmp/perf.core.
> >>>
> >>> - Arnaldo
> >>
> >>
> >> Hi Arnaldo, Ian
> >>
> >> Thanks for the fixes.
> >>
> >> Since we changed “CONFIG_TRACEEVENT” to “CONFIG_LIBTRACEEVENT”,
> >> below change is also needed in “arch/powerpc/util/Build”
> >>
> >> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
> >> index 71e57f28abda..9889245c555c 100644
> >> --- a/tools/perf/arch/powerpc/util/Build
> >> +++ b/tools/perf/arch/powerpc/util/Build
> >> @@ -1,5 +1,5 @@
> >> perf-y += header.o
> >> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> >> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> >> perf-y += perf_regs.o
> >> perf-y += mem-events.o
> >> perf-y += sym-handling.o
> >>
> >> With this change, I could successfully compile in these environment:
> >> - Without libtraceevent-devel installed
> >> - With libtraceevent-devel installed
> >> - With “make NO_LIBTRACEEVENT=1”
> >>
> >> With above change,
> >> Acked-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> >
> > I did that and the same thing for other architectures, thanks for
> > testing!
> >
> > I'll now give a try at implementing it without
> > tools/build/feature/test-libtraceevent-tep_field_is_relative.c, using
> > just the version of libtraceevent, as Ian suggested.
> >
> > It would be great if you could test it again then,
> >
>
> Sure Arnaldo, I will test with updated code.
>
> Thanks
> Athira


Thanks Athira and Arnaldo. It is a little strange to me to be using
the shell to do a version number test. The intent was to be doing
these in the code:
#if LIBRTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)
vs
...
LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE := $(shell expr 1 \*
255 \* 255 + 5 \* 255 + 0) # 1.5.0
ifeq ($(shell test $(LIBTRACEEVENT_VERSION_CPP) -gt
$(LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE); echo $$?),0)
CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
endif
...
#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
I'm a little selfish as I'm maintaining a bazel build and a single
version number to maintain is easier than lots of HAVE_... tests. I'm
happy to follow Arnaldo's lead. I think the test should also be
greater-equal rather than greater-than:
https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/tree/include/traceevent/event-parse.h?h=libtraceevent-v1.5#n128

Thanks,
Ian


Ian

> > Thanks,
> >
> > - Arnaldo
> >
> >
> > diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
> > index 88553c578ed7a1c4..78ef7115be3d91a7 100644
> > --- a/tools/perf/arch/arm64/util/Build
> > +++ b/tools/perf/arch/arm64/util/Build
> > @@ -3,7 +3,7 @@ perf-y += machine.o
> > perf-y += perf_regs.o
> > perf-y += tsc.o
> > perf-y += pmu.o
> > -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> > +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> > perf-$(CONFIG_DWARF)     += dwarf-regs.o
> > perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
> > perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
> > diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
> > index 71e57f28abdac7e9..9889245c555c4cfb 100644
> > --- a/tools/perf/arch/powerpc/util/Build
> > +++ b/tools/perf/arch/powerpc/util/Build
> > @@ -1,5 +1,5 @@
> > perf-y += header.o
> > -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> > +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> > perf-y += perf_regs.o
> > perf-y += mem-events.o
> > perf-y += sym-handling.o
> > diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
> > index aa8a5f05c9cb4706..db68840869979f2c 100644
> > --- a/tools/perf/arch/s390/util/Build
> > +++ b/tools/perf/arch/s390/util/Build
> > @@ -1,5 +1,5 @@
> > perf-y += header.o
> > -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
> > +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> > perf-y += perf_regs.o
> >
> > perf-$(CONFIG_DWARF) += dwarf-regs.o
>
Arnaldo Carvalho de Melo Dec. 13, 2022, 10:33 p.m. UTC | #39
On December 13, 2022 7:09:07 PM GMT-03:00, Ian Rogers <irogers@google.com> wrote:
>Thanks Athira and Arnaldo. It is a little strange to me to be using
>the shell to do a version number test. The intent was to be doing
>these in the code:
>#if LIBRTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)
>vs
>...
>LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE := $(shell expr 1 \*
>255 \* 255 + 5 \* 255 + 0) # 1.5.0
>ifeq ($(shell test $(LIBTRACEEVENT_VERSION_CPP) -gt
>$(LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE); echo $$?),0)
>CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>endif
>...
>#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
>I'm a little selfish as I'm maintaining a bazel build and a single
>version number to maintain is easier than lots of HAVE_... tests. I'm
>happy to follow Arnaldo's lead. I think the test should also be
>greater-equal rather than greater-than:
>https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/tree/include/traceevent/event-parse.h?h=libtraceevent-v1.5#n128

I'll fix that, and in a case like this please consider to send a patch with your preference, I'd happily
graft it.

- Arnaldo 
>
Ian Rogers Dec. 13, 2022, 10:47 p.m. UTC | #40
On Tue, Dec 13, 2022 at 2:34 PM Arnaldo Carvalho de Melo
<arnaldo.melo@gmail.com> wrote:
>
>
>
> On December 13, 2022 7:09:07 PM GMT-03:00, Ian Rogers <irogers@google.com> wrote:
> >Thanks Athira and Arnaldo. It is a little strange to me to be using
> >the shell to do a version number test. The intent was to be doing
> >these in the code:
> >#if LIBRTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)
> >vs
> >...
> >LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE := $(shell expr 1 \*
> >255 \* 255 + 5 \* 255 + 0) # 1.5.0
> >ifeq ($(shell test $(LIBTRACEEVENT_VERSION_CPP) -gt
> >$(LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE); echo $$?),0)
> >CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >endif
> >...
> >#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> >I'm a little selfish as I'm maintaining a bazel build and a single
> >version number to maintain is easier than lots of HAVE_... tests. I'm
> >happy to follow Arnaldo's lead. I think the test should also be
> >greater-equal rather than greater-than:
> >https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/tree/include/traceevent/event-parse.h?h=libtraceevent-v1.5#n128
>
> I'll fix that, and in a case like this please consider to send a patch with your preference, I'd happily
> graft it.
>
> - Arnaldo

I can fix it. I can fold it in with:
https://lore.kernel.org/linux-perf-users/20210923001024.550263-4-irogers@google.com/
which I mentioned in this thread.

Thanks,
Ian

> >
Athira Rajeev Dec. 15, 2022, 7:10 a.m. UTC | #41
> On 14-Dec-2022, at 3:39 AM, Ian Rogers <irogers@google.com> wrote:
> 
> On Tue, Dec 13, 2022 at 1:53 AM Athira Rajeev
> <atrajeev@linux.vnet.ibm.com> wrote:
>> 
>> 
>> 
>>> On 12-Dec-2022, at 7:21 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>> 
>>> Em Fri, Dec 09, 2022 at 12:04:18PM +0530, Athira Rajeev escreveu:
>>>> 
>>>> 
>>>>> On 09-Dec-2022, at 4:02 AM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>>>> 
>>>>> Em Thu, Dec 08, 2022 at 07:04:52PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>>> Em Thu, Dec 08, 2022 at 12:21:20PM +0530, Athira Rajeev escreveu:
>>>>>>>> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>>>>>>> Can you try again? tmp.perf/core? That "tmp." part means its a force
>>>>>>>> pushed branch, so I just force pushed with some arch specific fixes, now
>>>>>>>> I'm down to (removing the successful builds and unrelated failures, now
>>>>>>>> related to libbpf's F_DUPFD_CLOEXEC kaboom):
>>>>>> 
>>>>>>> Ok Arnaldo, Sure, I will check with updated branch
>>>>>> 
>>>>>>>> 5     7.38 fedora:34                     : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
>>>>>>>> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
>>>>>>>> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
>>>>>>>>  2787 |                 if (field->flags & TEP_FIELD_IS_RELATIVE)
>>>>>>>>       |                                    ^~~~~~~~~~~~~~~~~~~~~
>>>>>>>>       |                                    TEP_FIELD_IS_FLAG
>>>>>> 
>>>>>>> I observed same issue as updated here:
>>>>>>> https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/
>>>>>> 
>>>>>>> Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
>>>>>>> whereas it is there in header file in tools/lib/traceevent
>>>>>> 
>>>>>>> # grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
>>>>>>> # grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
>>>>>>>  TEP_FIELD_IS_RELATIVE   = 256,
>>>>>> 
>>>>>> Right, I had noticed that as well, so as a prep patch I'm adding the
>>>>>> patch below, before Ian's. Please check and provide an
>>>>>> Acked-by/Tested-by/Reviewed-by if possible.
>>>>> 
>>>>> I ended up with the one below, _after_ Ian's patch as I had some trouble grafting
>>>>> it before and had already tested it this way multiple times, I'm pushing
>>>>> this to tmp/perf.core.
>>>>> 
>>>>> - Arnaldo
>>>> 
>>>> 
>>>> Hi Arnaldo, Ian
>>>> 
>>>> Thanks for the fixes.
>>>> 
>>>> Since we changed “CONFIG_TRACEEVENT” to “CONFIG_LIBTRACEEVENT”,
>>>> below change is also needed in “arch/powerpc/util/Build”
>>>> 
>>>> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
>>>> index 71e57f28abda..9889245c555c 100644
>>>> --- a/tools/perf/arch/powerpc/util/Build
>>>> +++ b/tools/perf/arch/powerpc/util/Build
>>>> @@ -1,5 +1,5 @@
>>>> perf-y += header.o
>>>> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>>>> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
>>>> perf-y += perf_regs.o
>>>> perf-y += mem-events.o
>>>> perf-y += sym-handling.o
>>>> 
>>>> With this change, I could successfully compile in these environment:
>>>> - Without libtraceevent-devel installed
>>>> - With libtraceevent-devel installed
>>>> - With “make NO_LIBTRACEEVENT=1”
>>>> 
>>>> With above change,
>>>> Acked-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
>>> 
>>> I did that and the same thing for other architectures, thanks for
>>> testing!
>>> 
>>> I'll now give a try at implementing it without
>>> tools/build/feature/test-libtraceevent-tep_field_is_relative.c, using
>>> just the version of libtraceevent, as Ian suggested.
>>> 
>>> It would be great if you could test it again then,
>>> 
>> 
>> Sure Arnaldo, I will test with updated code.
>> 
>> Thanks
>> Athira
> 
> 
> Thanks Athira and Arnaldo. It is a little strange to me to be using


Hi Arnaldo, Ian

Compile tested with updated tmp.perf/core and results are good

Thanks
Athira

> the shell to do a version number test. The intent was to be doing
> these in the code:
> #if LIBRTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0)
> vs
> ...
> LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE := $(shell expr 1 \*
> 255 \* 255 + 5 \* 255 + 0) # 1.5.0
> ifeq ($(shell test $(LIBTRACEEVENT_VERSION_CPP) -gt
> $(LIBTRACEEVENT_VERSION_WITH_TEP_FIELD_IS_RELATIVE); echo $$?),0)
> CFLAGS += -DHAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> endif
> ...
> #ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
> I'm a little selfish as I'm maintaining a bazel build and a single
> version number to maintain is easier than lots of HAVE_... tests. I'm
> happy to follow Arnaldo's lead. I think the test should also be
> greater-equal rather than greater-than:
> https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/tree/include/traceevent/event-parse.h?h=libtraceevent-v1.5#n128
> 
> Thanks,
> Ian
> 
> 
> Ian
> 
>>> Thanks,
>>> 
>>> - Arnaldo
>>> 
>>> 
>>> diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
>>> index 88553c578ed7a1c4..78ef7115be3d91a7 100644
>>> --- a/tools/perf/arch/arm64/util/Build
>>> +++ b/tools/perf/arch/arm64/util/Build
>>> @@ -3,7 +3,7 @@ perf-y += machine.o
>>> perf-y += perf_regs.o
>>> perf-y += tsc.o
>>> perf-y += pmu.o
>>> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>>> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
>>> perf-$(CONFIG_DWARF)     += dwarf-regs.o
>>> perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
>>> perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
>>> diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
>>> index 71e57f28abdac7e9..9889245c555c4cfb 100644
>>> --- a/tools/perf/arch/powerpc/util/Build
>>> +++ b/tools/perf/arch/powerpc/util/Build
>>> @@ -1,5 +1,5 @@
>>> perf-y += header.o
>>> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>>> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
>>> perf-y += perf_regs.o
>>> perf-y += mem-events.o
>>> perf-y += sym-handling.o
>>> diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
>>> index aa8a5f05c9cb4706..db68840869979f2c 100644
>>> --- a/tools/perf/arch/s390/util/Build
>>> +++ b/tools/perf/arch/s390/util/Build
>>> @@ -1,5 +1,5 @@
>>> perf-y += header.o
>>> -perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
>>> +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
>>> perf-y += perf_regs.o
>>> 
>>> perf-$(CONFIG_DWARF) += dwarf-regs.o
diff mbox series

Patch

diff --git a/tools/perf/Build b/tools/perf/Build
index 496b096153bb..edafe3cb3d07 100644
--- a/tools/perf/Build
+++ b/tools/perf/Build
@@ -5,7 +5,6 @@  perf-y += builtin-diff.o
 perf-y += builtin-evlist.o
 perf-y += builtin-ftrace.o
 perf-y += builtin-help.o
-perf-y += builtin-sched.o
 perf-y += builtin-buildid-list.o
 perf-y += builtin-buildid-cache.o
 perf-y += builtin-kallsyms.o
@@ -13,11 +12,8 @@  perf-y += builtin-list.o
 perf-y += builtin-record.o
 perf-y += builtin-report.o
 perf-y += builtin-stat.o
-perf-y += builtin-timechart.o
 perf-y += builtin-top.o
 perf-y += builtin-script.o
-perf-y += builtin-kmem.o
-perf-y += builtin-lock.o
 perf-y += builtin-kvm.o
 perf-y += builtin-inject.o
 perf-y += builtin-mem.o
@@ -25,7 +21,12 @@  perf-y += builtin-data.o
 perf-y += builtin-version.o
 perf-y += builtin-c2c.o
 perf-y += builtin-daemon.o
-perf-y += builtin-kwork.o
+
+perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
+perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
+perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
+perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
+perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o
 
 perf-$(CONFIG_TRACE) += builtin-trace.o
 perf-$(CONFIG_LIBELF) += builtin-probe.o
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 9cc3c48f3288..b34288cb1900 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -763,18 +763,20 @@  ifndef NO_LIBUNWIND
   EXTLIBS += $(EXTLIBS_LIBUNWIND)
 endif
 
-ifeq ($(NO_SYSCALL_TABLE),0)
-  $(call detected,CONFIG_TRACE)
-else
-  ifndef NO_LIBAUDIT
-    $(call feature_check,libaudit)
-    ifneq ($(feature-libaudit), 1)
-      msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
-      NO_LIBAUDIT := 1
-    else
-      CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
-      EXTLIBS += -laudit
-      $(call detected,CONFIG_TRACE)
+ifneq ($(NO_LIBTRACEEVENT),1)
+  ifeq ($(NO_SYSCALL_TABLE),0)
+    $(call detected,CONFIG_TRACE)
+  else
+    ifndef NO_LIBAUDIT
+      $(call feature_check,libaudit)
+      ifneq ($(feature-libaudit), 1)
+        msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
+        NO_LIBAUDIT := 1
+      else
+        CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
+        EXTLIBS += -laudit
+        $(call detected,CONFIG_TRACE)
+      endif
     endif
   endif
 endif
@@ -1182,9 +1184,11 @@  ifdef LIBPFM4
   endif
 endif
 
-ifdef LIBTRACEEVENT_DYNAMIC
+# libtraceevent is a recommended dependency picked up from the system.
+ifneq ($(NO_LIBTRACEEVENT),1)
   $(call feature_check,libtraceevent)
   ifeq ($(feature-libtraceevent), 1)
+    CFLAGS += -DHAVE_LIBTRACEEVENT
     EXTLIBS += -ltraceevent
     LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
     LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
@@ -1192,12 +1196,11 @@  ifdef LIBTRACEEVENT_DYNAMIC
     LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
     LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
     CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
+    $(call detected,CONFIG_TRACEEVENT)
   else
-    dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
+    dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
   endif
-endif
 
-ifdef LIBTRACEFS_DYNAMIC
   $(call feature_check,libtracefs)
   ifeq ($(feature-libtracefs), 1)
     EXTLIBS += -ltracefs
@@ -1207,8 +1210,6 @@  ifdef LIBTRACEFS_DYNAMIC
     LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
     LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
     CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
-  else
-    dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
   endif
 endif
 
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 6689f644782f..f0e4daeef812 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -128,10 +128,6 @@  include ../scripts/utilities.mak
 #
 # Define BUILD_BPF_SKEL to enable BPF skeletons
 #
-# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
-#
-# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
-#
 
 # As per kernel Makefile, avoid funny character set dependencies
 unexport LC_ALL
@@ -242,10 +238,6 @@  sub-make: fixdep
 else # force_fixdep
 
 LIBAPI_DIR      = $(srctree)/tools/lib/api/
-ifndef LIBTRACEEVENT_DYNAMIC
-LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
-LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
-endif
 LIBBPF_DIR      = $(srctree)/tools/lib/bpf/
 LIBSUBCMD_DIR   = $(srctree)/tools/lib/subcmd/
 LIBSYMBOL_DIR   = $(srctree)/tools/lib/symbol/
@@ -295,31 +287,6 @@  SCRIPT_SH += perf-iostat.sh
 grep-libs = $(filter -l%,$(1))
 strip-libs = $(filter-out -l%,$(1))
 
-ifndef LIBTRACEEVENT_DYNAMIC
-ifneq ($(OUTPUT),)
-  LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
-else
-  LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
-endif
-LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
-LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
-LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
-LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
-LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
-export LIBTRACEEVENT
-LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
-CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
-#
-# The static build has no dynsym table, so this does not work for
-# static build. Looks like linker starts to scream about that now
-# (in Fedora 26) so we need to switch it off for static build.
-DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
-LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
-else
-LIBTRACEEVENT_DYNAMIC_LIST =
-LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
-endif
-
 ifneq ($(OUTPUT),)
   LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
 else
@@ -381,11 +348,7 @@  export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
 python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
 
 PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
-ifndef LIBTRACEEVENT_DYNAMIC
-PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
-else
 PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
-endif
 
 SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
 
@@ -430,9 +393,6 @@  ifndef NO_LIBBPF
     PERFLIBS += $(LIBBPF)
   endif
 endif
-ifndef LIBTRACEEVENT_DYNAMIC
-  PERFLIBS += $(LIBTRACEEVENT)
-endif
 
 # We choose to avoid "if .. else if .. else .. endif endif"
 # because maintaining the nesting to match is a pain.  If
@@ -682,9 +642,9 @@  all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
 # Create python binding output directory if not already present
 _dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
 
-$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
+$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
 	$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
-        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
+        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
 	  $(PYTHON_WORD) util/setup.py \
 	  --quiet build_ext; \
 	cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
@@ -710,8 +670,8 @@  $(PERF_IN): prepare FORCE
 $(PMU_EVENTS_IN): FORCE prepare
 	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
 
-$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
-	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
+$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
+	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
 		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
 
 $(GTK_IN): FORCE prepare
@@ -797,10 +757,6 @@  prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
 	$(LIBSYMBOL) \
 	bpf-skel
 
-ifndef LIBTRACEEVENT_DYNAMIC
-prepare: $(LIBTRACEEVENT)
-endif
-
 $(OUTPUT)%.o: %.c prepare FORCE
 	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 
@@ -856,38 +812,6 @@  endif
 
 $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
 
-ifndef LIBTRACEEVENT_DYNAMIC
-LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
-
-$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
-	$(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
-		DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
-		$@ install_headers
-
-$(LIBTRACEEVENT)-clean:
-	$(call QUIET_CLEAN, libtraceevent)
-	$(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
-
-libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
-	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
-		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
-		plugins
-
-libtraceevent_plugins-clean:
-	$(call QUIET_CLEAN, libtraceevent_plugins)
-	$(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
-
-$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
-	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
-		DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
-		$(LIBTRACEEVENT_FLAGS) $@
-
-install-traceevent-plugins: libtraceevent_plugins
-	$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
-		DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
-		$(LIBTRACEEVENT_FLAGS) install
-endif
-
 $(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
 	$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
 		DESTDIR=$(LIBAPI_DESTDIR) prefix= \
@@ -1095,10 +1019,6 @@  install-tests: all install-gtk
 
 install-bin: install-tools install-tests
 
-ifndef LIBTRACEEVENT_DYNAMIC
-install-bin: install-traceevent-plugins
-endif
-
 install: install-bin try-install-man
 
 install-python_ext:
@@ -1124,11 +1044,6 @@  SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
 $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
 	$(Q)$(MKDIR) -p $@
 
-ifndef LIBTRACEEVENT_DYNAMIC
-$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
-	$(Q)$(MKDIR) -p $@
-endif
-
 ifdef BUILD_BPF_SKEL
 BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
 BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
@@ -1211,10 +1126,6 @@  clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
 	$(call QUIET_CLEAN, Documentation) \
 	$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
 
-ifndef LIBTRACEEVENT_DYNAMIC
-clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
-endif
-
 #
 # To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
 # file if defined, with no further action.
@@ -1232,6 +1143,6 @@  FORCE:
 .PHONY: all install clean config-clean strip install-gtk
 .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
 .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
-.PHONY: libtraceevent_plugins archheaders
+.PHONY: archheaders
 
 endif # force_fixdep
diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
index dbeb04cb336e..a92644f12eec 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -1,7 +1,7 @@ 
 perf-y += header.o
 perf-y += tsc.o
 perf-y += pmu.o
-perf-y += kvm-stat.o
+perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
 perf-y += perf_regs.o
 perf-y += topdown.o
 perf-y += machine.o
diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
index af102f471e9f..1e39a034cee9 100644
--- a/tools/perf/arch/x86/util/intel-pt.c
+++ b/tools/perf/arch/x86/util/intel-pt.c
@@ -418,6 +418,7 @@  static int intel_pt_info_fill(struct auxtrace_record *itr,
 	return 0;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int intel_pt_track_switches(struct evlist *evlist)
 {
 	const char *sched_switch = "sched:sched_switch";
@@ -439,6 +440,7 @@  static int intel_pt_track_switches(struct evlist *evlist)
 
 	return 0;
 }
+#endif
 
 static void intel_pt_valid_str(char *str, size_t len, u64 valid)
 {
@@ -829,6 +831,7 @@  static int intel_pt_recording_options(struct auxtrace_record *itr,
 					ptr->have_sched_switch = 2;
 			}
 		} else {
+#ifdef HAVE_LIBTRACEEVENT
 			err = intel_pt_track_switches(evlist);
 			if (err == -EPERM)
 				pr_debug2("Unable to select sched:sched_switch\n");
@@ -836,6 +839,7 @@  static int intel_pt_recording_options(struct auxtrace_record *itr,
 				return err;
 			else
 				ptr->have_sched_switch = 1;
+#endif
 		}
 	}
 
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 517d928c00e3..90458ca6933f 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -499,7 +499,9 @@  int cmd_annotate(int argc, const char **argv)
 			.namespaces = perf_event__process_namespaces,
 			.attr	= perf_event__process_attr,
 			.build_id = perf_event__process_build_id,
+#ifdef HAVE_LIBTRACEEVENT
 			.tracing_data   = perf_event__process_tracing_data,
+#endif
 			.id_index	= perf_event__process_id_index,
 			.auxtrace_info	= perf_event__process_auxtrace_info,
 			.auxtrace	= perf_event__process_auxtrace,
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index e254f18986f7..3f4e4dd5abf3 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -607,6 +607,7 @@  static int perf_event__repipe_exit(struct perf_tool *tool,
 	return err;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int perf_event__repipe_tracing_data(struct perf_session *session,
 					   union perf_event *event)
 {
@@ -614,6 +615,7 @@  static int perf_event__repipe_tracing_data(struct perf_session *session,
 
 	return perf_event__process_tracing_data(session, event);
 }
+#endif
 
 static int dso__read_build_id(struct dso *dso)
 {
@@ -807,6 +809,7 @@  static int perf_inject__sched_switch(struct perf_tool *tool,
 	return 0;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int perf_inject__sched_stat(struct perf_tool *tool,
 				   union perf_event *event __maybe_unused,
 				   struct perf_sample *sample,
@@ -836,6 +839,7 @@  static int perf_inject__sched_stat(struct perf_tool *tool,
 	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
 	return perf_event__repipe(tool, event_sw, &sample_sw, machine);
 }
+#endif
 
 static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
 {
@@ -1961,7 +1965,9 @@  static int __cmd_inject(struct perf_inject *inject)
 		inject->tool.mmap	  = perf_event__repipe_mmap;
 		inject->tool.mmap2	  = perf_event__repipe_mmap2;
 		inject->tool.fork	  = perf_event__repipe_fork;
+#ifdef HAVE_LIBTRACEEVENT
 		inject->tool.tracing_data = perf_event__repipe_tracing_data;
+#endif
 	}
 
 	output_data_offset = perf_session__data_offset(session->evlist);
@@ -1984,8 +1990,10 @@  static int __cmd_inject(struct perf_inject *inject)
 				evsel->handler = perf_inject__sched_switch;
 			} else if (!strcmp(name, "sched:sched_process_exit"))
 				evsel->handler = perf_inject__sched_process_exit;
+#ifdef HAVE_LIBTRACEEVENT
 			else if (!strncmp(name, "sched:sched_stat_", 17))
 				evsel->handler = perf_inject__sched_stat;
+#endif
 		}
 	} else if (inject->itrace_synth_opts.vm_time_correlation) {
 		session->itrace_synth_opts = &inject->itrace_synth_opts;
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index ebfab2ca1702..e20656c431a4 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -35,6 +35,7 @@ 
 #include <regex.h>
 
 #include <linux/ctype.h>
+#include <traceevent/event-parse.h>
 
 static int	kmem_slab;
 static int	kmem_page;
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 7d9ec1bac1a2..641e739c717c 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -63,7 +63,7 @@  static const char *get_filename_for_perf_kvm(void)
 	return filename;
 }
 
-#ifdef HAVE_KVM_STAT_SUPPORT
+#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 
 void exit_event_get_key(struct evsel *evsel,
 			struct perf_sample *sample,
@@ -654,7 +654,7 @@  static void print_result(struct perf_kvm_stat *kvm)
 		pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
 }
 
-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 static int process_lost_event(struct perf_tool *tool,
 			      union perf_event *event __maybe_unused,
 			      struct perf_sample *sample __maybe_unused,
@@ -742,7 +742,7 @@  static bool verify_vcpu(int vcpu)
 	return true;
 }
 
-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 /* keeping the max events to a modest level to keep
  * the processing of samples per mmap smooth.
  */
@@ -1290,7 +1290,7 @@  kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
 	return kvm_events_report_vcpu(kvm);
 }
 
-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 static struct evlist *kvm_live_event_list(void)
 {
 	struct evlist *evlist;
@@ -1507,7 +1507,7 @@  static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
 	if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
 		return kvm_events_report(&kvm, argc - 1 , argv + 1);
 
-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 	if (!strncmp(argv[1], "live", 4))
 		return kvm_events_live(&kvm, argc - 1 , argv + 1);
 #endif
@@ -1644,7 +1644,7 @@  int cmd_kvm(int argc, const char **argv)
 		return cmd_top(argc, argv);
 	else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
 		return __cmd_buildid_list(file_name, argc, argv);
-#ifdef HAVE_KVM_STAT_SUPPORT
+#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
 	else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
 		return kvm_cmd_stat(file_name, argc, argv);
 #endif
diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
index 0e02b8098644..dc59d75180d1 100644
--- a/tools/perf/builtin-kwork.c
+++ b/tools/perf/builtin-kwork.c
@@ -23,6 +23,7 @@ 
 
 #include <subcmd/pager.h>
 #include <subcmd/parse-options.h>
+#include <traceevent/event-parse.h>
 
 #include <errno.h>
 #include <inttypes.h>
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index b7fd7ec586fb..7e17374f6c1a 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1701,8 +1701,10 @@  static void record__init_features(struct record *rec)
 	if (rec->no_buildid)
 		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (!have_tracepoints(&rec->evlist->core.entries))
 		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
+#endif
 
 	if (!rec->opts.branch_stack)
 		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index b6d77d3da64f..2ee2ecca208e 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -67,6 +67,10 @@ 
 #include <unistd.h>
 #include <linux/mman.h>
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 struct report {
 	struct perf_tool	tool;
 	struct perf_session	*session;
@@ -1199,7 +1203,9 @@  int cmd_report(int argc, const char **argv)
 			.lost		 = perf_event__process_lost,
 			.read		 = process_read_event,
 			.attr		 = process_attr,
+#ifdef HAVE_LIBTRACEEVENT
 			.tracing_data	 = perf_event__process_tracing_data,
+#endif
 			.build_id	 = perf_event__process_build_id,
 			.id_index	 = perf_event__process_id_index,
 			.auxtrace_info	 = perf_event__process_auxtrace_info,
@@ -1660,6 +1666,7 @@  int cmd_report(int argc, const char **argv)
 						  report.range_num);
 	}
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (session->tevent.pevent &&
 	    tep_set_function_resolver(session->tevent.pevent,
 				      machine__resolve_kernel_addr,
@@ -1668,7 +1675,7 @@  int cmd_report(int argc, const char **argv)
 		       __func__);
 		return -1;
 	}
-
+#endif
 	sort__setup_elide(stdout);
 
 	ret = __cmd_report(&report);
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index d7ec8c1af293..88888fb885c8 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -62,6 +62,9 @@ 
 #include "perf.h"
 
 #include <linux/ctype.h>
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
 
 static char const		*script_name;
 static char const		*generate_script_lang;
@@ -2154,12 +2157,12 @@  static void process_event(struct perf_script *script,
 		perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
 		return;
 	}
-
+#ifdef HAVE_LIBTRACEEVENT
 	if (PRINT_FIELD(TRACE) && sample->raw_data) {
 		event_format__fprintf(evsel->tp_format, sample->cpu,
 				      sample->raw_data, sample->raw_size, fp);
 	}
-
+#endif
 	if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
 		perf_sample__fprintf_synth(sample, evsel, fp);
 
@@ -2283,8 +2286,10 @@  static void process_stat_interval(u64 tstamp)
 
 static void setup_scripting(void)
 {
+#ifdef HAVE_LIBTRACEEVENT
 	setup_perl_scripting();
 	setup_python_scripting();
+#endif
 }
 
 static int flush_scripting(void)
@@ -3784,7 +3789,9 @@  int cmd_script(int argc, const char **argv)
 			.fork		 = perf_event__process_fork,
 			.attr		 = process_attr,
 			.event_update   = perf_event__process_event_update,
+#ifdef HAVE_LIBTRACEEVENT
 			.tracing_data	 = perf_event__process_tracing_data,
+#endif
 			.feature	 = process_feature_event,
 			.build_id	 = perf_event__process_build_id,
 			.id_index	 = perf_event__process_id_index,
@@ -4215,6 +4222,7 @@  int cmd_script(int argc, const char **argv)
 	else
 		symbol_conf.use_callchain = false;
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (session->tevent.pevent &&
 	    tep_set_function_resolver(session->tevent.pevent,
 				      machine__resolve_kernel_addr,
@@ -4223,7 +4231,7 @@  int cmd_script(int argc, const char **argv)
 		err = -1;
 		goto out_delete;
 	}
-
+#endif
 	if (generate_script_lang) {
 		struct stat perf_stat;
 		int input;
@@ -4259,9 +4267,12 @@  int cmd_script(int argc, const char **argv)
 			err = -ENOENT;
 			goto out_delete;
 		}
-
+#ifdef HAVE_LIBTRACEEVENT
 		err = scripting_ops->generate_script(session->tevent.pevent,
 						     "perf-script");
+#else
+		err = scripting_ops->generate_script(NULL, "perf-script");
+#endif
 		goto out_delete;
 	}
 
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
index c36296bb7637..6c629e7d370a 100644
--- a/tools/perf/builtin-timechart.c
+++ b/tools/perf/builtin-timechart.c
@@ -38,6 +38,7 @@ 
 #include "util/string2.h"
 #include "util/tracepoint.h"
 #include <linux/err.h>
+#include <traceevent/event-parse.h>
 
 #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
 FILE *open_memstream(char **ptr, size_t *sizeloc);
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 543c379d2a57..6909cd9f48d1 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -15,7 +15,6 @@ 
  */
 
 #include "util/record.h"
-#include <traceevent/event-parse.h>
 #include <api/fs/tracing_path.h>
 #include <bpf/bpf.h>
 #include "util/bpf_map.h"
@@ -80,6 +79,10 @@ 
 #include <linux/ctype.h>
 #include <perf/mmap.h>
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 #ifndef O_CLOEXEC
 # define O_CLOEXEC		02000000
 #endif
diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
index a71f491224da..a886929ec6e5 100644
--- a/tools/perf/builtin-version.c
+++ b/tools/perf/builtin-version.c
@@ -82,6 +82,7 @@  static void library_status(void)
 	STATUS(HAVE_AIO_SUPPORT, aio);
 	STATUS(HAVE_ZSTD_SUPPORT, zstd);
 	STATUS(HAVE_LIBPFM, libpfm4);
+	STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
 }
 
 int cmd_version(int argc, const char **argv)
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 7af135dea1cd..82bbe0ca858b 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -70,20 +70,26 @@  static struct cmd_struct commands[] = {
 	{ "report",	cmd_report,	0 },
 	{ "bench",	cmd_bench,	0 },
 	{ "stat",	cmd_stat,	0 },
+#ifdef HAVE_LIBTRACEEVENT
 	{ "timechart",	cmd_timechart,	0 },
+#endif
 	{ "top",	cmd_top,	0 },
 	{ "annotate",	cmd_annotate,	0 },
 	{ "version",	cmd_version,	0 },
 	{ "script",	cmd_script,	0 },
+#ifdef HAVE_LIBTRACEEVENT
 	{ "sched",	cmd_sched,	0 },
+#endif
 #ifdef HAVE_LIBELF_SUPPORT
 	{ "probe",	cmd_probe,	0 },
 #endif
+#ifdef HAVE_LIBTRACEEVENT
 	{ "kmem",	cmd_kmem,	0 },
 	{ "lock",	cmd_lock,	0 },
+#endif
 	{ "kvm",	cmd_kvm,	0 },
 	{ "test",	cmd_test,	0 },
-#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
+#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
 	{ "trace",	cmd_trace,	0 },
 #endif
 	{ "inject",	cmd_inject,	0 },
@@ -91,7 +97,9 @@  static struct cmd_struct commands[] = {
 	{ "data",	cmd_data,	0 },
 	{ "ftrace",	cmd_ftrace,	0 },
 	{ "daemon",	cmd_daemon,	0 },
+#ifdef HAVE_LIBTRACEEVENT
 	{ "kwork",	cmd_kwork,	0 },
+#endif
 };
 
 struct pager_config {
@@ -500,14 +508,18 @@  int main(int argc, const char **argv)
 		argv[0] = cmd;
 	}
 	if (strstarts(cmd, "trace")) {
-#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
-		setup_path();
-		argv[0] = "trace";
-		return cmd_trace(argc, argv);
-#else
+#ifndef HAVE_LIBTRACEEVENT
+		fprintf(stderr,
+			"trace command not available: missing libtraceevent devel package at build time.\n");
+		goto out;
+#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
 		fprintf(stderr,
 			"trace command not available: missing audit-libs devel package at build time.\n");
 		goto out;
+#else
+		setup_path();
+		argv[0] = "trace";
+		return cmd_trace(argc, argv);
 #endif
 	}
 	/* Look for flags.. */
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
index 7d0e33ce6aba..f65625a60704 100644
--- a/tools/perf/scripts/python/Perf-Trace-Util/Build
+++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
@@ -1,3 +1,3 @@ 
-perf-y += Context.o
+perf-$(CONFIG_TRACEEVENT) += Context.o
 
 CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 11b69023011b..34ebc009e05a 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -6,13 +6,13 @@  perf-y += parse-events.o
 perf-y += dso-data.o
 perf-y += attr.o
 perf-y += vmlinux-kallsyms.o
-perf-y += openat-syscall.o
-perf-y += openat-syscall-all-cpus.o
-perf-y += openat-syscall-tp-fields.o
-perf-y += mmap-basic.o
+perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
+perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
+perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
+perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
 perf-y += perf-record.o
 perf-y += evsel-roundtrip-name.o
-perf-y += evsel-tp-sched.o
+perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
 perf-y += fdarray.o
 perf-y += pmu.o
 perf-y += pmu-events.o
@@ -30,7 +30,7 @@  perf-y += task-exit.o
 perf-y += sw-clock.o
 perf-y += mmap-thread-lookup.o
 perf-y += thread-maps-share.o
-perf-y += switch-tracking.o
+perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
 perf-y += keep-tracking.o
 perf-y += code-reading.o
 perf-y += sample-parsing.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 4c6ae59a4dfd..658449204ce5 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -38,9 +38,11 @@  struct test_suite *__weak arch_tests[] = {
 
 static struct test_suite *generic_tests[] = {
 	&suite__vmlinux_matches_kallsyms,
+#ifdef HAVE_LIBTRACEEVENT
 	&suite__openat_syscall_event,
 	&suite__openat_syscall_event_on_all_cpus,
 	&suite__basic_mmap,
+#endif
 	&suite__mem,
 	&suite__parse_events,
 	&suite__expr,
@@ -51,8 +53,10 @@  static struct test_suite *generic_tests[] = {
 	&suite__dso_data_cache,
 	&suite__dso_data_reopen,
 	&suite__perf_evsel__roundtrip_name_test,
+#ifdef HAVE_LIBTRACEEVENT
 	&suite__perf_evsel__tp_sched_test,
 	&suite__syscall_openat_tp_fields,
+#endif
 	&suite__attr,
 	&suite__hists_link,
 	&suite__python_use,
@@ -71,7 +75,9 @@  static struct test_suite *generic_tests[] = {
 	&suite__thread_maps_share,
 	&suite__hists_output,
 	&suite__hists_cumulate,
+#ifdef HAVE_LIBTRACEEVENT
 	&suite__switch_tracking,
+#endif
 	&suite__fdarray__filter,
 	&suite__fdarray__add,
 	&suite__kmod_path__parse,
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 3440dd2616b0..dcbfb93287e8 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -46,6 +46,7 @@  static bool kvm_s390_create_vm_valid(void)
 }
 #endif
 
+#ifdef HAVE_LIBTRACEEVENT
 static int test__checkevent_tracepoint(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
@@ -76,6 +77,7 @@  static int test__checkevent_tracepoint_multi(struct evlist *evlist)
 	}
 	return TEST_OK;
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 static int test__checkevent_raw(struct evlist *evlist)
 {
@@ -222,6 +224,7 @@  static int test__checkevent_breakpoint_rw(struct evlist *evlist)
 	return TEST_OK;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
@@ -252,6 +255,7 @@  test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
 
 	return test__checkevent_tracepoint_multi(evlist);
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 static int test__checkevent_raw_modifier(struct evlist *evlist)
 {
@@ -453,6 +457,7 @@  static int test__checkevent_pmu(struct evlist *evlist)
 	return TEST_OK;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int test__checkevent_list(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
@@ -491,6 +496,7 @@  static int test__checkevent_list(struct evlist *evlist)
 
 	return TEST_OK;
 }
+#endif
 
 static int test__checkevent_pmu_name(struct evlist *evlist)
 {
@@ -762,6 +768,7 @@  static int test__group2(struct evlist *evlist)
 	return TEST_OK;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int test__group3(struct evlist *evlist __maybe_unused)
 {
 	struct evsel *evsel, *leader;
@@ -853,6 +860,7 @@  static int test__group3(struct evlist *evlist __maybe_unused)
 
 	return TEST_OK;
 }
+#endif
 
 static int test__group4(struct evlist *evlist __maybe_unused)
 {
@@ -1460,6 +1468,7 @@  static int test__sym_event_dc(struct evlist *evlist)
 	return TEST_OK;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int count_tracepoints(void)
 {
 	struct dirent *events_ent;
@@ -1513,6 +1522,7 @@  static int test__all_tracepoints(struct evlist *evlist)
 
 	return test__checkevent_tracepoint_multi(evlist);
 }
+#endif /* HAVE_LIBTRACEVENT */
 
 static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
 {
@@ -1642,6 +1652,7 @@  struct evlist_test {
 };
 
 static const struct evlist_test test__events[] = {
+#ifdef HAVE_LIBTRACEEVENT
 	{
 		.name  = "syscalls:sys_enter_openat",
 		.check = test__checkevent_tracepoint,
@@ -1652,6 +1663,7 @@  static const struct evlist_test test__events[] = {
 		.check = test__checkevent_tracepoint_multi,
 		/* 1 */
 	},
+#endif
 	{
 		.name  = "r1a",
 		.check = test__checkevent_raw,
@@ -1702,6 +1714,7 @@  static const struct evlist_test test__events[] = {
 		.check = test__checkevent_breakpoint_w,
 		/* 1 */
 	},
+#ifdef HAVE_LIBTRACEEVENT
 	{
 		.name  = "syscalls:sys_enter_openat:k",
 		.check = test__checkevent_tracepoint_modifier,
@@ -1712,6 +1725,7 @@  static const struct evlist_test test__events[] = {
 		.check = test__checkevent_tracepoint_multi_modifier,
 		/* 3 */
 	},
+#endif
 	{
 		.name  = "r1a:kp",
 		.check = test__checkevent_raw_modifier,
@@ -1757,11 +1771,13 @@  static const struct evlist_test test__events[] = {
 		.check = test__checkevent_breakpoint_w_modifier,
 		/* 2 */
 	},
+#ifdef HAVE_LIBTRACEEVENT
 	{
 		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
 		.check = test__checkevent_list,
 		/* 3 */
 	},
+#endif
 	{
 		.name  = "instructions:G",
 		.check = test__checkevent_exclude_host_modifier,
@@ -1792,11 +1808,13 @@  static const struct evlist_test test__events[] = {
 		.check = test__group2,
 		/* 9 */
 	},
+#ifdef HAVE_LIBTRACEEVENT
 	{
 		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
 		.check = test__group3,
 		/* 0 */
 	},
+#endif
 	{
 		.name  = "{cycles:u,instructions:kp}:p",
 		.check = test__group4,
@@ -1807,11 +1825,13 @@  static const struct evlist_test test__events[] = {
 		.check = test__group5,
 		/* 2 */
 	},
+#ifdef HAVE_LIBTRACEEVENT
 	{
 		.name  = "*:*",
 		.check = test__all_tracepoints,
 		/* 3 */
 	},
+#endif
 	{
 		.name  = "{cycles,cache-misses:G}:H",
 		.check = test__group_gh1,
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index ab37f588ee8b..612406311e27 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -69,17 +69,17 @@  perf-y += namespaces.o
 perf-y += comm.o
 perf-y += thread.o
 perf-y += thread_map.o
-perf-y += trace-event-parse.o
 perf-y += parse-events-flex.o
 perf-y += parse-events-bison.o
 perf-y += pmu.o
 perf-y += pmu-flex.o
 perf-y += pmu-bison.o
 perf-y += pmu-hybrid.o
-perf-y += trace-event-read.o
-perf-y += trace-event-info.o
-perf-y += trace-event-scripting.o
-perf-y += trace-event.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
+perf-$(CONFIG_TRACEEVENT) += trace-event.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
 perf-y += svghelper.o
 perf-y += sort.o
 perf-y += hist.o
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index c65cdaf6975e..8031b586e813 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -19,7 +19,6 @@ 
 #include <babeltrace/ctf-writer/event-fields.h>
 #include <babeltrace/ctf-ir/utils.h>
 #include <babeltrace/ctf/events.h>
-#include <traceevent/event-parse.h>
 #include "asm/bug.h"
 #include "data-convert.h"
 #include "session.h"
@@ -36,6 +35,10 @@ 
 #include "clockid.h"
 #include "util/sample.h"
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 #define pr_N(n, fmt, ...) \
 	eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
 
diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
index 57db59068cb6..ba9d93ce9463 100644
--- a/tools/perf/util/data-convert-json.c
+++ b/tools/perf/util/data-convert-json.c
@@ -27,6 +27,10 @@ 
 #include "util/thread.h"
 #include "util/tool.h"
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 struct convert_json {
 	struct perf_tool tool;
 	FILE *out;
@@ -217,6 +221,7 @@  static int process_sample_event(struct perf_tool *tool,
 	}
 	output_json_format(out, false, 3, "]");
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (sample->raw_data) {
 		int i;
 		struct tep_format_field **fields;
@@ -236,7 +241,7 @@  static int process_sample_event(struct perf_tool *tool,
 			free(fields);
 		}
 	}
-
+#endif
 	output_json_format(out, false, 2, "}");
 	return 0;
 }
@@ -313,7 +318,9 @@  int bt_convert__perf2json(const char *input_name, const char *output_name,
 			.exit           = perf_event__process_exit,
 			.fork           = perf_event__process_fork,
 			.lost           = perf_event__process_lost,
+#ifdef HAVE_LIBTRACEEVENT
 			.tracing_data   = perf_event__process_tracing_data,
+#endif
 			.build_id       = perf_event__process_build_id,
 			.id_index       = perf_event__process_id_index,
 			.auxtrace_info  = perf_event__process_auxtrace_info,
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index fbf3192bced9..590d4e77effc 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -290,6 +290,7 @@  struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
 	return evsel;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
 {
 	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
@@ -305,7 +306,8 @@  struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
 
 	evlist__add(evlist, evsel);
 	return evsel;
-};
+}
+#endif
 
 int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
 {
@@ -376,6 +378,7 @@  struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
 	return NULL;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
 {
 	struct evsel *evsel = evsel__newtp(sys, name);
@@ -387,6 +390,7 @@  int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
 	evlist__add(evlist, evsel);
 	return 0;
 }
+#endif
 
 struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
 {
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 16734c6756b3..e5b84ead566c 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -127,7 +127,9 @@  static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
 {
 	return evlist__add_aux_dummy(evlist, true);
 }
+#ifdef HAVE_LIBTRACEEVENT
 struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
+#endif
 
 int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
 			 evsel__sb_cb_t cb, void *data);
@@ -135,7 +137,9 @@  void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
 int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
 void evlist__stop_sb_thread(struct evlist *evlist);
 
+#ifdef HAVE_LIBTRACEEVENT
 int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
+#endif
 
 int __evlist__set_tracepoints_handlers(struct evlist *evlist,
 				       const struct evsel_str_handler *assocs,
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 0f617359a82f..ca911856c4b1 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -12,7 +12,6 @@ 
 #include <linux/bitops.h>
 #include <api/fs/fs.h>
 #include <api/fs/tracing_path.h>
-#include <traceevent/event-parse.h>
 #include <linux/hw_breakpoint.h>
 #include <linux/perf_event.h>
 #include <linux/compiler.h>
@@ -57,6 +56,10 @@ 
 
 #include <linux/ctype.h>
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 struct perf_missing_features perf_missing_features;
 
 static clockid_t clockid;
@@ -439,7 +442,9 @@  struct evsel *evsel__clone(struct evsel *orig)
 			goto out_err;
 	}
 	evsel->cgrp = cgroup__get(orig->cgrp);
+#ifdef HAVE_LIBTRACEEVENT
 	evsel->tp_format = orig->tp_format;
+#endif
 	evsel->handler = orig->handler;
 	evsel->core.leader = orig->core.leader;
 
@@ -479,6 +484,7 @@  struct evsel *evsel__clone(struct evsel *orig)
 /*
  * Returns pointer with encoded error via <linux/err.h> interface.
  */
+#ifdef HAVE_LIBTRACEEVENT
 struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
 {
 	struct evsel *evsel = zalloc(perf_evsel__object.size);
@@ -516,6 +522,7 @@  struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
 out_err:
 	return ERR_PTR(err);
 }
+#endif
 
 const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
 	"cycles",
@@ -2758,6 +2765,7 @@  u16 evsel__id_hdr_size(struct evsel *evsel)
 	return size;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
 {
 	return tep_find_field(evsel->tp_format, name);
@@ -2831,6 +2839,7 @@  u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
 
 	return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
 }
+#endif
 
 bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
 {
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index f3485799ddf9..d572be41b960 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -72,7 +72,9 @@  struct evsel {
 		char			*name;
 		char			*group_name;
 		const char		*pmu_name;
+#ifdef HAVE_LIBTRACEEVENT
 		struct tep_event	*tp_format;
+#endif
 		char			*filter;
 		unsigned long		max_events;
 		double			scale;
@@ -223,11 +225,14 @@  static inline struct evsel *evsel__new(struct perf_event_attr *attr)
 }
 
 struct evsel *evsel__clone(struct evsel *orig);
-struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
 
 int copy_config_terms(struct list_head *dst, struct list_head *src);
 void free_config_terms(struct list_head *config_terms);
 
+
+#ifdef HAVE_LIBTRACEEVENT
+struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
+
 /*
  * Returns pointer with encoded error via <linux/err.h> interface.
  */
@@ -235,10 +240,13 @@  static inline struct evsel *evsel__newtp(const char *sys, const char *name)
 {
 	return evsel__newtp_idx(sys, name, 0);
 }
+#endif
 
 struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
 
+#ifdef HAVE_LIBTRACEEVENT
 struct tep_event *event_format__new(const char *sys, const char *name);
+#endif
 
 void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
 void evsel__exit(struct evsel *evsel);
@@ -323,6 +331,7 @@  bool evsel__precise_ip_fallback(struct evsel *evsel);
 
 struct perf_sample;
 
+#ifdef HAVE_LIBTRACEEVENT
 void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
 u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
 
@@ -330,6 +339,7 @@  static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
 {
 	return evsel__rawptr(evsel, sample, name);
 }
+#endif
 
 struct tep_format_field;
 
diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
index 8c2ea8001329..bd22c4932d10 100644
--- a/tools/perf/util/evsel_fprintf.c
+++ b/tools/perf/util/evsel_fprintf.c
@@ -2,7 +2,6 @@ 
 #include <inttypes.h>
 #include <stdio.h>
 #include <stdbool.h>
-#include <traceevent/event-parse.h>
 #include "evsel.h"
 #include "util/evsel_fprintf.h"
 #include "util/event.h"
@@ -13,6 +12,10 @@ 
 #include "srcline.h"
 #include "dso.h"
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
 {
 	va_list args;
@@ -74,6 +77,7 @@  int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
 					 term, (u64)evsel->core.attr.sample_freq);
 	}
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (details->trace_fields) {
 		struct tep_format_field *field;
 
@@ -96,6 +100,7 @@  int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
 			field = field->next;
 		}
 	}
+#endif
 out:
 	fputc('\n', fp);
 	return ++printed;
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index dc2ae397d400..404d816ca124 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -6,6 +6,7 @@ 
 #include <sys/types.h>
 #include <byteswap.h>
 #include <unistd.h>
+#include <regex.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <linux/compiler.h>
@@ -55,6 +56,10 @@ 
 #include <linux/ctype.h>
 #include <internal/lib.h>
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 /*
  * magic2 = "PERFILE2"
  * must be a numerical value to let the endianness
@@ -298,6 +303,7 @@  static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
 	return 0;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int write_tracing_data(struct feat_fd *ff,
 			      struct evlist *evlist)
 {
@@ -306,6 +312,7 @@  static int write_tracing_data(struct feat_fd *ff,
 
 	return read_tracing_data(ff->fd, &evlist->core.entries);
 }
+#endif
 
 static int write_build_id(struct feat_fd *ff,
 			  struct evlist *evlist __maybe_unused)
@@ -2394,12 +2401,14 @@  FEAT_PROCESS_STR_FUN(arch, arch);
 FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
 FEAT_PROCESS_STR_FUN(cpuid, cpuid);
 
+#ifdef HAVE_LIBTRACEEVENT
 static int process_tracing_data(struct feat_fd *ff, void *data)
 {
 	ssize_t ret = trace_report(ff->fd, data, false);
 
 	return ret < 0 ? -1 : 0;
 }
+#endif
 
 static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
 {
@@ -3366,7 +3375,9 @@  static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
 const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
 
 const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
+#ifdef HAVE_LIBTRACEEVENT
 	FEAT_OPN(TRACING_DATA,	tracing_data,	false),
+#endif
 	FEAT_OPN(BUILD_ID,	build_id,	false),
 	FEAT_OPR(HOSTNAME,	hostname,	false),
 	FEAT_OPR(OSRELEASE,	osrelease,	false),
@@ -4082,6 +4093,7 @@  static int read_attr(int fd, struct perf_header *ph,
 	return ret <= 0 ? -1 : 0;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
 {
 	struct tep_event *event;
@@ -4125,6 +4137,7 @@  static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
 
 	return 0;
 }
+#endif
 
 int perf_session__read_header(struct perf_session *session, int repipe_fd)
 {
@@ -4230,11 +4243,15 @@  int perf_session__read_header(struct perf_session *session, int repipe_fd)
 		lseek(fd, tmp, SEEK_SET);
 	}
 
+#ifdef HAVE_LIBTRACEEVENT
 	perf_header__process_sections(header, fd, &session->tevent,
 				      perf_file_section__process);
 
 	if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
 		goto out_delete_evlist;
+#else
+	perf_header__process_sections(header, fd, NULL, perf_file_section__process);
+#endif
 
 	return 0;
 out_errno:
@@ -4412,6 +4429,7 @@  int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
 	return 0;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 int perf_event__process_tracing_data(struct perf_session *session,
 				     union perf_event *event)
 {
@@ -4459,6 +4477,7 @@  int perf_event__process_tracing_data(struct perf_session *session,
 
 	return size_read + padding;
 }
+#endif
 
 int perf_event__process_build_id(struct perf_session *session,
 				 union perf_event *event)
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 2d5e601ba60f..e3861ae62172 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -160,8 +160,10 @@  int perf_event__process_event_update(struct perf_tool *tool,
 				     union perf_event *event,
 				     struct evlist **pevlist);
 size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
+#ifdef HAVE_LIBTRACEEVENT
 int perf_event__process_tracing_data(struct perf_session *session,
 				     union perf_event *event);
+#endif
 int perf_event__process_build_id(struct perf_session *session,
 				 union perf_event *event);
 bool is_perf_magic(u64 magic);
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index e3548ddef254..6d3921627e33 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -3142,6 +3142,7 @@  static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
 	return 1;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int intel_pt_process_switch(struct intel_pt *pt,
 				   struct perf_sample *sample)
 {
@@ -3165,6 +3166,7 @@  static int intel_pt_process_switch(struct intel_pt *pt,
 
 	return machine__set_current_tid(pt->machine, cpu, -1, tid);
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 static int intel_pt_context_switch_in(struct intel_pt *pt,
 				      struct perf_sample *sample)
@@ -3433,9 +3435,12 @@  static int intel_pt_process_event(struct perf_session *session,
 			return err;
 	}
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
 		err = intel_pt_process_switch(pt, sample);
-	else if (event->header.type == PERF_RECORD_ITRACE_START)
+	else
+#endif
+	if (event->header.type == PERF_RECORD_ITRACE_START)
 		err = intel_pt_process_itrace_start(pt, event, sample);
 	else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
 		err = intel_pt_process_aux_output_hw_id(pt, event, sample);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 6502cd679f57..21cce83462b3 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -445,6 +445,7 @@  int parse_events_add_cache(struct list_head *list, int *idx,
 	return ret;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static void tracepoint_error(struct parse_events_error *e, int err,
 			     const char *sys, const char *name)
 {
@@ -593,6 +594,7 @@  static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
 	closedir(events_dir);
 	return ret;
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 #ifdef HAVE_LIBBPF_SUPPORT
 struct __add_bpf_event_param {
@@ -1143,6 +1145,7 @@  static int config_term_pmu(struct perf_event_attr *attr,
 		return config_term_common(attr, term, err);
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int config_term_tracepoint(struct perf_event_attr *attr,
 				  struct parse_events_term *term,
 				  struct parse_events_error *err)
@@ -1170,6 +1173,7 @@  static int config_term_tracepoint(struct perf_event_attr *attr,
 
 	return 0;
 }
+#endif
 
 static int config_attr(struct perf_event_attr *attr,
 		       struct list_head *head,
@@ -1325,6 +1329,7 @@  int parse_events_add_tracepoint(struct list_head *list, int *idx,
 				struct parse_events_error *err,
 				struct list_head *head_config)
 {
+#ifdef HAVE_LIBTRACEEVENT
 	if (head_config) {
 		struct perf_event_attr attr;
 
@@ -1339,6 +1344,16 @@  int parse_events_add_tracepoint(struct list_head *list, int *idx,
 	else
 		return add_tracepoint_event(list, idx, sys, event,
 					    err, head_config);
+#else
+	(void)list;
+	(void)idx;
+	(void)sys;
+	(void)event;
+	(void)head_config;
+	parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
+				strdup("libtraceevent is necessary for tracepoint support"));
+	return -1;
+#endif
 }
 
 int parse_events_add_numeric(struct parse_events_state *parse_state,
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 07df7bb7b042..428e72eaafcc 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -18,7 +18,6 @@  struct parse_events_error;
 struct option;
 struct perf_pmu;
 
-bool have_tracepoints(struct list_head *evlist);
 bool is_event_supported(u8 type, u64 config);
 
 const char *event_type(int type);
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index b5941c74a0d6..728fe2f51759 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -417,6 +417,7 @@  static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
 	return ret;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static bool is_tracepoint(struct pyrf_event *pevent)
 {
 	return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
@@ -486,14 +487,17 @@  get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
 
 	return tracepoint_field(pevent, field);
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 static PyObject*
 pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
 {
 	PyObject *obj = NULL;
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (is_tracepoint(pevent))
 		obj = get_tracepoint_field(pevent, attr_name);
+#endif
 
 	return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
 }
diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
index 0f5ba28339cf..77544d2c447c 100644
--- a/tools/perf/util/scripting-engines/Build
+++ b/tools/perf/util/scripting-engines/Build
@@ -1,5 +1,7 @@ 
-perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
-perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
+ifeq ($(CONFIG_TRACEEVENT),y)
+  perf-$(CONFIG_LIBPERL)   += trace-event-perl.o
+  perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
+endif
 
 CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
 
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index d685a7399ee2..fabba21919b8 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -30,6 +30,7 @@ 
 #include <linux/bitmap.h>
 #include <linux/compiler.h>
 #include <linux/time64.h>
+#include <traceevent/event-parse.h>
 
 #include "../build-id.h"
 #include "../counts.h"
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 1facd4616317..7c021c6cedb9 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -314,7 +314,9 @@  void perf_session__delete(struct perf_session *session)
 			evlist__delete(session->evlist);
 		perf_data__close(session->data);
 	}
+#ifdef HAVE_LIBTRACEEVENT
 	trace_event__cleanup(&session->tevent);
+#endif
 	free(session);
 }
 
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index be5871ea558f..ee3715e8563b 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -33,7 +33,9 @@  struct perf_session {
 	struct auxtrace		*auxtrace;
 	struct itrace_synth_opts *itrace_synth_opts;
 	struct list_head	auxtrace_index;
+#ifdef HAVE_LIBTRACEEVENT
 	struct trace_event	tevent;
+#endif
 	struct perf_record_time_conv	time_conv;
 	bool			repipe;
 	bool			one_mmap;
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 2e7330867e2e..c7a97b33e134 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -22,7 +22,6 @@ 
 #include "srcline.h"
 #include "strlist.h"
 #include "strbuf.h"
-#include <traceevent/event-parse.h>
 #include "mem-events.h"
 #include "annotate.h"
 #include "event.h"
@@ -32,6 +31,10 @@ 
 #include <linux/kernel.h>
 #include <linux/string.h>
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 regex_t		parent_regex;
 const char	default_parent_pattern[] = "^sys_|^do_page_fault";
 const char	*parent_pattern = default_parent_pattern;
@@ -743,6 +746,7 @@  struct sort_entry sort_time = {
 
 /* --sort trace */
 
+#ifdef HAVE_LIBTRACEEVENT
 static char *get_trace_output(struct hist_entry *he)
 {
 	struct trace_seq seq;
@@ -806,6 +810,7 @@  struct sort_entry sort_trace = {
 	.se_snprintf    = hist_entry__trace_snprintf,
 	.se_width_idx	= HISTC_TRACE,
 };
+#endif /* HAVE_LIBTRACEEVENT */
 
 /* sort keys for branch stacks */
 
@@ -2022,7 +2027,9 @@  static struct sort_dimension common_sort_dimensions[] = {
 	DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
 	DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
 	DIM(SORT_TRANSACTION, "transaction", sort_transaction),
+#ifdef HAVE_LIBTRACEEVENT
 	DIM(SORT_TRACE, "trace", sort_trace),
+#endif
 	DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
 	DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
 	DIM(SORT_CGROUP, "cgroup", sort_cgroup),
@@ -2206,7 +2213,14 @@  bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt)	\
 	return hse->se == &sort_ ## key ;			\
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 MK_SORT_ENTRY_CHK(trace)
+#else
+bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
+{
+	return false;
+}
+#endif
 MK_SORT_ENTRY_CHK(srcline)
 MK_SORT_ENTRY_CHK(srcfile)
 MK_SORT_ENTRY_CHK(thread)
@@ -2347,6 +2361,17 @@  static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
 	return 0;
 }
 
+#ifndef HAVE_LIBTRACEEVENT
+bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
+{
+	return false;
+}
+bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
+				     struct hists *hists __maybe_unused)
+{
+	return false;
+}
+#else
 struct hpp_dynamic_entry {
 	struct perf_hpp_fmt hpp;
 	struct evsel *evsel;
@@ -2621,6 +2646,7 @@  __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
 
 	return hde;
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
 {
@@ -2633,6 +2659,7 @@  struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
 		new_hse = memdup(hse, sizeof(*hse));
 		if (new_hse)
 			new_fmt = &new_hse->hpp;
+#ifdef HAVE_LIBTRACEEVENT
 	} else if (perf_hpp__is_dynamic_entry(fmt)) {
 		struct hpp_dynamic_entry *hde, *new_hde;
 
@@ -2640,6 +2667,7 @@  struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
 		new_hde = memdup(hde, sizeof(*hde));
 		if (new_hde)
 			new_fmt = &new_hde->hpp;
+#endif
 	} else {
 		new_fmt = memdup(fmt, sizeof(*fmt));
 	}
@@ -2719,6 +2747,7 @@  static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
 	return evsel;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 static int __dynamic_dimension__add(struct evsel *evsel,
 				    struct tep_format_field *field,
 				    bool raw_trace, int level)
@@ -2789,13 +2818,13 @@  static int add_all_matching_fields(struct evlist *evlist,
 	}
 	return ret;
 }
+#endif /* HAVE_LIBTRACEEVENT */
 
 static int add_dynamic_entry(struct evlist *evlist, const char *tok,
 			     int level)
 {
 	char *str, *event_name, *field_name, *opt_name;
 	struct evsel *evsel;
-	struct tep_format_field *field;
 	bool raw_trace = symbol_conf.raw_trace;
 	int ret = 0;
 
@@ -2820,6 +2849,7 @@  static int add_dynamic_entry(struct evlist *evlist, const char *tok,
 		raw_trace = true;
 	}
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (!strcmp(field_name, "trace_fields")) {
 		ret = add_all_dynamic_fields(evlist, raw_trace, level);
 		goto out;
@@ -2829,6 +2859,7 @@  static int add_dynamic_entry(struct evlist *evlist, const char *tok,
 		ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
 		goto out;
 	}
+#endif
 
 	evsel = find_evsel(evlist, event_name);
 	if (evsel == NULL) {
@@ -2843,10 +2874,12 @@  static int add_dynamic_entry(struct evlist *evlist, const char *tok,
 		goto out;
 	}
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (!strcmp(field_name, "*")) {
 		ret = add_evsel_fields(evsel, raw_trace, level);
 	} else {
-		field = tep_find_any_field(evsel->tp_format, field_name);
+		struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
+
 		if (field == NULL) {
 			pr_debug("Cannot find event field for %s.%s\n",
 				 event_name, field_name);
@@ -2855,6 +2888,10 @@  static int add_dynamic_entry(struct evlist *evlist, const char *tok,
 
 		ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
 	}
+#else
+	(void)level;
+	(void)raw_trace;
+#endif /* HAVE_LIBTRACEEVENT */
 
 out:
 	free(str);
@@ -2955,11 +2992,11 @@  int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
 	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
 		struct sort_dimension *sd = &common_sort_dimensions[i];
 
-		if (strncasecmp(tok, sd->name, strlen(tok)))
+		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
 			continue;
 
 		for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
-			if (!strcmp(dynamic_headers[j], sd->name))
+			if (sd->name && !strcmp(dynamic_headers[j], sd->name))
 				sort_dimension_add_dynamic_header(sd);
 		}
 
@@ -3009,7 +3046,7 @@  int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
 		struct sort_dimension *sd = &bstack_sort_dimensions[i];
 
-		if (strncasecmp(tok, sd->name, strlen(tok)))
+		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
 			continue;
 
 		if (sort__mode != SORT_MODE__BRANCH)
@@ -3025,7 +3062,7 @@  int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
 	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
 		struct sort_dimension *sd = &memory_sort_dimensions[i];
 
-		if (strncasecmp(tok, sd->name, strlen(tok)))
+		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
 			continue;
 
 		if (sort__mode != SORT_MODE__MEMORY)
@@ -3339,7 +3376,7 @@  int output_field_add(struct perf_hpp_list *list, char *tok)
 	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
 		struct sort_dimension *sd = &common_sort_dimensions[i];
 
-		if (strncasecmp(tok, sd->name, strlen(tok)))
+		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
 			continue;
 
 		return __sort_dimension__add_output(list, sd);
@@ -3357,7 +3394,7 @@  int output_field_add(struct perf_hpp_list *list, char *tok)
 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
 		struct sort_dimension *sd = &bstack_sort_dimensions[i];
 
-		if (strncasecmp(tok, sd->name, strlen(tok)))
+		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
 			continue;
 
 		if (sort__mode != SORT_MODE__BRANCH)
@@ -3369,7 +3406,7 @@  int output_field_add(struct perf_hpp_list *list, char *tok)
 	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
 		struct sort_dimension *sd = &memory_sort_dimensions[i];
 
-		if (strncasecmp(tok, sd->name, strlen(tok)))
+		if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
 			continue;
 
 		if (sort__mode != SORT_MODE__MEMORY)
@@ -3508,6 +3545,9 @@  void reset_output_field(void)
 
 static void add_key(struct strbuf *sb, const char *str, int *llen)
 {
+	if (!str)
+		return;
+
 	if (*llen >= 75) {
 		strbuf_addstr(sb, "\n\t\t\t ");
 		*llen = INDENT;
diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
index 0645795ff080..3ab6a92b1a6d 100644
--- a/tools/perf/util/synthetic-events.c
+++ b/tools/perf/util/synthetic-events.c
@@ -2157,6 +2157,7 @@  int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
 	return err;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
 					perf_event__handler_t process)
 {
@@ -2203,6 +2204,7 @@  int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
 
 	return aligned_size;
 }
+#endif
 
 int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
 				    perf_event__handler_t process, struct machine *machine)
@@ -2355,6 +2357,7 @@  int perf_event__synthesize_for_pipe(struct perf_tool *tool,
 	}
 	ret += err;
 
+#ifdef HAVE_LIBTRACEEVENT
 	if (have_tracepoints(&evlist->core.entries)) {
 		int fd = perf_data__fd(data);
 
@@ -2374,6 +2377,9 @@  int perf_event__synthesize_for_pipe(struct perf_tool *tool,
 		}
 		ret += err;
 	}
+#else
+	(void)data;
+#endif
 
 	return ret;
 }
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index c9c83a40647c..2d3c2576bab7 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -11,6 +11,8 @@ 
 #include "trace-event.h"
 
 #include <linux/ctype.h>
+#include <linux/kernel.h>
+#include <traceevent/event-parse.h>
 
 static int get_common_field(struct scripting_context *context,
 			    int *offset, int *size, const char *type)
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 43146a4ce2fb..1162c49b8082 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -11,6 +11,7 @@ 
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <sys/mman.h>
+#include <traceevent/event-parse.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
index 636a010d929b..56175c53f9af 100644
--- a/tools/perf/util/trace-event-scripting.c
+++ b/tools/perf/util/trace-event-scripting.c
@@ -9,6 +9,7 @@ 
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <traceevent/event-parse.h>
 
 #include "debug.h"
 #include "trace-event.h"
diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
index b3ee651e3d91..8ad75b31e09b 100644
--- a/tools/perf/util/trace-event.c
+++ b/tools/perf/util/trace-event.c
@@ -1,5 +1,4 @@ 
 // SPDX-License-Identifier: GPL-2.0
-
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 8f39f5bcb2c2..add6c5d9531c 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -2,9 +2,11 @@ 
 #ifndef _PERF_UTIL_TRACE_EVENT_H
 #define _PERF_UTIL_TRACE_EVENT_H
 
-#include <traceevent/event-parse.h>
-#include "parse-events.h"
+#include <stdbool.h>
+#include <stdio.h>
+#include <linux/types.h>
 
+struct evlist;
 struct machine;
 struct perf_sample;
 union perf_event;
@@ -18,6 +20,11 @@  struct trace_event {
 	struct tep_plugin_list	*plugin_list;
 };
 
+typedef char *(tep_func_resolver_t)(void *priv,
+				    unsigned long long *addrp, char **modp);
+
+bool have_tracepoints(struct list_head *evlist);
+
 int trace_event__init(struct trace_event *t);
 void trace_event__cleanup(struct trace_event *t);
 int trace_event__register_resolver(struct machine *machine,