Allow customizing exports (images) and document

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>
This commit is contained in:
Daniel F. Dickinson 2020-01-16 00:13:53 -05:00
parent f8f3d6fe93
commit 3f2ff883c3
3 changed files with 76 additions and 12 deletions

View File

@ -129,6 +129,24 @@ The following environment variables are supported:
If set, then instead of working through the numeric stages in order, this list will be followed. For example setting to `"stage0 stage1 mystage stage2"` will run the contents of `mystage` before stage2. Note that quotes are needed around the list. An absolute or relative path can be given for stages outside the pi-gen directory.
* `stageX_EXPORT_LIST` (Default: based on presence for `EXPORT_IMAGE` and/or
`EXPORT_NOOBS` in stageX directory (currently stage2, stage4, and stage5) )
If set, then instead of determining images to export based on `EXPORT_IMAGE`
and/or `EXPORT_NOOBS` being present in a particular directory the images to
export for a particular stage is based on that stage's `stageX_EXPORT_LIST`.
Only stages with a `stageX_EXPORT_LIST` (e.g. `stage2_EXPORT_LIST`) are
determined this way. All other stages use the default method (presence of
`EXPORT_IMAGE` and/or `EXPORT_NOOBS`).
For stages with a `stageX_EXPORT_LIST`, the contents of EXPORT_LIST are
expected to be directory names in the repo directory. In addition, files
with each directory in EXPORT_LIST translated to upper case and dashes (-)
converted to underscores (\_) in the stage's directory are sourced before
generating the image. (e.g. an 'export-image' in the stage2_EXPORT_LIST
first sources stage2/EXPORT_IMAGE and then generates an images using the
`export-image` directory, which is the same behaviour as the old default
behaviour.
A simple example for building Raspbian:
```bash

View File

@ -87,8 +87,13 @@ run_stage(){
STAGE_WORK_DIR="${WORK_DIR}/${STAGE}"
ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs
if [ ! -f SKIP_IMAGES ]; then
if [ -f "${STAGE_DIR}/EXPORT_IMAGE" ]; then
EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}"
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
@ -180,6 +185,15 @@ 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
@ -236,20 +250,26 @@ for STAGE_DIR in $STAGE_LIST; do
done
CLEAN=1
for EXPORT_DIR in ${EXPORT_DIRS}; do
STAGE_DIR=${BASE_DIR}/export-image
# shellcheck source=/dev/null
source "${EXPORT_DIR}/EXPORT_IMAGE"
EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename "${EXPORT_DIR}")/rootfs
run_stage
if [ "${USE_QEMU}" != "1" ]; then
if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then
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}/EXPORT_NOOBS"
STAGE_DIR="${BASE_DIR}/export-noobs"
source "${EXPORT_DIR}/${IMAGE_SOURCE}"
# shellcheck disable=SC2153
EXPORT_ROOTFS_DIR="${WORK_DIR}/${EXPORT_STAGE}/rootfs"
run_stage
log "End ${EXPORT_IMAGE}"
fi
fi
done
log "End export ${EXPORT_DIR}"
done
if [ -x ${BASE_DIR}/postrun.sh ]; then

View File

@ -98,3 +98,29 @@ update_issue() {
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using ${PI_GEN}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
}
export -f update_issue
get_stage_export() {
local stage_dir="$1"
local stage_var
stage_var="$(echo "$(basename "$1")"|tr '\- :/' '_')"
local export_list_var
export_list_var="\$${stage_var}"_EXPORT_LIST
eval EXPORT_LIST="$export_list_var"
if [ -z "${EXPORT_LIST}" ]; then
if [ -e "$stage_dir"/EXPORT_IMAGE ]; then
EXPORT_LIST="export-image"
fi
if [ -e "$stage_dir"/EXPORT_NOOBS ]; then
EXPORT_LIST="${EXPORT_LIST} export-noobs"
fi
fi
EXPORT_STAGE="$(basename "$1")"
export EXPORT_STAGE
export EXPORT_LIST
}
export -f get_stage_export