From c419c549b9a1db32d307ae5a6ad62f6b41540e78 Mon Sep 17 00:00:00 2001 From: BtbN Date: Tue, 6 Apr 2021 03:41:36 +0200 Subject: [PATCH] Add fully layered build --- generate.sh | 72 ++++++++++++++++++---- scripts.d/10-mingw.sh | 8 +++ scripts.d/{21-libxml2.sh => 20-libxml2.sh} | 0 util/vars.sh | 8 +++ 4 files changed, 77 insertions(+), 11 deletions(-) rename scripts.d/{21-libxml2.sh => 20-libxml2.sh} (100%) diff --git a/generate.sh b/generate.sh index fbfe5ed..b5ceb93 100755 --- a/generate.sh +++ b/generate.sh @@ -5,19 +5,69 @@ source util/vars.sh rm -f Dockerfile -to_df() { - printf "$@" >> Dockerfile - echo >> Dockerfile +layername() { + printf "layer-" + basename "$1" | sed 's/.sh$//' } -to_df "FROM ${REGISTRY}/${REPO}/base-${TARGET}:latest" +exec_dockerstage() { + SCRIPT="$1" + ( + SELF="$SCRIPT" + source "$SCRIPT" + ffbuild_enabled || exit 0 + ffbuild_dockerstage || exit $? + ) +} + +to_df() { + _of="${TODF:-Dockerfile}" + printf "$@" >> "$_of" + echo >> "$_of" +} + +to_df "FROM ${REGISTRY}/${REPO}/base-${TARGET}:latest AS base" to_df "ENV TARGET=$TARGET VARIANT=$VARIANT REPO=$REPO ADDINS_STR=$ADDINS_STR" -for script in scripts.d/*.sh; do -( - SELF="$script" - source $script - ffbuild_enabled || exit 0 - ffbuild_dockerstage || exit $? -) +PREVLAYER="base" +for ID in $(ls -1d scripts.d/??-* | sed -s 's|^.*/\(..\).*|\1|' | sort -u); do + LAYER="layer-$ID" + + for STAGE in scripts.d/$ID-*; do + to_df "FROM $PREVLAYER AS $(layername "$STAGE")" + + if [[ -f "$STAGE" ]]; then + exec_dockerstage "$STAGE" + else + for STAGE in "${STAGE}"/??-*; do + exec_dockerstage "$STAGE" + done + fi + done + + to_df "FROM $PREVLAYER AS $LAYER" + for STAGE in scripts.d/$ID-*; do + if [[ -f "$STAGE" ]]; then + SCRIPT="$STAGE" + else + SCRIPTS=( "$STAGE"/??-* ) + SCRIPT="${SCRIPTS[-1]}" + fi + + ( + SELF="$SCRIPT" + SELFLAYER="$(layername "$STAGE")" + source "$SCRIPT" + ffbuild_enabled || exit 0 + ffbuild_dockerlayer || exit $? + TODF="Dockerfile.final" PREVLAYER="__PREVLAYER__" \ + ffbuild_dockerfinal || exit $? + ) + done + + PREVLAYER="$LAYER" done + +to_df "FROM base" +sed "s/__PREVLAYER__/$PREVLAYER/g" Dockerfile.final | sort -u >> Dockerfile +rm Dockerfile.final diff --git a/scripts.d/10-mingw.sh b/scripts.d/10-mingw.sh index 4a7c198..aba0743 100755 --- a/scripts.d/10-mingw.sh +++ b/scripts.d/10-mingw.sh @@ -8,6 +8,14 @@ ffbuild_enabled() { return 0 } +ffbuild_dockerlayer() { + to_df "COPY --from=${SELFLAYER} /usr/\$FFBUILD_TOOLCHAIN/. /usr/\$FFBUILD_TOOLCHAIN" +} + +ffbuild_dockerfinal() { + to_df "COPY --from=${PREVLAYER} /usr/\$FFBUILD_TOOLCHAIN/. /usr/\$FFBUILD_TOOLCHAIN" +} + ffbuild_dockerbuild() { git-mini-clone "$MINGW_REPO" "$MINGW_COMMIT" mingw cd mingw/mingw-w64-headers diff --git a/scripts.d/21-libxml2.sh b/scripts.d/20-libxml2.sh similarity index 100% rename from scripts.d/21-libxml2.sh rename to scripts.d/20-libxml2.sh diff --git a/util/vars.sh b/util/vars.sh index 1be3bb1..f8643e3 100644 --- a/util/vars.sh +++ b/util/vars.sh @@ -39,6 +39,14 @@ ffbuild_dockerstage() { to_df "RUN --mount=src=${SELF},dst=/stage.sh run_stage /stage.sh" } +ffbuild_dockerlayer() { + to_df "COPY --from=${SELFLAYER} \$FFBUILD_PREFIX/. \$FFBUILD_PREFIX" +} + +ffbuild_dockerfinal() { + to_df "COPY --from=${PREVLAYER} \$FFBUILD_PREFIX/. \$FFBUILD_PREFIX" +} + ffbuild_configure() { return 0 }