xref: /linux/tools/bpf/bpftool/Makefile (revision 9d9d8cc21e3827b89e414f990016836290de3038)
1ec8f24b7SThomas Gleixner# SPDX-License-Identifier: GPL-2.0-only
271bb428fSJakub Kicinskiinclude ../../scripts/Makefile.include
371bb428fSJakub Kicinskiinclude ../../scripts/utilities.mak
471bb428fSJakub Kicinski
571bb428fSJakub Kicinskiifeq ($(srctree),)
671bb428fSJakub Kicinskisrctree := $(patsubst %/,%,$(dir $(CURDIR)))
771bb428fSJakub Kicinskisrctree := $(patsubst %/,%,$(dir $(srctree)))
871bb428fSJakub Kicinskisrctree := $(patsubst %/,%,$(dir $(srctree)))
971bb428fSJakub Kicinskiendif
1071bb428fSJakub Kicinski
1171bb428fSJakub Kicinskiifeq ($(V),1)
1271bb428fSJakub Kicinski  Q =
1371bb428fSJakub Kicinskielse
1471bb428fSJakub Kicinski  Q = @
1571bb428fSJakub Kicinskiendif
1671bb428fSJakub Kicinski
1771bb428fSJakub KicinskiBPF_DIR = $(srctree)/tools/lib/bpf/
1871bb428fSJakub Kicinski
1971bb428fSJakub Kicinskiifneq ($(OUTPUT),)
2045c5589dSQuentin Monnet  LIBBPF_OUTPUT = $(OUTPUT)/libbpf/
2145c5589dSQuentin Monnet  LIBBPF_PATH = $(LIBBPF_OUTPUT)
2271bb428fSJakub Kicinskielse
2345c5589dSQuentin Monnet  LIBBPF_PATH = $(BPF_DIR)
2471bb428fSJakub Kicinskiendif
2571bb428fSJakub Kicinski
2645c5589dSQuentin MonnetLIBBPF = $(LIBBPF_PATH)libbpf.a
2771bb428fSJakub Kicinski
28e0a43aa3SQuentin MonnetBPFTOOL_VERSION := $(shell make -rR --no-print-directory -sC ../../.. kernelversion)
294bfe3bd3SRoman Gushchin
3071bb428fSJakub Kicinski$(LIBBPF): FORCE
3145c5589dSQuentin Monnet	$(if $(LIBBPF_OUTPUT),@mkdir -p $(LIBBPF_OUTPUT))
3245c5589dSQuentin Monnet	$(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) $(LIBBPF_OUTPUT)libbpf.a
3371bb428fSJakub Kicinski
3471bb428fSJakub Kicinski$(LIBBPF)-clean:
3571bb428fSJakub Kicinski	$(call QUIET_CLEAN, libbpf)
3645c5589dSQuentin Monnet	$(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null
3771bb428fSJakub Kicinski
38658e85aaSQuentin Monnetprefix ?= /usr/local
39507e590dSQuentin Monnetbash_compdir ?= /usr/share/bash-completion/completions
4071bb428fSJakub Kicinski
4171bb428fSJakub KicinskiCFLAGS += -O2
42a9436dcaSQuentin MonnetCFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
43a9436dcaSQuentin MonnetCFLAGS += $(filter-out -Wswitch-enum,$(EXTRA_WARNINGS))
44f412eed9SJakub KicinskiCFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
4505aca6daSAndrii Nakryiko	-I$(if $(OUTPUT),$(OUTPUT),.) \
46f412eed9SJakub Kicinski	-I$(srctree)/kernel/bpf/ \
47f412eed9SJakub Kicinski	-I$(srctree)/tools/include \
48f412eed9SJakub Kicinski	-I$(srctree)/tools/include/uapi \
49229c3b47SToke Høiland-Jørgensen	-I$(srctree)/tools/lib \
50f412eed9SJakub Kicinski	-I$(srctree)/tools/perf
514bfe3bd3SRoman GushchinCFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"'
520ef6bf39SJiri Olsaifneq ($(EXTRA_CFLAGS),)
530ef6bf39SJiri OlsaCFLAGS += $(EXTRA_CFLAGS)
540ef6bf39SJiri Olsaendif
55c8506165SJiri Olsaifneq ($(EXTRA_LDFLAGS),)
56c8506165SJiri OlsaLDFLAGS += $(EXTRA_LDFLAGS)
57c8506165SJiri Olsaendif
580ef6bf39SJiri Olsa
59658e85aaSQuentin MonnetINSTALL ?= install
60658e85aaSQuentin MonnetRM ?= rm -f
6147c09d6aSSong LiuCLANG ?= clang
62658e85aaSQuentin Monnet
63fb982666SRoman GushchinFEATURE_USER = .bpftool
640b3b9ca3SQuentin MonnetFEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \
6505aca6daSAndrii Nakryiko	clang-bpf-co-re
660b3b9ca3SQuentin MonnetFEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
6705aca6daSAndrii Nakryiko	clang-bpf-co-re
68fb982666SRoman Gushchin
69fb982666SRoman Gushchincheck_feat := 1
70fb982666SRoman GushchinNON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
71fb982666SRoman Gushchinifdef MAKECMDGOALS
72fb982666SRoman Gushchinifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),)
73fb982666SRoman Gushchin  check_feat := 0
74fb982666SRoman Gushchinendif
75fb982666SRoman Gushchinendif
76fb982666SRoman Gushchin
77fb982666SRoman Gushchinifeq ($(check_feat),1)
78fb982666SRoman Gushchinifeq ($(FEATURES_DUMP),)
79fb982666SRoman Gushchininclude $(srctree)/tools/build/Makefile.feature
80fb982666SRoman Gushchinelse
81fb982666SRoman Gushchininclude $(FEATURES_DUMP)
82fb982666SRoman Gushchinendif
83fb982666SRoman Gushchinendif
84fb982666SRoman Gushchin
85fb982666SRoman Gushchinifeq ($(feature-disassembler-four-args), 1)
86fb982666SRoman GushchinCFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
87fb982666SRoman Gushchinendif
88fb982666SRoman Gushchin
89531b014eSJakub Kicinskiifeq ($(feature-reallocarray), 0)
90531b014eSJakub KicinskiCFLAGS += -DCOMPAT_NEED_REALLOCARRAY
91531b014eSJakub Kicinskiendif
92531b014eSJakub Kicinski
930b3b9ca3SQuentin MonnetLIBS = $(LIBBPF) -lelf -lz
940b3b9ca3SQuentin Monnetifeq ($(feature-libcap), 1)
950b3b9ca3SQuentin MonnetCFLAGS += -DUSE_LIBCAP
960b3b9ca3SQuentin MonnetLIBS += -lcap
970b3b9ca3SQuentin Monnetendif
980b3b9ca3SQuentin Monnet
9990126e3aSJakub Kicinskiinclude $(wildcard $(OUTPUT)*.d)
10071bb428fSJakub Kicinski
10171bb428fSJakub Kicinskiall: $(OUTPUT)bpftool
10271bb428fSJakub Kicinski
10329a9c10eSStanislav FomichevBFD_SRCS = jit_disasm.c
10429a9c10eSStanislav Fomichev
10529a9c10eSStanislav FomichevSRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c))
10629a9c10eSStanislav Fomichev
10729a9c10eSStanislav Fomichevifeq ($(feature-libbfd),1)
1086e8ccb4fSStanislav Fomichev  LIBS += -lbfd -ldl -lopcodes
1096e8ccb4fSStanislav Fomichevelse ifeq ($(feature-libbfd-liberty),1)
1106e8ccb4fSStanislav Fomichev  LIBS += -lbfd -ldl -lopcodes -liberty
1116e8ccb4fSStanislav Fomichevelse ifeq ($(feature-libbfd-liberty-z),1)
1126e8ccb4fSStanislav Fomichev  LIBS += -lbfd -ldl -lopcodes -liberty -lz
1136e8ccb4fSStanislav Fomichevendif
1146e8ccb4fSStanislav Fomichev
1156e8ccb4fSStanislav Fomichevifneq ($(filter -lbfd,$(LIBS)),)
11629a9c10eSStanislav FomichevCFLAGS += -DHAVE_LIBBFD_SUPPORT
11729a9c10eSStanislav FomichevSRCS += $(BFD_SRCS)
11829a9c10eSStanislav Fomichevendif
11929a9c10eSStanislav Fomichev
12016e9b187SAndrii NakryikoBPFTOOL_BOOTSTRAP := $(if $(OUTPUT),$(OUTPUT)bpftool-bootstrap,./bpftool-bootstrap)
12116e9b187SAndrii Nakryiko
12216e9b187SAndrii NakryikoBOOTSTRAP_OBJS = $(addprefix $(OUTPUT),main.o common.o json_writer.o gen.o btf.o)
123c9c35995SJakub KicinskiOBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
12447c09d6aSSong Liu
12505aca6daSAndrii NakryikoVMLINUX_BTF_PATHS := $(if $(O),$(O)/vmlinux)				\
12605aca6daSAndrii Nakryiko		     $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)	\
12705aca6daSAndrii Nakryiko		     ../../../vmlinux					\
12805aca6daSAndrii Nakryiko		     /sys/kernel/btf/vmlinux				\
12905aca6daSAndrii Nakryiko		     /boot/vmlinux-$(shell uname -r)
13005aca6daSAndrii NakryikoVMLINUX_BTF := $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
13114e5728fSSong Liu
13205aca6daSAndrii Nakryikoifneq ($(VMLINUX_BTF),)
13305aca6daSAndrii Nakryikoifeq ($(feature-clang-bpf-co-re),1)
13405aca6daSAndrii Nakryiko
13505aca6daSAndrii NakryikoBUILD_BPF_SKELS := 1
13605aca6daSAndrii Nakryiko
13705aca6daSAndrii Nakryiko$(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP)
13805aca6daSAndrii Nakryiko	$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@
13905aca6daSAndrii Nakryiko
14005aca6daSAndrii Nakryiko$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF)
141fe4eb069STobias Klauser	$(QUIET_CLANG)$(CLANG) \
14205aca6daSAndrii Nakryiko		-I$(if $(OUTPUT),$(OUTPUT),.) \
143fe4eb069STobias Klauser		-I$(srctree)/tools/include/uapi/ \
14405aca6daSAndrii Nakryiko		-I$(LIBBPF_PATH) \
14505aca6daSAndrii Nakryiko		-I$(srctree)/tools/lib \
14639be909cSSong Liu		-g -O2 -target bpf -c $< -o $@
14747c09d6aSSong Liu
14805aca6daSAndrii Nakryiko$(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
14905aca6daSAndrii Nakryiko	$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@
15047c09d6aSSong Liu
15105aca6daSAndrii Nakryiko$(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h
15205aca6daSAndrii Nakryiko
153d53dee3fSAndrii Nakryiko$(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h
154d53dee3fSAndrii Nakryiko
15505aca6daSAndrii Nakryikoendif
15605aca6daSAndrii Nakryikoendif
15705aca6daSAndrii Nakryiko
158*9d9d8cc2STobias KlauserCFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS)
159c9c35995SJakub Kicinski
160c9c35995SJakub Kicinski$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
161d70a6be1SIlya Leoshkevich	$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
16271bb428fSJakub Kicinski
163d66fa3c7SPeter Wu$(OUTPUT)feature.o: | zdep
164d66fa3c7SPeter Wu
16516e9b187SAndrii Nakryiko$(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF)
16616e9b187SAndrii Nakryiko	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BOOTSTRAP_OBJS) $(LIBS)
16716e9b187SAndrii Nakryiko
16816e9b187SAndrii Nakryiko$(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
16916e9b187SAndrii Nakryiko	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
17071bb428fSJakub Kicinski
17171bb428fSJakub Kicinski$(OUTPUT)%.o: %.c
172d70a6be1SIlya Leoshkevich	$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
17371bb428fSJakub Kicinski
17471bb428fSJakub Kicinskiclean: $(LIBBPF)-clean
17571bb428fSJakub Kicinski	$(call QUIET_CLEAN, bpftool)
176fbdb620bSQuentin Monnet	$(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
17705aca6daSAndrii Nakryiko	$(Q)$(RM) -- $(BPFTOOL_BOOTSTRAP) $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h
178fbdb620bSQuentin Monnet	$(Q)$(RM) -r -- $(OUTPUT)libbpf/
179cc5b3403SJakub Kicinski	$(call QUIET_CLEAN, core-gen)
180fbdb620bSQuentin Monnet	$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
181fbdb620bSQuentin Monnet	$(Q)$(RM) -r -- $(OUTPUT)feature/
18271bb428fSJakub Kicinski
183658e85aaSQuentin Monnetinstall: $(OUTPUT)bpftool
184658e85aaSQuentin Monnet	$(call QUIET_INSTALL, bpftool)
185658e85aaSQuentin Monnet	$(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin
186658e85aaSQuentin Monnet	$(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool
187658e85aaSQuentin Monnet	$(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir)
188658e85aaSQuentin Monnet	$(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir)
18971bb428fSJakub Kicinski
190d3244248SQuentin Monnetuninstall:
191d3244248SQuentin Monnet	$(call QUIET_UNINST, bpftool)
192fbdb620bSQuentin Monnet	$(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool
193fbdb620bSQuentin Monnet	$(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool
194d3244248SQuentin Monnet
195ff69c21aSJakub Kicinskidoc:
196658e85aaSQuentin Monnet	$(call descend,Documentation)
197658e85aaSQuentin Monnet
198658e85aaSQuentin Monnetdoc-clean:
199658e85aaSQuentin Monnet	$(call descend,Documentation,clean)
200ff69c21aSJakub Kicinski
201ff69c21aSJakub Kicinskidoc-install:
202658e85aaSQuentin Monnet	$(call descend,Documentation,install)
203ff69c21aSJakub Kicinski
204d3244248SQuentin Monnetdoc-uninstall:
205d3244248SQuentin Monnet	$(call descend,Documentation,uninstall)
206d3244248SQuentin Monnet
20771bb428fSJakub KicinskiFORCE:
20871bb428fSJakub Kicinski
209d66fa3c7SPeter Wuzdep:
210d66fa3c7SPeter Wu	@if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi
211d66fa3c7SPeter Wu
21205aca6daSAndrii Nakryiko.SECONDARY:
213d66fa3c7SPeter Wu.PHONY: all FORCE clean install uninstall zdep
214d3244248SQuentin Monnet.PHONY: doc doc-clean doc-install doc-uninstall
21571bb428fSJakub Kicinski.DEFAULT_GOAL := all
216