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_CTYPE = $(LIB_OUTPUT)/ctype.o 49LIB_CTYPE_SRC = $(srctree)/tools/lib/ctype.c 50 51LIB_STRING = $(LIB_OUTPUT)/string.o 52LIB_STRING_SRC = $(srctree)/tools/lib/string.c 53 54LIB_STR_ERROR_R = $(LIB_OUTPUT)/str_error_r.o 55LIB_STR_ERROR_R_SRC = $(srctree)/tools/lib/str_error_r.c 56 57VERSION := $(shell sh -c "make -sC ../../.. kernelversion | grep -v make") 58DOCSRC := ../../../Documentation/tools/rtla/ 59 60FEATURE_TESTS := libtraceevent 61FEATURE_TESTS += libtracefs 62FEATURE_TESTS += libcpupower 63FEATURE_TESTS += libcheck 64FEATURE_TESTS += libbpf 65FEATURE_TESTS += clang-bpf-co-re 66FEATURE_TESTS += bpftool-skeletons 67FEATURE_DISPLAY := libtraceevent 68FEATURE_DISPLAY += libtracefs 69FEATURE_DISPLAY += libcpupower 70FEATURE_DISPLAY += libcheck 71FEATURE_DISPLAY += libbpf 72FEATURE_DISPLAY += clang-bpf-co-re 73FEATURE_DISPLAY += bpftool-skeletons 74 75all: $(RTLA) 76 77include $(srctree)/tools/build/Makefile.include 78include Makefile.rtla 79include tests/unit/Makefile.unit 80 81# check for dependencies only on required targets 82NON_CONFIG_TARGETS := clean install tarball doc doc_clean doc_install 83 84config := 1 85ifdef MAKECMDGOALS 86ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),) 87 config := 0 88endif 89endif 90 91ifeq ($(config),1) 92 include $(srctree)/tools/build/Makefile.feature 93 include Makefile.config 94endif 95 96CFLAGS += $(INCLUDES) $(LIB_INCLUDES) $(TOOLS_INCLUDES) -I$(LIBSUBCMD_INCLUDES) 97 98export CFLAGS OUTPUT srctree 99 100ifeq ($(BUILD_BPF_SKEL),1) 101src/timerlat.bpf.o: src/timerlat.bpf.c 102 $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ 103 104src/timerlat.skel.h: src/timerlat.bpf.o 105 $(QUIET_GENSKEL)$(SYSTEM_BPFTOOL) gen skeleton $< > $@ 106 107example/timerlat_bpf_action.o: example/timerlat_bpf_action.c 108 $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ 109 110tests/bpf/bpf_action_map.o: tests/bpf/bpf_action_map.c 111 $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ 112else 113src/timerlat.skel.h: 114 $(Q)echo '/* BPF skeleton is disabled */' > src/timerlat.skel.h 115 116example/timerlat_bpf_action.o: example/timerlat_bpf_action.c 117 $(Q)echo "BPF skeleton support is disabled, skipping example/timerlat_bpf_action.o" 118 119tests/bpf/bpf_action_map.o: tests/bpf/bpf_action_map.c 120 $(Q)echo "BPF skeleton support is disabled, skipping tests/bpf/bpf_action_map.o" 121endif 122 123$(RTLA): $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) 124 $(QUIET_LINK)$(CC) $(LDFLAGS) -o $(RTLA) $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) $(EXTLIBS) 125 126static: $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) 127 $(eval LDFLAGS += -static) 128 $(QUIET_LINK)$(CC) -static $(LDFLAGS) -o $(RTLA)-static $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) $(EXTLIBS) 129 130rtla.%: fixdep FORCE 131 make -f $(srctree)/tools/build/Makefile.build dir=. $@ 132 133$(RTLA_IN): fixdep FORCE src/timerlat.skel.h $(LIBSUBCMD_INCLUDES) 134 make $(build)=rtla 135 136$(LIBSUBCMD_OUTPUT): 137 $(Q)$(MKDIR) -p $@ 138 139$(LIBSUBCMD_INCLUDES): FORCE | $(LIBSUBCMD_OUTPUT) 140 $(Q)$(MAKE) -C $(LIBSUBCMD_DIR) $(LIBSUBCMD_MAKEFLAGS) \ 141 install_headers 142 143$(LIBSUBCMD): FORCE | $(LIBSUBCMD_OUTPUT) 144 $(Q)$(MAKE) -C $(LIBSUBCMD_DIR) $(LIBSUBCMD_MAKEFLAGS) \ 145 $@ 146 147$(LIB_OUTPUT): 148 $(Q)$(MKDIR) -p $@ 149 150$(LIB_STR_ERROR_R): $(LIB_STR_ERROR_R_SRC) | $(LIB_OUTPUT) 151 $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< 152 153$(LIB_STRING): $(LIB_STRING_SRC) | $(LIB_OUTPUT) 154 $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< 155 156$(LIB_CTYPE): $(LIB_CTYPE_SRC) | $(LIB_OUTPUT) 157 $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< 158 159libsubcmd-clean: 160 $(call QUIET_CLEAN, libsubcmd) 161 $(Q)$(RM) -r -- $(LIBSUBCMD_OUTPUT) 162 163lib-clean: 164 $(call QUIET_CLEAN, lib) 165 $(Q)$(RM) -r -- $(LIB_OUTPUT) 166 167clean: doc_clean fixdep-clean libsubcmd-clean lib-clean 168 $(call QUIET_CLEAN, rtla) 169 $(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete 170 $(Q)rm -f rtla rtla-static fixdep FEATURE-DUMP rtla-* 171 $(Q)rm -rf feature 172 $(Q)rm -f src/timerlat.bpf.o src/timerlat.skel.h example/timerlat_bpf_action.o 173 $(Q)rm -f $(UNIT_TESTS) 174 175check: $(RTLA) tests/bpf/bpf_action_map.o 176 RTLA=$(RTLA) BPFTOOL=$(SYSTEM_BPFTOOL) prove -o -f -v tests/ 177examples: example/timerlat_bpf_action.o 178.PHONY: FORCE clean check 179