-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'bpf-bpftool-build-improvements'
Quentin Monnet says: ==================== This set attempts to make it easier to build bpftool, in particular when passing a specific output directory. This is a follow-up to the conversation held last month by Lorenz, Ilya and Jakub [0]. The first patch is a minor fix to bpftool's Makefile, regarding the retrieval of kernel version (which currently prints a non-relevant make warning on some invocations). Second patch improves the Makefile commands to support more "make" invocations, or to fix building with custom output directory. On Jakub's suggestion, a script is also added to BPF selftests in order to keep track of the supported build variants. Building bpftool with "make tools/bpf" from the top of the repository generates files in "libbpf/" and "feature/" directories under tools/bpf/ and tools/bpf/bpftool/. The third patch ensures such directories are taken care of on "make clean", and add them to the relevant .gitignore files. At last, fourth patch is a sligthly modified version of Ilya's fix regarding libbpf.a appearing twice on the linking command for bpftool. [0] https://lore.kernel.org/bpf/CACAyw9-CWRHVH3TJ=Tke2x8YiLsH47sLCijdp=V+5M836R9aAA@mail.gmail.com/ v2: - Return error from check script if one of the make invocations returns non-zero (even if binary is successfully produced). - Run "make clean" from bpf/ and not only bpf/bpftool/ in that same script, when relevant. - Add a patch to clean up generated "feature/" and "libbpf/" directories. ==================== Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Tested-by: Ilya Leoshkevich <iii@linux.ibm.com> Cc: Lorenz Bauer <lmb@cloudflare.com> Cc: Ilya Leoshkevich <iii@linux.ibm.com> Cc: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
- Loading branch information
Showing
6 changed files
with
167 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
FEATURE-DUMP.bpf | ||
feature | ||
bpf_asm | ||
bpf_dbg | ||
bpf_exp.yacc.* | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,3 +3,5 @@ | |
bpftool*.8 | ||
bpf-helpers.* | ||
FEATURE-DUMP.bpftool | ||
feature | ||
libbpf |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
#!/bin/bash | ||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||
|
||
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 | ||
|
||
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 | ||
;; | ||
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 | ||
|
||
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 | ||
} | ||
|
||
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 |