# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) VERSION = 0 PATCHLEVEL = 0 EXTRAVERSION = 4 LIBBPF_VERSION = $(VERSION).$(PATCHLEVEL).$(EXTRAVERSION) TOPDIR = .. INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi ALL_CFLAGS := $(INCLUDES) FEATURE_REALLOCARRAY := $(shell $(TOPDIR)/scripts/check-reallocarray.sh) ifneq ($(FEATURE_REALLOCARRAY),) ALL_CFLAGS += -DCOMPAT_NEED_REALLOCARRAY endif ifndef BUILD_STATIC_ONLY ALL_CFLAGS += -fPIC -fvisibility=hidden endif CFLAGS ?= -g -O2 -Werror -Wall ALL_CFLAGS += $(CFLAGS) ALL_LDFLAGS += $(LDFLAGS) ifdef NO_PKG_CONFIG ALL_LDFLAGS += -lelf else PKG_CONFIG ?= pkg-config ALL_CFLAGS += $(shell $(PKG_CONFIG) --cflags libelf) ALL_LDFLAGS += $(shell $(PKG_CONFIG) --libs libelf) endif OBJDIR ?= . OBJS := $(addprefix $(OBJDIR)/,bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o xsk.o \ btf_dump.o hashmap.o) LIBS := $(OBJDIR)/libbpf.a ifndef BUILD_STATIC_ONLY LIBS += $(OBJDIR)/libbpf.so \ $(OBJDIR)/libbpf.so.$(VERSION) \ $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) VERSION_SCRIPT := libbpf.map endif HEADERS := bpf.h libbpf.h btf.h xsk.h libbpf_util.h UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,bpf.h bpf_common.h \ btf.h) PC_FILE := $(OBJDIR)/libbpf.pc INSTALL = install DESTDIR ?= ifeq ($(shell uname -m),x86_64) LIBSUBDIR := lib64 else LIBSUBDIR := lib endif PREFIX ?= /usr LIBDIR ?= $(PREFIX)/$(LIBSUBDIR) INCLUDEDIR ?= $(PREFIX)/include UAPIDIR ?= $(PREFIX)/include all: $(LIBS) $(PC_FILE) $(OBJDIR)/libbpf.a: $(OBJS) $(AR) rcs $@ $^ $(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(VERSION) ln -sf $(^F) $@ $(OBJDIR)/libbpf.so.$(VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) ln -sf $(^F) $@ $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(OBJS) $(CC) -shared $(ALL_LDFLAGS) -Wl,--version-script=$(VERSION_SCRIPT) \ -Wl,-soname,libbpf.so.$(VERSION) \ $^ -o $@ $(OBJDIR)/libbpf.pc: sed -e "s|@PREFIX@|$(PREFIX)|" \ -e "s|@LIBDIR@|$(LIBDIR)|" \ -e "s|@VERSION@|$(LIBBPF_VERSION)|" \ < libbpf.pc.template > $@ $(OBJDIR)/%.o: %.c $(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@ define do_install if [ ! -d '$(DESTDIR)$2' ]; then \ $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ fi; \ $(INSTALL) $1 $(if $3,-m $3,) '$(DESTDIR)$2' endef # Preserve symlinks at installation. define do_s_install if [ ! -d '$(DESTDIR)$2' ]; then \ $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ fi; \ cp -fpR $1 '$(DESTDIR)$2' endef install: all install_headers install_pkgconfig $(call do_s_install,$(LIBS),$(LIBDIR)) install_headers: $(call do_install,$(HEADERS),$(INCLUDEDIR)/bpf,644) # UAPI headers can be installed by a different package so they're not installed # in by install rule. install_uapi_headers: $(call do_install,$(UAPI_HEADERS),$(UAPIDIR)/linux,644) install_pkgconfig: $(PC_FILE) $(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644) clean: rm -f *.o *.a *.so *.so.* *.pc