summaryrefslogtreecommitdiff
path: root/tcwg_kernel-build.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tcwg_kernel-build.sh')
-rwxr-xr-xtcwg_kernel-build.sh168
1 files changed, 98 insertions, 70 deletions
diff --git a/tcwg_kernel-build.sh b/tcwg_kernel-build.sh
index ab169e5b..9485e0ba 100755
--- a/tcwg_kernel-build.sh
+++ b/tcwg_kernel-build.sh
@@ -4,26 +4,19 @@ set -euf -o pipefail
scripts=$(dirname $0)
. $scripts/jenkins-helpers.sh
+. $scripts/round-robin.sh
convert_args_to_variables "$@"
obligatory_variables rr[ci_config]
-# Execution mode: baseline, bisect, continue, jenkins-full
+# Execution mode: baseline, bisect, jenkins-full
rr[mode]="${rr[mode]-baseline}"
-case "${rr[mode]}" in
- "jenkins-full")
- obligatory_variables rr[current_project] rr[current_branch]
- ;;
-esac
-
# Set custom revision for one of the projects, and use baseline revisions
# for all other projects.
rr[ci_project]="${rr[ci_project]-tcwg_kernel}"
rr[baseline_branch]="${rr[baseline_branch]-linaro-local/ci/${rr[ci_project]}/${rr[ci_config]}}"
-rr[current_branch]="${rr[current_branch]-default}"
-rr[current_project]="${rr[current_project]-none}"
rr[reset_baseline]="${rr[reset_baseline]-false}"
rr[top_artifacts]="${rr[top_artifacts]-$(pwd)/artifacts}"
@@ -32,9 +25,22 @@ IFS=- read -a ci_config <<EOF
${rr[ci_config]}
EOF
rr[toolchain]=${rr[toolchain]-${ci_config[0]}}
+rr[release]=${rr[release]-${ci_config[1]}}
rr[target]=${rr[target]-${ci_config[2]}}
rr[linux_config]=${rr[linux_config]-${ci_config[4]}}
+case "${rr[toolchain]}" in
+ llvm) rr[components]="llvm linux" ;;
+ gnu) rr[components]="binutils gcc linux" ;;
+ *) assert false ;;
+esac
+
+# Use baseline branches by default.
+for c in ${rr[components]}; do
+ rr[${c}_branch]=${rr[${c}_branch]-baseline}
+ obligatory_variables rr[${c}_url]
+done
+
start_at="${start_at-default}"
finish_at="${finish_at-default}"
verbose="${verbose-true}"
@@ -47,29 +53,21 @@ trap "eval \"echo ERROR at \${FUNCNAME[0]}:\${BASH_LINENO[0]}\"" EXIT
# Set start and finish steps for different modes.
default_start_at=""
default_finish_at=""
-base_artifacts_opt="base-artifacts"
case "${rr[mode]}" in
"baseline")
default_finish_at="update_baseline"
;;
"bisect")
- case "${rr[toolchain]}:${rr[current_project]}" in
+ case "${rr[toolchain]}:$(print_single_updated_component)" in
gnu:binutils) default_start_at="build_abe-binutils" ;;
gnu:gcc) default_start_at="build_abe-stage1" ;;
- gnu:linux) default_start_at="count_linux_objs" ;;
+ gnu:linux) default_start_at="build_linux" ;;
llvm:llvm) default_start_at="build_llvm" ;;
- llvm:linux) default_start_at="count_linux_objs" ;;
+ llvm:linux) default_start_at="build_linux" ;;
+ *) assert false ;;
esac
default_finish_at="check_regression"
;;
- "continue")
- # Developer mode.
- case "${rr[toolchain]}" in
- "gnu") default_start_at="prepare_abe" ;;
- "llvm") default_start_at="build_llvm" ;;
- esac
- base_artifacts_opt=""
- ;;
"jenkins-full") ;;
esac
if [ x"$start_at" = x"default" ]; then
@@ -79,12 +77,10 @@ if [ x"$finish_at" = x"default" ]; then
finish_at="$default_finish_at"
fi
-run_step_init "$start_at" "$finish_at" "${rr[top_artifacts]}" "$base_artifacts_opt" "$verbose"
-
-. $scripts/round-robin.sh
+run_step_init "$start_at" "$finish_at" "${rr[top_artifacts]}" "$verbose"
# Build Linux kernel
-build_linux ()
+build_linux_1 ()
{
(
set -euf -o pipefail
@@ -94,7 +90,7 @@ build_linux ()
rm -rf $(pwd)/bin
mkdir $(pwd)/bin
- local bin cc
+ local bin cc ld_opt
case "${rr[toolchain]}" in
llvm)
@@ -107,6 +103,12 @@ build_linux ()
;;
esac
+ case "${rr[toolchain]}-${rr[release]}-${rr[target]}-${rr[linux_config]}" in
+ llvm-*-aarch64-defconfig) ld_opt="LD=$bin/ld.lld" ;;
+ llvm-master-arm-defconfig) ld_opt="LD=$bin/ld.lld" ;;
+ *) ld_opt="" ;;
+ esac
+
# Use binutils, etc from $bin
export PATH="$bin:$PATH"
@@ -114,7 +116,8 @@ build_linux ()
# Otherwise the compiler is new in every build and we would
# only clobber ccache volume.
local ccache=""
- if [ x"${rr[mode]}" != x"jenkins-full" -a x"${rr[current_project]}" = x"linux" ]; then
+ if [ x"${rr[mode]}" != x"jenkins-full" \
+ -a x"$(print_single_updated_component)" = x"linux" ]; then
ccache="ccache"
fi
cat > $(pwd)/bin/${rr[target]}-cc <<EOF
@@ -124,7 +127,7 @@ EOF
chmod +x $(pwd)/bin/${rr[target]}-cc
# Define make variables.
- local opts="CC=$(pwd)/bin/${rr[target]}-cc SUBLEVEL=0 EXTRAVERSION=-bisect"
+ local opts="CC=$(pwd)/bin/${rr[target]}-cc $ld_opt SUBLEVEL=0 EXTRAVERSION=-bisect"
if [ x"${rr[target]}" != x"$(uname -m)" ]; then
opts="$opts ARCH=$(print_kernel_target ${rr[target]})"
opts="$opts CROSS_COMPILE=$(print_gnu_target ${rr[target]})-"
@@ -144,34 +147,61 @@ EOF
KBUILD_BUILD_TIMESTAMP=0 make $opts -j$(nproc --all) -s -k &
local res=0 && wait $! || res=$?
ccache -s
- cp include/config/kernel.release $run_step_artifacts/
return $res
)
}
-# Count number successfully built .o files in linux (and build linux)
-count_linux_objs ()
+# Build linux and count number successfully built .o files in linux
+build_linux ()
{
(
set -euf -o pipefail
- if true; then
- build_linux &
- local res=0; wait $! || res=$?
-
- # Number of .o files created is the main success metric.
- echo "linux_n_obj:" >> ${rr[top_artifacts]}/results
- if [ $res != 0 ]; then
- local linux_n_obj
- linux_n_obj=$(find linux -name "*.o" | wc -l)
- echo "$linux_n_obj" >> ${rr[top_artifacts]}/results
- else
- echo "all" >> ${rr[top_artifacts]}/results
- fi
+ build_linux_1 &
+ local res=0 && wait $! || res=$?
+
+ # Number of .o files created is the main success metric.
+ local linux_n_obj
+ linux_n_obj=$(find linux -name "*.o" | wc -l)
+ echo "linux_n_obj:" >> ${rr[top_artifacts]}/results
+ echo "$linux_n_obj" >> ${rr[top_artifacts]}/results
+
+ if [ $res = 0 ]; then
+ echo "linux build successful:" >> ${rr[top_artifacts]}/results
+ echo "all" >> ${rr[top_artifacts]}/results
fi
+
+ return $res
)
}
+# Boot linux kernel
+boot_linux ()
+{
+ (
+ set -euf -o pipefail
+
+ local image cpu
+ case ${rr[target]} in
+ aarch64)
+ image=linux/arch/arm64/boot/Image.gz
+ cpu="-cpu cortex-a53"
+ ;;
+ arm)
+ image=linux/arch/arm/boot/zImage
+ cpu=""
+ ;;
+ *) assert false ;;
+ esac
+ timeout 10s qemu-system-${rr[target]} \
+ -kernel $image -machine virt $cpu -m 512 \
+ -serial mon:stdio -display none \
+ -append "console=ttyAMA0 panic=-1" -no-reboot
+
+ echo "linux boot successful:" >> ${rr[top_artifacts]}/results
+ echo "boot" >> ${rr[top_artifacts]}/results
+ )
+}
# Exit with code 0 if no regression compared to base-artifacts/results.
no_regression_p ()
@@ -182,37 +212,34 @@ no_regression_p ()
local linux_n_obj
linux_n_obj=$(tail -n1 ${rr[top_artifacts]}/results)
- if [ x"$linux_n_obj" = x"all" ]; then
- # Ideal result, no need to compare to baseline.
- return 0
- fi
-
- if ! [ "$linux_n_obj" -ge "-10" ]; then
- # Something is very wrong with result (e.g., it's not a number).
- return 1
- fi
-
# Assume worst for non-existent baseline.
local base_linux_n_obj="-10"
-
if [ -f base-artifacts/results ]; then
base_linux_n_obj=$(tail -n1 base-artifacts/results)
- if [ x"$base_linux_n_obj" = x"all" ]; then
- # Current build is not ideal, so make sure baseline "all" is
- # better than the current result.
- base_linux_n_obj=$(($linux_n_obj+1))
- elif ! [ "$base_linux_n_obj" -ge "-10" ]; then
- # Something is very wrong with baseline result
- # (e.g., it's not a number).
- return 0
- fi
fi
- if [ $linux_n_obj -ge $base_linux_n_obj ]; then
- return 0
- else
- return 1
- fi
+ case "$linux_n_obj:$base_linux_n_obj" in
+ boot:*) return 0 ;;
+ *:boot) return 1 ;;
+ all:*) return 0 ;;
+ *:all) return 1 ;;
+ *)
+ if ! [ "$linux_n_obj" -ge "-10" ]; then
+ # Something is very wrong with result (e.g., it's not a number).
+ return 1
+ fi
+ if ! [ "$base_linux_n_obj" -ge "-10" ]; then
+ # Something is very wrong with result (e.g., it's not a number).
+ return 0
+ fi
+
+ if [ $linux_n_obj -ge $base_linux_n_obj ]; then
+ return 0
+ else
+ return 1
+ fi
+ ;;
+ esac
)
}
@@ -227,7 +254,8 @@ case "${rr[toolchain]}" in
run_step skip_on_fail -1 build_llvm
;;
esac
-run_step skip_on_fail x count_linux_objs
+run_step skip_on_fail x build_linux
+run_step skip_on_fail x boot_linux
run_step reset_on_fail x check_regression
run_step stop_on_fail x update_baseline
run_step stop_on_fail x push_baseline