From a82a66eda3b1965d786960b61c1899011a15368d Mon Sep 17 00:00:00 2001 From: Andrey Ignatov Date: Thu, 11 Oct 2018 14:58:49 -0700 Subject: [PATCH] Extend build and add install rules to Makefile Introduce multiple improvements to Makefile to make the build more flexible and support install: * Support overriding CFLAGS by user but keep required flags in place. ALL_FLAGS is used in Makefile as recommended in [1]. * Add additional BUILD_SHARED flag to build dynamically linked flavor of the library. If the flag is set, -fPIC is also passed to make it possible to build .so. * Support building in a separate directory provided by OBJDIR variable. * Add multiple install targets. By default the library itself and libbpf headers are installed (install target). UAPI headers can be optionally installed by user. * All installation paths, including PREFIX, library and include directories can be overridden. UAPI can be made different from include directory for libbpf headers. That makes it possible to keep latest in a place that doesn't conflict with the one installed e.g. by kernel-headers package and use it in user's build system. * Support DESTDIR (see [2]). * Support overriding LDFLAGS. * Use utilities such as rm directly as recommended in [3]. * Use compiler and related programs (such as ar) via make variables as recommended in [3]. * In clean rule remove all possible build artifacts not to rely on passed options (e.g. if build was done w/ BUILD_SHARED, but clean w/o it). * Document new build options in README. [1] https://www.gnu.org/software/make/manual/html_node/Command-Variables.html#Command-Variables [2] https://www.gnu.org/prep/standards/html_node/DESTDIR.html [3] https://www.gnu.org/software/make/manual/html_node/Utilities-in-Makefiles.html#Utilities-in-Makefiles Signed-off-by: Andrey Ignatov --- README | 10 +++++-- src/Makefile | 75 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 73 insertions(+), 12 deletions(-) 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