| # SPDX-License-Identifier: GPL-2.0-only | |
| ifeq ($(srctree),) | |
| srctree := $(patsubst %/,%,$(dir $(CURDIR))) | |
| srctree := $(patsubst %/,%,$(dir $(srctree))) | |
| srctree := $(patsubst %/,%,$(dir $(srctree))) | |
| endif | |
| include $(srctree)/tools/scripts/Makefile.include | |
| # O is an alias for OUTPUT | |
| OUTPUT := $(O) | |
| ifeq ($(OUTPUT),) | |
| OUTPUT := $(CURDIR) | |
| else | |
| # subdir is used by the ../Makefile in $(call descend,) | |
| ifneq ($(subdir),) | |
| OUTPUT := $(OUTPUT)/$(subdir) | |
| endif | |
| endif | |
| ifneq ($(patsubst %/,,$(lastword $(OUTPUT))),) | |
| OUTPUT := $(OUTPUT)/ | |
| endif | |
| RTLA := $(OUTPUT)rtla | |
| RTLA_IN := $(RTLA)-in.o | |
| LIBSUBCMD_DIR = $(srctree)/tools/lib/subcmd/ | |
| ifneq ($(OUTPUT),) | |
| LIBSUBCMD_OUTPUT = $(abspath $(OUTPUT))/libsubcmd | |
| else | |
| LIBSUBCMD_OUTPUT = $(CURDIR)/libsubcmd | |
| endif | |
| LIBSUBCMD = $(LIBSUBCMD_OUTPUT)/libsubcmd.a | |
| LIBSUBCMD_INCLUDES = $(LIBSUBCMD_OUTPUT)/include | |
| LIBSUBCMD_MAKEFLAGS = O=$(LIBSUBCMD_OUTPUT) DESTDIR=$(LIBSUBCMD_OUTPUT) prefix= subdir= | |
| TOOLS_INCLUDES = -I$(srctree)/tools/include | |
| ifneq ($(OUTPUT),) | |
| LIB_OUTPUT = $(abspath $(OUTPUT))/lib | |
| else | |
| LIB_OUTPUT = $(CURDIR)/lib | |
| endif | |
| LIB_CTYPE = $(LIB_OUTPUT)/ctype.o | |
| LIB_CTYPE_SRC = $(srctree)/tools/lib/ctype.c | |
| LIB_STRING = $(LIB_OUTPUT)/string.o | |
| LIB_STRING_SRC = $(srctree)/tools/lib/string.c | |
| LIB_STR_ERROR_R = $(LIB_OUTPUT)/str_error_r.o | |
| LIB_STR_ERROR_R_SRC = $(srctree)/tools/lib/str_error_r.c | |
| VERSION := $(shell sh -c "make -sC ../../.. kernelversion | grep -v make") | |
| DOCSRC := ../../../Documentation/tools/rtla/ | |
| FEATURE_TESTS := libtraceevent | |
| FEATURE_TESTS += libtracefs | |
| FEATURE_TESTS += libcpupower | |
| FEATURE_TESTS += libcheck | |
| FEATURE_TESTS += libbpf | |
| FEATURE_TESTS += clang-bpf-co-re | |
| FEATURE_TESTS += bpftool-skeletons | |
| FEATURE_DISPLAY := libtraceevent | |
| FEATURE_DISPLAY += libtracefs | |
| FEATURE_DISPLAY += libcpupower | |
| FEATURE_DISPLAY += libcheck | |
| FEATURE_DISPLAY += libbpf | |
| FEATURE_DISPLAY += clang-bpf-co-re | |
| FEATURE_DISPLAY += bpftool-skeletons | |
| all: $(RTLA) | |
| include $(srctree)/tools/build/Makefile.include | |
| include Makefile.rtla | |
| include tests/unit/Makefile.unit | |
| # check for dependencies only on required targets | |
| NON_CONFIG_TARGETS := clean install tarball doc doc_clean doc_install | |
| config := 1 | |
| ifdef MAKECMDGOALS | |
| ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),) | |
| config := 0 | |
| endif | |
| endif | |
| ifeq ($(config),1) | |
| include $(srctree)/tools/build/Makefile.feature | |
| include Makefile.config | |
| endif | |
| CFLAGS += $(INCLUDES) $(LIB_INCLUDES) $(TOOLS_INCLUDES) -I$(LIBSUBCMD_INCLUDES) | |
| export CFLAGS OUTPUT srctree | |
| ifeq ($(BUILD_BPF_SKEL),1) | |
| src/timerlat.bpf.o: src/timerlat.bpf.c | |
| $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ | |
| src/timerlat.skel.h: src/timerlat.bpf.o | |
| $(QUIET_GENSKEL)$(SYSTEM_BPFTOOL) gen skeleton $< > $@ | |
| example/timerlat_bpf_action.o: example/timerlat_bpf_action.c | |
| $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ | |
| tests/bpf/bpf_action_map.o: tests/bpf/bpf_action_map.c | |
| $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf -c $(filter %.c,$^) -o $@ | |
| else | |
| src/timerlat.skel.h: | |
| $(Q)echo '/* BPF skeleton is disabled */' > src/timerlat.skel.h | |
| example/timerlat_bpf_action.o: example/timerlat_bpf_action.c | |
| $(Q)echo "BPF skeleton support is disabled, skipping example/timerlat_bpf_action.o" | |
| tests/bpf/bpf_action_map.o: tests/bpf/bpf_action_map.c | |
| $(Q)echo "BPF skeleton support is disabled, skipping tests/bpf/bpf_action_map.o" | |
| endif | |
| $(RTLA): $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) | |
| $(QUIET_LINK)$(CC) $(LDFLAGS) -o $(RTLA) $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) $(EXTLIBS) | |
| static: $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) | |
| $(eval LDFLAGS += -static) | |
| $(QUIET_LINK)$(CC) -static $(LDFLAGS) -o $(RTLA)-static $(RTLA_IN) $(LIBSUBCMD) $(LIB_CTYPE) $(LIB_STRING) $(LIB_STR_ERROR_R) $(EXTLIBS) | |
| rtla.%: fixdep FORCE | |
| make -f $(srctree)/tools/build/Makefile.build dir=. $@ | |
| $(RTLA_IN): fixdep FORCE src/timerlat.skel.h $(LIBSUBCMD_INCLUDES) | |
| make $(build)=rtla | |
| $(LIBSUBCMD_OUTPUT): | |
| $(Q)$(MKDIR) -p $@ | |
| $(LIBSUBCMD_INCLUDES): FORCE | $(LIBSUBCMD_OUTPUT) | |
| $(Q)$(MAKE) -C $(LIBSUBCMD_DIR) $(LIBSUBCMD_MAKEFLAGS) \ | |
| install_headers | |
| $(LIBSUBCMD): FORCE | $(LIBSUBCMD_OUTPUT) | |
| $(Q)$(MAKE) -C $(LIBSUBCMD_DIR) $(LIBSUBCMD_MAKEFLAGS) \ | |
| $@ | |
| $(LIB_OUTPUT): | |
| $(Q)$(MKDIR) -p $@ | |
| $(LIB_STR_ERROR_R): $(LIB_STR_ERROR_R_SRC) | $(LIB_OUTPUT) | |
| $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< | |
| $(LIB_STRING): $(LIB_STRING_SRC) | $(LIB_OUTPUT) | |
| $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< | |
| $(LIB_CTYPE): $(LIB_CTYPE_SRC) | $(LIB_OUTPUT) | |
| $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $< | |
| libsubcmd-clean: | |
| $(call QUIET_CLEAN, libsubcmd) | |
| $(Q)$(RM) -r -- $(LIBSUBCMD_OUTPUT) | |
| lib-clean: | |
| $(call QUIET_CLEAN, lib) | |
| $(Q)$(RM) -r -- $(LIB_OUTPUT) | |
| clean: doc_clean fixdep-clean libsubcmd-clean lib-clean | |
| $(call QUIET_CLEAN, rtla) | |
| $(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete | |
| $(Q)rm -f rtla rtla-static fixdep FEATURE-DUMP rtla-* | |
| $(Q)rm -rf feature | |
| $(Q)rm -f src/timerlat.bpf.o src/timerlat.skel.h example/timerlat_bpf_action.o | |
| $(Q)rm -f $(UNIT_TESTS) | |
| check: $(RTLA) tests/bpf/bpf_action_map.o | |
| RTLA=$(RTLA) BPFTOOL=$(SYSTEM_BPFTOOL) prove -o -f -v tests/ | |
| examples: example/timerlat_bpf_action.o | |
| .PHONY: FORCE clean check |