From 3f2ff883c36a716bb5cf4aee25236af06b9e42d1 Mon Sep 17 00:00:00 2001 From: "Daniel F. Dickinson" Date: Thu, 16 Jan 2020 00:13:53 -0500 Subject: [PATCH] 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 --- README.md | 18 ++++++++++++++++++ build.sh | 44 ++++++++++++++++++++++++++++++++------------ scripts/common | 26 ++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 73d4961..a305dbd 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/build.sh b/build.sh index 9e78728..1b264d6 100755 --- a/build.sh +++ b/build.sh @@ -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 diff --git a/scripts/common b/scripts/common index e2048d9..9c3e4d5 100644 --- a/scripts/common +++ b/scripts/common @@ -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