| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # |
| # Copyright IBM Corp. 2008,2025 |
| # |
| |
| tree= |
| if [ "$1" ]; then |
| tree=$1 |
| shift |
| fi |
| |
| # shellcheck source=common.sh |
| . "$(dirname "$0")/common.sh" |
| |
| set -e |
| |
| bparent=$(dirname "$build_dir") |
| |
| line=$(tail -n 1 "$SHA1_FILE") |
| |
| # strip everything after the first tab character |
| stree=${line%% *} |
| if [ "$tree" ]; then |
| if [ "$tree" != "$stree" ]; then |
| printf 'That is not the last tree merged (%s v %s)\n' "$tree" "$stree" 1>&2 |
| exit 1 |
| fi |
| else |
| tree="$stree" |
| fi |
| obdir="$bparent/old/$tree" |
| |
| kselftest_targets=$(echo $(cat ../etc/kselftest-targets)) |
| |
| git push -f ${NEXT_BUILD_HOST}:${NEXT_BUILD_DIR} HEAD:refs/heads/next |
| |
| cmd="/bin/sh" |
| if [ "$build_host" ]; then |
| cmd="ssh -T $build_host" |
| fi |
| |
| log_regex='/^[[:space:]]+$/d |
| /^[.[:digit:]]+user [.[:digit:]]+system [:.[:digit:]]+elapsed [[:digit:]]+%CPU \([[:digit:]]+avgtext\+[[:digit:]]+avgdata [[:digit:]]+maxresident\)k$/d |
| /^[[:digit:]]+inputs\+[[:digit:]]+outputs \([[:digit:]]+major\+[[:digit:]]+minor\)pagefaults [[:digit:]]+swaps$/d |
| /^Setup is [[:digit:]]+ bytes \(padded to [[:digit:]]+ bytes\)\.$/d |
| /^System is [[:digit:]]+ kB$/d |
| /^CRC [[:xdigit:]]+$/d |
| /^Kernel: arch\/x86\/boot\/bzImage is ready \(#[[:digit:]]+\)$/d |
| s/^(WARNING: (modpost: )?(drivers\/built-in|vmlinux)\.o\(\.[^+]*\+0x)[[:xdigit:]]+(\): Section mismatch in reference from .*)$/\1XXXX\4/ |
| /^Warning: Kernel ABI header at /d |
| /^[[:space:]]+PERF_VERSION = /d |
| s/^(Parsed description of) [[:digit:]]+ (helper function)/\1 X \2/ |
| s/^[[:xdigit:]]+([[:space:]]+R_PPC64_(ADDR64|REL32)[[:space:]].*)$/XXX\1/' |
| |
| $cmd <<-EOF |
| |
| echo Building on \$(hostname) |
| |
| echo \$PATH | grep -q "\$HOME/bin" || export PATH="\$HOME/bin:\$PATH" |
| export LANG=C |
| |
| cd "$build_dir" || exit 1 |
| |
| export CCACHE_DIR="$bparent/.ccache" |
| export TMPDIR="$bparent/tmp" |
| |
| git reset --hard next || exit 1 |
| touch .scmversion || exit 1 |
| |
| g=../global.except |
| if [ -r \$g ]; then |
| KCONFIG_ALLCONFIG=\$g |
| export KCONFIG_ALLCONFIG |
| fi |
| |
| [ -d "$obdir" ] || mkdir -p "$obdir" || exit 1 |
| |
| sanitise_log() { |
| sed -E -e '$log_regex' | grep -vxFf $bparent/log-ignore |
| } |
| |
| do_fail() |
| { |
| sep='!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' |
| echo "\$sep" |
| echo "ERROR: \$1 build failed - log follows" |
| echo "\$sep" |
| cat "\$2" |
| if [ -n "\$3" ]; then |
| kill "\$3" || true |
| fi |
| killall make |
| rm .scmversion |
| exit 1 |
| } |
| |
| show_log() { |
| arch=\$1 |
| conf=\$2 |
| log=\$3 |
| |
| sep='======================================================================' |
| |
| echo "\$sep" |
| echo " \$arch \$conf build OK - log follows" |
| echo "\$sep" |
| cat \$log |
| b=\$(basename \$log) |
| olen=0 |
| if [ -f $obdir/\$b ]; then |
| olen=\$(sanitise_log <$obdir/\$b | wc -l) |
| fi |
| len=\$(sanitise_log <\$log | wc -l) |
| if [ \$len -gt \$olen ]; then |
| echo "\$sep" |
| echo " log \$b increased number of lines" |
| echo "\$sep" |
| linux-next-notify "\$arch \$conf log got bigger" |
| if [ -f $obdir/\$b ]; then |
| diff -u $obdir/\$b \$log 2>&1 | less |
| else |
| diff -u /dev/null \$log 2>&1 | less |
| fi |
| fi |
| if [ \$len -gt 0 ]; then |
| (sanitise_log <\$log; cat $bparent/log-ignore ) | |
| sort -u >$bparent/log-ignore.tmp |
| mv $bparent/log-ignore.tmp $bparent/log-ignore |
| fi |
| mv \$log $obdir/\$b |
| } |
| |
| echo Building: perf |
| d="$bparent/perf" |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_perf=\$d.log |
| |
| if ! /usr/bin/time make -C tools/perf -f Makefile.perf -s -O O=\$d NO_BPF_SKEL=1 > \$log_perf 2>&1; then |
| do_fail perf "\$log_perf" |
| fi |
| |
| show_log native perf \$log_perf |
| |
| echo Building: arm64 allnoconfig |
| d="$bparent/arm64_allnoconfig" |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_arm64_allno=\$d.log |
| make ARCH=arm64 O=\$d -s allnoconfig || exit 1 |
| |
| if ! /usr/bin/time make ARCH=arm64 O=\$d -j200 -O -s > \$log_arm64_allno 2>&1; then |
| do_fail "arm64 allnoconfig" "\$log_arm64_allno" |
| fi |
| |
| show_log arm64 allnoconfig \$log_arm64_allno |
| |
| echo Building: arm64 defconfig |
| d="$bparent/arm64_defconfig" |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_arm64=\$d.log |
| make ARCH=arm64 O=\$d -s defconfig || exit 1 |
| |
| if ! /usr/bin/time make ARCH=arm64 O=\$d -j200 -O -s > \$log_arm64 2>&1; then |
| do_fail "arm64 defconfig" "\$log_arm64" |
| fi |
| |
| show_log arm64 defconfig \$log_arm64 |
| |
| echo Building: arm multi_v7_defconfig |
| d="$bparent/arm_multi_v7_defconfig" |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_arm=\$d.log |
| make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=\$d -s multi_v7_defconfig || exit 1 |
| |
| if ! /usr/bin/time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=\$d -j200 -O -s > \$log_arm 2>&1; then |
| do_fail 'arm multi_v7_defconfig' "\$log_arm" |
| fi |
| |
| show_log arm multi_v7_defconfig \$log_arm |
| |
| echo Building: arm64 kselftest |
| d="$bparent/arm64_kselftest" |
| # I do not trust the kselftest build system to do deps |
| rm -rf \$d |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_kselftest=\$d.log |
| make -j${j_factor} ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=\$d -s headers_install || exit 1 |
| |
| if ! /usr/bin/time make -j200 ARCH=arm64 -C tools/testing/selftests TARGETS="${kselftest_targets}" FORCE_TARGETS=1 CROSS_COMPILE=aarch64-linux-gnu- KBUILD_OUTPUT=\$d O=\$d -O -s > \$log_kselftest 2>&1; then |
| do_fail 'arm64 kselftest' "\$log_kselftest" |
| fi |
| # headers_install pollutes the tree for generated files :( |
| git clean -d -x -f |
| touch .scmversion || exit 1 |
| |
| show_log arm64 kselftest \$log_kselftest |
| |
| echo Building: arm64 kunit |
| d="$bparent/arm64_kunit" |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_kunit=\$d.log |
| json_kunit=\$d.json |
| if ! ./tools/testing/kunit/kunit.py run --make_options LLVM=1 --failed --alltests --kconfig_add CONFIG_KASAN=y --kconfig_add CONFIG_RUST=y --build_dir \$d --arch arm64 --cross_compile=aarch64-linux-gnu- --json="\$json_kunit" > \$log_kunit 2>&1 ; then |
| echo kunit run failed |
| do_fail 'arm64 kunit' "\$log_kunit" |
| fi |
| |
| if [ "\$(jq '[.misc.failed, .misc.crashed, .misc.errors] | add' < "\$json_kunit")" != "0" ]; then |
| echo kunit test failed |
| echo do_fail 'arm64 kunit' "\$log_kunit" |
| fi |
| |
| show_log arm64 kunit \$log_kunit |
| |
| echo Building: x86_64 allmodconfig |
| d="$bparent/x86_64_allmodconfig" |
| [ -d \$d ] || mkdir \$d || exit 1 |
| log_x86=\$d.log |
| make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- O=\$d -s allmodconfig || exit 1 |
| |
| if ! /usr/bin/time make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- CLIPPY=1 O=\$d -j200 -O -s > \$log_x86 2>&1; then |
| do_fail "x86_64 allmodconfig" "\$log_x86" |
| fi |
| if ! /usr/bin/time make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- CLIPPY=1 O=\$d -j200 -O -s rustfmtcheck >> \$log_x86 2>&1; then |
| do_fail "x86_64 allmodconfig rustfmtcheck" "\$log_x86" |
| fi |
| |
| show_log x86_64 allmodconfig \$log_x86 |
| |
| |
| rm .scmversion |
| EOF |
| |
| echo -n > ../unbuilt |