#!/bin/bash
#
-# Copyright (C) 2016-2019 Michael Jeanson <mjeanson@efficios.com>
+# Copyright (C) 2016-2023 Michael Jeanson <mjeanson@efficios.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
set -exu
# Parameters
-platforms=${platforms:-}
+platform=${platforms:-}
+cross_arch=${cross_arch:-}
+ktag=${ktag:-}
+kgitrepo=${kgitrepo:-}
+mversion=${mversion:-}
+mgitrepo=${mgitrepo:-}
+make_args=()
+
+DEBUG=${DEBUG:-}
+
# Derive arch from label if it isn't set
if [ -z "${arch:-}" ] ; then
# Labels may be platform specific, eg. jammy-amd64, deb12-armhf
regex='[[:alnum:]]+-([[:alnum:]]+)'
- if [[ "${platforms}" =~ ${regex} ]] ; then
+ if [[ "${platform}" =~ ${regex} ]] ; then
arch="${BASH_REMATCH[1]}"
else
- arch="${platforms:-}"
+ arch="${platform:-}"
fi
fi
-cross_arch=${cross_arch:-}
-ktag=${ktag:-}
-kgitrepo=${kgitrepo:-}
-mversion=${mversion:-}
-mgitrepo=${mgitrepo:-}
-make_args=()
-
-DEBUG=${DEBUG:-}
## FUNCTIONS ##
[ "$1" = "$2" ] && return 1 || vergte "$1" "$2"
}
+print_header() {
+ set +x
+
+ local message=" $1 "
+ local message_len
+ local padding_len
+
+ message_len="${#message}"
+ padding_len=$(( (80 - (message_len)) / 2 ))
+
+ printf '\n'; printf -- '#%.0s' {1..80}; printf '\n'
+ printf -- '-%.0s' {1..80}; printf '\n'
+ printf -- '#%.0s' $(seq 1 $padding_len); printf '%s' "$message"; printf -- '#%.0s' $(seq 1 $padding_len); printf '\n'
+ printf -- '-%.0s' {1..80}; printf '\n'
+ printf -- '#%.0s' {1..80}; printf '\n\n'
+
+ set -x
+}
+
git_clone_modules_sources() {
mkdir -p "$MODULES_GIT_DIR"
# Checkout a shallow kernel tree of the specified tag
git_clone_linux_sources() {
mkdir -p "$LINUX_GIT_DIR"
- git clone --depth=1 -b "${ktag}" --reference "$LINUX_GIT_REF_REPO_DIR" "${kgitrepo}" "$LINUX_GIT_DIR"
+ case "${distroversion:-}" in
+ el*)
+ git clone -b "${ktag}" "${kgitrepo}" src/linux-rpm
+
+ # Get the source files
+ pushd src/linux-rpm
+ "${WORKSPACE}/src/getsrc/getsrc/getsrc.sh"
+ tar -x -C "${LINUX_GIT_DIR}" --strip-components=1 -f SOURCES/linux-*.tar.xz
+ popd
+
+ # Pretend we're a repo like the default expects
+ pushd "${LINUX_GIT_DIR}"
+ git init .
+ git config user.name 'Jenkins'
+ git config user.email 'jenkins@efficios.com'
+ git add .
+ git commit -a -m 'Initial commit'
+ git tag "${ktag}"
+ echo "${LINUX_GIT_REF_REPO_DIR}" > .git/objects/info/alternates
+ popd
+ ;;
+
+ *)
+ git clone --depth=1 -b "${ktag}" --reference-if-able "$LINUX_GIT_REF_REPO_DIR" "${kgitrepo}" "$LINUX_GIT_DIR"
+ ;;
+ esac
}
cd -
}
+# List all GCC versions present in the PATH
list_gccs() {
local gccs
gccs=()
# Find the most recent GCC version supported by the kernel sources
select_compiler() {
- local selected_cc
+ # Enter linux source dir
cd "$LINUX_SRCOBJ_DIR"
- kversion=$(make -s kernelversion)
+ # Get the kernel version using the host toolchain, some cross-compiled arch may be broken
+ kversion=$(unset ARCH; unset CROSS_COMPILE; make -s kernelversion)
- set +e
+ if [ "${cross_arch}" = "riscv64" ] && verlt "${kversion}" "5.12"; then
+ echo "RISC-V support was upstreamed in kernel v4.19 but kprobes support was only added in v5.12. Don't try to build it."
+ exit 0
+ fi
- for cc in $(list_gccs) ; do
- if "${CROSS_COMPILE:-}${cc}" -I include/ -D__LINUX_COMPILER_H -D__LINUX_COMPILER_TYPES_H -E include/linux/compiler-gcc.h; then
- cc_version=$(echo "${cc}" | cut -d'-' -f2)
- if { verlt "${kversion}" "5.17"; } && { vergt "${cc_version}" "11"; } ; then
- # Using gcc-12+ with '-Wuse-after-free' breaks the build of older
- # kernels (in particular, objtool). Some releases on LTS
- # branches between 4.x and 5.15 can be built with gcc-12.
- # @see https://lore.kernel.org/lkml/20494.1643237814@turing-police/
- # @see https://gitlab.com/linux-kernel/stable/-/commit/52a9dab6d892763b2a8334a568bd4e2c1a6fde66
- continue
- fi
- selected_cc="$cc"
- break
- fi
- done
+ if [ "${cross_arch}" = "arm64" ] && verlt "${kversion}" "3.7"; then
+ echo "ARM64 support was added as of v3.7. Don't try to build it."
+ exit 0
+ fi
- set -e
+ if [ "${cross_arch}" = "arm64" ] && verlt "${kversion}" "3.18"; then
+ echo "lttng-modules requires gcc >= 5.1 for ARM64 due to compiler bugs in gcc."
+ echo "gcc-5 support was added to the kernel as of v3.18. Don't this to build it."
+ exit 0
+ fi
- # Force gcc-4.8 for kernels before 4.4
if { verlt "$kversion" "4.4"; }; then
+ # Force gcc-4.8 for kernels before 4.4
selected_cc='gcc-4.8'
+ # Due to compiler bugs in gcc on arm64, lttng-modules disallows
+ # compilation with gcc < 5.1.
+ if [[ "${cross_arch}" == "arm64" ]] ; then
+ selected_cc='gcc-5.5'
+ export PATH="${PATH:-}:/usr/local/gcc5.5/bin"
+ export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}:/usr/local/gcc5.5/lib"
+ fi
+ selected_cc_version=$(echo "${selected_cc}" | cut -d'-' -f2)
+ else
+ for cc in $(list_gccs) ; do
+ if "${CROSS_COMPILE:-}${cc}" -I include/ -D__LINUX_COMPILER_H -D__LINUX_COMPILER_TYPES_H -E include/linux/compiler-gcc.h; then
+ cc_version=$(echo "${cc}" | cut -d'-' -f2)
+ if { verlt "${kversion}" "5.17"; } && { vergt "${cc_version}" "11"; } ; then
+ # Using gcc-12+ with '-Wuse-after-free' breaks the build of older
+ # kernels (in particular, objtool). Some releases on LTS
+ # branches between 4.x and 5.15 can be built with gcc-12.
+ # @see https://lore.kernel.org/lkml/20494.1643237814@turing-police/
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/52a9dab6d892763b2a8334a568bd4e2c1a6fde66
+ continue
+ fi
+ selected_cc="$cc"
+ selected_cc_version="$cc_version"
+ break
+ fi
+ done
fi
- if [ "x$selected_cc" = "x" ]; then
+ if [ -z "$selected_cc" ]; then
echo "Found no suitable compiler."
exit 1
fi
+ # lttng-modules requires gcc >= 5.1 for aarch64
+ # @see https://github.com/lttng/lttng-modules/commit/be06402dbdbea2f3394e60ec15c5d3356e2be416
+ if { verlt "${selected_cc_version}" "5.1"; } && [ "${cross_arch}" = "arm64" ] ; then
+ echo "Building lttng-modules on aarch64 requires gcc >= 5.1"
+ exit 1
+ fi
+
+ cd -
+}
+
+export_kbuild_flags() {
+ local _KAFLAGS
+ local _KCFLAGS
+ local _KCPPFLAGS
+ local _HOSTCFLAGS
+
_KAFLAGS=()
_KCFLAGS=()
_KCPPFLAGS=()
_HOSTCFLAGS=()
- if [ "$selected_cc" != "gcc-4.8" ]; then
+
+ if { vergte "$selected_cc_version" "6"; }; then
# Older kernel Makefiles do not expect the compiler to default to PIE
_KAFLAGS+=(-fno-pie)
_KCFLAGS+=(
_KCPPFLAGS+=(-fno-pie)
fi
- selected_cc_version="$(echo "${selected_cc}" | cut -d'-' -f2)"
if { vergte "${selected_cc_version}" "10"; } && { verlt "${kversion}" "5.10"; } ; then
# gcc-10 changed the default from '-fcommon' to '-fno-common', which
# causes a linker failure. '-fcommon' can be set on the HOSTCFLAGS
_HOSTCFLAGS+=(-fcommon)
fi
- if [ "${cross_arch:-}" == "armhf" ] ; then
- if { verlt "${kversion}" "5.14"; } ; then
- # Work-around for producing instructions that aren't valid for the
- # default architectures.
- # Eg. Error: selected processor does not support `cpsid i' in ARM mode
- _KCFLAGS+=(-march=armv7-a -mfpu=vfpv3-d16)
- _KCPPFLAGS+=(-march=armv7-a -mfpu=vfpv3-d16)
- fi
+ if { verlt "${kversion}" "5.14"; } && [ "${cross_arch:-}" == "armhf" ] ; then
+ # Work-around for producing instructions that aren't valid for the
+ # default architectures.
+ # Eg. Error: selected processor does not support `cpsid i' in ARM mode
+ _KCFLAGS+=(-march=armv7-a -mfpu=vfpv3-d16)
+ _KCPPFLAGS+=(-march=armv7-a -mfpu=vfpv3-d16)
fi
if { vergt "${selected_cc_version}" "8"; } && { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.17"; } ; then
HOSTCC="${HOSTCC}"
HOSTCFLAGS="${HOSTCFLAGS:-}"
)
+
if [ -n "${DEBUG}" ] ; then
make_args+=(
V=1
)
fi
- cd -
}
patch_linux_kernel() {
local commit_hash
commit_hash="$1"
+
+ # Show the title of the patch in the build log
+ git -C "${LINUX_GIT_REF_REPO_DIR}" show --oneline -s "${commit_hash}"
+
+ # Apply patch, don't fail if it doesn't apply cleanly
set +e
git -C "${LINUX_GIT_REF_REPO_DIR}" format-patch -n1 --stdout "${commit_hash}" | patch -p1
set -e
+
if [ "$?" -gt 1 ] ; then
echo "Serious issue patching"
exit 1
# Generate kernel configuration
case "$ktag" in
+ *el*)
+ # Copy the EL kernel configuration
+ el_arch="${cross_arch:-$arch}"
+ case "${el_arch}" in
+ amd64)
+ el_arch=x86_64
+ ;;
+ arm64)
+ el_arch=aarch64
+ ;;
+ ppc64el)
+ el_arch=ppc64le
+ ;;
+ *)
+ ;;
+ esac
+ ls "${WORKSPACE}/src/linux-rpm/SOURCES/"
+ if [ -f "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}.config" ] ; then
+ cp "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}.config" .config
+ elif [ -f "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}-rhel.config" ] ; then
+ cp "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}-rhel.config" .config
+ fi
+
+ # Eg.
+ # mm/mempolicy.c: In function ‘mpol_parse_str’:
+ # mm/mempolicy.c:2980:26: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
+ export KCFLAGS="${KCFLAGS} -Wno-error -Wno-all -Wno-error=stringop-overflow -Wno-error=address-of-packed-member"
+ ;;
+
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
+ if [ "${cross_arch}" = "powerpc" ] && 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
- # Disable riscv64 config generation, we don't have a toolchain on bionic
- sed -i 's/riscv64 //' debian.master/etc/kernelconfig
+ if [ "${cross_arch}" = "riscv64" ] && verlt "${kversion}" "6.2"; then
+ echo "Ubuntu added RISC-V config to their 'regular' kernels in v6.2. Don't try to build it."
+ exit 0
+ fi
- fakeroot debian/rules clean KW_DEFCONFIG_DIR=.
+ FAKEROOT_ARGS=(
+ 'KW_DEFCONFIG_DIR=.'
+ )
+ fakeroot debian/rules clean "${FAKEROOT_ARGS[@]}"
# Hack for kernel Ubuntu-hwe-5.8
# The debian/control file is produced by the clean target above, so this
# Ubuntu annotations.
# In any case, the configuration will be updated with any missing values
# later in our build script.
- fakeroot debian/rules genconfigs KW_DEFCONFIG_DIR=. do_skip_checks=true
+ FAKEROOT_ARGS+=('do_skip_checks=true')
+
+ # Some Ubuntu tags default the toolchain using `gcc?=gcc-XX` in
+ # `debian/rules.d/0-common-vars.mk`. This may fail if the gcc version
+ # used as a default isn't available.
+ # For example, Ubuntu-6.8.0-7.7 sets `gcc?=gcc-13`, and that version
+ # of gcc isn't available on the deb12-amd64 ci-nodes.
+ # Work has also already been done in `select_compiler` to make our
+ # own decision of which compiler to use. As a result of both cases,
+ # our compiler choice should be passed into genconfigs.
+ FAKEROOT_ARGS+=("gcc=${selected_cc}")
+
+ fakeroot debian/rules genconfigs "${FAKEROOT_ARGS[@]}"
cp CONFIGS/"${ubuntu_config}" .config
;;
scripts/config --disable CONFIG_KVM_BOOK3S_64_HV
fi
+ if [ -f "init/Kconfig.suse" ] ; then
+ # Get values from git tag, eg. 'rpm-5.14.21-150400.24.108'
+ # Note: the "150400" type of SUSE major version is only present on tags
+ # from 2022 and newer (about half-way through SLE15SP3).
+ # This will not work as expected on earlier tags.
+ SLES_RELEASE="$(echo "${ktag}" | cut -d '-' -f 3 | cut -d'.' -f 1)"
+ scripts/config --set-val CONFIG_SUSE_VERSION $((10#"$(echo "${SLES_RELEASE}" | head -c 2)"))
+ scripts/config --set-val CONFIG_SUSE_PATCHLEVEL $((10#"$(echo "${SLES_RELEASE}" | head -c 4 | tail -c 2)"))
+
+ # Disable the renesas clk driver that has build issues,
+ # eg. drivers/clk/renesas/renesas-rzg2l-cpg.c:185:17: error: ‘clk’ undeclared (first use in this function)
+ scripts/config --disable CONFIG_CLK_RENESAS
+
+ # From drives/spi/spi-atmel.c
+ # ./include/linux/gpio/consumer.h:141:49: note: expected ‘struct gpio_desc *’ but argument is of type 'int'
+ scripts/config --disable CONFIG_SPI_ATMEL
+ scripts/config --disable CONFIG_SPI_AT91_USART
+ scripts/config --disable CONFIG_SPI_ATMEL_QUADSPI
+
+ # drivers/net/wireless/mediatek/mt76/mt7915/testmode.c: In function ‘mt7915_tm_set_wmm_qid’:
+ # drivers/net/wireless/mediatek/mt76/mt7915/testmode.c:176:30: error: ‘struct mt7915_vif’ has no member named ‘mt76’
+ scripts/config --disable CONFIG_WLAN_VENDOR_MEDIATEK
+
+ # drivers/net/wireless/microchip/wilc1000/cfg80211.c: In function ‘wilc_wfi_cfg_parse_ch_attr’:
+ # drivers/net/wireless/microchip/wilc1000/cfg80211.c:970:17: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
+ scripts/config --disable CONFIG_WLAN_VENDOR_MICROCHIP
+
+ # fs/f2fs/file.c: In function ‘punch_hole’:
+ # fs/f2fs/file.c:1093:49: error: ‘mapping’ undeclared (first use in this function)
+ scripts/config --disable CONFIG_F2FS_FS
+ fi
+
# oldnoconfig was renamed in 4.19
if vergte "$kversion" "4.19"; then
update_conf_target="olddefconfig"
fi
fi
- if { vergt "${selected_cc_version}" "7"; } && { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.17"; } ; then
+ if { vergt "${selected_cc_version}" "7"; } && { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.17"; } ; then
# Builds fail due to -Werror=restrict in pager.o and str_error_r.o
if { verlt "${kversion}" "4.16"; } ; then
# This is patched since objtool's Makefile doesn't respect HOSTCFLAGS
patch_linux_kernel 854e55ad289ef8888e7991f0ada85d5846f5afb9
fi
- # More recent compiler optimizations expose build errors with netronome.
- # It seems easier to disable the driver than to attempt patching.
- scripts/config --disable CONFIG_NET_VENDOR_NETRONOME
- scripts/config --disable CONFIG_MICREL_PHY
+ fi
+ if { vergt "${selected_cc_version}" "9"; } && { verlt "${kversion}" "5.6"; } ; then
# Duplicate decalarations of __force_order
# @see https://gitlab.com/linux-kernel/stable/-/commit/df6d4f9db79c1a5d6f48b59db35ccd1e9ff9adfc
# However, kaslr_64.c doesn't exit in 4.15, 4.16, it's named pagetable.c
if [ -f arch/x86/boot/compressed/pagetable.c ] ; then
sed -i '/^unsigned long __force_order;$/d' arch/x86/boot/compressed/pagetable.c
fi
+ if [ -f arch/x86/boot/compressed/kaslr_64.c ] ; then
+ patch_linux_kernel df6d4f9db79c1a5d6f48b59db35ccd1e9ff9adfc
+ fi
+ fi
+
+ if { vergte "${kversion}" "4.18"; } && { verlt "${kversion}" "4.19"; } ; then
+ # In some cases, compiling net/bpfilter can fail with the following error:
+ # net/bpfilter/main.c:9:10: fatal error: include/uapi/linux/bpf.h: No such file or directory
+ # make[2]: *** [scripts/Makefile.host:107: net/bpfilter/main.o] Error 1
+ #
+ # While the issue is potentially in a number of old versions, it has only
+ # been observed in v4.18-rt
+ #
+ patch_linux_kernel 303a339f30a9441c4695d3d2cc78f1b33cd959ff
+ fi
+
+ if { vergte "${kversion}" "4.18"; } && { verlt "${kversion}" "4.19"; } ; then
+ # In some cases, compiling net/bpfilter can fail with the following error:
+ # net/bpfilter/main.c:9:10: fatal error: include/uapi/linux/bpf.h: No such file or directory
+ # make[2]: *** [scripts/Makefile.host:107: net/bpfilter/main.o] Error 1
+ #
+ # While the issue is potentially in a number of old versions, it has only
+ # been observed in v4.18-rt
+ #
+ patch_linux_kernel 303a339f30a9441c4695d3d2cc78f1b33cd959ff
fi
if { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.18"; } ; then
# Some old kernels fail to build when make is too new
# @see https://gitlab.com/linux-kernel/stable/-/commit/9feeb638cde083c737e295c0547f1b4f28e99583
patch_linux_kernel 9564a8cf422d7b58f6e857e3546d346fa970191e
+ fi
+
+ if { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.14.55"; } ; then
+ # Some old kernels fail to build when make is too new
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/9feeb638cde083c737e295c0547f1b4f28e99583
+ patch_linux_kernel e82885490a611f2b75a6c27cd7bb09665c1740be
+ fi
+
+ if ( { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.18"; } ) || \
+ ( { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.14.56"; } ) ; then
+ # Some old kernels fail to build when make is too new
# @see https://gitlab.com/linux-kernel/stable/-/commit/9feeb638cde083c737e295c0547f1b4f28e99583
patch_linux_kernel 9feeb638cde083c737e295c0547f1b4f28e99583
fi
- if { vergte "${kversion}" "4.12"; } && { verlt "${kversion}" "4.19"; } ; then
+ if ( { vergte "${kversion}" "4.12"; } && { verlt "${kversion}" "4.20.17"; } ) || \
+ ( { vergte "${kversion}" "5.0"; } && { verlt "${kversion}" "5.0.12"; } ) ; then
# Old kernels can fail to build while on newer host kernels with errors
# such as:
# In file included from scripts/selinux/genheaders/genheaders.c:19:
patch_linux_kernel dfbd199a7cfe3e3cd8531e1353cdbd7175bfbc5e
fi
- if { vergte "${kversion}" "3.18"; } && { verlt "${kversion}" "4.4"; } ; then
- # Compatibility with binutils >= ~ 2.31
+ # Compatibility with binutils >= ~ 2.31
+ if { vergte "${kversion}" "3.19"; } && { verlt "${kversion}" "4.16"; } ; then
patch_linux_kernel b21ebf2fb4cde1618915a97cc773e287ff49173e
fi
+ if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18.69"; } ; then
+ patch_linux_kernel edb9d2d5e647e7a8521b0d35f8452deb02dfd138
+ fi
+ if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18.100"; } ; then
+ patch_linux_kernel 3be6583f0b6f1bf1ee650ebf473d9dee36836527
+ patch_linux_kernel 12d839211d080f6a9c370398c41a260365d34c62
+ fi
+ if { vergte "${kversion}" "3.16"; } && { verlt "${kversion}" "3.16.82"; } ; then
+ patch_linux_kernel ad10e6d464796f2a481de4039a43b9cfca034e1c
+ fi
- # The above patch only partially applies linux 3.17, and has been, so a
- # rebased version is used instead.
- if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18"; } ; then
- cat <<'EOF' | patch -p1
-diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
-index 48598105..0652c5b6 100644
---- a/arch/x86/kernel/machine_kexec_64.c
-+++ b/arch/x86/kernel/machine_kexec_64.c
-@@ -516,6 +516,7 @@ int arch_kexec_apply_relocations_add(const Elf64_Ehdr *ehdr,
- goto overflow;
- break;
- case R_X86_64_PC32:
-+ case R_X86_64_PLT32:
- value -= (u64)address;
- *(u32 *)location = value;
- break;
-diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
-index e69f9882..7c6bc9fe 100644
---- a/arch/x86/kernel/module.c
-+++ b/arch/x86/kernel/module.c
-@@ -180,6 +180,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
- goto overflow;
- break;
- case R_X86_64_PC32:
-+ case R_X86_64_PLT32:
- val -= (u64)loc;
- *(u32 *)loc = val;
- #if 0
-diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
-index bbb1d225..8deeacbc 100644
---- a/arch/x86/tools/relocs.c
-+++ b/arch/x86/tools/relocs.c
-@@ -763,6 +763,7 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
- switch (r_type) {
- case R_X86_64_NONE:
- case R_X86_64_PC32:
-+ case R_X86_64_PLT32:
- /*
- * NONE can be ignored and PC relative relocations don't
- * need to be adjusted.
-EOF
- fi
-
- if ( { vergte "${kversion}" "3.15"; } && { verlt "${kversion}" "4.4"; } ) ||
- ( { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.17"; } ); then
+ if ( { vergte "${kversion}" "3.14"; } && { verlt "${kversion}" "4.4"; } ) ||
+ ( { vergte "${kversion}" "4.8"; } && { verlt "${kversion}" "4.18"; } ); then
# While the original motivation of this patch is for fixing builds using
- # clang, the same error occurs between linux >= 3.15 and < 4.4, and in
+ # clang, the same error occurs between linux >= 3.14 and < 4.4, and in
# 4.15, 4.16.
+ # For rt-linux, the error has been observed in 4.8, 4.11, and 4.13.
#
# This patch only partially applies due to changes in kernel/Makefile,
# so a supplementary patch is needed
sed -i '/^.* += elfcore.o$/d' kernel/Makefile
fi
fi
+ # Same as above for the v4.4 branch
+ if ( { vergte "${kversion}" "4.4"; } && { verlt "${kversion}" "4.4.257"; } ); then
+ patch_linux_kernel 3140b0740b31cc63cf2ee08bc3f746b423eb068d
+ if grep -q elfcore.o kernel/Makefile ; then
+ sed -i '/^.* += elfcore.o$/d' kernel/Makefile
+ fi
+ fi
+
+ if { vergte "${kversion}" "4.5"; } && { verlt "${kversion}" "4.8"; } ; then
+ # Kernels between v4.5 and v4.8 built with gcc >= 8 on arm will hit an
+ # assembler error :
+ #
+ # kernel/.tmp_fork.s: Assembler messages:
+ # kernel/.tmp_fork.s:1790: Error: .err encountered
+ #
+ # @see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85745
+ #
+ patch_linux_kernel 9f73bd8bb445e0cbe4bcef6d4cfc788f1e184007
+ fi
+
+ if ( { vergte "${kversion}" "4.4"; } && { verlt "${kversion}" "4.4.136"; } ) ||
+ ( { vergte "${kversion}" "4.5"; } && { verlt "${kversion}" "4.8"; } ); then
+ # Hacky patch to deal with the following build error:
+ # Cannot find symbol for section 7: .text.unlikely.
+ # kernel/kexec_file.o: failed
+ # make[1]: *** [scripts/Makefile.build:291: kernel/kexec_file.o] Error 1
+ #
+ # This error happens with binutils 2.36 and 2.37, but should probably not
+ # be an issue with binutils 2.38.
+ # @see https://github.com/linuxppc/issues/issues/388
+ # @see https://github.com/bminor/binutils-gdb/commit/c09c8b42021180eee9495bd50d8b35e683d3901b
+ #
+ # There is some sort of config (unspecified in past discussions) which
+ # provokes the error, and there was never a potential fix merged in
+ # this discussion, in part because the build systems of the kernel
+ # switched to objtool instead.
+ #
+ # @see https://lore.kernel.org/all/20210215162209.5e2a475b@gandalf.local.home/
+ #
+ sed -i 's/return txtname;/return shdr0->sh_size ? txtname : NULL;/' scripts/recordmcount.h
+
+ # After applying the above patch, the build continues but fails with
+ # head64.c:(.text.exit+0x5): undefined reference to `__gcov_exit'
+ #
+ scripts/config --disable CONFIG_GCOV_KERNEL
+ fi
+
+ if { vergte "${kversion}" "4.5"; } && { verlt "${kversion}" "4.5.5"; } ; then
+ # drivers/staging/wilc1000/wilc_spi.c:123:34: error: storage size of ‘wilc1000_spi_ops’ isn’t known
+ patch_linux_kernel ce7b516f3f9e11fe4ee06fad0d7e853bb6e8f160
+ 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
+ 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
+
+ if [ "$(scripts/config --state CONFIG_EXTCON_ADC_JACK)" != "n" ] &&
+ ( { vergte "${kversion}" "4.2"; } && { verlt "${kversion}" "4.12"; } ); then
+ # 73b6ecdb93e8e77752cae9077c424fcdc6f23c39 introduced a change where
+ # extcon-adc-jack.h has an incompatible pointer type.
+ # In GCC >= 5 this will provoke a warning and build failure.
+ # Eg.
+ # drivers/extcon/extcon-adc-jack.c: In function ‘adc_jack_probe’:
+ # drivers/extcon/extcon-adc-jack.c:111:64: error: passing argument 2 of ‘devm_extcon_dev_allocate’ from incompatible pointer type [-Werror=incompatible-pointer-types]
+ # make[2]: *** [scripts/Makefile.build:295: drivers/extcon/extcon-adc-jack.o] Error 1
+ #
+ # 8a522bf2d4f788306443d36b26b54f0aedcdfdbe (in 4.11) has a fix for this warning
+ #
+ patch_linux_kernel 8a522bf2d4f788306443d36b26b54f0aedcdfdbe
+ fi
+
+ if ( { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.15.2"; } ) || \
+ ( { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.14.18"; } ) ; then
+ # Fix an objtool Segmentation fault
+ patch_linux_kernel dd12561854824fd1f05baf2a1b794faa046e2425
+ fi
+
+ if { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.14.268"; } ; then
+ # Builds fail due to -Werror=use-after-free in sigchain.o and help.o
+ patch_linux_kernel e89bb266b710ce056f141f29f091fd468a4a8185
fi
# Fix a typo in v2.6.36.x
if [ "$(scripts/config --state CONFIG_DEBUG_INFO_BTF)" == "y" ] &&
{ vergte "${pahole_version}" "1.24"; } &&
- { vergte "${kversion}" "5.10"; } && { verlt "${kversion}" "6.0"; } ;then
+ (
+ ( { vergte "${kversion}" "5.10"; } && { verlt "${kversion}" "6.0"; } ) || [[ "${ktag}" =~ .el8 ]]
+ ) ; then
# Some kernels Eg. Ubuntu-hwe-5.13-5.13.0-52.59_20.04.1
# fail with the following error:
# BTFIDS vmlinux
# @see https://lore.kernel.org/bpf/20220825171620.cioobudss6ovyrkc@altlinux.org/t/
#
if [ -f "scripts/pahole-flags.sh" ] ; then
+ # shellcheck disable=SC2016
sed -i 's/ -J ${PAHOLE_FLAGS} / -J ${PAHOLE_FLAGS} --skip_encoding_btf_enum64 /' scripts/link-vmlinux.sh
else
+ # shellcheck disable=SC2016
sed -i 's/ -J ${extra_paholeopt} / -J ${extra_paholeopt} --skip_encoding_btf_enum64 /' scripts/link-vmlinux.sh
+ # Some older versions of RHEL don't have '${extra_paholeopt}'
+ sed -i 's/${PAHOLE} -J ${1}/${PAHOLE} -J --skip_encoding_btf_enum64 ${1}/' scripts/link-vmlinux.sh
fi
fi
scripts/config --disable CONFIG_MFD_WM8994
scripts/config --disable CONFIG_DRM_RADEON
scripts/config --disable CONFIG_SND_SOC_WM5100
+ # More recent compiler optimizations (from gcc 8 onwards )expose build errors
+ # with netronome on older kernels.
+ # Observed in 4.11-rt, 4.15-4.17, 5.0-rt - 5.16-rt
+ # It seems easier to disable the driver than to attempt patching.
+ # Eg.
+ # In function ‘ur_load_imm_any’,
+ # inlined from ‘jeq_imm’ at drivers/net/ethernet/netronome/nfp/bpf/jit.c:3146:13:
+ # ./include/linux/compiler.h:350:45: error: call to ‘__compiletime_assert_1062’ declared with attribute error: FIELD_FIT: value too large for the field
+ # 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
+ #
+ scripts/config --disable CONFIG_NET_VENDOR_NETRONOME
+ # Eg.
+ # In function ‘memcpy’,
+ # inlined from ‘kszphy_get_strings’ at drivers/net/phy/micrel.c:664:3:
+ # ./include/linux/string.h:305:25: error: call to ‘__read_overflow2’ declared with attribute error: detected read beyond size of object passed as 2nd parameter
+ # 305 | __read_overflow2();
+ # | ^~~~~~~~~~~~~~~~~~
+ # make[3]: *** [scripts/Makefile.build:308: drivers/net/phy/micrel.o] Error 1
+ #
+ scripts/config --disable CONFIG_MICREL_PHY
+
# IGBVF won't build with recent gcc on 2.6.38.x
if { vergte "$kversion" "2.6.37" && verlt "$kversion" "2.6.38"; }; then
# Copy arch includes
(find arch -name include -type d -print0 | \
- xargs -0 -n1 -i: find : -type f) | \
+ xargs -0 -n1 -I '{}' find '{}' -type f) | \
cpio -pd --preserve-modification-time "${LINUX_HDROBJ_DIR}"
# Copy arch scripts
(find arch -name scripts -type d -print0 | \
- xargs -0 -n1 -i: find : -type f) | \
+ xargs -0 -n1 -I '{}' find '{}' -type f) | \
cpio -pd --preserve-modification-time "${LINUX_HDROBJ_DIR}"
# Cleanup scripts
# On powerpc 32bits this object is required to link modules
if [ "${karch}" = "powerpc" ]; then
- if [ "x$(scripts/config -s CONFIG_PPC64)" = "xy" ] && vergte "${kversion}" "5.4"; then
+ if [ "$(scripts/config -s CONFIG_PPC64)" = "y" ] && vergte "${kversion}" "5.4"; then
:
else
cp -a --parents arch/powerpc/lib/crtsavres.[So] "${LINUX_HDROBJ_DIR}/"
fi
fi
+ # On riscv with 5.14 the vsdo objects are required
+ if [ "${karch}" = "riscv" ] && \
+ ( { vergte "${kversion}" "5.14"; } && { verlt "${kversion}" "5.15"; } ); then
+ cp -a --parents arch/riscv/kernel/vdso/*.o "${LINUX_HDROBJ_DIR}/"
+ fi
+
# Newer kernels need objtool to build modules when CONFIG_STACK_VALIDATION=y
if [ -f tools/objtool/objtool ]; then
cp -a --parents tools/objtool/objtool "${LINUX_HDROBJ_DIR}/"
# On powerpc 32bits this object is required to link modules
if [ "${karch}" = "powerpc" ]; then
- if [ "x$(scripts/config -s CONFIG_PPC64)" = "xy" ] && vergte "${kversion}" "5.4"; then
+ if [ "$(scripts/config -s CONFIG_PPC64)" = "y" ] && vergte "${kversion}" "5.4"; then
:
else
make arch/powerpc/lib/crtsavres.o "${make_args[@]}"
echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> include/generated/utsrelease.h
echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> "${LINUX_HDROBJ_DIR}/include/generated/utsrelease.h"
;;
+ rpm-*)
+ # Update the definition of UTS_RELEASE to match something akin to '5.14.21-150400.24.108-default'
+ if [ -f "init/Kconfig.suse" ] ; then
+ SLESVERSION="$(echo "${ktag}" | cut -d'-' -f 3)-default"
+ sed -E -i "s%^(#define UTS_RELEASE \"[\.a-z0-9]+)(\")%\1-${SLESVERSION}\2%g" include/generated/utsrelease.h
+ sed -E -i "s%^(#define UTS_RELEASE \"[\.a-z0-9]+)(\")%\1-${SLESVERSION}\2%g" "${LINUX_HDROBJ_DIR}/include/generated/utsrelease.h"
+ fi
+ ;;
esac
}
# Build modules
KERNELDIR="${kdir}" make -j"${NPROC}" V=1 "${make_args[@]}"
- ret=$?
+ ret=$?
set -e
# Create build directories
mkdir -p "${LINUX_SRCOBJ_DIR}" "${LINUX_HDROBJ_DIR}" "${LINUX_INSTOBJ_DIR}" "${MODULES_OUTPUT_KSRC_DIR}" "${MODULES_OUTPUT_KHDR_DIR}"
+print_header "Clone LTTng-modules sources"
git_clone_modules_sources
# Setup cross compile env if available
ubuntu_config="ppc64el-config.flavour.generic"
;;
+ "riscv64")
+ karch="riscv"
+ cross_compile="riscv64-linux-gnu-"
+ vanilla_config="defconfig"
+ ubuntu_config="riscv64-config.flavour.generic"
+ ;;
+
*)
echo "Unsupported cross arch $cross_arch"
exit 1
ubuntu_config="ppc64el-config.flavour.generic"
;;
+ "riscv64")
+ karch="riscv"
+ vanilla_config="allmodconfig"
+ ubuntu_config="riscv64-config.flavour.generic"
+ ;;
+
*)
echo "Unsupported arch $arch"
exit 1
# First get the kernel build from the object store, or build it, if it's
# not available.
+set +x
echo "# Setup endpoint
host_base = obj.internal.efficios.com
host_bucket = obj.internal.efficios.com
# Enable S3 v4 signature APIs
signature_v2 = False" > "$WORKSPACE/.s3cfg"
+set -x
url_hash="$(echo -n "$kgitrepo" | md5sum | awk '{ print $1 }')"
obj_name="linux.tar.bz2"
-if [ "x${cross_arch}" = "x" ]; then
- obj_url_prefix="$OBJ_STORE_URL/linux-build/$url_hash/$ktag/platform-${platforms}/$arch/native"
+if [ -z "${cross_arch}" ]; then
+ obj_url_prefix="$OBJ_STORE_URL/linux-build/$url_hash/$ktag/platform-${platform}/$arch/native"
else
- obj_url_prefix="$OBJ_STORE_URL/linux-build/$url_hash/$ktag/platform-${platforms}/${cross_arch}"
+ obj_url_prefix="$OBJ_STORE_URL/linux-build/$url_hash/$ktag/platform-${platform}/${cross_arch}"
fi
obj_url="$obj_url_prefix/$obj_name"
case "$ret" in
"0")
+ print_header "Get sources and prebuilt kernel"
s3cmd -c "$WORKSPACE/.s3cfg" get "$obj_url"
extract_archive_obj
+
+ print_header "Select compiler and set build flags"
+ select_compiler
+ export_kbuild_flags
;;
"12")
- echo "File not found"
+ print_header "Clone kernel sources"
# Build all the things and upload
# then finish the module build...
git_clone_linux_sources
git_export_linux_sources
+ print_header "Select compiler and set build flags"
select_compiler
+ export_kbuild_flags
## PREPARE FULL LINUX SOURCE TREE
+ print_header "Build kernel from source"
build_linux_kernel
## EXTRACT DISTRO STYLE KERNEL HEADERS / DEVEL
extract_distro_headers
+ print_header "Upload kernel to object storage"
tar_archive_obj
-
upload_archive_obj
;;
;;
esac
-select_compiler
-
-selected_cc_version="$(echo "${selected_cc}" | cut -d'-' -f2)"
-# lttng-modules requires gcc >= 5.1 for aarch64
-# @see https://github.com/lttng/lttng-modules/commit/be06402dbdbea2f3394e60ec15c5d3356e2be416
-if { verlt "${selected_cc_version}" "5.1"; } && [ "${cross_arch}" = "arm64" ] ; then
- echo "Building lltng-modules on aarch64 requires gcc >= 5.1"
- exit 0
-fi
## BUILD modules
# Either we downloaded a pre-build kernel or we built it and uploaded
cd "$WORKSPACE"
-# Build modules against full kernel sources
+print_header "Build modules against full kernel sources"
build_modules "${LINUX_SRCOBJ_DIR}" "${MODULES_OUTPUT_KSRC_DIR}"
-# Build modules against kernel headers
+print_header "Build modules against kernel headers"
build_modules "${LINUX_HDROBJ_DIR}" "${MODULES_OUTPUT_KHDR_DIR}"
+
+print_header "Check for built modules in install directory"
+
# Make sure some modules were actually built
tree "${MODULES_OUTPUT_KSRC_DIR}"
if [ "x$(find "${MODULES_OUTPUT_KSRC_DIR}" -name '*.ko*' -printf yes -quit)" != "xyes" ]; then