xref: /aosp_15_r20/external/libbpf/src/Makefile (revision f7c14bbac8cf49633f2740db462ea43457973ec4)
1# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
3ifeq ($(V),1)
4	Q =
5	msg =
6else
7	Q = @
8	msg = @printf '  %-8s %s%s\n' "$(1)" "$(2)" "$(if $(3), $(3))";
9endif
10
11LIBBPF_MAJOR_VERSION := 1
12LIBBPF_MINOR_VERSION := 4
13LIBBPF_PATCH_VERSION := 5
14LIBBPF_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).$(LIBBPF_PATCH_VERSION)
15LIBBPF_MAJMIN_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).0
16LIBBPF_MAP_VERSION := $(shell grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | sort -rV | head -n1 | cut -d'_' -f2)
17ifneq ($(LIBBPF_MAJMIN_VERSION), $(LIBBPF_MAP_VERSION))
18$(error Libbpf release ($(LIBBPF_VERSION)) and map ($(LIBBPF_MAP_VERSION)) versions are out of sync!)
19endif
20
21define allow-override
22  $(if $(or $(findstring environment,$(origin $(1))),\
23            $(findstring command line,$(origin $(1)))),,\
24    $(eval $(1) = $(2)))
25endef
26
27$(call allow-override,CC,$(CROSS_COMPILE)cc)
28$(call allow-override,LD,$(CROSS_COMPILE)ld)
29
30TOPDIR = ..
31
32INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi
33ALL_CFLAGS := $(INCLUDES)
34
35SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED
36
37CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89
38ALL_CFLAGS += $(CFLAGS) 						\
39	      -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64		\
40	      -Wno-unknown-warning-option -Wno-format-overflow		\
41	      $(EXTRA_CFLAGS)
42ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS)
43
44ifdef NO_PKG_CONFIG
45	ALL_LDFLAGS += -lelf -lz
46else
47	PKG_CONFIG ?= pkg-config
48	ALL_CFLAGS += $(shell $(PKG_CONFIG) --cflags libelf zlib)
49	ALL_LDFLAGS += $(shell $(PKG_CONFIG) --libs libelf zlib)
50endif
51
52OBJDIR ?= .
53SHARED_OBJDIR := $(OBJDIR)/sharedobjs
54STATIC_OBJDIR := $(OBJDIR)/staticobjs
55OBJS := bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \
56	nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o \
57	btf_dump.o hashmap.o ringbuf.o strset.o linker.o gen_loader.o \
58	relo_core.o usdt.o zip.o elf.o features.o
59SHARED_OBJS := $(addprefix $(SHARED_OBJDIR)/,$(OBJS))
60STATIC_OBJS := $(addprefix $(STATIC_OBJDIR)/,$(OBJS))
61
62STATIC_LIBS := $(OBJDIR)/libbpf.a
63ifndef BUILD_STATIC_ONLY
64	SHARED_LIBS := $(OBJDIR)/libbpf.so \
65		       $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) \
66		       $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION)
67	VERSION_SCRIPT := libbpf.map
68endif
69
70HEADERS := bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h \
71	   bpf_helpers.h bpf_helper_defs.h bpf_tracing.h \
72	   bpf_endian.h bpf_core_read.h skel_internal.h libbpf_version.h \
73	   usdt.bpf.h
74UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,\
75			    bpf.h bpf_common.h btf.h)
76
77PC_FILE := $(OBJDIR)/libbpf.pc
78
79INSTALL = install
80
81DESTDIR ?=
82
83HOSTARCH = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine)))
84ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(HOSTARCH)),)
85	LIBSUBDIR := lib64
86else
87	LIBSUBDIR := lib
88endif
89
90# By default let the pc file itself use ${prefix} in includedir/libdir so that
91# the prefix can be overridden at runtime (eg: --define-prefix)
92ifndef LIBDIR
93	LIBDIR_PC := $$\{prefix\}/$(LIBSUBDIR)
94else
95	LIBDIR_PC := $(LIBDIR)
96endif
97PREFIX ?= /usr
98LIBDIR ?= $(PREFIX)/$(LIBSUBDIR)
99INCLUDEDIR ?= $(PREFIX)/include
100UAPIDIR ?= $(PREFIX)/include
101
102TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags)
103
104all: $(STATIC_LIBS) $(SHARED_LIBS) $(PC_FILE)
105
106$(OBJDIR)/libbpf.a: $(STATIC_OBJS)
107	$(call msg,AR,$@)
108	$(Q)$(AR) rcs $@ $^
109
110$(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION)
111	$(Q)ln -sf $(^F) $@
112
113$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION)
114	$(Q)ln -sf $(^F) $@
115
116$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(SHARED_OBJS)
117	$(call msg,CC,$@)
118	$(Q)$(CC) -shared -Wl,--version-script=$(VERSION_SCRIPT) \
119		  -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \
120		  $^ $(ALL_LDFLAGS) -o $@
121
122$(OBJDIR)/libbpf.pc: force
123	$(Q)sed -e "s|@PREFIX@|$(PREFIX)|" \
124		-e "s|@LIBDIR@|$(LIBDIR_PC)|" \
125		-e "s|@VERSION@|$(LIBBPF_VERSION)|" \
126		< libbpf.pc.template > $@
127
128$(STATIC_OBJDIR) $(SHARED_OBJDIR):
129	$(call msg,MKDIR,$@)
130	$(Q)mkdir -p $@
131
132$(STATIC_OBJDIR)/%.o: %.c | $(STATIC_OBJDIR)
133	$(call msg,CC,$@)
134	$(Q)$(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@
135
136$(SHARED_OBJDIR)/%.o: %.c | $(SHARED_OBJDIR)
137	$(call msg,CC,$@)
138	$(Q)$(CC) $(ALL_CFLAGS) $(SHARED_CFLAGS) $(CPPFLAGS) -c $< -o $@
139
140define do_install
141	$(call msg,INSTALL,$1)
142	$(Q)if [ ! -d '$(DESTDIR)$2' ]; then		\
143		$(INSTALL) -d -m 755 '$(DESTDIR)$2';	\
144	fi;
145	$(Q)$(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR)$2'
146endef
147
148# Preserve symlinks at installation.
149define do_s_install
150	$(call msg,INSTALL,$1)
151	$(Q)if [ ! -d '$(DESTDIR)$2' ]; then		\
152		$(INSTALL) -d -m 755 '$(DESTDIR)$2';	\
153	fi;
154	$(Q)cp -fR $1 '$(DESTDIR)$2'
155endef
156
157install: all install_headers install_pkgconfig
158	$(call do_s_install,$(STATIC_LIBS) $(SHARED_LIBS),$(LIBDIR))
159
160install_headers:
161	$(call do_install,$(HEADERS),$(INCLUDEDIR)/bpf,644)
162
163# UAPI headers can be installed by a different package so they're not installed
164# in by install rule.
165install_uapi_headers:
166	$(call do_install,$(UAPI_HEADERS),$(UAPIDIR)/linux,644)
167
168install_pkgconfig: $(PC_FILE)
169	$(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644)
170
171clean:
172	$(call msg,CLEAN)
173	$(Q)rm -rf *.o *.a *.so *.so.* *.pc $(SHARED_OBJDIR) $(STATIC_OBJDIR)
174
175.PHONY: cscope tags force
176cscope:
177	$(call msg,CSCOPE)
178	$(Q)ls *.c *.h > cscope.files
179	$(Q)cscope -b -q -f cscope.out
180
181tags:
182	$(call msg,CTAGS)
183	$(Q)rm -f TAGS tags
184	$(Q)ls *.c *.h | xargs $(TAGS_PROG) -a
185
186force:
187