mirror of
https://github.com/armbian/build.git
synced 2025-08-15 23:56:57 +02:00
- armbian-next: introduce `USE_LOCAL_APT_DEB_CACHE` (default `=yes`) as alternative/in addition to `apt-cacher-ng` (eg, in Docker) - this uses `cache/aptcache/${RELEASE}-${ARCH}` (in the host) for - apt cache, by bind-mounting it to `${SDCARD}/var/cache/apt` in the `chroot_sdcard_apt_get()` runner and its usages - debootstrap, by passing it `--cache-dir` - utility function to help understand what is happening to cache during usage - apt itself mantains this cache, removing old packages when new ones are installed. apt does this _by default_ - introduce `DONT_MAINTAIN_APT_CACHE=yes` to skip out of automatic apt maintenance of apt cache, eg, during `remove`s - don't do `apt clean` and such if using local cache, that would clean the cache, not the chroot - clean up `install_deb_chroot()` a little, find an unrelated bug there - WiP: the great cli entrypoint (+docker) rewrite, Phase 6: relaunching structure; re-pass ARMBIAN_BUILD_UUID; use ARMBIAN_COMMAND for log filename; fix for output/logs dir perms - WiP: the great cli entrypoint (+docker) rewrite, Phase 5: cleanups 4/x; better logging, check & force `DEST_LANG` - WiP: the great cli entrypoint (+docker) rewrite, Phase 5: cleanups 3/x; don't write to stderr in generated Dockerfile - it's `drastic red` on non-buildx dockers - WiP: the great cli entrypoint (+docker) rewrite, Phase 5: cleanups 2/x, logging - WiP: the great cli entrypoint (+docker) rewrite, Phase 5: cleanups 1/x - source configs in a logging section. - Docker: silent, fast retries to make sure `docker system df` works - shut-up `chown` (no `-v`) output related to `SET_OWNER_TO_UID` - ask user to wait while `DESTIMG` is rsync'ed to `FINALDEST` -- it's potentially very slow - use green apple for Mac logging, instead of red apple which might imply error... - WiP: the great cli entrypoint (+docker) rewrite, Phase 4: run as non-root, maybe-with-Docker - introduce `is_docker_ready_to_go()`; if it is, and we're not root, use Docker instead of sudo. <- GOOD IDEA? BAD IDEA? lol - introduce `SET_OWNER_TO_UID` var to be passed to Docker/sudo so written files are owned by the launching user, not root. - introduce `mkdir_recursive_and_set_uid_owner()` and `reset_uid_owner()` to reset owner based on `SET_OWNER_TO_UID` - use it for userpatches files created, logs, and output files, including images and debs. - @TODOs ref. `$SUDO_USER` which I think the old version of this? - add a lot of @TODOs, ref being able to relaunch something that's not `build` inside Docker, also add/change params and configs and command. - initially add `ARMBIAN_DOCKER_RELAUNCH_EXTRA_ARGS` - WiP: the great cli entrypoint (+docker) rewrite, Phase 3: rpardini is demented, v3 - WiP: the great cli entrypoint (+docker) rewrite, Phase 2: rpardini is demented - WiP: the great cli entrypoint (+docker) rewrite, Phase 1 - armbian-next: WiP: Docker: actually use the GHA-image as base; pull it every 24hs. - using image in my private repo. - this has significant speedup to "start building time" on the 1st run - move some Linux specific stuff to its own if - add comments and todo - armbian-next: WiP: Docker, high-WiP, beginnings of Armbian mount dict, with linux/darwin preferences - armbian-next: WiP: Docker, configure `BUILDKIT_COLORS` - armbian-next: WiP: Docker, make docker image from Dockerfile more compact by flattening layers - armbian-next: `logging`: add whale indicator if build running under Docker - armbian-next: WiP: `docker`: working with `bookworm`, `sid`, and `jammy` on Darwin & Linux; works with `bullseye` on Linux only - armbian-next: WiP: `docker`: force ARMBIAN_RUNNING_IN_CONTAINER both in Dockerfile and passed as `--env`; apt update and install in same layer; back to jammy - armbian-next: introduce `armbian_is_running_in_container()` and `armbian_is_host_running_systemd()`, replacing `systemd-detect-virt` in multiple spots - WiP: try with debian:bullseye -- can't detect docker at all - armbian-next: WiP: 2nd stab at new Docker support; Darwin still works; Linux `docker.io` working - gen .dockerignore together with Dockerfile - split in funcs - hacks for Linux and `/dev/loop` stuff, CONTAINER_COMPAT=yes - mac still works, Linux stuff would break it but I if'fed - armbian-next: the secrets of `CONTAINER_COMPAT` revealed; add size checking to check_loop_device() and avoid retry when `mknod`ing - this fails for the right reasons now, causing retries, which are then retried and work ;-) - this is related to building under Docker on Linux, using docker.io package (not docker-ce) - armbian-next: remove `.dockerignore` and add it to `.gitignore`; it's going to be auto-generated - armbian-next: `.dockerignore`: Docker context should only have minimal files and folders, to speed up Dockerfile build - IMPORTANT: `.dockerignore` is going to be generated from now on: so this is the last commit with changes before removal - armbian-next: WiP: initial stab at new Docker support; really run the passed cmdline; add Dockerfile to gitignore - armbian-next: WiP: initial stab at new Docker support; generate Dockerfile; introduce REQUIREMENTS_DEFS_ONLY - uses REQUIREMENTS_DEFS_ONLY - works on Docker Desktop on Mac; - linux TBA - armbian-next: don't error out if `.git` not present; other small fixes - armbian-next: general "work or at least don't misbehave when run on a very bare ubuntu:latest instance" - can't assume things, for example: - that `sudo` will be available; it might not, and might be already root, no reason to fail - that `/etc/timezone` will exist - that `systemd-detect-virt` will be available - that `git` will be available - that `locale-gen` will be available
226 lines
10 KiB
Bash
226 lines
10 KiB
Bash
# This does NOT run under the logging manager. We should invoke the do_with_logging wrapper for
|
|
# strategic parts of this. Attention: rootfs does it's own logging, so just let that be.
|
|
function main_default_build_single() {
|
|
|
|
# Starting work. Export TMPDIR, which will be picked up by all `mktemp` invocations hopefully.
|
|
# Runner functions in logging/runners.sh will explicitly unset TMPDIR before invoking chroot.
|
|
# Invoking chroot directly will fail in subtle ways, so, please use the runner.sh functions.
|
|
display_alert "Starting single build, exporting TMPDIR" "${WORKDIR}" "debug"
|
|
mkdir -p "${WORKDIR}"
|
|
add_cleanup_handler trap_handler_cleanup_workdir
|
|
|
|
export TMPDIR="${WORKDIR}"
|
|
|
|
start=$(date +%s)
|
|
|
|
### Write config summary
|
|
LOG_SECTION="config_summary" do_with_logging write_config_summary_output_file
|
|
|
|
# Check and install dependencies, directory structure and settings
|
|
LOG_SECTION="prepare_host" do_with_logging prepare_host
|
|
|
|
# Create a directory inside WORKDIR with a "python" symlink to "/usr/bin/python2"; add it to PATH first.
|
|
BIN_WORK_DIR="${WORKDIR}/bin"
|
|
# No cleanup of this is necessary, since it's inside WORKDIR.
|
|
mkdir -p "${BIN_WORK_DIR}"
|
|
ln -s "/usr/bin/python2" "${BIN_WORK_DIR}/python"
|
|
export PATH="${BIN_WORK_DIR}:${PATH}"
|
|
|
|
if [[ "${JUST_INIT}" == "yes" ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
if [[ $CLEAN_LEVEL == *sources* ]]; then
|
|
general_cleaning "sources"
|
|
fi
|
|
|
|
# Too many things being done. Allow doing only one thing. For core development, mostly.
|
|
# Also because "KERNEL_ONLY=yes" should really be spelled "PACKAGES_ONLY=yes"
|
|
local do_build_uboot="yes" do_build_kernel="yes" exit_after_kernel_build="no" exit_after_uboot_build="no" do_host_tools="yes"
|
|
if [[ "${JUST_UBOOT}" == "yes" && "${JUST_KERNEL}" == "yes" ]]; then
|
|
exit_with_error "User of build system" "can't make up his mind about JUST_KERNEL or JUST_UBOOT"
|
|
elif [[ "${JUST_UBOOT}" == "yes" ]]; then
|
|
display_alert "JUST_KERNEL set to yes" "Building only kernel and exiting after that" "debug"
|
|
do_build_uboot="yes"
|
|
do_host_tools="yes" # rkbin, fips, etc.
|
|
exit_after_uboot_build="yes"
|
|
elif [[ "${JUST_KERNEL}" == "yes" ]]; then
|
|
display_alert "JUST_KERNEL set to yes" "Building only kernel and exiting after that" "debug"
|
|
do_build_uboot="no"
|
|
exit_after_kernel_build="yes"
|
|
do_host_tools="no"
|
|
fi
|
|
|
|
# ignore updates help on building all images - for internal purposes
|
|
if [[ $IGNORE_UPDATES != yes ]]; then
|
|
|
|
# Fetch and build the host tools (via extensions)
|
|
if [[ "${do_host_tools}" == "yes" ]]; then
|
|
LOG_SECTION="fetch_and_build_host_tools" do_with_logging fetch_and_build_host_tools
|
|
fi
|
|
|
|
for cleaning_fragment in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do
|
|
if [[ $cleaning_fragment != sources ]] && [[ $cleaning_fragment != none ]] && [[ $cleaning_fragment != make* ]]; then
|
|
LOG_SECTION="cleaning_${cleaning_fragment}" do_with_logging general_cleaning "${cleaning_fragment}"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ "${do_build_uboot}" == "yes" ]]; then
|
|
# Don't build u-boot at all if the BOOTCONFIG is 'none'.
|
|
if [[ "${BOOTCONFIG}" != "none" ]]; then
|
|
# @TODO: refactor this. we use it very often
|
|
# Compile u-boot if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]]; then
|
|
if [[ -n "${ATFSOURCE}" && "${ATFSOURCE}" != "none" && "${REPOSITORY_INSTALL}" != *u-boot* ]]; then
|
|
LOG_SECTION="compile_atf" do_with_logging compile_atf
|
|
fi
|
|
# @TODO: refactor this construct. we use it too many times.
|
|
if [[ "${REPOSITORY_INSTALL}" != *u-boot* ]]; then
|
|
LOG_SECTION="compile_uboot" do_with_logging compile_uboot
|
|
fi
|
|
fi
|
|
fi
|
|
if [[ "${exit_after_uboot_build}" == "yes" ]]; then
|
|
display_alert "Exiting after u-boot build" "JUST_UBOOT=yes" "info"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Compile kernel if packed .deb does not exist or use the one from repository
|
|
if [[ "${do_build_kernel}" == "yes" ]]; then
|
|
if [[ ! -f ${DEB_STORAGE}/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb ]]; then
|
|
export KDEB_CHANGELOG_DIST=$RELEASE
|
|
if [[ -n $KERNELSOURCE ]] && [[ "${REPOSITORY_INSTALL}" != *kernel* ]]; then
|
|
compile_kernel # This handles its own logging sections.
|
|
fi
|
|
fi
|
|
if [[ "${exit_after_kernel_build}" == "yes" ]]; then
|
|
display_alert "Only building kernel and exiting" "JUST_KERNEL=yes" "debug"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Compile armbian-config if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f ${DEB_STORAGE}/armbian-config_${REVISION}_all.deb ]]; then
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-config* ]]; then
|
|
LOG_SECTION="compile_armbian-config" do_with_logging compile_armbian-config
|
|
fi
|
|
fi
|
|
|
|
# Compile armbian-zsh if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f ${DEB_STORAGE}/armbian-zsh_${REVISION}_all.deb ]]; then
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-zsh* ]]; then
|
|
LOG_SECTION="compile_armbian-zsh" do_with_logging compile_armbian-zsh
|
|
fi
|
|
fi
|
|
|
|
# Compile plymouth-theme-armbian if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f ${DEB_STORAGE}/plymouth-theme-armbian_${REVISION}_all.deb ]]; then
|
|
if [[ "${REPOSITORY_INSTALL}" != *plymouth-theme-armbian* ]]; then
|
|
compile_plymouth-theme-armbian
|
|
fi
|
|
fi
|
|
|
|
# Compile armbian-firmware if packed .deb does not exist or use the one from repository
|
|
if ! ls "${DEB_STORAGE}/armbian-firmware_${REVISION}_all.deb" 1> /dev/null 2>&1 || ! ls "${DEB_STORAGE}/armbian-firmware-full_${REVISION}_all.deb" 1> /dev/null 2>&1; then
|
|
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-firmware* ]]; then
|
|
if [[ "${INSTALL_ARMBIAN_FIRMWARE:-yes}" == "yes" ]]; then # Build firmware by default.
|
|
# Build the light version of firmware package
|
|
FULL="" REPLACE="-full" LOG_SECTION="compile_firmware" do_with_logging compile_firmware
|
|
|
|
# Build the full version of firmware package
|
|
FULL="-full" REPLACE="" LOG_SECTION="compile_firmware_full" do_with_logging compile_firmware
|
|
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
overlayfs_wrapper "cleanup"
|
|
|
|
# create board support package
|
|
if [[ -n "${RELEASE}" && ! -f "${DEB_STORAGE}/${BSP_CLI_PACKAGE_FULLNAME}.deb" && "${REPOSITORY_INSTALL}" != *armbian-bsp-cli* ]]; then
|
|
LOG_SECTION="create_board_package" do_with_logging create_board_package
|
|
fi
|
|
|
|
# create desktop package
|
|
if [[ -n "${RELEASE}" && "${DESKTOP_ENVIRONMENT}" && ! -f "${DEB_STORAGE}/$RELEASE/${CHOSEN_DESKTOP}_${REVISION}_all.deb" && "${REPOSITORY_INSTALL}" != *armbian-desktop* ]]; then
|
|
LOG_SECTION="create_desktop_package" do_with_logging create_desktop_package
|
|
fi
|
|
if [[ -n "${RELEASE}" && "${DESKTOP_ENVIRONMENT}" && ! -f "${DEB_STORAGE}/${RELEASE}/${BSP_DESKTOP_PACKAGE_FULLNAME}.deb" && "${REPOSITORY_INSTALL}" != *armbian-bsp-desktop* ]]; then
|
|
LOG_SECTION="create_bsp_desktop_package" do_with_logging create_bsp_desktop_package
|
|
fi
|
|
|
|
# skip image creation if exists. useful for CI when making a lot of images
|
|
if [ "$IMAGE_PRESENT" == yes ] && ls "${FINALDEST}/${VENDOR}_${REVISION}_${BOARD^}_${RELEASE}_${BRANCH}_${VER/-$LINUXFAMILY/}${DESKTOP_ENVIRONMENT:+_$DESKTOP_ENVIRONMENT}"*.xz 1> /dev/null 2>&1; then
|
|
display_alert "Skipping image creation" "image already made - IMAGE_PRESENT is set" "wrn"
|
|
exit
|
|
fi
|
|
|
|
# build additional packages
|
|
if [[ $EXTERNAL_NEW == compile ]]; then
|
|
LOG_SECTION="chroot_build_packages" do_with_logging chroot_build_packages
|
|
fi
|
|
|
|
# Reset owner of DEB_STORAGE, if needed. Might be a lot of packages there, but such is life.
|
|
# @TODO: might be needed also during 'cleanup': if some package fails, the previous package might be left owned by root.
|
|
reset_uid_owner "${DEB_STORAGE}"
|
|
|
|
# end of kernel-only, so display what was built.
|
|
if [[ $KERNEL_ONLY != yes ]]; then
|
|
display_alert "Kernel build done" "@host" "target-reached"
|
|
display_alert "Target directory" "${DEB_STORAGE}/" "info"
|
|
display_alert "File name" "${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb" "info"
|
|
fi
|
|
|
|
# build rootfs, if not only kernel.
|
|
if [[ $KERNEL_ONLY != yes ]]; then
|
|
display_alert "Building image" "${BOARD}" "target-started"
|
|
[[ $BSP_BUILD != yes ]] && build_rootfs_and_image # old debootstrap-ng. !!!LOGGING!!! handled inside, there are many sub-parts.
|
|
display_alert "Done building image" "${BOARD}" "target-reached"
|
|
fi
|
|
|
|
call_extension_method "run_after_build" <<- 'RUN_AFTER_BUILD'
|
|
*hook for function to run after build, i.e. to change owner of `$SRC`*
|
|
Really one of the last hooks ever called. The build has ended. Congratulations.
|
|
- *NOTE:* this will run only if there were no errors during build process.
|
|
RUN_AFTER_BUILD
|
|
|
|
end=$(date +%s)
|
|
runtime=$(((end - start) / 60))
|
|
display_alert "Runtime" "$runtime min" "info"
|
|
|
|
if armbian_is_running_in_container; then
|
|
BUILD_CONFIG='docker' # @TODO: this is not true, depends on how we end up launching this.
|
|
fi
|
|
|
|
# Make it easy to repeat build by displaying build options used. Prepare array.
|
|
local -a repeat_args=("./compile.sh" "${BUILD_CONFIG}" " BRANCH=${BRANCH}")
|
|
[[ -n ${RELEASE} ]] && repeat_args+=("RELEASE=${RELEASE}")
|
|
[[ -n ${BUILD_MINIMAL} ]] && repeat_args+=("BUILD_MINIMAL=${BUILD_MINIMAL}")
|
|
[[ -n ${BUILD_DESKTOP} ]] && repeat_args+=("BUILD_DESKTOP=${BUILD_DESKTOP}")
|
|
[[ -n ${KERNEL_ONLY} ]] && repeat_args+=("KERNEL_ONLY=${KERNEL_ONLY}")
|
|
[[ -n ${KERNEL_CONFIGURE} ]] && repeat_args+=("KERNEL_CONFIGURE=${KERNEL_CONFIGURE}")
|
|
[[ -n ${DESKTOP_ENVIRONMENT} ]] && repeat_args+=("DESKTOP_ENVIRONMENT=${DESKTOP_ENVIRONMENT}")
|
|
[[ -n ${DESKTOP_ENVIRONMENT_CONFIG_NAME} ]] && repeat_args+=("DESKTOP_ENVIRONMENT_CONFIG_NAME=${DESKTOP_ENVIRONMENT_CONFIG_NAME}")
|
|
[[ -n ${DESKTOP_APPGROUPS_SELECTED} ]] && repeat_args+=("DESKTOP_APPGROUPS_SELECTED=\"${DESKTOP_APPGROUPS_SELECTED}\"")
|
|
[[ -n ${DESKTOP_APT_FLAGS_SELECTED} ]] && repeat_args+=("DESKTOP_APT_FLAGS_SELECTED=\"${DESKTOP_APT_FLAGS_SELECTED}\"")
|
|
[[ -n ${COMPRESS_OUTPUTIMAGE} ]] && repeat_args+=("COMPRESS_OUTPUTIMAGE=${COMPRESS_OUTPUTIMAGE}")
|
|
display_alert "Repeat Build Options" "${repeat_args[*]}" "ext" # * = expand array, space delimited, single-word.
|
|
|
|
}
|
|
|
|
function trap_handler_cleanup_workdir() {
|
|
display_alert "Cleanup WORKDIR: $WORKDIR" "trap_handler_cleanup_workdir" "cleanup"
|
|
unset TMPDIR
|
|
if [[ -d "${WORKDIR}" ]]; then
|
|
if [[ "${PRESERVE_WORKDIR}" != "yes" ]]; then
|
|
display_alert "Cleaning up WORKDIR" "$(du -h -s "$WORKDIR")" "debug"
|
|
rm -rf "${WORKDIR}"
|
|
else
|
|
display_alert "Preserving WORKDIR due to PRESERVE_WORKDIR=yes" "$(du -h -s "$WORKDIR")" "warn"
|
|
fi
|
|
fi
|
|
}
|