diff --git a/README b/README index 662c422..54de29e 100644 --- a/README +++ b/README @@ -18,7 +18,13 @@ successful. Build ===== -To build, +To build static library libbpf.a: cd src make -and it will build libbpf.a library + +To build both static libbpf.a and shared libbpf.so libraries in directory +build/ and install them together with libbpf headers in a staging directory +root/: + cd src + mkdir build root + BUILD_SHARED=y OBJDIR=build DESTDIR=root make install diff --git a/src/Makefile b/src/Makefile index 9d4fa44..25ebb06 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,23 +1,78 @@ # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) TOPDIR = .. -INCLUDES = -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi -CFLAGS = $(INCLUDES) -O2 -Werror -Wall + +INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi +ALL_CFLAGS := $(INCLUDES) FEATURE_REALLOCARRAY := $(shell $(TOPDIR)/scripts/check-reallocarray.sh) ifneq ($(FEATURE_REALLOCARRAY),) - CFLAGS += -DCOMPAT_NEED_REALLOCARRAY + ALL_CFLAGS += -DCOMPAT_NEED_REALLOCARRAY endif -OBJFILES = bpf.o btf.o libbpf.o libbpf_errno.o netlink.o nlattr.o str_error.o +ifdef BUILD_SHARED + ALL_CFLAGS += -fPIC +endif -all: libbpf.a +CFLAGS ?= -g -O2 -Werror -Wall +ALL_CFLAGS += $(CFLAGS) -libbpf.a: $(OBJFILES) - /bin/rm -f $@; /bin/ar rcs $@ $^ +OBJDIR ?= . -%.o: %.c - gcc $(CFLAGS) -c $< -o $@ +OBJS := $(addprefix $(OBJDIR)/,bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ + nlattr.o str_error.o) + +LIBS := $(OBJDIR)/libbpf.a +ifdef BUILD_SHARED + LIBS += $(OBJDIR)/libbpf.so +endif + +HEADERS := bpf.h libbpf.h btf.h +UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,bpf.h btf.h) + +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) + +$(OBJDIR)/libbpf.a: $(OBJS) + $(AR) rcs $@ $^ + +$(OBJDIR)/libbpf.so: $(OBJS) + $(CC) -shared $(LDFLAGS) $^ -o $@ + +$(OBJDIR)/%.o: %.c + $(CC) $(ALL_CFLAGS) -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 + +install: all install_headers + $(call do_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) clean: - /bin/rm -f libbpf.a $(OBJFILES) + rm -f *.o *.a *.so