cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

Makefile (9961B)


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