mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 16:38:12 +00:00
41d5c37b74
eBPF selftests include a script to check that bpftool builds correctly with different command lines. Let's add one build for bpftool's documentation so as to detect errors or warning reported by rst2man when compiling the man pages. Also add a build to the selftests Makefile to make sure we build bpftool documentation along with bpftool when building the selftests. This also builds and checks warnings for the man page for eBPF helpers, which is built along bpftool's documentation. This change adds rst2man as a dependency for selftests (it comes with Python's "docutils"). v2: - Use "--exit-status=1" option for rst2man instead of counting lines from stderr. - Also build bpftool as part as the selftests build (and not only when the tests are actually run). Signed-off-by: Quentin Monnet <quentin@isovalent.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200909162251.15498-3-quentin@isovalent.com
168 lines
4 KiB
Bash
Executable file
168 lines
4 KiB
Bash
Executable file
#!/bin/bash
|
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
|
|
|
case $1 in
|
|
-h|--help)
|
|
echo -e "$0 [-j <n>]"
|
|
echo -e "\tTest the different ways of building bpftool."
|
|
echo -e ""
|
|
echo -e "\tOptions:"
|
|
echo -e "\t\t-j <n>:\tPass -j flag to 'make'."
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
J=$*
|
|
|
|
# Assume script is located under tools/testing/selftests/bpf/. We want to start
|
|
# build attempts from the top of kernel repository.
|
|
SCRIPT_REL_PATH=$(realpath --relative-to=$PWD $0)
|
|
SCRIPT_REL_DIR=$(dirname $SCRIPT_REL_PATH)
|
|
KDIR_ROOT_DIR=$(realpath $PWD/$SCRIPT_REL_DIR/../../../../)
|
|
cd $KDIR_ROOT_DIR
|
|
if [ ! -e tools/bpf/bpftool/Makefile ]; then
|
|
echo -e "skip: bpftool files not found!\n"
|
|
exit 0
|
|
fi
|
|
|
|
ERROR=0
|
|
TMPDIR=
|
|
|
|
# If one build fails, continue but return non-0 on exit.
|
|
return_value() {
|
|
if [ -d "$TMPDIR" ] ; then
|
|
rm -rf -- $TMPDIR
|
|
fi
|
|
exit $ERROR
|
|
}
|
|
trap return_value EXIT
|
|
|
|
check() {
|
|
local dir=$(realpath $1)
|
|
|
|
echo -n "binary: "
|
|
# Returns non-null if file is found (and "false" is run)
|
|
find $dir -type f -executable -name bpftool -print -exec false {} + && \
|
|
ERROR=1 && printf "FAILURE: Did not find bpftool\n"
|
|
}
|
|
|
|
make_and_clean() {
|
|
echo -e "\$PWD: $PWD"
|
|
echo -e "command: make -s $* >/dev/null"
|
|
make $J -s $* >/dev/null
|
|
if [ $? -ne 0 ] ; then
|
|
ERROR=1
|
|
fi
|
|
if [ $# -ge 1 ] ; then
|
|
check ${@: -1}
|
|
else
|
|
check .
|
|
fi
|
|
(
|
|
if [ $# -ge 1 ] ; then
|
|
cd ${@: -1}
|
|
fi
|
|
make -s clean
|
|
)
|
|
echo
|
|
}
|
|
|
|
make_with_tmpdir() {
|
|
local ARGS
|
|
|
|
TMPDIR=$(mktemp -d)
|
|
if [ $# -ge 2 ] ; then
|
|
ARGS=${@:1:(($# - 1))}
|
|
fi
|
|
echo -e "\$PWD: $PWD"
|
|
echo -e "command: make -s $ARGS ${@: -1}=$TMPDIR/ >/dev/null"
|
|
make $J -s $ARGS ${@: -1}=$TMPDIR/ >/dev/null
|
|
if [ $? -ne 0 ] ; then
|
|
ERROR=1
|
|
fi
|
|
check $TMPDIR
|
|
rm -rf -- $TMPDIR
|
|
echo
|
|
}
|
|
|
|
make_doc_and_clean() {
|
|
echo -e "\$PWD: $PWD"
|
|
echo -e "command: make -s $* doc >/dev/null"
|
|
RST2MAN_OPTS="--exit-status=1" make $J -s $* doc
|
|
if [ $? -ne 0 ] ; then
|
|
ERROR=1
|
|
printf "FAILURE: Errors or warnings when building documentation\n"
|
|
fi
|
|
(
|
|
if [ $# -ge 1 ] ; then
|
|
cd ${@: -1}
|
|
fi
|
|
make -s doc-clean
|
|
)
|
|
echo
|
|
}
|
|
|
|
echo "Trying to build bpftool"
|
|
echo -e "... through kbuild\n"
|
|
|
|
if [ -f ".config" ] ; then
|
|
make_and_clean tools/bpf
|
|
|
|
## $OUTPUT is overwritten in kbuild Makefile, and thus cannot be passed
|
|
## down from toplevel Makefile to bpftool's Makefile.
|
|
|
|
# make_with_tmpdir tools/bpf OUTPUT
|
|
echo -e "skip: make tools/bpf OUTPUT=<dir> (not supported)\n"
|
|
|
|
make_with_tmpdir tools/bpf O
|
|
else
|
|
echo -e "skip: make tools/bpf (no .config found)\n"
|
|
echo -e "skip: make tools/bpf OUTPUT=<dir> (not supported)\n"
|
|
echo -e "skip: make tools/bpf O=<dir> (no .config found)\n"
|
|
fi
|
|
|
|
echo -e "... from kernel source tree\n"
|
|
|
|
make_and_clean -C tools/bpf/bpftool
|
|
|
|
make_with_tmpdir -C tools/bpf/bpftool OUTPUT
|
|
|
|
make_with_tmpdir -C tools/bpf/bpftool O
|
|
|
|
echo -e "... from tools/\n"
|
|
cd tools/
|
|
|
|
make_and_clean bpf
|
|
|
|
## In tools/bpf/Makefile, function "descend" is called and passes $(O) and
|
|
## $(OUTPUT). We would like $(OUTPUT) to have "bpf/bpftool/" appended before
|
|
## calling bpftool's Makefile, but this is not the case as the "descend"
|
|
## function focuses on $(O)/$(subdir). However, in the present case, updating
|
|
## $(O) to have $(OUTPUT) recomputed from it in bpftool's Makefile does not
|
|
## work, because $(O) is not defined from command line and $(OUTPUT) is not
|
|
## updated in tools/scripts/Makefile.include.
|
|
##
|
|
## Workarounds would require to a) edit "descend" or use an alternative way to
|
|
## call bpftool's Makefile, b) modify the conditions to update $(OUTPUT) and
|
|
## other variables in tools/scripts/Makefile.include (at the risk of breaking
|
|
## the build of other tools), or c) append manually the "bpf/bpftool" suffix to
|
|
## $(OUTPUT) in bpf's Makefile, which may break if targets for other directories
|
|
## use "descend" in the future.
|
|
|
|
# make_with_tmpdir bpf OUTPUT
|
|
echo -e "skip: make bpf OUTPUT=<dir> (not supported)\n"
|
|
|
|
make_with_tmpdir bpf O
|
|
|
|
echo -e "... from bpftool's dir\n"
|
|
cd bpf/bpftool
|
|
|
|
make_and_clean
|
|
|
|
make_with_tmpdir OUTPUT
|
|
|
|
make_with_tmpdir O
|
|
|
|
echo -e "Checking documentation build\n"
|
|
# From tools/bpf/bpftool
|
|
make_doc_and_clean
|