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