3f2ff883c3
There are use cases where pi-gen can be useful that need different image generation that the current defaults. Rather than force such users to require carrying modified versions of the default exports, allow users to specify alternate exports (e.g. instead of export-image and export-noobs, or in addition to these). We do this using a mechanism similar to STAGE_LIST, except that the lists of images are per-stage and default to paying attention to the presence of EXPORT_IMAGE and EXPORT_NOOBS as is currently the case. Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
283 lines
6.8 KiB
Bash
Executable File
283 lines
6.8 KiB
Bash
Executable File
#!/bin/bash -e
|
|
# shellcheck disable=SC2119
|
|
run_sub_stage()
|
|
{
|
|
log "Begin ${SUB_STAGE_DIR}"
|
|
pushd "${SUB_STAGE_DIR}" > /dev/null
|
|
for i in {00..99}; do
|
|
if [ -f "${i}-debconf" ]; then
|
|
log "Begin ${SUB_STAGE_DIR}/${i}-debconf"
|
|
on_chroot << EOF
|
|
debconf-set-selections <<SELEOF
|
|
$(cat "${i}-debconf")
|
|
SELEOF
|
|
EOF
|
|
|
|
log "End ${SUB_STAGE_DIR}/${i}-debconf"
|
|
fi
|
|
if [ -f "${i}-packages-nr" ]; then
|
|
log "Begin ${SUB_STAGE_DIR}/${i}-packages-nr"
|
|
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages-nr")"
|
|
if [ -n "$PACKAGES" ]; then
|
|
on_chroot << EOF
|
|
apt-get install --no-install-recommends -y $PACKAGES
|
|
EOF
|
|
fi
|
|
log "End ${SUB_STAGE_DIR}/${i}-packages-nr"
|
|
fi
|
|
if [ -f "${i}-packages" ]; then
|
|
log "Begin ${SUB_STAGE_DIR}/${i}-packages"
|
|
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages")"
|
|
if [ -n "$PACKAGES" ]; then
|
|
on_chroot << EOF
|
|
apt-get install -y $PACKAGES
|
|
EOF
|
|
fi
|
|
log "End ${SUB_STAGE_DIR}/${i}-packages"
|
|
fi
|
|
if [ -d "${i}-patches" ]; then
|
|
log "Begin ${SUB_STAGE_DIR}/${i}-patches"
|
|
pushd "${STAGE_WORK_DIR}" > /dev/null
|
|
if [ "${CLEAN}" = "1" ]; then
|
|
rm -rf .pc
|
|
rm -rf ./*-pc
|
|
fi
|
|
QUILT_PATCHES="${SUB_STAGE_DIR}/${i}-patches"
|
|
SUB_STAGE_QUILT_PATCH_DIR="$(basename "$SUB_STAGE_DIR")-pc"
|
|
mkdir -p "$SUB_STAGE_QUILT_PATCH_DIR"
|
|
ln -snf "$SUB_STAGE_QUILT_PATCH_DIR" .pc
|
|
quilt upgrade
|
|
if [ -e "${SUB_STAGE_DIR}/${i}-patches/EDIT" ]; then
|
|
echo "Dropping into bash to edit patches..."
|
|
bash
|
|
fi
|
|
RC=0
|
|
quilt push -a || RC=$?
|
|
case "$RC" in
|
|
0|2)
|
|
;;
|
|
*)
|
|
false
|
|
;;
|
|
esac
|
|
popd > /dev/null
|
|
log "End ${SUB_STAGE_DIR}/${i}-patches"
|
|
fi
|
|
if [ -x ${i}-run.sh ]; then
|
|
log "Begin ${SUB_STAGE_DIR}/${i}-run.sh"
|
|
./${i}-run.sh
|
|
log "End ${SUB_STAGE_DIR}/${i}-run.sh"
|
|
fi
|
|
if [ -f ${i}-run-chroot.sh ]; then
|
|
log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
|
|
on_chroot < ${i}-run-chroot.sh
|
|
log "End ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
|
|
fi
|
|
done
|
|
popd > /dev/null
|
|
log "End ${SUB_STAGE_DIR}"
|
|
}
|
|
|
|
|
|
run_stage(){
|
|
log "Begin ${STAGE_DIR}"
|
|
STAGE="$(basename "${STAGE_DIR}")"
|
|
pushd "${STAGE_DIR}" > /dev/null
|
|
unmount "${WORK_DIR}/${STAGE}"
|
|
STAGE_WORK_DIR="${WORK_DIR}/${STAGE}"
|
|
ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs
|
|
if [ ! -f SKIP_IMAGES ]; then
|
|
if [ -z "${EXPORT_LIST}" ]; then
|
|
get_stage_export "${STAGE_DIR}"
|
|
if [ -n "${EXPORT_LIST}" ]; then
|
|
EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}"
|
|
fi
|
|
unset EXPORT_LIST
|
|
export EXPORT_LIST
|
|
fi
|
|
fi
|
|
if [ ! -f SKIP ]; then
|
|
if [ "${CLEAN}" = "1" ]; then
|
|
if [ -d "${ROOTFS_DIR}" ]; then
|
|
rm -rf "${ROOTFS_DIR}"
|
|
fi
|
|
fi
|
|
if [ -x prerun.sh ]; then
|
|
log "Begin ${STAGE_DIR}/prerun.sh"
|
|
./prerun.sh
|
|
log "End ${STAGE_DIR}/prerun.sh"
|
|
fi
|
|
for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do
|
|
if [ -d "${SUB_STAGE_DIR}" ] &&
|
|
[ ! -f "${SUB_STAGE_DIR}/SKIP" ]; then
|
|
run_sub_stage
|
|
fi
|
|
done
|
|
fi
|
|
unmount "${WORK_DIR}/${STAGE}"
|
|
PREV_STAGE="${STAGE}"
|
|
PREV_STAGE_DIR="${STAGE_DIR}"
|
|
PREV_ROOTFS_DIR="${ROOTFS_DIR}"
|
|
popd > /dev/null
|
|
log "End ${STAGE_DIR}"
|
|
}
|
|
|
|
if [ "$(id -u)" != "0" ]; then
|
|
echo "Please run as root" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
export BASE_DIR
|
|
|
|
if [ -f config ]; then
|
|
# shellcheck disable=SC1091
|
|
source config
|
|
fi
|
|
|
|
while getopts "c:" flag
|
|
do
|
|
case "$flag" in
|
|
c)
|
|
EXTRA_CONFIG="$OPTARG"
|
|
# shellcheck disable=SC1090
|
|
source "$EXTRA_CONFIG"
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
|
|
export PI_GEN=${PI_GEN:-pi-gen}
|
|
export PI_GEN_REPO=${PI_GEN_REPO:-https://github.com/RPi-Distro/pi-gen}
|
|
|
|
if [ -z "${IMG_NAME}" ]; then
|
|
echo "IMG_NAME not set" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
export USE_QEMU="${USE_QEMU:-0}"
|
|
export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}"
|
|
export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}"
|
|
export ZIP_FILENAME="${ZIP_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}"
|
|
|
|
export SCRIPT_DIR="${BASE_DIR}/scripts"
|
|
export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}"
|
|
export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"}
|
|
export DEPLOY_ZIP="${DEPLOY_ZIP:-1}"
|
|
export LOG_FILE="${WORK_DIR}/build.log"
|
|
|
|
export HOSTNAME=${HOSTNAME:-raspberrypi}
|
|
|
|
export FIRST_USER_NAME=${FIRST_USER_NAME:-pi}
|
|
export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry}
|
|
export WPA_ESSID
|
|
export WPA_PASSWORD
|
|
export WPA_COUNTRY
|
|
export ENABLE_SSH="${ENABLE_SSH:-0}"
|
|
|
|
export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_GB.UTF-8}"
|
|
|
|
export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-gb}"
|
|
export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (UK)}"
|
|
|
|
export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/London}"
|
|
|
|
export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
|
|
|
|
if [ "${USE_QEMU}" = "1" ]; then
|
|
# shellcheck disable=SC2034
|
|
export stage2_EXPORT_LIST="${stage2_EXPORT_LIST:-export-image}"
|
|
# shellcheck disable=SC2034
|
|
export stage4_EXPORT_LIST="${stage4_EXPORT_LIST:-export-image}"
|
|
# shellcheck disable=SC2034
|
|
export stage5_EXPORT_LIST="${stage5_EXPORT_LIST:-export-image}"
|
|
fi
|
|
|
|
export CLEAN
|
|
export IMG_NAME
|
|
export APT_PROXY
|
|
|
|
export STAGE
|
|
export STAGE_DIR
|
|
export STAGE_WORK_DIR
|
|
export PREV_STAGE
|
|
export PREV_STAGE_DIR
|
|
export ROOTFS_DIR
|
|
export PREV_ROOTFS_DIR
|
|
export IMG_SUFFIX
|
|
export NOOBS_NAME
|
|
export NOOBS_DESCRIPTION
|
|
export EXPORT_DIR
|
|
export EXPORT_ROOTFS_DIR
|
|
|
|
export QUILT_PATCHES
|
|
export QUILT_NO_DIFF_INDEX=1
|
|
export QUILT_NO_DIFF_TIMESTAMPS=1
|
|
export QUILT_REFRESH_ARGS="-p ab"
|
|
|
|
# shellcheck source=scripts/common
|
|
source "${SCRIPT_DIR}/common"
|
|
# shellcheck source=scripts/dependencies_check
|
|
source "${SCRIPT_DIR}/dependencies_check"
|
|
|
|
dependencies_check "${BASE_DIR}/depends"
|
|
|
|
#check username is valid
|
|
if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
|
|
echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then
|
|
echo "Could not reach APT_PROXY server: ${APT_PROXY}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63 ]] ; then
|
|
echo "WPA_PASSWORD" must be between 8 and 63 characters
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "${WORK_DIR}"
|
|
log "Begin ${BASE_DIR}"
|
|
|
|
STAGE_LIST=${STAGE_LIST:-${BASE_DIR}/stage*}
|
|
|
|
for STAGE_DIR in $STAGE_LIST; do
|
|
STAGE_DIR=$(realpath "${STAGE_DIR}")
|
|
run_stage
|
|
done
|
|
|
|
CLEAN=1
|
|
|
|
for EXPORT_DIR in ${EXPORT_DIRS}; do
|
|
log "Begin export ${EXPORT_DIR}"
|
|
# e.g. stageX with default stage_dirs
|
|
get_stage_export "${EXPORT_DIR}"
|
|
|
|
for EXPORT_IMAGE in ${EXPORT_LIST}; do
|
|
IMAGE_SOURCE="$(echo "${EXPORT_IMAGE}" | tr '[:lower:]' '[:upper:]' | tr '\-' '_')"
|
|
if [ -f "${EXPORT_DIR}/${IMAGE_SOURCE}" ]; then
|
|
log "Begin ${EXPORT_IMAGE}"
|
|
STAGE_DIR="${BASE_DIR}/${EXPORT_IMAGE}"
|
|
# shellcheck source=/dev/null
|
|
source "${EXPORT_DIR}/${IMAGE_SOURCE}"
|
|
# shellcheck disable=SC2153
|
|
EXPORT_ROOTFS_DIR="${WORK_DIR}/${EXPORT_STAGE}/rootfs"
|
|
run_stage
|
|
log "End ${EXPORT_IMAGE}"
|
|
fi
|
|
done
|
|
log "End export ${EXPORT_DIR}"
|
|
done
|
|
|
|
if [ -x ${BASE_DIR}/postrun.sh ]; then
|
|
log "Begin postrun.sh"
|
|
cd "${BASE_DIR}"
|
|
./postrun.sh
|
|
log "End postrun.sh"
|
|
fi
|
|
|
|
log "End ${BASE_DIR}"
|