Skip to content

Commit

Permalink
build_mixed: Add a generic script for GKI mixed builds
Browse files Browse the repository at this point in the history
As more vendors adopt GKI, it's useful to provide a generic script that
can be used to create GKI mixed builds.

Bug: 184667897
Signed-off-by: J. Avila <[email protected]>
Change-Id: Ief3be4d5f230526de6cc795cfd9edc0cf4be6118
  • Loading branch information
J. Avila committed Jun 8, 2021
1 parent 69ec772 commit c2af8e5
Showing 1 changed file with 142 additions and 0 deletions.
142 changes: 142 additions & 0 deletions build_mixed.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

# build_mixed.sh takes as input a GKI source tree or GKI prebuilts as
# well as a device kernel source tree, compiles them, and then combines
# them into a set of flashable images to boot a GKI build.
#
# Usage:
# To build the GKI kernel:
# GKI_KERNEL_BUILD_CONFIG=path/to/gki/config \
# DEVICE_KERNEL_BUILD_CONFIG=path/to/device/config \
# build_mixed.sh
#
# To use GKI prebuilts:
# GKI_KERNEL_PREBUILTS_DIR=path/to/gki/prebuilts \
# DEVICE_KERNEL_BUILD_CONFIG=path/to/device/config \
# build_mixed.sh
#
# Note that you must always set one of either GKI_KERNEL_PREBUILTS_DIR or
# GKI_KERNEL_BUILD_CONFIG.
#
# The following environment variables are considered during execution:
#
# DEVICE_KERNEL_BUILD_CONFIG
# The build config for the device kernel to be passed into build.sh. This
# config is always required to be set.
#
# GKI_KERNEL_BUILD_CONFIG
# The build config for the GKI kernel to be passed into build.sh. This
# config is required if you are building the GKI kernel, and is incompatible
# with GKI_KERNEL_PREBUILTS_DIR.
#
# GKI_DEFCONFIG_FRAGMENT
# An optional path to an additional build.config fragment. Only works if
# your base build config supports GKI_DEFCONFIG_FRAGMENT, such as
# build.config.gki.aarch64. This is incompatible with GKI_KERNEL_PREBUILTS_DIR.
#
# GKI_KERNEL_PREBUILTS_DIR
# A path to a set of GKI prebuilts. These prebuilts can be used to skip the
# compilation of the GKI kernel. Incompatible with GKI_KERNEL_BUILD_CONFIG.
#
# The following must be found in this directory to work:
# vmlinux
# System.map
# vmlinux.symvers
# modules.builtin
# modules.builtin.modinfo
# Image.lz4

function print_usage {
cat << EOF
$0 takes as input a GKI source tree or GKI prebuilts as
well as a device kernel source tree, compiles them, and then combines
them into a set of flashable images to boot a GKI build.
Example usage of $0:
To build the GKI kernel:
GKI_KERNEL_BUILD_CONFIG=path/to/gki/config \\
DEVICE_KERNEL_BUILD_CONFIG=path/to/device/config \\
$0
To use GKI prebuilts:
GKI_KERNEL_PREBUILTS_DIR=path/to/gki/prebuilts \\
DEVICE_KERNEL_BUILD_CONFIG=path/to/device/config \\
$0
EOF
}

function exit_if_error {
if [ $1 -ne 0 ]; then
echo "ERROR: $2: retval=$1" >&2
exit $1
fi
}

function copy_gki_prebuilts {
mkdir -p ${DIST_DIR}
echo "Copying GKI prebuilts from ${GKI_KERNEL_PREBUILTS_DIR} to ${DIST_DIR}."
cp ${GKI_KERNEL_PREBUILTS_DIR}/* ${DIST_DIR}/
}

function build_gki {
echo "Building GKI kernel using ${GKI_KERNEL_BUILD_CONFIG}..."
BUILD_CONFIG=${GKI_KERNEL_BUILD_CONFIG} \
OUT_DIR=${BASE_OUT}/${GKI_KERNEL_OUT_DIR}/ \
DIST_DIR=${DIST_DIR} \
SKIP_CP_KERNEL_HDR=1 \
build/build.sh KCFLAGS=-Werror "$@"
exit_if_error $? "Failed to compile GKI kernel"
}

function build_device_kernel {
echo "Building device kernel using ${DEVICE_KERNEL_BUILD_CONFIG}..."
BUILD_CONFIG=${DEVICE_KERNEL_BUILD_CONFIG} \
OUT_DIR=${BASE_OUT}/${DEVICE_KERNEL_OUT_DIR}/ \
DIST_DIR=${DIST_DIR} \
MIXED_BUILD=1 \
KBUILD_MIXED_TREE=${GKI_BINARIES_DIR} \
build/build.sh KCFLAGS=-Werror "$@"
exit_if_error $? "Failed to compile device kernel"
}

BASE_OUT=${OUT_DIR:-out}/mixed/
DIST_DIR=${DIST_DIR:-${BASE_OUT}/dist/}
GKI_KERNEL_OUT_DIR=${GKI_KERNEL_OUT_DIR:-"gki-kernel"}
DEVICE_KERNEL_OUT_DIR=${DEVICE_KERNEL_OUT_DIR:-"device-kernel"}
GKI_BINARIES_DIR=$(readlink -m ${DIST_DIR})

if [ -n "${GKI_KERNEL_PREBUILTS_DIR}" ]; then
GKI_KERNEL_PREBUILTS_DIR=$(readlink -m "${GKI_KERNEL_PREBUILTS_DIR}")
fi

if [ -n "${BUILD_CONFIG}" ]; then
print_usage
exit_if_error 1 "BUILD_CONFIG is not supported for $0"
fi

if [ -z "${DEVICE_KERNEL_BUILD_CONFIG}" ]; then
print_usage
exit_if_error 1 "No DEVICE_KERNEL_BUILD_CONFIG set"
fi

if [ -n "${GKI_KERNEL_PREBUILTS_DIR}" ]; then
if [ -n "${GKI_KERNEL_BUILD_CONFIG}" ]; then
print_usage
exit_if_error 1 "Flags incompatible with GKI_KERNEL_PREBUILTS_DIR detected"
elif [ ! -d ${GKI_KERNEL_PREBUILTS_DIR} ]; then
exit_if_error 1 "${GKI_KERNEL_PREBUILTS_DIR} does not exist"
fi
elif [ -z "${GKI_KERNEL_BUILD_CONFIG}" ]; then
print_usage
exit_if_error 1 "Must set GKI_KERNEL_PREBUILTS_DIR or GKI_KERNEL_BUILD_CONFIG"
fi

if [ -n "${GKI_KERNEL_BUILD_CONFIG}" ]; then
build_gki
else
copy_gki_prebuilts
fi

build_device_kernel

0 comments on commit c2af8e5

Please sign in to comment.