| #!/bin/bash | |
| # | |
| # Based on the build-linux.sh script from the Mutter project: | |
| # https://gitlab.gnome.org/GNOME/mutter/-/blob/main/src/tests/kvm/build-linux.sh | |
| # | |
| # Script for building the Linux kernel from git. It aims to build a kernel image | |
| # that is suitable for running in a virtual machine and is aimed to used for | |
| # testing. | |
| # | |
| # Usage: build-linux.sh [REPO-URL] [BRANCH|TAG] [OUTPUT-FILE] [...CONFIGS] | |
| # | |
| # Where [..CONFIGS] can be any number of configuration options, e.g. | |
| # --enable CONFIG_DRM_VKMS | |
| # | |
| set -e | |
| # From scripts/subarch.include in linux | |
| function get-subarch() | |
| { | |
| uname -m | sed -e s/i.86/x86/ \ | |
| -e s/x86_64/x86/ \ | |
| -e s/sun4u/sparc64/ \ | |
| -e s/arm.*/arm/ -e s/sa110/arm/ \ | |
| -e s/s390x/s390/ -e s/parisc64/parisc/ \ | |
| -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ | |
| -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ \ | |
| -e s/riscv.*/riscv/ | |
| } | |
| REPO="$1" | |
| BRANCH_OR_TAG="$2" | |
| IMAGE="$3" | |
| ARCH=$(uname -m) | |
| SUBARCH=$(get-subarch) | |
| shift | |
| shift | |
| shift | |
| # ./scripts/config --enable CONFIG_VIDEO_VISL | |
| CONFIGS=() | |
| while [[ "x$1" != "x" ]]; do | |
| CONFIGS+=( "$1" ) | |
| shift | |
| done | |
| echo Building Linux for $ARCH \($SUBARCH\)... | |
| set -x | |
| if [ -d linux ]; then | |
| pushd linux | |
| git fetch --depth=1 $REPO $BRANCH_OR_TAG | |
| git checkout FETCH_HEAD | |
| else | |
| git clone --depth=1 --branch=$BRANCH_OR_TAG $REPO linux | |
| pushd linux | |
| fi | |
| # Apply visl patches until they are upstreamed | |
| for patch in ../ci/docker/fedora/patches/*.patch; do | |
| patch -p1 < "${patch}" | |
| done | |
| make defconfig | |
| sync | |
| make kvm_guest.config | |
| echo "Disabling unused features..." | |
| ./scripts/config \ | |
| --disable USB \ | |
| --disable SOUND \ | |
| --disable SND \ | |
| --disable NETDEVICES \ | |
| --disable DRM \ | |
| --disable INPUT \ | |
| --disable I2C \ | |
| --disable HID \ | |
| --disable CRYPTO \ | |
| --disable IPV6 | |
| echo Enabling ${CONFIGS[@]}... | |
| ./scripts/config ${CONFIGS[@]/#/--enable } | |
| make olddefconfig | |
| make -j8 WERROR=0 | |
| popd | |
| TARGET_DIR="$(dirname "$IMAGE")" | |
| mkdir -p "$TARGET_DIR" | |
| mv linux/arch/$SUBARCH/boot/bzImage "$IMAGE" | |
| mv linux/.config $TARGET_DIR/.config | |
| rm -rf linux |