+ for cc in gcc-8 gcc-5 gcc-4.8; do
+ if "${CROSS_COMPILE:-}${cc}" -I include/ -D__LINUX_COMPILER_H -D__LINUX_COMPILER_TYPES_H -E include/linux/compiler-gcc.h; then
+ selected_cc="$cc"
+ break
+ fi
+ done
+
+ set -e
+
+ if [ "x$selected_cc" = "x" ]; then
+ echo "Found no suitable compiler."
+ exit 1
+ fi
+
+ # Force gcc-4.8 for kernels before 3.18
+ if { verlt "$kversion" "3.18"; }; then
+ selected_cc=gcc-4.8
+ fi
+
+ if [ "$selected_cc" != "gcc-4.8" ]; then
+ # Older kernel Makefiles do not expect the compiler to default to PIE
+ KAFLAGS="-fno-pie"
+ KCFLAGS="-fno-pie -no-pie -fno-stack-protector"
+ KCPPFLAGS="-fno-pie"
+ export KAFLAGS KCFLAGS KCPPFLAGS
+ fi
+
+ export CC="${CROSS_COMPILE:-}${selected_cc}"
+ export HOSTCC="${selected_cc}"
+
+ cd -
+}
+
+
+build_linux_kernel() {
+ cd "$LINUX_SRCOBJ_DIR"
+
+ kversion=$(make -s kernelversion)
+
+ # Generate kernel configuration
+ case "$ktag" in
+ Ubuntu*)
+ if [ "${cross_arch}" = "powerpc" ]; then
+ if vergte "${kversion}" "4.10"; then
+ echo "Ubuntu removed big endian powerpc configuration from kernel >= 4.10. Don't try to build it."
+ exit 0
+ fi
+ fi
+
+ # Disable riscv64 config generation, we don't have a toolchain on bionic
+ sed -i 's/riscv64 //' debian.master/etc/kernelconfig
+
+ # Hack for kernel Ubuntu-hwe-5.8
+ if [ ! -f "debian/compat" ]; then
+ echo "10" > "debian/compat"
+ fi
+
+ fakeroot debian/rules clean KW_DEFCONFIG_DIR=.
+ fakeroot debian/rules genconfigs KW_DEFCONFIG_DIR=.
+ cp CONFIGS/"${ubuntu_config}" .config
+ ;;
+
+ *)
+ # Force 32bit build on i386, default is 64bit
+ if [ "$arch" = "i386" ]; then
+ export ARCH="i386"
+ fi
+
+ # allyesconfig is mostly broken for kernels of the 2.6 series
+ if verlt "$kversion" "3.0"; then
+ vanilla_config="defconfig"
+ fi
+
+ make "${vanilla_config}"
+ ;;
+ esac
+
+ # oldnoconfig was renamed in 4.19
+ if vergte "$kversion" "4.19"; then
+ update_conf_target="olddefconfig"
+ else
+ update_conf_target="oldnoconfig"
+ fi
+
+ # Fix 'defined(@array)' was removed from recent perl
+ if [ -f "kernel/timeconst.pl" ]; then
+ sed -i 's/defined(\@\(.*\))/@\1/' kernel/timeconst.pl
+ fi
+
+ # Fix syntax of inline assembly which is confused with C++11 raw strings on gcc >= 5
+ if [ "$HOSTCC" != "gcc-4.8" ]; then
+ if [ -f "arch/x86/kvm/svm.c" ]; then
+ sed -i 's/ R"/ R "/g; s/"R"/" R "/g' arch/x86/kvm/svm.c
+ fi
+
+ if [ -f "arch/x86/kvm/vmx.c" ]; then
+ sed -i 's/ R"/ R "/g; s/"R"/" R "/g' arch/x86/kvm/vmx.c
+ fi
+ fi
+
+ # Newer binutils don't accept 3 operand 'cmp' instructions on ppc64
+ # Convert them to 'cmpw' which was previously done silently
+ if verlt "$kversion" "4.9"; then
+ find arch/powerpc/ -name "*.S" -print0 | xargs -0 sed -i "s/\(cmp\)\(\s\+[a-zA-Z0-9]\+,\s*[a-zA-Z0-9]\+,\s*[a-zA-Z0-9]\+\)/cmpw\2/"
+ find arch/powerpc/ -name "*.S" -print0 | xargs -0 sed -i "s/\(cmpli\)\(\s\+[a-zA-Z0-9]\+,\s*[a-zA-Z0-9]\+,\s*[a-zA-Z0-9]\+\)/cmplwi\2/"
+ sed -i "s/\$pie \-o \"\$ofile\"/\$pie --no-dynamic-linker -o \"\$ofile\"/" arch/powerpc/boot/wrapper
+ fi
+
+ # Fix a typo in v2.6.36.x
+ if [ -f "arch/x86/kernel/entry_64.S" ]; then
+ sed -i 's/END(do_hypervisor_callback)/END(xen_do_hypervisor_callback)/' arch/x86/kernel/entry_64.S
+ fi
+
+ # Fix compiler switch in vdso Makefile for 2.6.36 to 2.6.36.2
+ if { vergte "$kversion" "2.6.36" && verlte "$kversion" "2.6.36.3"; }; then
+ sed -i 's/-m elf_x86_64/-m64/' arch/x86/vdso/Makefile
+ sed -i 's/-m elf_i386/-m32/' arch/x86/vdso/Makefile
+ fi
+
+ # Fix kernel < 3.0 with gcc >= 4.7
+ if verlt "$kversion" "3.0"; then
+ sed -i '/linux\/compiler.h/a #include <linux\/linkage.h> \/* For asmregparm *\/' arch/x86/include/asm/ptrace.h
+ sed -i 's/extern long syscall_trace_enter/extern asmregparm long syscall_trace_enter/' arch/x86/include/asm/ptrace.h
+ sed -i 's/extern void syscall_trace_leave/extern asmregparm void syscall_trace_leave/' arch/x86/include/asm/ptrace.h
+ echo "header-y += linkage.h" >> include/linux/Kbuild
+ fi
+
+ # GCC 4.8
+ if [ "$HOSTCC" == "gcc-4.8" ]; then
+ scripts/config --disable CONFIG_CC_STACKPROTECTOR_STRONG
+ fi
+
+ # Don't try to sign modules
+ scripts/config --disable CONFIG_MODULE_SIG
+
+ # Disable kernel stack frame correctness validation, introduced in 4.6.0 and currently fails
+ scripts/config --disable CONFIG_STACK_VALIDATION
+
+ # Cause problems with inline assembly on i386
+ scripts/config --disable CONFIG_DEBUG_SECTION_MISMATCH
+
+ # Don't build samples, they are broken on some kernel releases
+ scripts/config --disable CONFIG_SAMPLES
+ scripts/config --disable CONFIG_BUILD_DOCSRC
+
+ # Disable kcov
+ scripts/config --disable CONFIG_KCOV
+
+ # Broken on some RT kernels
+ scripts/config --disable CONFIG_HYPERV
+
+ # Broken drivers
+ scripts/config --disable CONFIG_RAPIDIO_TSI721
+ scripts/config --disable CONFIG_SGI_XP
+ scripts/config --disable CONFIG_MFD_WM8994
+ scripts/config --disable CONFIG_DRM_RADEON
+ scripts/config --disable CONFIG_SND_SOC_WM5100
+
+ # IGBVF won't build with recent gcc on 2.6.38.x
+ if { vergte "$kversion" "2.6.37" && verlt "$kversion" "2.6.38"; }; then
+ scripts/config --disable CONFIG_IGBVF
+ fi
+
+ # Don't fail the build on warnings
+ scripts/config --disable CONFIG_WERROR
+
+ # Set required options
+ scripts/config --enable CONFIG_TRACEPOINTS
+ scripts/config --enable CONFIG_KALLSYMS
+ scripts/config --enable CONFIG_HIGH_RES_TIMERS
+ scripts/config --enable CONFIG_KPROBES
+ scripts/config --enable CONFIG_FTRACE
+ scripts/config --enable CONFIG_BLK_DEV_IO_TRACE
+ scripts/config --enable CONFIG_KALLSYMS_ALL
+ scripts/config --enable CONFIG_HAVE_SYSCALL_TRACEPOINTS
+ scripts/config --enable CONFIG_PERF_EVENTS
+ scripts/config --enable CONFIG_EVENT_TRACING
+ scripts/config --enable CONFIG_KRETPROBES
+
+ # FIXME: disable objtool on vmlinux, it OOMs on allyesconfig
+ sed -i 's/objtool_link vmlinux.o//' scripts/link-vmlinux.sh || true
+
+ # Debug
+ #cat .config
+
+ make "$update_conf_target" CC="$CC"
+ make -j"$NPROC" CC="$CC"