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

test_bpftool_build.sh (3992B)


      1#!/bin/bash
      2# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
      3
      4case $1 in
      5	-h|--help)
      6		echo -e "$0 [-j <n>]"
      7		echo -e "\tTest the different ways of building bpftool."
      8		echo -e ""
      9		echo -e "\tOptions:"
     10		echo -e "\t\t-j <n>:\tPass -j flag to 'make'."
     11		exit 0
     12		;;
     13esac
     14
     15J=$*
     16
     17# Assume script is located under tools/testing/selftests/bpf/. We want to start
     18# build attempts from the top of kernel repository.
     19SCRIPT_REL_PATH=$(realpath --relative-to=$PWD $0)
     20SCRIPT_REL_DIR=$(dirname $SCRIPT_REL_PATH)
     21KDIR_ROOT_DIR=$(realpath $PWD/$SCRIPT_REL_DIR/../../../../)
     22cd $KDIR_ROOT_DIR
     23if [ ! -e tools/bpf/bpftool/Makefile ]; then
     24	echo -e "skip:    bpftool files not found!\n"
     25	exit 4 # KSFT_SKIP=4
     26fi
     27
     28ERROR=0
     29TMPDIR=
     30
     31# If one build fails, continue but return non-0 on exit.
     32return_value() {
     33	if [ -d "$TMPDIR" ] ; then
     34		rm -rf -- $TMPDIR
     35	fi
     36	exit $ERROR
     37}
     38trap return_value EXIT
     39
     40check() {
     41	local dir=$(realpath $1)
     42
     43	echo -n "binary:  "
     44	# Returns non-null if file is found (and "false" is run)
     45	find $dir -type f -executable -name bpftool -print -exec false {} + && \
     46		ERROR=1 && printf "FAILURE: Did not find bpftool\n"
     47}
     48
     49make_and_clean() {
     50	echo -e "\$PWD:    $PWD"
     51	echo -e "command: make -s $* >/dev/null"
     52	make $J -s $* >/dev/null
     53	if [ $? -ne 0 ] ; then
     54		ERROR=1
     55	fi
     56	if [ $# -ge 1 ] ; then
     57		check ${@: -1}
     58	else
     59		check .
     60	fi
     61	(
     62		if [ $# -ge 1 ] ; then
     63			cd ${@: -1}
     64		fi
     65		make -s clean
     66	)
     67	echo
     68}
     69
     70make_with_tmpdir() {
     71	local ARGS
     72
     73	TMPDIR=$(mktemp -d)
     74	if [ $# -ge 2 ] ; then
     75		ARGS=${@:1:(($# - 1))}
     76	fi
     77	echo -e "\$PWD:    $PWD"
     78	echo -e "command: make -s $ARGS ${@: -1}=$TMPDIR/ >/dev/null"
     79	make $J -s $ARGS ${@: -1}=$TMPDIR/ >/dev/null
     80	if [ $? -ne 0 ] ; then
     81		ERROR=1
     82	fi
     83	check $TMPDIR
     84	rm -rf -- $TMPDIR
     85	echo
     86}
     87
     88echo "Trying to build bpftool"
     89echo -e "... through kbuild\n"
     90
     91if [ -f ".config" ] ; then
     92	make_and_clean tools/bpf
     93	## "make tools/bpf" sets $(OUTPUT) to ...tools/bpf/runqslower for
     94	## runqslower, but the default (used for the "clean" target) is .output.
     95	## Let's make sure we clean runqslower's directory properly.
     96	make -C tools/bpf/runqslower OUTPUT=${KDIR_ROOT_DIR}/tools/bpf/runqslower/ clean
     97
     98	## $OUTPUT is overwritten in kbuild Makefile, and thus cannot be passed
     99	## down from toplevel Makefile to bpftool's Makefile.
    100
    101	# make_with_tmpdir tools/bpf OUTPUT
    102	echo -e "skip:    make tools/bpf OUTPUT=<dir> (not supported)\n"
    103
    104	make_with_tmpdir tools/bpf O
    105else
    106	echo -e "skip:    make tools/bpf (no .config found)\n"
    107	echo -e "skip:    make tools/bpf OUTPUT=<dir> (not supported)\n"
    108	echo -e "skip:    make tools/bpf O=<dir> (no .config found)\n"
    109fi
    110
    111echo -e "... from kernel source tree\n"
    112
    113make_and_clean -C tools/bpf/bpftool
    114
    115make_with_tmpdir -C tools/bpf/bpftool OUTPUT
    116
    117make_with_tmpdir -C tools/bpf/bpftool O
    118
    119echo -e "... from tools/\n"
    120cd tools/
    121
    122make_and_clean bpf
    123
    124## In tools/bpf/Makefile, function "descend" is called and passes $(O) and
    125## $(OUTPUT). We would like $(OUTPUT) to have "bpf/bpftool/" appended before
    126## calling bpftool's Makefile, but this is not the case as the "descend"
    127## function focuses on $(O)/$(subdir). However, in the present case, updating
    128## $(O) to have $(OUTPUT) recomputed from it in bpftool's Makefile does not
    129## work, because $(O) is not defined from command line and $(OUTPUT) is not
    130## updated in tools/scripts/Makefile.include.
    131##
    132## Workarounds would require to a) edit "descend" or use an alternative way to
    133## call bpftool's Makefile, b) modify the conditions to update $(OUTPUT) and
    134## other variables in tools/scripts/Makefile.include (at the risk of breaking
    135## the build of other tools), or c) append manually the "bpf/bpftool" suffix to
    136## $(OUTPUT) in bpf's Makefile, which may break if targets for other directories
    137## use "descend" in the future.
    138
    139# make_with_tmpdir bpf OUTPUT
    140echo -e "skip:    make bpf OUTPUT=<dir> (not supported)\n"
    141
    142make_with_tmpdir bpf O
    143
    144echo -e "... from bpftool's dir\n"
    145cd bpf/bpftool
    146
    147make_and_clean
    148
    149make_with_tmpdir OUTPUT
    150
    151make_with_tmpdir O