linux/tools/lib/bpf/Makefile
<<
>>
Prefs
   1# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
   2# Most of this file is copied from tools/lib/traceevent/Makefile
   3
   4RM ?= rm
   5srctree = $(abs_srctree)
   6
   7LIBBPF_VERSION := $(shell \
   8        grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | \
   9        sort -rV | head -n1 | cut -d'_' -f2)
  10LIBBPF_MAJOR_VERSION := $(firstword $(subst ., ,$(LIBBPF_VERSION)))
  11
  12MAKEFLAGS += --no-print-directory
  13
  14# This will work when bpf is built in tools env. where srctree
  15# isn't set and when invoked from selftests build, where srctree
  16# is a ".". building_out_of_srctree is undefined for in srctree
  17# builds
  18ifndef building_out_of_srctree
  19srctree := $(patsubst %/,%,$(dir $(CURDIR)))
  20srctree := $(patsubst %/,%,$(dir $(srctree)))
  21srctree := $(patsubst %/,%,$(dir $(srctree)))
  22#$(info Determined 'srctree' to be $(srctree))
  23endif
  24
  25INSTALL = install
  26
  27# Use DESTDIR for installing into a different root directory.
  28# This is useful for building a package. The program will be
  29# installed in this directory as if it was the root directory.
  30# Then the build tool can move it later.
  31DESTDIR ?=
  32DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
  33
  34include $(srctree)/tools/scripts/Makefile.arch
  35
  36ifeq ($(LP64), 1)
  37  libdir_relative = lib64
  38else
  39  libdir_relative = lib
  40endif
  41
  42prefix ?= /usr/local
  43libdir = $(prefix)/$(libdir_relative)
  44man_dir = $(prefix)/share/man
  45man_dir_SQ = '$(subst ','\'',$(man_dir))'
  46
  47export man_dir man_dir_SQ INSTALL
  48export DESTDIR DESTDIR_SQ
  49
  50include $(srctree)/tools/scripts/Makefile.include
  51
  52# copy a bit from Linux kbuild
  53
  54ifeq ("$(origin V)", "command line")
  55  VERBOSE = $(V)
  56endif
  57ifndef VERBOSE
  58  VERBOSE = 0
  59endif
  60
  61INCLUDES = -I. -I$(srctree)/tools/include -I$(srctree)/tools/include/uapi
  62
  63export prefix libdir src obj
  64
  65# Shell quotes
  66libdir_SQ = $(subst ','\'',$(libdir))
  67libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
  68
  69OBJ             = $@
  70N               =
  71
  72LIB_TARGET      = libbpf.a libbpf.so.$(LIBBPF_VERSION)
  73LIB_FILE        = libbpf.a libbpf.so*
  74PC_FILE         = libbpf.pc
  75
  76# Set compile option CFLAGS
  77ifdef EXTRA_CFLAGS
  78  CFLAGS := $(EXTRA_CFLAGS)
  79else
  80  CFLAGS := -g -O2
  81endif
  82
  83# Append required CFLAGS
  84override CFLAGS += $(EXTRA_WARNINGS) -Wno-switch-enum
  85override CFLAGS += -Werror -Wall
  86override CFLAGS += $(INCLUDES)
  87override CFLAGS += -fvisibility=hidden
  88override CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
  89
  90# flags specific for shared library
  91SHLIB_FLAGS := -DSHARED -fPIC
  92
  93ifeq ($(VERBOSE),1)
  94  Q =
  95else
  96  Q = @
  97endif
  98
  99# Disable command line variables (CFLAGS) override from top
 100# level Makefile (perf), otherwise build Makefile will get
 101# the same command line setup.
 102MAKEOVERRIDES=
 103
 104all:
 105
 106export srctree OUTPUT CC LD CFLAGS V
 107include $(srctree)/tools/build/Makefile.include
 108
 109SHARED_OBJDIR   := $(OUTPUT)sharedobjs/
 110STATIC_OBJDIR   := $(OUTPUT)staticobjs/
 111BPF_IN_SHARED   := $(SHARED_OBJDIR)libbpf-in.o
 112BPF_IN_STATIC   := $(STATIC_OBJDIR)libbpf-in.o
 113VERSION_SCRIPT  := libbpf.map
 114BPF_HELPER_DEFS := $(OUTPUT)bpf_helper_defs.h
 115
 116LIB_TARGET      := $(addprefix $(OUTPUT),$(LIB_TARGET))
 117LIB_FILE        := $(addprefix $(OUTPUT),$(LIB_FILE))
 118PC_FILE         := $(addprefix $(OUTPUT),$(PC_FILE))
 119
 120TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags)
 121
 122GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN_SHARED) | \
 123                           cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
 124                           sed 's/\[.*\]//' | \
 125                           awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
 126                           sort -u | wc -l)
 127VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
 128                              sed 's/\[.*\]//' | \
 129                              awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
 130                              grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
 131
 132CMD_TARGETS = $(LIB_TARGET) $(PC_FILE)
 133
 134all: fixdep
 135        $(Q)$(MAKE) all_cmd
 136
 137all_cmd: $(CMD_TARGETS) check
 138
 139$(BPF_IN_SHARED): force $(BPF_HELPER_DEFS)
 140        @(test -f ../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \
 141        (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \
 142        echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true
 143        @(test -f ../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \
 144        (diff -B ../../include/uapi/linux/bpf_common.h ../../../include/uapi/linux/bpf_common.h >/dev/null) || \
 145        echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf_common.h' differs from latest version at 'include/uapi/linux/bpf_common.h'" >&2 )) || true
 146        @(test -f ../../include/uapi/linux/netlink.h -a -f ../../../include/uapi/linux/netlink.h && ( \
 147        (diff -B ../../include/uapi/linux/netlink.h ../../../include/uapi/linux/netlink.h >/dev/null) || \
 148        echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/netlink.h' differs from latest version at 'include/uapi/linux/netlink.h'" >&2 )) || true
 149        @(test -f ../../include/uapi/linux/if_link.h -a -f ../../../include/uapi/linux/if_link.h && ( \
 150        (diff -B ../../include/uapi/linux/if_link.h ../../../include/uapi/linux/if_link.h >/dev/null) || \
 151        echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/if_link.h' differs from latest version at 'include/uapi/linux/if_link.h'" >&2 )) || true
 152        @(test -f ../../include/uapi/linux/if_xdp.h -a -f ../../../include/uapi/linux/if_xdp.h && ( \
 153        (diff -B ../../include/uapi/linux/if_xdp.h ../../../include/uapi/linux/if_xdp.h >/dev/null) || \
 154        echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/if_xdp.h' differs from latest version at 'include/uapi/linux/if_xdp.h'" >&2 )) || true
 155        $(Q)$(MAKE) $(build)=libbpf OUTPUT=$(SHARED_OBJDIR) CFLAGS="$(CFLAGS) $(SHLIB_FLAGS)"
 156
 157$(BPF_IN_STATIC): force $(BPF_HELPER_DEFS)
 158        $(Q)$(MAKE) $(build)=libbpf OUTPUT=$(STATIC_OBJDIR)
 159
 160$(BPF_HELPER_DEFS): $(srctree)/tools/include/uapi/linux/bpf.h
 161        $(QUIET_GEN)$(srctree)/scripts/bpf_doc.py --header \
 162                --file $(srctree)/tools/include/uapi/linux/bpf.h > $(BPF_HELPER_DEFS)
 163
 164$(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION)
 165
 166$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED)
 167        $(QUIET_LINK)$(CC) $(LDFLAGS) \
 168                --shared -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \
 169                -Wl,--version-script=$(VERSION_SCRIPT) $^ -lelf -lz -o $@
 170        @ln -sf $(@F) $(OUTPUT)libbpf.so
 171        @ln -sf $(@F) $(OUTPUT)libbpf.so.$(LIBBPF_MAJOR_VERSION)
 172
 173$(OUTPUT)libbpf.a: $(BPF_IN_STATIC)
 174        $(QUIET_LINK)$(RM) -f $@; $(AR) rcs $@ $^
 175
 176$(OUTPUT)libbpf.pc:
 177        $(QUIET_GEN)sed -e "s|@PREFIX@|$(prefix)|" \
 178                -e "s|@LIBDIR@|$(libdir_SQ)|" \
 179                -e "s|@VERSION@|$(LIBBPF_VERSION)|" \
 180                < libbpf.pc.template > $@
 181
 182check: check_abi
 183
 184check_abi: $(OUTPUT)libbpf.so
 185        @if [ "$(GLOBAL_SYM_COUNT)" != "$(VERSIONED_SYM_COUNT)" ]; then  \
 186                echo "Warning: Num of global symbols in $(BPF_IN_SHARED)"        \
 187                     "($(GLOBAL_SYM_COUNT)) does NOT match with num of"  \
 188                     "versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \
 189                     "Please make sure all LIBBPF_API symbols are"       \
 190                     "versioned in $(VERSION_SCRIPT)." >&2;              \
 191                readelf -s --wide $(BPF_IN_SHARED) |                     \
 192                    cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' |   \
 193                    sed 's/\[.*\]//' |                                   \
 194                    awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'|  \
 195                    sort -u > $(OUTPUT)libbpf_global_syms.tmp;           \
 196                readelf --dyn-syms --wide $(OUTPUT)libbpf.so |           \
 197                    sed 's/\[.*\]//' |                                   \
 198                    awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'|  \
 199                    grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 |             \
 200                    sort -u > $(OUTPUT)libbpf_versioned_syms.tmp;        \
 201                diff -u $(OUTPUT)libbpf_global_syms.tmp                  \
 202                     $(OUTPUT)libbpf_versioned_syms.tmp;                 \
 203                rm $(OUTPUT)libbpf_global_syms.tmp                       \
 204                   $(OUTPUT)libbpf_versioned_syms.tmp;                   \
 205                exit 1;                                                  \
 206        fi
 207
 208define do_install_mkdir
 209        if [ ! -d '$(DESTDIR_SQ)$1' ]; then             \
 210                $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
 211        fi
 212endef
 213
 214define do_install
 215        if [ ! -d '$(DESTDIR_SQ)$2' ]; then             \
 216                $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \
 217        fi;                                             \
 218        $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
 219endef
 220
 221install_lib: all_cmd
 222        $(call QUIET_INSTALL, $(LIB_TARGET)) \
 223                $(call do_install_mkdir,$(libdir_SQ)); \
 224                cp -fpR $(LIB_FILE) $(DESTDIR)$(libdir_SQ)
 225
 226INSTALL_HEADERS = bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h xsk.h \
 227                  bpf_helpers.h $(BPF_HELPER_DEFS) bpf_tracing.h             \
 228                  bpf_endian.h bpf_core_read.h skel_internal.h
 229
 230install_headers: $(BPF_HELPER_DEFS)
 231        $(call QUIET_INSTALL, headers)                                       \
 232                $(foreach hdr,$(INSTALL_HEADERS),                            \
 233                        $(call do_install,$(hdr),$(prefix)/include/bpf,644);)
 234
 235install_pkgconfig: $(PC_FILE)
 236        $(call QUIET_INSTALL, $(PC_FILE)) \
 237                $(call do_install,$(PC_FILE),$(libdir_SQ)/pkgconfig,644)
 238
 239install: install_lib install_pkgconfig install_headers
 240
 241clean:
 242        $(call QUIET_CLEAN, libbpf) $(RM) -rf $(CMD_TARGETS)                 \
 243                *~ .*.d .*.cmd LIBBPF-CFLAGS $(BPF_HELPER_DEFS)              \
 244                $(SHARED_OBJDIR) $(STATIC_OBJDIR)                            \
 245                $(addprefix $(OUTPUT),                                       \
 246                            *.o *.a *.so *.so.$(LIBBPF_MAJOR_VERSION) *.pc)
 247
 248PHONY += force cscope tags
 249force:
 250
 251cscope:
 252        ls *.c *.h > cscope.files
 253        cscope -b -q -I $(srctree)/include -f cscope.out
 254
 255tags:
 256        $(RM) -f TAGS tags
 257        ls *.c *.h | xargs $(TAGS_PROG) -a
 258
 259# Declare the contents of the .PHONY variable as phony.  We keep that
 260# information in a variable so we can use it in if_changed and friends.
 261.PHONY: $(PHONY)
 262
 263# Delete partially updated (corrupted) files on error
 264.DELETE_ON_ERROR:
 265