1# SPDX-License-Identifier: GPL-2.0-only 2 3ifeq ($(srctree),) 4 srctree := $(patsubst %/,%,$(dir $(CURDIR))) 5 srctree := $(patsubst %/,%,$(dir $(srctree))) 6 srctree := $(patsubst %/,%,$(dir $(srctree))) 7endif 8 9include $(srctree)/tools/scripts/Makefile.include 10 11# O is an alias for OUTPUT 12OUTPUT := $(O) 13 14ifeq ($(OUTPUT),) 15 OUTPUT := $(CURDIR) 16else 17 # subdir is used by the ../Makefile in $(call descend,) 18 ifneq ($(subdir),) 19 OUTPUT := $(OUTPUT)/$(subdir) 20 endif 21endif 22 23ifneq ($(patsubst %/,,$(lastword $(OUTPUT))),) 24 OUTPUT := $(OUTPUT)/ 25endif 26 27RTLA := $(OUTPUT)rtla 28RTLA_IN := $(RTLA)-in.o 29 30LIBSUBCMD_DIR = $(srctree)/tools/lib/subcmd/ 31ifneq ($(OUTPUT),) 32 LIBSUBCMD_OUTPUT = $(abspath $(OUTPUT))/libsubcmd 33else 34 LIBSUBCMD_OUTPUT = $(CURDIR)/libsubcmd 35endif 36LIBSUBCMD = $(LIBSUBCMD_OUTPUT)/libsubcmd.a 37LIBSUBCMD_INCLUDES = $(LIBSUBCMD_OUTPUT)/include 38LIBSUBCMD_MAKEFLAGS = O=$(LIBSUBCMD_OUTPUT) DESTDIR=$(LIBSUBCMD_OUTPUT) prefix= subdir= 39 40TOOLS_INCLUDES = -I$(srctree)/tools/include 41 42ifneq ($(OUTPUT),) 43 LIB_OUTPUT = $(abspath $(OUTPUT))/lib 44else 45 LIB_OUTPUT = $(CURDIR)/lib 46endif 47 48LIB_STRING = $(LIB_OUTPUT)/string.o 49LIB_STRING_SRC = $(srctree)/tools/lib/string.c 50 51LIB_STR_ERROR_R = $(LIB_OUTPUT)/str_error_r.o 52LIB_STR_ERROR_R_SRC = $(srctree)/tools/lib/str_error_r.c 53 54VERSION := $(shell sh -c "make -sC ../../.. kernelversion | grep -v make") 55DOCSRC := ../../../Documentation/tools/rtla/ 56 57FEATURE_TESTS := libtraceevent 58FEATURE_TESTS += libtracefs 59FEATURE_TESTS += libcpupower 60FEATURE_TESTS += libcheck 61FEATURE_TESTS += libbpf 62FEATURE_TESTS += clang-bpf-co-re 63FEATURE_TESTS += bpftool-skeletons 64FEATURE_DISPLAY := libtraceevent 65FEATURE_DISPLAY += libtracefs 66FEATURE_DISPLAY += libcpupower 67FEATURE_DISPLAY += libcheck 68FEATURE_DISPLAY += libbpf 69FEATURE_DISPLAY += clang-bpf-co-re 70FEATURE_DISPLAY += bpftool-skeletons 71 72all: $(RTLA) 73 74include $(srctree)/tools/build/Makefile.include 75include Makefile.rtla 76include tests/unit/Makefile.unit 77 78# check for dependencies only on required targets 79NON_CONFIG_TARGETS := clean install tarball doc doc_clean doc_install 80 81config := 1 82ifdef MAKECMDGOALS 83ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),) 84 config := 0 85endif 86endif 87 88ifeq ($(config),1) 89 include $(srctree)/tools/build/Makefile.feature 90 include Makefile.config 91endif 92 93CFLAGS += $(INCLUDES) $(LIB_INCLUDES) $(TOOLS_INCLUDES) -I$(LIBSUBCMD_INCLUDES) 94 95export CFLAGS OUTPUT srctree 96 97ifeq ($(BUILD_BPF_SKEL),1) 98src/timerlat.bpf.o: src/timerlat.bpf.c 99 $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ 100 101src/timerlat.skel.h: src/timerlat.bpf.o 102 $(QUIET_GENSKEL)$(SYSTEM_BPFTOOL) gen skeleton $< > $@ 103 104example/timerlat_bpf_action.o: example/timerlat_bpf_action.c 105 $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ 106 107tests/bpf/bpf_action_map.o: tests/bpf/bpf_action_map.c 108 $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ 109else 110src/timerlat.skel.h: 111 $(Q)echo '/* BPF skeleton is disabled */' > src/timerlat.skel.h 112 113example/timerlat_bpf_action.o: example/timerlat_bpf_action.c 114 $(Q)echo "BPF skeleton support is disabled, skipping example/timerlat_bpf_action.o" 115 116tests/bpf/bpf_action_map.o: tests/bpf/bpf_action_map.c 117 $(Q)echo "BPF skeleton support is disabled, skipping tests/bpf/bpf_action_map.o" 118endif 119 120$(RTLA): $(RTLA_IN) $(LIBSUBCMD) $(LIB_STRING) $(LIB_STR_ERROR_R) 121 $(QUIET_LINK)$(CC) $(LDFLAGS) -o $(RTLA) $(RTLA_IN) $(LIBSUBCMD) $(LIB_STRING) $(LIB_STR_ERROR_R) $(EXTLIBS) 122 123static: $(RTLA_IN) $(LIBSUBCMD) $(LIB_STRING) $(LIB_STR_ERROR_R) 124 $(eval LDFLAGS += -static) 125 $(QUIET_LINK)$(CC) -static $(LDFLAGS) -o $(RTLA)-static $(RTLA_IN) $(LIBSUBCMD) $(LIB_STRING) $(LIB_STR_ERROR_R) $(EXTLIBS) 126 127rtla.%: fixdep FORCE 128 make -f $(srctree)/tools/build/Makefile.build dir=. $@ 129 130$(RTLA_IN): fixdep FORCE src/timerlat.skel.h $(LIBSUBCMD_INCLUDES) 131 make $(build)=rtla 132 133$(LIBSUBCMD_OUTPUT): 134 $(Q)$(MKDIR) -p $@ 135 136$(LIBSUBCMD_INCLUDES): FORCE | $(LIBSUBCMD_OUTPUT) 137 $(Q)$(MAKE) -C $(LIBSUBCMD_DIR) $(LIBSUBCMD_MAKEFLAGS) \ 138 install_headers 139 140$(LIBSUBCMD): FORCE | $(LIBSUBCMD_OUTPUT) 141 $(Q)$(MAKE) -C $(LIBSUBCMD_DIR) $(LIBSUBCMD_MAKEFLAGS) \ 142 $@ 143 144$(LIB_OUTPUT): 145 $(Q)$(MKDIR) -p $@ 146 147$(LIB_STR_ERROR_R): $(LIB_STR_ERROR_R_SRC) | $(LIB_OUTPUT) 148 $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< 149 150$(LIB_STRING): $(LIB_STRING_SRC) | $(LIB_OUTPUT) 151 $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< 152 153libsubcmd-clean: 154 $(call QUIET_CLEAN, libsubcmd) 155 $(Q)$(RM) -r -- $(LIBSUBCMD_OUTPUT) 156 157lib-clean: 158 $(call QUIET_CLEAN, lib) 159 $(Q)$(RM) -r -- $(LIB_OUTPUT) 160 161clean: doc_clean fixdep-clean libsubcmd-clean lib-clean 162 $(call QUIET_CLEAN, rtla) 163 $(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete 164 $(Q)rm -f rtla rtla-static fixdep FEATURE-DUMP rtla-* 165 $(Q)rm -rf feature 166 $(Q)rm -f src/timerlat.bpf.o src/timerlat.skel.h example/timerlat_bpf_action.o 167 $(Q)rm -f $(UNIT_TESTS) 168 169check: $(RTLA) tests/bpf/bpf_action_map.o 170 RTLA=$(RTLA) BPFTOOL=$(SYSTEM_BPFTOOL) prove -o -f -v tests/ 171examples: example/timerlat_bpf_action.o 172.PHONY: FORCE clean check 173