mirror of
https://github.com/netdata/libbpf.git
synced 2026-03-23 01:39:06 +08:00
Determining the correct library installation path (lib vs. lib64) using uname(1) breaks in cross compilation scenarios where word widths differ between the host and target system. Instead, source the information from the compilers '-dumpmachine' option (supported by both GCC and Clang). We call this the "host" architecture, using the same nomenclature as Autotools (--host configure option). Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
184 lines
5.1 KiB
Makefile
184 lines
5.1 KiB
Makefile
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
|
|
|
|
ifeq ($(V),1)
|
|
Q =
|
|
msg =
|
|
else
|
|
Q = @
|
|
msg = @printf ' %-8s %s%s\n' "$(1)" "$(2)" "$(if $(3), $(3))";
|
|
endif
|
|
|
|
LIBBPF_MAJOR_VERSION := 1
|
|
LIBBPF_MINOR_VERSION := 1
|
|
LIBBPF_PATCH_VERSION := 0
|
|
LIBBPF_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).$(LIBBPF_PATCH_VERSION)
|
|
LIBBPF_MAJMIN_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).0
|
|
LIBBPF_MAP_VERSION := $(shell grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | sort -rV | head -n1 | cut -d'_' -f2)
|
|
ifneq ($(LIBBPF_MAJMIN_VERSION), $(LIBBPF_MAP_VERSION))
|
|
$(error Libbpf release ($(LIBBPF_VERSION)) and map ($(LIBBPF_MAP_VERSION)) versions are out of sync!)
|
|
endif
|
|
|
|
define allow-override
|
|
$(if $(or $(findstring environment,$(origin $(1))),\
|
|
$(findstring command line,$(origin $(1)))),,\
|
|
$(eval $(1) = $(2)))
|
|
endef
|
|
|
|
$(call allow-override,CC,$(CROSS_COMPILE)cc)
|
|
$(call allow-override,LD,$(CROSS_COMPILE)ld)
|
|
|
|
TOPDIR = ..
|
|
|
|
INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi
|
|
ALL_CFLAGS := $(INCLUDES)
|
|
|
|
SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED
|
|
|
|
CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89
|
|
ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS)
|
|
ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS)
|
|
|
|
ifdef NO_PKG_CONFIG
|
|
ALL_LDFLAGS += -lelf -lz
|
|
else
|
|
PKG_CONFIG ?= pkg-config
|
|
ALL_CFLAGS += $(shell $(PKG_CONFIG) --cflags libelf zlib)
|
|
ALL_LDFLAGS += $(shell $(PKG_CONFIG) --libs libelf zlib)
|
|
endif
|
|
|
|
OBJDIR ?= .
|
|
SHARED_OBJDIR := $(OBJDIR)/sharedobjs
|
|
STATIC_OBJDIR := $(OBJDIR)/staticobjs
|
|
OBJS := bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \
|
|
nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o \
|
|
btf_dump.o hashmap.o ringbuf.o strset.o linker.o gen_loader.o \
|
|
relo_core.o usdt.o
|
|
SHARED_OBJS := $(addprefix $(SHARED_OBJDIR)/,$(OBJS))
|
|
STATIC_OBJS := $(addprefix $(STATIC_OBJDIR)/,$(OBJS))
|
|
|
|
STATIC_LIBS := $(OBJDIR)/libbpf.a
|
|
ifndef BUILD_STATIC_ONLY
|
|
SHARED_LIBS := $(OBJDIR)/libbpf.so \
|
|
$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) \
|
|
$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION)
|
|
VERSION_SCRIPT := libbpf.map
|
|
endif
|
|
|
|
HEADERS := bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h \
|
|
bpf_helpers.h bpf_helper_defs.h bpf_tracing.h \
|
|
bpf_endian.h bpf_core_read.h skel_internal.h libbpf_version.h \
|
|
usdt.bpf.h
|
|
UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,\
|
|
bpf.h bpf_common.h btf.h)
|
|
|
|
PC_FILE := $(OBJDIR)/libbpf.pc
|
|
|
|
INSTALL = install
|
|
|
|
DESTDIR ?=
|
|
|
|
HOSTARCH = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine)))
|
|
ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(HOSTARCH)),)
|
|
LIBSUBDIR := lib64
|
|
else
|
|
LIBSUBDIR := lib
|
|
endif
|
|
|
|
# By default let the pc file itself use ${prefix} in includedir/libdir so that
|
|
# the prefix can be overridden at runtime (eg: --define-prefix)
|
|
ifndef LIBDIR
|
|
LIBDIR_PC := $$\{prefix\}/$(LIBSUBDIR)
|
|
else
|
|
LIBDIR_PC := $(LIBDIR)
|
|
endif
|
|
PREFIX ?= /usr
|
|
LIBDIR ?= $(PREFIX)/$(LIBSUBDIR)
|
|
INCLUDEDIR ?= $(PREFIX)/include
|
|
UAPIDIR ?= $(PREFIX)/include
|
|
|
|
TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags)
|
|
|
|
all: $(STATIC_LIBS) $(SHARED_LIBS) $(PC_FILE)
|
|
|
|
$(OBJDIR)/libbpf.a: $(STATIC_OBJS)
|
|
$(call msg,AR,$@)
|
|
$(Q)$(AR) rcs $@ $^
|
|
|
|
$(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION)
|
|
$(Q)ln -sf $(^F) $@
|
|
|
|
$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION)
|
|
$(Q)ln -sf $(^F) $@
|
|
|
|
$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(SHARED_OBJS)
|
|
$(call msg,CC,$@)
|
|
$(Q)$(CC) -shared -Wl,--version-script=$(VERSION_SCRIPT) \
|
|
-Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \
|
|
$^ $(ALL_LDFLAGS) -o $@
|
|
|
|
$(OBJDIR)/libbpf.pc: force
|
|
$(Q)sed -e "s|@PREFIX@|$(PREFIX)|" \
|
|
-e "s|@LIBDIR@|$(LIBDIR_PC)|" \
|
|
-e "s|@VERSION@|$(LIBBPF_VERSION)|" \
|
|
< libbpf.pc.template > $@
|
|
|
|
$(STATIC_OBJDIR) $(SHARED_OBJDIR):
|
|
$(call msg,MKDIR,$@)
|
|
$(Q)mkdir -p $@
|
|
|
|
$(STATIC_OBJDIR)/%.o: %.c | $(STATIC_OBJDIR)
|
|
$(call msg,CC,$@)
|
|
$(Q)$(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@
|
|
|
|
$(SHARED_OBJDIR)/%.o: %.c | $(SHARED_OBJDIR)
|
|
$(call msg,CC,$@)
|
|
$(Q)$(CC) $(ALL_CFLAGS) $(SHARED_CFLAGS) $(CPPFLAGS) -c $< -o $@
|
|
|
|
define do_install
|
|
$(call msg,INSTALL,$1)
|
|
$(Q)if [ ! -d '$(DESTDIR)$2' ]; then \
|
|
$(INSTALL) -d -m 755 '$(DESTDIR)$2'; \
|
|
fi;
|
|
$(Q)$(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR)$2'
|
|
endef
|
|
|
|
# Preserve symlinks at installation.
|
|
define do_s_install
|
|
$(call msg,INSTALL,$1)
|
|
$(Q)if [ ! -d '$(DESTDIR)$2' ]; then \
|
|
$(INSTALL) -d -m 755 '$(DESTDIR)$2'; \
|
|
fi;
|
|
$(Q)cp -fR $1 '$(DESTDIR)$2'
|
|
endef
|
|
|
|
install: all install_headers install_pkgconfig
|
|
$(call do_s_install,$(STATIC_LIBS) $(SHARED_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:
|
|
$(call msg,CLEAN)
|
|
$(Q)rm -rf *.o *.a *.so *.so.* *.pc $(SHARED_OBJDIR) $(STATIC_OBJDIR)
|
|
|
|
.PHONY: cscope tags force
|
|
cscope:
|
|
$(call msg,CSCOPE)
|
|
$(Q)ls *.c *.h > cscope.files
|
|
$(Q)cscope -b -q -f cscope.out
|
|
|
|
tags:
|
|
$(call msg,CTAGS)
|
|
$(Q)rm -f TAGS tags
|
|
$(Q)ls *.c *.h | xargs $(TAGS_PROG) -a
|
|
|
|
force:
|