1 #!/bin/bash 2 # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 3 4 case $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 ;; 13 esac 14 15 J=$* 16 17 # Assume script is located under tools/testing/selftests/bpf/. We want to start 18 # build attempts from the top of kernel repository. 19 SCRIPT_REL_PATH=$(realpath --relative-to=$PWD $0) 20 SCRIPT_REL_DIR=$(dirname $SCRIPT_REL_PATH) 21 KDIR_ROOT_DIR=$(realpath $PWD/$SCRIPT_REL_DIR/../../../../) 22 cd $KDIR_ROOT_DIR 23 if [ ! -e tools/bpf/bpftool/Makefile ]; then 24 echo -e "skip: bpftool files not found!\n" 25 exit 4 # KSFT_SKIP=4 26 fi 27 28 ERROR=0 29 TMPDIR= 30 31 # If one build fails, continue but return non-0 on exit. 32 return_value() { 33 if [ -d "$TMPDIR" ] ; then 34 rm -rf -- $TMPDIR 35 fi 36 exit $ERROR 37 } 38 trap return_value EXIT 39 40 check() { 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 49 make_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 70 make_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 88 echo "Trying to build bpftool" 89 echo -e "... through kbuild\n" 90 91 if [ -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 105 else 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" 109 fi 110 111 echo -e "... from kernel source tree\n" 112 113 make_and_clean -C tools/bpf/bpftool 114 115 make_with_tmpdir -C tools/bpf/bpftool OUTPUT 116 117 make_with_tmpdir -C tools/bpf/bpftool O 118 119 echo -e "... from tools/\n" 120 cd tools/ 121 122 make_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 140 echo -e "skip: make bpf OUTPUT=<dir> (not supported)\n" 141 142 make_with_tmpdir bpf O 143 144 echo -e "... from bpftool's dir\n" 145 cd bpf/bpftool 146 147 make_and_clean 148 149 make_with_tmpdir OUTPUT 150 151 make_with_tmpdir O
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.