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