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
  <linux/bpf.h> 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 <rdna@fb.com>
This commit is contained in:
Andrey Ignatov 2018-10-11 14:58:49 -07:00
parent c2015d0a65
commit a82a66eda3
2 changed files with 73 additions and 12 deletions

10
README
View File

@ -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

View File

@ -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