Skip to content

Instantly share code, notes, and snippets.

@takumin
Last active December 2, 2018 11:48
Show Gist options
  • Save takumin/77e879b2918f5a4cf1c16dc291e0cd62 to your computer and use it in GitHub Desktop.
Save takumin/77e879b2918f5a4cf1c16dc291e0cd62 to your computer and use it in GitHub Desktop.
#!/bin/sh
set -e
################################################################################
# Variables
################################################################################
# Raspberry Pi Kernel Version
: ${KERNEL_VERSION:="4.14.y"}
# Raspberry Pi Kernel Source URL
: ${SOURCE_URL:="https://github.com/raspberrypi/linux/archive/rpi-${KERNEL_VERSION}.zip"}
# Linaro ARM Toolchain
: ${TOOLCHAIN_BASEURL:="https://releases.linaro.org/components/toolchain/binaries/latest-7"}
: ${TOOLCHAIN_VERSION:="7.3.1"}
: ${TOOLCHAIN_RELEASE:="2018.05"}
# Working Directory
: ${DOWN_DIR:="${HOME}/Downloads"}
: ${WORK_DIR:="/tmp/raspi"}
: ${TOOL_DIR:="${WORK_DIR}/tool"}
: ${BUILD_DIR:="${WORK_DIR}/build"}
: ${SOURCE_DIR:="${WORK_DIR}/source"}
: ${INSTALL_DIR:="${WORK_DIR}/install"}
################################################################################
# Cleanup
################################################################################
rm -fr "${BUILD_DIR}"
rm -fr "${SOURCE_DIR}"
rm -fr "${INSTALL_DIR}"
################################################################################
# Initialize
################################################################################
if [ ! -d "${DOWN_DIR}" ]; then
mkdir -p "${DOWN_DIR}"
fi
if [ ! -d "${WORK_DIR}" ]; then
mkdir -p "${WORK_DIR}"
fi
if [ ! -d "${TOOL_DIR}" ]; then
mkdir -p "${TOOL_DIR}"
fi
if [ ! -d "${BUILD_DIR}" ]; then
mkdir -p "${BUILD_DIR}"
fi
if [ ! -d "${SOURCE_DIR}" ]; then
mkdir -p "${SOURCE_DIR}"
fi
if [ ! -d "${INSTALL_DIR}" ]; then
mkdir -p "${INSTALL_DIR}"
fi
################################################################################
# Download
################################################################################
if [ ! -f "${DOWN_DIR}/linux-rpi-${KERNEL_VERSION}.zip" ]; then
wget -O "${DOWN_DIR}/linux-rpi-${KERNEL_VERSION}.zip" "${SOURCE_URL}"
fi
if [ ! -f "${DOWN_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_armv8l-linux-gnueabihf.tar.xz" ]; then
wget -O "${DOWN_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_armv8l-linux-gnueabihf.tar.xz" \
"${TOOLCHAIN_BASEURL}/armv8l-linux-gnueabihf/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_armv8l-linux-gnueabihf.tar.xz"
fi
if [ ! -f "${DOWN_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_aarch64-linux-gnu.tar.xz" ]; then
wget -O "${DOWN_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_aarch64-linux-gnu.tar.xz" \
"${TOOLCHAIN_BASEURL}/aarch64-linux-gnu/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_aarch64-linux-gnu.tar.xz"
fi
################################################################################
# Extract
################################################################################
if [ ! -d "${SOURCE_DIR}/kernel" ]; then
unzip -d "${WORK_DIR}" "${DOWN_DIR}/linux-rpi-${KERNEL_VERSION}.zip"
mv "${WORK_DIR}/linux-rpi-${KERNEL_VERSION}" "${SOURCE_DIR}/kernel"
fi
if [ ! -d "${TOOL_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_armv8l-linux-gnueabihf" ]; then
tar -xvf "${DOWN_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_armv8l-linux-gnueabihf.tar.xz" -C "${TOOL_DIR}"
fi
if [ ! -d "${TOOL_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_aarch64-linux-gnu" ]; then
tar -xvf "${DOWN_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_aarch64-linux-gnu.tar.xz" -C "${TOOL_DIR}"
fi
################################################################################
# Build
################################################################################
export ARCH="arm64"
export CROSS_COMPILE="${TOOL_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-"
export CROSS32CC="${TOOL_DIR}/gcc-linaro-${TOOLCHAIN_VERSION}-${TOOLCHAIN_RELEASE}-x86_64_armv8l-linux-gnueabihf/bin/armv8l-linux-gnueabihf-gcc"
mkdir -p "${BUILD_DIR}/kernel"
make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" bcmrpi3_defconfig
make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" vmlinux
make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" dtbs
make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" modules
################################################################################
# Install
################################################################################
RELEASE="`make -s -C ${SOURCE_DIR}/kernel O=${BUILD_DIR}/kernel kernelrelease`"
VERSION="`make -s -C ${SOURCE_DIR}/kernel O=${BUILD_DIR}/kernel kernelversion`"
mkdir -p "${INSTALL_DIR}/kernel/image"
cp "${BUILD_DIR}/kernel/vmlinux" "${INSTALL_DIR}/kernel/image/vmlinux"
find "${BUILD_DIR}/kernel/arch/arm64/boot/dts" -type f -name "*.dtb" -exec cp {} "${INSTALL_DIR}/kernel/image/" \;
make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" INSTALL_HDR_PATH="${INSTALL_DIR}/kernel/headers/usr" headers_install
make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" INSTALL_MOD_PATH="${INSTALL_DIR}/kernel/modules" modules_install
# make -j `nproc` -C "${SOURCE_DIR}/kernel" O="${BUILD_DIR}/kernel" INSTALL_FW_PATH="${INSTALL_DIR}/kernel/firmware/lib/firmware" firmware_install
rm "${INSTALL_DIR}/kernel/modules/lib/modules/${RELEASE}/build"
rm "${INSTALL_DIR}/kernel/modules/lib/modules/${RELEASE}/source"
rm -fr "${INSTALL_DIR}/kernel/modules/lib/firmware"
################################################################################
# Archive
################################################################################
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment