From 5137f76cc9e21b199af72c9fe934284e0f761538 Mon Sep 17 00:00:00 2001 From: Ricardo Pardini Date: Fri, 1 Jul 2022 01:57:08 +0200 Subject: [PATCH] ------------------------ armbian-next END marker ----------------------------- - this contains .md with the git logs short and full for the armbian-next history pre-squash --- README.armbian-next.md | 47309 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47309 insertions(+) create mode 100644 README.armbian-next.md diff --git a/README.armbian-next.md b/README.armbian-next.md new file mode 100644 index 000000000..97170cc1b --- /dev/null +++ b/README.armbian-next.md @@ -0,0 +1,47309 @@ +## This is armbian-next. + + + +## Short fuller log + +- c9cf3fc241cfb4c872f4aef7bbc41d5854db7ea3 to 6809de3d6063cb041205a8318e19da6a4dee68c9 ref extensions_08_10_2022_pre_v30 + + +``` +commit 6809de3d6063cb041205a8318e19da6a4dee68c9 +Author: Ricardo Pardini +AuthorDate: Sat Oct 8 11:30:37 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:32:06 2022 +0200 + + armbian-next: manual merge (30) of lib changes between 882f995e21f4791d773bc59efdfdb676494ee6ba and 31ac6383e1ac7ebddd0813abc0f1f9632a9c9c40 + +lib/functions/configuration/main-config.sh +lib/functions/general/downloads.sh + +commit 404916b083a1f1a9735abe40452d460c65cd412f +Author: Igor Pecovnik +AuthorDate: Sun Jan 16 23:59:47 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:32:06 2022 +0200 + + armbian-next: manual merge (30) of family/board changes between 882f995e21f4791d773bc59efdfdb676494ee6ba and 31ac6383e1ac7ebddd0813abc0f1f9632a9c9c40 + +config/sources/families/media.conf + +commit adc5e01444daf4548cba3ef99ea3430d8bbf8335 +Author: Ricardo Pardini +AuthorDate: Sun Sep 25 01:49:11 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (29) of family/board changes between 3435c4636723e9553be0a9ce3666bddb0887069e and 882f995e21f4791d773bc59efdfdb676494ee6ba (A LOT!) + +config/boards/uefi-arm64.conf +config/boards/uefi-x86.conf +config/sources/arm64.conf +config/sources/armhf.conf +config/sources/families/bcm2711.conf +config/sources/families/include/meson_common.inc +config/sources/families/uefi-x86.conf + +commit c1aef1c25eb29772a754bd3961b69f98c7afa48d +Author: Ricardo Pardini +AuthorDate: Sun Sep 25 01:36:43 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (29) of lib changes between 3435c4636723e9553be0a9ce3666bddb0887069e and 882f995e21f4791d773bc59efdfdb676494ee6ba (A LOT!) + +extensions/grub.sh +lib/functions/bsp/bsp-desktop.sh +lib/functions/compilation/debs.sh +lib/functions/compilation/patch/kernel-bootsplash.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/configuration/interactive.sh +lib/functions/configuration/main-config.sh +lib/functions/general/chroot-helpers.sh +lib/functions/general/cleaning.sh +lib/functions/general/downloads.sh +lib/functions/host/external-toolchains.sh +lib/functions/image/initrd.sh +lib/functions/image/partitioning.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/main/default-build.sh +lib/functions/rootfs/create-cache.sh +lib/functions/rootfs/distro-agnostic.sh +lib/functions/rootfs/distro-specific.sh + +commit dde4db8ee4d9f984b35f8fb909785622316207a8 +Author: Ricardo Pardini +AuthorDate: Sat Aug 27 12:52:47 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (28) of lib changes between revisions af6ceee6c55bd4726139fb8b1ad77641d385515a and 38df56fbf39739b48b31b5e393f15261d053b3cd + +lib/functions/compilation/patch/kernel-bootsplash.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/image/fingerprint.sh +lib/functions/image/partitioning.sh + +commit 0ae75757f23941e025ed29dae1aacf44cd2249ac +Author: Ricardo Pardini +AuthorDate: Sat Aug 27 12:41:42 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (28) of sources/families changes between revisions af6ceee6c55bd4726139fb8b1ad77641d385515a and 38df56fbf39739b48b31b5e393f15261d053b3cd + +config/sources/families/include/meson_common.inc +config/sources/families/media.conf +config/sources/families/odroidxu4.conf + +commit e3e84f5c72e34013ea09dbd556c30870017b43a8 +Author: Ricardo Pardini +AuthorDate: Sat Aug 13 13:53:57 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (27) of `lib` changes between revisions 9c52562176390624d33c93634e63a8f91cc0815b and af6ceee6c55bd4726139fb8b1ad77641d385515a + +lib/functions/bsp/bsp-cli.sh +lib/functions/compilation/patch/kernel-bootsplash.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/general/cleaning.sh +lib/functions/general/downloads.sh +lib/functions/image/partitioning.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/create-cache.sh +lib/functions/rootfs/distro-agnostic.sh + +commit d08b0971d93456143e2648b94341fedc5a612049 +Author: Ricardo Pardini +AuthorDate: Sat Aug 13 13:24:53 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (27) of `sources/families` changes between revisions 9c52562176390624d33c93634e63a8f91cc0815b and af6ceee6c55bd4726139fb8b1ad77641d385515a + +config/sources/families/bcm2711.conf +config/sources/families/imx6.conf +config/sources/families/include/meson64_common.inc +config/sources/families/include/meson_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +config/sources/families/include/uefi_common.inc +config/sources/families/jethub.conf +config/sources/families/media.conf +config/sources/families/mvebu64.conf +config/sources/families/rk322x.conf +config/sources/families/rockchip-rk3588.conf +config/sources/families/rockchip.conf + +commit 2306f2c90751a293dfed429819496b1c7cce3ab0 +Author: Ricardo Pardini +AuthorDate: Wed Jun 29 10:38:41 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: move `ROOTFSCACHE_VERSION` resolution from GitHub from `main-config` down to `create-cache` + + - this way config does not depend on remote... + +lib/functions/configuration/main-config.sh +lib/functions/rootfs/create-cache.sh + +commit dfcfcbc5e08b81d294170bb901900f7772abc0ae +Author: Ricardo Pardini +AuthorDate: Wed Jun 29 13:26:06 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: move `ARMBIAN_MIRROR` selection (network) from `main-config` to `prepare-host` + + - this way CONFIG_DEFS_ONLY can run without touching the network + +lib/functions/configuration/main-config.sh +lib/functions/host/prepare-host.sh + +commit 8f2922f37b7ccc5c790c77d96bcc25ba5f13118b +Author: Ricardo Pardini +AuthorDate: Mon Jul 18 15:37:15 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (26) of MD5-checking via debsums (3955) re-imagined + + - @TODO make sure + +lib/functions/rootfs/create-cache.sh + +commit 733b9bfb06ea36373049b98751f42e13905247d5 +Author: Ricardo Pardini +AuthorDate: Mon Jul 18 15:26:08 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (26) of sources/families changes between revisions 20ee8c54502f877bfa563e113d67709cb80dc6f9 and 9c52562176390624d33c93634e63a8f91cc0815b + +config/sources/families/jetson-nano.conf +config/sources/families/media.conf + +commit 63aa49ecac9c0401f359bb3ad801af6f7618a5ce +Author: Ricardo Pardini +AuthorDate: Mon Jul 18 15:17:50 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (26) of lib changes between revisions 20ee8c54502f877bfa563e113d67709cb80dc6f9 and 9c52562176390624d33c93634e63a8f91cc0815b + + - @TODO NOT including the md5/debsums check, that needs further rewrite + +lib/functions/configuration/interactive.sh +lib/functions/main/config-prepare.sh +lib/functions/rootfs/apt-install.sh + +commit a71814dfd278aa138d679c56026f7de1d4d6d892 +Author: Ricardo Pardini +AuthorDate: Wed Jun 29 10:06:29 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (25) of lib changes between revisions fe972621c61f339c9b84aaf94fd851fa789882e8 and 20ee8c54502f877bfa563e113d67709cb80dc6f9 + + - @TODO hmm Igor is now going out to the network for rootfs cache version during configuration phase!!! BAD BAD BAD + +lib/functions/configuration/main-config.sh +lib/functions/general/downloads.sh +lib/functions/rootfs/create-cache.sh + +commit 7b782918ecd066682e15b10a37a076d8ab07c70c +Author: Ricardo Pardini +AuthorDate: Wed Jun 29 09:59:36 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (25) of family changes between revisions fe972621c61f339c9b84aaf94fd851fa789882e8 and 20ee8c54502f877bfa563e113d67709cb80dc6f9 + +config/sources/families/include/rockchip64_common.inc +config/sources/families/media.conf + +commit 35a5ec860a5729794add0bc3f5b71f4dc09cd708 +Author: Ricardo Pardini +AuthorDate: Wed Jun 22 20:23:12 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (24) of families changes between revisions 9ca9120420aa2a39b91ab7283a7dafe113de42e8 and 560531a63505eb610d269b26858689307a9483f5 + +config/sources/families/include/meson64_common.inc +config/sources/families/include/rockchip64_common.inc + +commit ac26f77b6eaebec9d11537995eeadb07bf87c54a +Author: Ricardo Pardini +AuthorDate: Wed Jun 22 20:22:08 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (24) of lib changes between revisions 9ca9120420aa2a39b91ab7283a7dafe113de42e8 and 560531a63505eb610d269b26858689307a9483f5 + +lib/functions/configuration/main-config.sh + +commit d868b7b64ae2da0614078cccefab59804715542c +Author: Ricardo Pardini +AuthorDate: Fri Jun 17 12:19:32 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (23) of all changes between revisions 17b4fb913c76233d1e2126cfd35ecb85acfa5a25 and 9ca9120420aa2a39b91ab7283a7dafe113de42e8 + +config/sources/families/sun50iw6.conf +lib/functions/configuration/main-config.sh + +commit d4904385fe7e7506638e68638e348d9f0b412bd7 +Author: Ricardo Pardini +AuthorDate: Sun Jun 12 14:03:44 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (22) of all changes between revisions 0eb8fe7497aebf341bead2b3b0fb7309fd7bdc14 and 1dddf78cd0ed096edd6506241cfd9aa8cc27ba4e + + - @TODO EXCEPT the insanity about locales/eval/VERYSILENT in #3850, requires deep review + +config/sources/families/bcm2711.conf +config/sources/families/imx6.conf +config/sources/families/include/meson_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +config/sources/families/include/uefi_common.inc +config/sources/families/mvebu64.conf +config/sources/families/odroidxu4.conf +config/sources/families/rk322x.conf +config/sources/families/rockchip.conf +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/compilation/uboot.sh +lib/functions/extras/buildpkg.sh +lib/functions/host/prepare-host.sh +lib/functions/image/partitioning.sh + +commit 3459a57c661ce495eba407216a8c38f6f297b617 +Author: Ricardo Pardini +AuthorDate: Sat May 28 12:44:49 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (21) of all changes between revisions e7d7dab1bb50c1172206629a44f983c1794f8359 and 0eb8fe7497aebf341bead2b3b0fb7309fd7bdc14 + +config/sources/families/include/meson_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/media.conf +config/sources/families/mvebu64.conf +config/sources/families/sun50iw9.conf +lib/functions/compilation/debs.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/host/prepare-host.sh +lib/functions/image/partitioning.sh + +commit e4d0f9c279b4b8859b23e4828579337ea415f175 +Author: Ricardo Pardini +AuthorDate: Mon May 23 20:35:54 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: fix: patching CREATE_PATCHES=yes + + - needed to create output dir + +lib/functions/compilation/patch/patching.sh + +commit 2058ba0f88aa1196667089faedd64e469c7d7f32 +Author: Ricardo Pardini +AuthorDate: Sat May 21 21:36:33 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: add `python2-dev` dep for old uboots + + - cleanup some comments + +lib/functions/host/prepare-host.sh + +commit 79185a3bad52301322e806a22103922b430f99fc +Author: Ricardo Pardini +AuthorDate: Sat May 21 18:52:18 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: manual merge (20) of all changes between revisions 6b72ae3c864fc020c6aadea473997ca033a0d8cc and 247c4c45fd18aa370575998443fc837466c02971 + +config/sources/families/include/rockchip64_common.inc +lib/functions/compilation/debs.sh +lib/functions/extras/buildpkg.sh +lib/functions/image/fingerprint.sh + +commit 449ce337d3997a00b867dcb9baae9624983fefdb +Author: Ricardo Pardini +AuthorDate: Sat May 21 16:22:58 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:40 2022 +0200 + + armbian-next: fix: pass `TERM` to kernel's make, so `make menuconfig` can work + +lib/functions/compilation/kernel.sh + +commit 61c3306cdf3f79c318f93aa677b26da072d003bc +Author: Ricardo Pardini +AuthorDate: Wed May 18 11:49:04 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix: git: read commit UNIX timestamp/local date correctly + + - `checked_out_revision_ts` was correct; git outputs `%ct` as a UNIX timestamp, UTC-based + - `checked_out_revision_mtime` was incorrect: git output it without converting to local time + - manually convert using `date @xx` so it has correct local time, whatever it is. + - add debugging to `get_file_modification_time()` too + +lib/functions/compilation/patch/fasthash.sh +lib/functions/general/git.sh + +commit 73dba5953b8b76715005d8f8096040c4d5bcc153 +Author: Ricardo Pardini +AuthorDate: Tue May 17 11:06:22 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: abstract `$QEMU_BINARY` to `qemu-static.sh`: `deploy_qemu_binary_to_chroot()`/`undeploy_qemu_binary_from_chroot()` + + - add hackish logic to avoid removing binary that would be needed if image actually contains `qemu-user-static` package + +config/sources/amd64.conf +extensions/flash-kernel.sh +lib/functions/image/initrd.sh +lib/functions/rootfs/create-cache.sh +lib/functions/rootfs/post-tweaks.sh +lib/functions/rootfs/qemu-static.sh +lib/library-functions.sh + +commit ef945476dee668f7ab3889f0cc2994467613b0d7 +Author: Ricardo Pardini +AuthorDate: Mon May 16 18:06:25 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix `uuidgen` basic dep check; use fake bash `$RANDOM` if uuidgen not available + + - not good: we need uuidgen to begin logging, but it may not be installed yet. workaround. + +lib/functions/cli/cli-entrypoint.sh +lib/functions/host/basic-deps.sh + +commit bc644378ffa202f368e6c0bc705d7c3b05709f21 +Author: Ricardo Pardini +AuthorDate: Wed May 11 21:15:18 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: retry 3 times download-only also for `PACKAGE_LIST_BOARD` + + - acng is really not helping + +lib/functions/rootfs/distro-agnostic.sh + +commit 37a7eb9cbbf8fdf02054e2c9b5fd9eb924aa2524 +Author: Ricardo Pardini +AuthorDate: Wed May 11 16:51:09 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: allow customizing UBUNTU_MIRROR (ports mirror) with `CUSTOM_UBUNTU_MIRROR_ARM64=host/path` + +lib/functions/configuration/main-config.sh + +commit 6533471c376936d076fe884304b27e904af6d54e +Author: Ricardo Pardini +AuthorDate: Mon May 9 20:41:47 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: WiP: kernel make via `env -i` for clean env; show produced /boot tree + +lib/functions/compilation/kernel-debs.sh +lib/functions/compilation/kernel.sh + +commit 514a63ddef96369aa2be85175544eedb000779c5 +Author: Ricardo Pardini +AuthorDate: Sun May 8 20:50:42 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: manual merge (19) of all changes between revisions b23498b94909a855d8b0fda1a95ccfc0ab17c747 and e621d25adc8ee66b0d14c94605ef462a13464b85 + + - the ssh firstrun revert stuff mostly + +lib/functions/main/rootfs-image.sh + +commit 896c4e78d75f23a8dfa21354773cd8254f34d196 +Author: Ricardo Pardini +AuthorDate: Sat May 7 03:55:49 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: *breaking change* remove `LIB_TAG` and `.ignore_changes` completely + + - one day should be replaced with an "update checker" extension, or even "update-enforcer" + - for now this just causes chaos + +config/templates/config-example.conf +lib/functions/cli/cli-entrypoint.sh +lib/functions/cli/utils-cli.sh + +commit d20902020953d75c3f7d1a9c27ec9c553825660a +Author: Ricardo Pardini +AuthorDate: Sun May 8 14:15:32 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: `python2` is required for some u-boot builds + + - would be "use `python-is-python2` so /usr/bin/python exists and points to Python 2.x" but Jammy does not have that anymore + - python2 is required for some u-boot builds. + - that said, python 2.x is deprecated for a while and needs work thus @TODO + +lib/functions/host/prepare-host.sh + +commit cec6a1b3ebe5c7df20dc8be8f7687416843d5db9 +Author: Ricardo Pardini +AuthorDate: Sun May 8 13:45:19 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: bump Python info gatherer to RELEASE=jammy too + +lib/tools/info.py + +commit 75a638f13bfeeb3327510ad9c1ef3ce3adb166bd +Author: Ricardo Pardini +AuthorDate: Sun May 8 13:44:28 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: add `KERNEL_MAJOR_MINOR` info to `media` kernel (@balbes150) + + - 5.18 is not yet released so might be a problem here + +config/sources/families/media.conf + +commit 91db9e2a305cd385077289363ffe1212a7c614f2 +Author: Ricardo Pardini +AuthorDate: Sun May 8 00:18:35 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: allow to skip submodules during `fetch_from_repo`; introduce hook `fetch_custom_uboot` + + - via GIT_SKIP_SUBMODULES=yes, which disables all submodules everywhere + - via UBOOT_GIT_SKIP_SUBMODULES=yes, which disables fetching of submodules during uboot fetch (hidden rkbins anyone?) + - extension hook `fetch_custom_uboot` so we can fetch our own stuff if needed + +lib/functions/compilation/uboot.sh +lib/functions/general/git.sh + +commit fb3add638441223317735bf5eb826badfe8c0924 +Author: Ricardo Pardini +AuthorDate: Mon May 9 12:15:08 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: `initrd` caching fixes (always enable hook; if cache hit, convert to uImage too) + +lib/functions/image/initrd.sh + +commit a732119d010bf7008caaacf3e50b3659c8dbf472 +Author: Ricardo Pardini +AuthorDate: Sun Apr 17 05:19:46 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: introduce `initramfs`/`initrd` caching + + - using hashes of (hopefully) all involved files + - cache hits are rewarded with sprinkly hearts. + - why? this proves we got a reproducible kernel modules build! + - also, you just saved yourself 2-10 minutes of pain + +lib/functions/image/initrd.sh +lib/functions/logging/logging.sh + +commit 220529f8f779673746843fa55b84d23753f1e037 +Author: Ricardo Pardini +AuthorDate: Sat May 7 16:54:00 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: manual merge (18) of changes between revisions 08cf31de73de5f5ba1986348e4556b00d77af09f and c8855aa08dafaa02c939039e55e01967bad61c28 + + - heh; most bash code changes are for things already done in -next, or no longer used + - some version bumps, etc + +config/sources/families/bcm2711.conf +config/sources/families/imx6.conf +config/sources/families/include/meson64_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/jetson-nano.conf +config/sources/families/media.conf +config/sources/families/mvebu.conf +config/sources/families/mvebu64.conf +config/sources/families/odroidxu4.conf +config/sources/families/rk35xx.conf +config/sources/families/virtual.conf +lib/functions/bsp/bsp-cli.sh +lib/functions/compilation/patch/kernel-bootsplash.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/configuration/main-config.sh +lib/functions/general/downloads.sh +lib/functions/general/repo.sh +lib/functions/image/partitioning.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/distro-agnostic.sh + +commit eb38c77729431d0c89ae1f0546ab56e450429acc +Author: Ricardo Pardini +AuthorDate: Sat May 7 13:09:55 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: cleanup entrypoint and shuffle `prepare_host_basic()` into logging section + +lib/functions/cli/cli-entrypoint.sh +lib/functions/host/basic-deps.sh + +commit 91af44294685e7747b5df793778a1790756e8ce7 +Author: Ricardo Pardini +AuthorDate: Wed Apr 20 15:32:16 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: *breaking change* add global extlinux killswitch `ALLOW_EXTLINUX` + + - unless you set `ALLOW_EXTLINUX=yes`, then `SRC_EXTLINUX` will be disabled globally. + - add a bunch of logging regarding extlinux, armbianEnv and bootscripts for clarity during build + - this is due to nand-sata-install problems with extlinux + - some boards _only work_ with extlinux; we'll have to handle it later + +lib/functions/bsp/bsp-cli.sh +lib/functions/configuration/main-config.sh +lib/functions/image/partitioning.sh +lib/functions/rootfs/distro-agnostic.sh + +commit 03516ad0f6d5fc598f67c896e6dc28eb91b54ddf +Author: Ricardo Pardini +AuthorDate: Fri May 6 10:25:26 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: extensions: `image-output-{qcow2|ovf}`: virtual output formats + + - which use `qemu-utils` for `qemu-img` conversion of the .img + +extensions/image-output-ovf.sh +extensions/image-output-qcow2.sh + +commit 36a2c3741d28a6280af99bcd7d8f9d3a339a7fcb +Author: Ricardo Pardini +AuthorDate: Fri May 6 10:24:10 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: extension: `kernel-localmodconfig`: faster/slimmer kernel builds with `make localmodconfig` + +extensions/kernel-localmodconfig.sh + +commit 981a9f5856ba100eaad07c9ffe7e24f578e93003 +Author: Ricardo Pardini +AuthorDate: Fri May 6 10:23:29 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: extension: `cleanup-space-final-image`: zerofree, slim down firmware, show used space + +extensions/cleanup-space-final-image.sh + +commit 5d51b5559c28815deb56d27e1ca22765dc22e853 +Author: Ricardo Pardini +AuthorDate: Sat Apr 23 16:07:44 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: introduce `do_with_ccache_statistics` and use it for kernel compile + + - some TODOs + - better logging for .config copying + +lib/functions/compilation/kernel.sh + +commit 0a29ad6f91eae99594e52173724fdf87b5b186d5 +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 19:23:13 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: *breaking change* really disable apt sources for non-desktop builds + +lib/functions/rootfs/apt-sources.sh + +commit fc0621decc383f2aed1194f882035b26de49c0aa +Author: Ricardo Pardini +AuthorDate: Fri Apr 29 17:55:47 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix: don't manage apt-cacher-ng if told NOT to, not the other way around + +lib/functions/host/apt-cacher-ng.sh + +commit bdb9aba47d9b70cfb04089866bafe176a1e6dab6 +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 14:55:43 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: `JUST_UBOOT=yes` + hooks `build_custom_uboot()`/`post_write_uboot_platform()` + + - post_write_uboot_platform() + - only runs during build, for now (not on device) + - build_custom_uboot() + - allow fully custom, extension driven, building of u-boot + - also partial preparation of uboot source combined with default Armbian build + - HACK: u-boot: downgrade some errors to warnings via KCFLAGS + - fix copy of atf bins to uboot, don't do it if atf's not there + +lib/functions/compilation/uboot.sh +lib/functions/image/loop.sh +lib/functions/main/default-build.sh + +commit 893b8615a1a976ee6246e186f59aba468ad1a7b5 +Author: Ricardo Pardini +AuthorDate: Thu Apr 28 09:35:26 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix: no use testing the host for resolvconf if we're manipulating the SDCARD + +lib/functions/rootfs/distro-agnostic.sh + +commit 25a8de27bb2b240734c1647a71826688b474b0a0 +Author: Ricardo Pardini +AuthorDate: Sun Apr 24 09:32:14 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: sunxi_common: avoid shortcircuit error on family_tweaks_bsp when family_tweaks_bsp_s is not defined + +config/sources/families/include/sunxi_common.inc +lib/functions/bsp/bsp-cli.sh + +commit c46418fd00b24879e4a4f18f77c19ccb887a9346 +Author: Ricardo Pardini +AuthorDate: Fri Apr 22 12:50:21 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix: add `zstd` and `parallel` to hostdeps + +lib/functions/host/prepare-host.sh + +commit 6d5a8490804d8427c6f4578389b0ae73c746ed61 +Author: Ricardo Pardini +AuthorDate: Wed Apr 20 12:49:20 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: manual merge (17) of all changes between revisions 64410fb74b44cca82e9affbdf93a59d5692862ff and 08cf31de73de5f5ba1986348e4556b00d77af09f + + - changes about `git safe dir` ignored, I've done the same in a different way + - hash calculation changes ignored, fasthash is completely different + +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +config/sources/families/include/uefi_common.inc +config/sources/families/mvebu64.conf +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/host/external-toolchains.sh + +commit 8341a778f0a1b9678858904eaddb540f43129b58 +Author: Ricardo Pardini +AuthorDate: Tue Apr 19 13:48:06 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: add `crossbuild-essential-armel` so `arm-linux-gnueabi-gcc` is available with system toolchains + + - need to for some ATF builds, at least. + +lib/functions/host/prepare-host.sh + +commit 8fdc420cc001b9ad79784ff486461eb0a2af6be8 +Author: Ricardo Pardini +AuthorDate: Tue Apr 19 00:18:04 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: rockchip64_common: lotsa logging and debugging + + - supposedly no practical changes + +config/sources/families/include/rockchip64_common.inc + +commit 52922a6b105279e73ccb760523e43fa6f7b0d5e0 +Author: Ricardo Pardini +AuthorDate: Mon Apr 18 10:56:34 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: grub: better logging + +extensions/grub.sh + +commit 7bf6574305c5d2b7230225007fa4a62e0f19a817 +Author: Ricardo Pardini +AuthorDate: Mon Apr 18 11:23:10 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix for chaos caused by git's fix of CVE-2022-24765 otherwise "fatal: unsafe repository" + + - might not be the best solution, but it's the only one I found + +compile.sh +lib/functions/compilation/debs.sh +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh + +commit ad315fb153cd743614eb2d4102ad8a61d8be99aa +Author: Ricardo Pardini +AuthorDate: Mon Apr 18 23:14:20 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + partitioning: fix: don't try fixing a bootscript that's not there + + - this fixes a bug when "rootpart=2" without rootpart 1 being /boot + +lib/functions/image/partitioning.sh + +commit 1661922e79f34bec964fdd86e278489e28945b4d +Author: Ricardo Pardini +AuthorDate: Mon Apr 18 23:15:29 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: cleanups: umount tmpfs-based $SDCARD during cleanup too + +lib/functions/main/rootfs-image.sh + +commit 7253f98a262253eab6094b29640293079b673ab0 +Author: Ricardo Pardini +AuthorDate: Mon Apr 18 23:16:32 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: indented heredoc, no functional changes + +lib/functions/image/rootfs-to-image.sh + +commit 1ac36b752e2982dbf59336c3ee857c91080ed8cf +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 19:23:00 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix shortcircuit as last statement in case of extlinux + + - yes, I wasted 3 hours on this tiny bit, so *you* don't have to! + - better logging for rootfs `mkfs` et al + - introduce `PRESERVE_SDCARD_MOUNT=yes` to preserve SDCARD, MOUNT, and LOOP for debugging + +lib/functions/image/partitioning.sh +lib/functions/main/rootfs-image.sh + +commit ef3709d30ee099523db2ad28e3f65e0d17754f50 +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 12:13:07 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: kernel-headers: less verbose, trimmed down tools a bit (perf and testing) + +lib/functions/compilation/kernel-debs.sh + +commit 20c29c1d6e04783ac8e8151f27f57b52b8531342 +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 11:23:13 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + khadas-vim3l: add asound.state for Khadas VIM3L + +config/boards/khadas-vim3l.conf +packages/blobs/asound.state/asound.state.khadas-vim3l + +commit a22979940d28a816571644e92f157fe8e0af431f +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 11:14:23 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: introduce hook `extension_finish_config()` - late hook for ext configuration + + - `extension_finish_config()` is the last thing done in config phase + - use it for determining stuff based on kernel version details, package names, etc + - also tune down some logging which was too verbose + - CI logs with no ANSI escape codes + +extensions/nvidia.sh +extensions/zfs.sh +lib/functions/logging/logging.sh +lib/functions/main/config-prepare.sh +lib/functions/rootfs/apt-sources.sh + +commit bedd3aa1a4c661bc177af7dd0db3062296d7ec5f +Author: Ricardo Pardini +AuthorDate: Sat Apr 16 00:45:30 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: shuffle around code and logic of `add_desktop_package_sources()` + + - @TODO: still needs proper asset logging for sources.list(.d) + - @TODO: tunes down adding of sources/packages to CLI builds, check with Igor + +lib/functions/rootfs/apt-install.sh +lib/functions/rootfs/apt-sources.sh +lib/functions/rootfs/create-cache.sh +lib/functions/rootfs/rootfs-desktop.sh +lib/library-functions.sh + +commit 4876e0444f33ea1ce28cb340215638702ef98792 +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 22:07:17 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: 4.x can't build objtool in kernel-headers; allow for handling that later + + - 4.x has a lot more obtuse dependencies + - introduce KERNEL_HAS_WORKING_HEADERS calculated based on KERNEL_MAJOR_MINOR + +extensions/nvidia.sh +extensions/zfs.sh +lib/functions/compilation/kernel-debs.sh +lib/functions/main/config-prepare.sh + +commit 6b5726444e6be8a935fe758664847184e7642840 +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 21:48:22 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: downgrade `error=misleading-indentation` to warning + + - some 4.x kernels patches are really messy + - newer gcc's make that an error now + +lib/functions/compilation/kernel.sh + +commit 54cad4f827e14967d692ae4d14426394cc56b4ff +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 17:23:42 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: *allow cross compilation*, even the so-called "reverse cross-compile" (amd64 on arm64) + +config/sources/amd64.conf +lib/functions/compilation/kernel.sh + +commit c57535fbcab21c0cf7284e0cbcb614971e6d4bd7 +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 13:49:23 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: add `zfs` extension, which installs headers and builds ZFS via DKMS in chroot + + - similar to how `nvidia` extension does it + +extensions/zfs.sh + +commit 82756687f5930a55f413a3f7164b1fb9337bd2b0 +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 13:49:56 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: x86: enable `nvidia` extension for all releases (only desktop) + +config/sources/families/uefi-x86.conf + +commit d4ce330682ba9563b1821ae08b8412e9149fec80 +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 13:53:14 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: `headers-debian-byteshift.patch` is dead; long-live cross-compiled source-only kernel-headers + + - kernel-headers package now only includes _sources_ + - postinst does the compilation and preparation for DKMS compatibility + - `tools` dir is included now, which includes the byteshift utilities + - handle special scripts/module.lds case after 5.10 + - tested on a 6 combinations of `x86` / `arm64` / `armhf` (3x targets, 2x hosts) + - @TODO: we might be able to reduce the size of tools a bit (perf/tests/etc) + - @TODO: still missing ARCH vs ARCHITECTURE vs SRC_ARCH clarity elsewhere + +lib/functions/compilation/kernel-debs.sh +lib/functions/compilation/kernel.sh +patch/misc/headers-debian-byteshift.patch + +commit d797c800c30b6a86f105e511068e545f90b9c825 +Author: Ricardo Pardini +AuthorDate: Fri Apr 15 13:37:13 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: allow `use_clean_environment=yes` for `chroot_sdcard_apt_get()` and descendants + + - this causes command to be run under `env -i`, for a clean environment + +lib/functions/logging/runners.sh + +commit 0caf73b8ee67c9f34b6e6d1fce8b86ed4021694c +Author: Ricardo Pardini +AuthorDate: Thu Apr 14 09:58:15 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: manual merge (16) of all changes between revisions be9b5156a4bdcb3850fbe0e7ada0f4421acde174 and 2a8e1ecac1c4fdbf986034be9d6c05a8f1b6e6fb + + - many `traps` ignored: we don't use them anymore + +config/sources/families/include/meson64_common.inc +config/sources/families/media.conf +config/sources/families/rk322x.conf +config/sources/families/rockchip.conf +config/sources/families/sun50iw6.conf +config/templates/Dockerfile +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/configuration/main-config.sh +lib/functions/extras/buildpkg.sh +lib/functions/general/downloads.sh +lib/functions/image/partitioning.sh +lib/functions/rootfs/distro-specific.sh + +commit 71addbe3ffd4e9e8015125186d11fc53eac1da25 +Author: Ricardo Pardini +AuthorDate: Thu Apr 7 15:56:19 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fix logging for apt sources/gpg keys + +lib/functions/rootfs/rootfs-desktop.sh + +commit 7ca67f8d2669568a654d0fcf11415b24434cfd0b +Author: Ricardo Pardini +AuthorDate: Thu Apr 7 13:54:59 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: don't leak `if_error_xxx` vars across runner helper invocations; always clean then (even if no error) + + - also: fix wireguard-tools install, had a double parameter there + +lib/functions/logging/runners.sh +lib/functions/rootfs/distro-agnostic.sh + +commit a057b793478fde9b1e0015d52b711c0442d91789 +Author: Ricardo Pardini +AuthorDate: Thu Apr 7 13:53:58 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + bcm2711: rpi4b: add `pi-bluetooth` which provides working Bluetooth + +config/sources/families/bcm2711.conf + +commit b0d907082d89474a04a790919fad6e27043bc474 +Author: Ricardo Pardini +AuthorDate: Thu Apr 7 12:06:26 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: fixes for (non-)logging when interactively configuring kernel (`KERNEL_CONFIGURE=yes`) + +lib/functions/compilation/kernel.sh + +commit e10cb5c51bd77b47ee06ac7c9aaaaa4485646f61 +Author: Ricardo Pardini +AuthorDate: Sun Apr 3 11:28:18 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: move `lz4` rootfs caches to `zstd`, multithreaded + +lib/functions/rootfs/create-cache.sh + +commit 1b602cf8ebae2179b8590126751ce801c976cdfb +Author: Ricardo Pardini +AuthorDate: Sun Apr 3 11:25:50 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: customize.sh: error handling, do not mount overlay if it doesn't exist + +lib/functions/rootfs/customize.sh + +commit 09a55387f126f1907945ee72060cdd42973a8d4b +Author: Ricardo Pardini +AuthorDate: Sat Apr 2 21:15:55 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:39 2022 +0200 + + armbian-next: extra info for runners; `if_error_detail_message` and `if_error_find_files_sdcard` globals + + - those are unset after running any command + - if error occur, message and/or found files will be included in log, for clarity + +extensions/nvidia.sh +lib/functions/compilation/uboot.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh +lib/functions/rootfs/apt.sh +lib/functions/rootfs/create-cache.sh + +commit 4cbbde478c436b76c883d4ece3a74fc8d0aeb72d +Author: Ricardo Pardini +AuthorDate: Sat Apr 2 16:01:19 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: manual merge (15) of all changes between revisions 0f7200c7932bb04a34601a25fe30dca0197fbc8b and 101eaec90750f23cae3075d6b5329a33b2bf4685 + +config/sources/families/rk35xx.conf +lib/functions/configuration/main-config.sh +lib/functions/rootfs/create-cache.sh +lib/functions/rootfs/rootfs-desktop.sh + +commit 0023bcce6aaed245b27c031156ba650acbafed3b +Author: Ricardo Pardini +AuthorDate: Fri Apr 1 12:27:19 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: better logging for `rsync` calls everywhere + + - make rsync verbose + +lib/functions/bsp/bsp-cli.sh +lib/functions/compilation/debs.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/uboot.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/rootfs/apt.sh + +commit 5aa5cad33ed6ea11af0cb371c0f5a1ef3cce0309 +Author: Ricardo Pardini +AuthorDate: Fri Apr 1 00:51:22 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: downloads: skip download if no `ARMBIAN_MIRROR` nor `DOWNLOAD_MIRROR`; less logs + +lib/functions/general/downloads.sh + +commit fcc2cdc23237549cde54eee47b76776106c29ec0 +Author: Ricardo Pardini +AuthorDate: Thu Mar 31 20:02:17 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: update rockchip.conf from master and use runners + +config/sources/families/rockchip.conf + +commit 0b7e6c6bb6a744d6b95038e9ab3b1ab7b1aa7027 +Author: Ricardo Pardini +AuthorDate: Thu Mar 31 19:33:39 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: update mvebu64.conf from master and use functions + +config/sources/families/mvebu64.conf + +commit b1ded35c1baa90f16652299b433410fef216f8f7 +Author: Ricardo Pardini +AuthorDate: Thu Mar 31 19:23:33 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: git: fix `fetch_from_repo` with actual submodules usage + +lib/functions/general/git.sh + +commit 8996fb16048de112e985c9f2a4d5f896623b1cd0 +Author: Ricardo Pardini +AuthorDate: Thu Mar 31 16:25:50 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: `armbian-next`ify the `nvidia` extension after rebase from master + + - driver version is configurable via `NVIDIA_DRIVER_VERSION` + - use runner function to log/error-handle/use apt cache/etc + +extensions/nvidia.sh + +commit d72e4b69754671ba464882cbca6b68c67e2c7c9a +Author: Ricardo Pardini +AuthorDate: Thu Mar 10 00:00:39 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + rpi4b: there's no legacy branch anymore, remove it from KERNEL_TARGET + +config/boards/rpi4b.wip + +commit 1dbe3c33255a6947743bed2c3dd0ba067035208f +Author: Ricardo Pardini +AuthorDate: Wed Mar 9 13:19:20 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: `download_and_verify` non-error handled; logging is messy [WiP] [HACK] + +lib/functions/general/downloads.sh + +commit 30ee27b4fd6d9b578ad19ca9b0b484809242d77f +Author: Ricardo Pardini +AuthorDate: Mon Mar 21 17:21:03 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: logging: let ANSI colors pass to logfile; CALLER_PID instead of BASHPID in subshell + +lib/functions/logging/logging.sh + +commit a63ba98aefbb6ba7998ad8abedc5d239e1520191 +Author: Ricardo Pardini +AuthorDate: Mon Mar 21 17:20:17 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: enable HTTPS CONNECT in Armbian-managed apt-cacher-ng configuration + + - PPAs require it + +lib/functions/host/apt-cacher-ng.sh + +commit d3641a69a60266f3d7a75109fa6e396b20d85700 +Author: Ricardo Pardini +AuthorDate: Thu Mar 31 13:41:53 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: don't loop forever if we can't obtain ARMBIAN_MIRROR from redirector + + - also, don't even try to do it if `SKIP_ARMBIAN_REPO=yes` + +lib/functions/configuration/main-config.sh + +commit 617e2ef1d6ff85e0bc6d5c24bc391a21e125f2aa +Author: Ricardo Pardini +AuthorDate: Thu Mar 31 12:25:09 2022 +0200 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: manual merge (14) of all changes between revisions 13469fd8a9eda4a53f87b7dfee0f431dbab8db54 and 09e416e31cc01ece4533a65f02a470a4c21b90ea + + - also editorconfig and compile.sh (root) changes + +.editorconfig +config/desktop/bullseye/appgroups/browsers/armbian/create_desktop_package.sh +config/desktop/bullseye/environments/mate/armbian/create_desktop_package.sh +config/desktop/buster/appgroups/browsers/armbian/create_desktop_package.sh +config/desktop/buster/environments/cinnamon/armbian/create_desktop_package.sh +config/desktop/buster/environments/lxde/armbian/create_desktop_package.sh +config/desktop/buster/environments/mate/armbian/create_desktop_package.sh +config/desktop/focal/appgroups/browsers/armbian/create_desktop_package.sh +config/desktop/focal/environments/budgie/armbian/create_desktop_package.sh +config/desktop/focal/environments/cinnamon/armbian/create_desktop_package.sh +config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh +config/desktop/focal/environments/enlightenment/armbian/create_desktop_package.sh +config/desktop/focal/environments/gnome/armbian/create_desktop_package.sh +config/desktop/focal/environments/mate/armbian/create_desktop_package.sh +config/desktop/focal/environments/xfce/debian/armbian-bsp-desktop/prepare.sh +config/desktop/sid/appgroups/browsers/armbian/create_desktop_package.sh +config/desktop/sid/environments/lxde/armbian/create_desktop_package.sh +config/desktop/sid/environments/mate/armbian/create_desktop_package.sh +config/desktop/sid/environments/xfce/armbian/create_desktop_package.sh +config/sources/families/include/rockchip64_common.inc +config/templates/Dockerfile +lib/functions/cli/utils-cli.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/configuration/main-config.sh +lib/functions/host/prepare-host.sh +lib/functions/rootfs/distro-specific.sh +lib/functions/rootfs/rootfs-desktop.sh + +commit d2d2fa9315f74ec155f209096fe55ead120491c6 +Author: Ricardo Pardini +AuthorDate: Fri Mar 18 02:17:01 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: *much* improved logging to HTML; log archiving; consistency + + - keep only current logfile + - log to LOGFILE also if SHOW_LOG=yes + - log cmd runtime and success/error directly in runner + +lib/functions/cli/cli-entrypoint.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh + +commit 1b160ce366c31c724346f52a7f7bfa79036a6acf +Author: Ricardo Pardini +AuthorDate: Fri Mar 18 00:34:46 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: *breaking change* use `MemAvailable` (not including swap) and up requirements for tmpfs + + - of course add debugging logs + - rename vars + - should really only use this if we've really a lot of completely free RAM to spare + - otherwise OOM killer comes knocking + - or swapping to disk, that is counter-productive + +lib/functions/main/rootfs-image.sh + +commit 04a11cc78f5681dd41e3764ce644c53e7032156b +Author: Ricardo Pardini +AuthorDate: Thu Mar 17 22:46:05 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: *breaking change* `DEB_COMPRESS=none` by default if not running in CI/GHA + +lib/functions/configuration/main-config.sh + +commit 667a8de92b5075c05d2ca67761a13c93b8e8b99d +Author: Ricardo Pardini +AuthorDate: Thu Mar 17 22:21:45 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: *breaking change* `CLEAN_LEVEL=make` is no more; new `make-kernel`, `make-atf`, `make-uboot` + + - allows individual control of what to clean + - this effectively disables `make clean` by default + - rebuilds work and timestamping works for patching, so no reason to clean everytime by default. + +config/templates/config-example.conf +lib/functions/compilation/atf.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/uboot.sh +lib/functions/general/cleaning.sh +lib/functions/main/default-build.sh + +commit 39999ad4efc4854213d0b2164d999071684ec1ea +Author: Ricardo Pardini +AuthorDate: Thu Mar 17 21:16:21 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: refactor `prepare_host`, give `apt-cacher-ng` some much needed attention + + - library dir for host-related stuff, pull it out of "general" finally + +lib/functions/host/apt-cacher-ng.sh +lib/functions/host/basic-deps.sh +lib/functions/host/external-toolchains.sh +lib/functions/host/host-utils.sh +lib/functions/host/prepare-host.sh +lib/functions/logging/runners.sh +lib/functions/rootfs/create-cache.sh +lib/library-functions.sh + +commit 2c4ee50aabed7ad126f7ca80b870077672371a5d +Author: Ricardo Pardini +AuthorDate: Wed Mar 9 13:20:25 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: hostdeps: all toolchains via `crossbuild-essential-arm64`/`armhf`/`amd64` + + - trying to sort out hostdeps for Jammy [WiP] + +lib/functions/general/host.sh + +commit c8a9f3aca890ed098b160bd060f11042d21ee711 +Author: Ricardo Pardini +AuthorDate: Thu Mar 17 16:19:49 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: remove `eatmydata` usage, leftover from failed tries to make git faster + +lib/functions/general/git.sh + +commit 5d4c5aa9320ab317f540415ddb5403538630bcfb +Author: Ricardo Pardini +AuthorDate: Wed Mar 16 03:13:29 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: fix git origin check, recreate working copy if origin does not match + + - fix cold bundle https download progress reporting + +lib/functions/general/git.sh + +commit 625031cd5797295e14494d7d2c986c7de9b6e15d +Author: Ricardo Pardini +AuthorDate: Tue Mar 15 14:10:32 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: finally consolidating logs into output/logs; colorized HTML logs + +lib/functions/cli/cli-entrypoint.sh +lib/functions/configuration/main-config.sh +lib/functions/general/host.sh +lib/functions/logging/logging.sh + +commit 58e643c14a0b527d25856938bfc219835984e83d +Author: Ricardo Pardini +AuthorDate: Tue Mar 15 11:30:55 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: introduce `do_with_retries()` and use it for apt remote operations during image build + +lib/functions/logging/runners.sh +lib/functions/rootfs/create-cache.sh + +commit ff3ccab39db2e364feb16b583c973d6d305c69d5 +Author: Ricardo Pardini +AuthorDate: Mon Mar 7 09:42:57 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: another round of logging tuning/fixes; log assets; git logging + + - introduce `do_with_log_asset()` and `LOG_ASSET=xxx` + - separate "git" logging level + - add `trap_handler_cleanup_destimg()` to cleanup DESTIMG + +lib/functions/cli/cli-entrypoint.sh +lib/functions/compilation/kernel-debs.sh +lib/functions/compilation/patch/fasthash.sh +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh +lib/functions/image/initrd.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/logging/logging.sh +lib/functions/main/default-build.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/distro-agnostic.sh + +commit fb943e2aa891513456e76a07a32351f04d2b1fe2 +Author: Ricardo Pardini +AuthorDate: Mon Mar 14 18:51:39 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: kernel: use parallel compressors; reproducible kernel builds + + - also remove leftover mkdebian/builddeb parameters in make invocation + - add pbzip2 to hostdeps + +lib/functions/compilation/kernel.sh +lib/functions/general/host.sh + +commit fcba106dae815e6d90fea84cc538239030fde9ac +Author: Ricardo Pardini +AuthorDate: Mon Mar 14 18:50:13 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: tuning logging for timestamp/fasthash related stuff which is very verbose + + - idea is to not completely overwhelm `SHOW_DEBUG=yes` case + - make patching quieter and use file instead of stdin + - set checked_out_revision_ts during git checkout (timestamp version of _mtime) + - timestamp | fasthash logging level (via `SHOW_FASTHASH=yes`) + +lib/functions/compilation/patch/fasthash.sh +lib/functions/compilation/patch/patching.sh +lib/functions/general/git.sh +lib/functions/logging/logging.sh + +commit dab49a9133741fce7b40bdeff1e6cccf6becc180 +Author: Ricardo Pardini +AuthorDate: Mon Mar 14 15:02:20 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: completely remove mkdebian/builddeb/general-packaging kernel packaging stuff + +lib/functions/compilation/kernel.sh +lib/functions/compilation/patch/kernel-pkg.sh +lib/library-functions.sh +packages/armbian/builddeb +packages/armbian/mkdebian +patch/misc/general-packaging-4.14.y.patch +patch/misc/general-packaging-4.19.y-rk35xx.patch +patch/misc/general-packaging-4.19.y.patch +patch/misc/general-packaging-4.4.y-rk3399.patch +patch/misc/general-packaging-4.4.y-rockchip64.patch +patch/misc/general-packaging-4.4.y.patch +patch/misc/general-packaging-4.9.y.patch +patch/misc/general-packaging-5.10.y.patch +patch/misc/general-packaging-5.3.y.patch +patch/misc/general-packaging-5.6.y.patch +patch/misc/general-packaging-5.8-9.y.patch + +commit 134bb92d95726ae56da8734bc9c39552c4821e4c +Author: Ricardo Pardini +AuthorDate: Wed Mar 9 23:43:39 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: manual merge (12) of all changes between revisions 34d4be6b7b346507af58133125cef0bc8ff5aef1 and 5fe0f36aa832ac64d1db05adc4eb09a4df4b5509 + +config/sources/families/rk35xx.conf +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh + +commit 6058f580ae03c4c197ea60789128edca73046758 +Author: Ricardo Pardini +AuthorDate: Wed Mar 9 18:41:30 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: introduce `PRESERVE_WORKDIR=yes` for heavy debugging + +lib/functions/main/default-build.sh + +commit 87c808d5d398dc51a1fabe97b732d94d3094b8b9 +Author: Ricardo Pardini +AuthorDate: Wed Mar 9 14:39:21 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: packaging linux-headers again + + - do NOT use any output from `make headers_install` - that's for libc headers + - grabs "headers" (and binary tools) directly from the kernel build tree, not install target + - does not produce headers if cross compiling, for now + - produces kernel-headers package for the architecture on which it was built + - doing a single make invocation with build and install for packaging + - using 'make all' in place of vmlinuz/bzImage/image/zImage + +lib/functions/compilation/kernel-debs.sh +lib/functions/compilation/kernel.sh + +commit 8cfda3dcc398e3abb11f05f76509b4a165e402d3 +Author: Ricardo Pardini +AuthorDate: Wed Mar 9 13:20:05 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: apt download-only retried 3 times before installing main packages + +lib/functions/logging/runners.sh +lib/functions/rootfs/create-cache.sh + +commit 4b82345a588df2d9214b1ace097599ad42ee3463 +Author: Ricardo Pardini +AuthorDate: Tue Mar 8 12:56:04 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: fix `VER=` read from kernel-image package, also add `linux` default + +lib/functions/compilation/kernel-debs.sh +lib/functions/rootfs/distro-agnostic.sh + +commit 5d2a41313f02fd2e651c911984ae6b6f803154c7 +Author: Ricardo Pardini +AuthorDate: Mon Mar 7 10:24:52 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: some logging for atf compilation + +lib/functions/compilation/atf.sh + +commit 779e9978e01f5d1706d85acc3f0182046cebcfbd +Author: Ricardo Pardini +AuthorDate: Mon Mar 7 10:09:29 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: rewrite hostdeps as array, add armhf toolchains + +lib/functions/general/host.sh + +commit 3a8770b0a1e28eaa7009964d6ebc3ba494de8010 +Author: Ricardo Pardini +AuthorDate: Mon Mar 7 06:20:17 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: distro-agnostic: cleanups + +lib/functions/rootfs/distro-agnostic.sh + +commit 4d47d22489538006f32464dc9a0058a77810536b +Author: Ricardo Pardini +AuthorDate: Sat Mar 5 02:24:29 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: armbianEnv hooks/debugs (bsp / image) + +lib/functions/bsp/bsp-cli.sh +lib/functions/image/partitioning.sh + +commit 1afd681bab297b9441fe9e65104ba52d1a3d96ce +Author: Ricardo Pardini +AuthorDate: Fri Mar 4 04:16:50 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: rpi: completely remove dtb hacks, allowing flash-kernel to work again + +config/sources/families/bcm2711.conf + +commit 33beb042960cbf7ab66271a44b53b79dafa01642 +Author: Ricardo Pardini +AuthorDate: Fri Mar 4 01:09:55 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: refactor new kernel packaging; add linux-dtb package back in finally, upgrades untested + +lib/functions/compilation/kernel-debs.sh + +commit 5cd4b7a471267aaf8a1336629a65a6df4b81b087 +Author: Ricardo Pardini +AuthorDate: Thu Mar 3 23:31:08 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: refactor new kernel packaging; extract hook helper, fix kernel symlink + +lib/functions/compilation/kernel-debs.sh + +commit c2259116c1728595802cf29aae7f29098a4a5c99 +Author: Ricardo Pardini +AuthorDate: Thu Mar 3 21:49:24 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: refactor new kernel packaging; add linux-dtb package back in finally, all hooks untested + +lib/functions/compilation/kernel-debs.sh +lib/functions/compilation/kernel.sh + +commit 7cd425e1c3c2efa14c7fb7a13a9b24f9bb5cfc38 +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 20:31:44 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + flash-kernel: fix short-circuits as last statement in functions + +extensions/flash-kernel.sh + +commit b459fb3af894ae4315e8416fee62d77c2a1a191b +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 13:28:37 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: do not force `SHOW_LOG=yes` if `CI=true`; let's _trust_ logging and error handling works + +compile.sh + +commit a0ed264825785655fba53d67de525ddebbb48090 +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 13:26:56 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: back out of setting mtime to the revision time during git checkout. + + - of course this causes huge recompiles when wanted revision moves forward + +lib/functions/general/git.sh + +commit 4d1d62558c4cf4f670fae821f7629a01a1f2c35e +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 13:16:04 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: sync 'config' dir from master revision ed589b248aef675cb5e845fcb55c12dfbcc5e925 + + - this is _also_ getting out of hand... gotta merge soon + +config/boards/rpi4b.wip +config/boards/uefi-arm64.conf +config/boards/uefi-x86.conf +config/sources/families/bcm2711.conf +config/sources/families/include/meson64_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/include/uefi_common.inc +config/sources/families/jetson-nano.conf +config/sources/families/media.conf + +commit b4c137bdb097e7cbba7bfc22795fa1223ea2bc7d +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 12:57:31 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: sync 'packages' dir from master revision ed589b248aef675cb5e845fcb55c12dfbcc5e925 + +packages/armbian/builddeb +packages/armbian/mkdebian +packages/bsp/common/etc/profile.d/armbian-activate-profile-sync-daemon.sh +packages/bsp/common/etc/profile.d/armbian-check-first-login-reboot.sh +packages/bsp/common/etc/profile.d/armbian-ssh-title.sh +packages/bsp/jethub/jethub-remove-log-file.sh +packages/bsp/nanopim4/nanopim4-pwm-fan.sh +packages/bsp/odroid/c1_init.sh +packages/bsp/odroid/c2_init.sh +packages/bsp/rk3328/z28pro/start_bt.sh +packages/bsp/rockchip/start_bt.sh +packages/bsp/sunxi/zeroplus2-bt.sh +packages/extras-buildpkgs/hostapd-realtek/debian/ifupdown/hostapd.sh +packages/extras-buildpkgs/hostapd/debian/ifupdown/hostapd.sh + +commit c216282d323014ca365a1539a305911ca835906b +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 12:44:36 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: manual merge (11) of all lib/*.sh changes between revisions 3305d45b8175dbdd647dc1dc53fa6f0a522920c7 and ed589b248aef675cb5e845fcb55c12dfbcc5e925 + +lib/functions/compilation/patch/kernel-bootsplash.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/configuration/main-config.sh +lib/functions/main/config-prepare.sh + +commit c2871d87a4237f167e274f9ec38442e6ff4e0934 +Author: Ricardo Pardini +AuthorDate: Wed Mar 2 02:31:37 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: more refactorings, general logging; fixes; split image stuff + + - logging flowing correct to LOGDIR, still needs packaging + +lib/extensions.sh +lib/functions/compilation/kernel.sh +lib/functions/configuration/main-config.sh +lib/functions/general/chroot-helpers.sh +lib/functions/image/compress-checksum.sh +lib/functions/image/fingerprint.sh +lib/functions/image/partitioning.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/image/write-device.sh +lib/functions/logging/logging.sh +lib/functions/logging/traps.sh +lib/functions/main/default-build.sh +lib/functions/main/rootfs-image.sh +lib/library-functions.sh + +commit c7862c7c5e2807060ead176597998270256faff9 +Author: Ricardo Pardini +AuthorDate: Tue Mar 1 11:44:32 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: complete removal of usages of `LOG_SUBPATH`; 100% error handled + + - loose ends, use new LOGDIR + - remove the last shortcircuit in extensions execution, now it's 100% error handled + - many logging fixes + - still missing: final log consolidation/cleanup + +extensions/gen-sample-extension-docs.sh +extensions/grub.sh +lib/extensions.sh +lib/functions/bsp/bsp-desktop.sh +lib/functions/cli/cli-entrypoint.sh +lib/functions/configuration/main-config.sh +lib/functions/general/downloads.sh +lib/functions/general/host.sh +lib/functions/image/initrd.sh +lib/functions/image/partitioning.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh +lib/functions/main/config-prepare.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/distro-agnostic.sh +lib/functions/rootfs/rootfs-desktop.sh + +commit 11d89f69e44b97e6f494a92ea688099f2c9b8370 +Author: Ricardo Pardini +AuthorDate: Mon Feb 28 20:36:55 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + logging: blue groups if `SHOW_DEBUG=yes` or `SHOW_GROUPS=yes` (console equivalent of CI's avocado) + +lib/functions/logging/logging.sh + +commit c3f70639f0f0323baef75950f664e10517ef94fb +Author: Ricardo Pardini +AuthorDate: Mon Feb 28 17:20:18 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:38 2022 +0200 + + armbian-next: shut down some too-verbose logging: logo building and update-initramfs + +lib/functions/image/initrd.sh +lib/functions/rootfs/boot_logo.sh + +commit 9218d4a1196a4b7d0f303a972e2f5c293e789d90 +Author: Ricardo Pardini +AuthorDate: Mon Feb 28 15:43:03 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: git/patching, kernel: use date from git as mtime minimum for patched files + + - use revision's date from git log as mtime for all fetch_from_repo + - fix patched files date at least checkout date, otherwise some patches never build + +lib/functions/compilation/kernel.sh +lib/functions/compilation/patch/fasthash.sh +lib/functions/compilation/patch/patching.sh +lib/functions/general/git.sh + +commit 839e3ab254e7d5f91fa5eeb1f456e66bf0483a1c +Author: Ricardo Pardini +AuthorDate: Mon Feb 28 00:20:41 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: first attempt at kernel packaging rework; just linux-image pkg, no dtbs yet + + - correctly predict KERNELRELEASE, put image-dtbs in the right spot for flash-kernel + - remove dpkg-gencontrol, do it all directly + +lib/functions/compilation/kernel-debs.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/patch/kernel-pkg.sh +lib/library-functions.sh + +commit 477926aac9205e2b7bc07c14e2727730eba11a27 +Author: Ricardo Pardini +AuthorDate: Fri Feb 25 22:49:47 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: rework kernel source packaging, now exporting from git, to .tar.zst + + - compress with zstdmt (multi-thread zstd), remove pv indicator, it's much faster anyway + - export from git (soon will have all patches et al too) + - better logging, show pkg name + - much, much faster due to zstdmt and deb with none compression + +lib/functions/compilation/kernel.sh + +commit d14b2a9265f92d47185047eb8520a956f6ce9ea4 +Author: Ricardo Pardini +AuthorDate: Fri Feb 25 00:50:27 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: a bit atrocious, nameref loaded, `get_list_of_all_buildable_boards()` + + - in the process, add support for userpatches/config structure mirroring core, for easy upstreaming + +lib/functions/compilation/kernel.sh +lib/functions/configuration/interactive.sh +lib/functions/configuration/main-config.sh +lib/functions/main/config-prepare.sh + +commit bc0d123dc5e1baf21a20ef86d5c4e32aff3aa931 +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 19:57:43 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: make `SKIP_EXTERNAL_TOOLCHAINS=yes` default. lets see what breaks [WiP] + +lib/functions/configuration/main-config.sh + +commit 7fb54baca48ed6ae60b6a0025e83b0e29380164f +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 19:57:17 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: keeping stdout clean, use display_alert() for cleanup logging + +compile.sh +lib/functions/configuration/config-desktop.sh +lib/functions/configuration/main-config.sh +lib/functions/main/rootfs-image.sh + +commit a3b64e15f9130871ff37061aa533ca0649c0bc0c +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 19:35:23 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: library cleanups; remove `build-all.sh` for good; bring `patching.sh` back + +lib/functions/compilation/patch/patching.sh +lib/functions/multi/build-all.sh +lib/library-functions.sh + +commit 68efe99a09da93c27a9cf20d1f14fc9354c73b92 +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 19:27:06 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: `interactive_desktop_main_configuration()` and stderr'ed + error handl'ed dialog + + - use redirection to fd 3 for dialog, now cleanly on stderr + - `show_menu()` -> `dialog_menu()` et al + - interactive configuration now works again! + +lib/functions/configuration/config-desktop.sh +lib/functions/configuration/interactive.sh +lib/functions/configuration/main-config.sh +lib/functions/configuration/menu.sh +lib/functions/general/host.sh +lib/functions/main/config-prepare.sh + +commit 8aed5b427cbc6fd3ddef54b604ee0a8287ebdd7b +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 16:36:59 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: logging: `SHOW_PIDS=yes` + +lib/functions/logging/logging.sh + +commit 5ede8ce433706f6e98413a2e976c8698bbc85afa +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 16:36:18 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: refactor and error-handle most of desktop configuration, incl menus/dialog + + - `dialog_if_terminal_set_vars()` in place of `dialog_if_terminal()` + +lib/functions/configuration/config-desktop.sh +lib/functions/configuration/interactive.sh +lib/functions/configuration/main-config.sh +lib/functions/configuration/menu.sh +lib/functions/general/repo.sh +lib/functions/main/config-prepare.sh + +commit 6d5802b05da59513e169dd2837d293b8d99e95c4 +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 01:27:39 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [WiP] ddk stuff, allow if not in `$KERNEL_TARGET` + +lib/functions/main/config-prepare.sh + +commit e1e33a3e9413fda79f7240abf61a9bd3ef95d27a +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 00:39:31 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: split `compile_kernel()` function into smaller functions (+logging) + + - `do_with_logging()` galore, much better error reporting for kernel + - `do_with_hooks()` is for the future, just a placeholder for now + +lib/functions/compilation/kernel.sh +lib/functions/main/default-build.sh + +commit e16b1e19e04308d5313908a5750e74ed2bdd72aa +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 00:31:23 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: `do_with_hooks()` placeholder for future ideas + +lib/extensions.sh + +commit 4416b6b18cdb3c9311aa254189b21dfdf03747cf +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 00:30:55 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: logging: small refactor and `do_with_logging` admit it does not do error control + +lib/functions/logging/logging.sh + +commit 3047f4362cad224283a9febd1dc05c4178768964 +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 00:28:09 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: fix: traps: `trap_manager_error_handled` is integer (`-i`) not array (`-a`) + +lib/functions/logging/traps.sh + +commit a6df63b905f60045a41f640f98c01e8e5305e8ed +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 00:25:30 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: sunxi-tools: fix logging for sunxi-tools compilation + +extensions/sunxi-tools.sh + +commit 1f1f7c01f3e77fa8de9c5657a123f0bf723cceb0 +Author: Ricardo Pardini +AuthorDate: Thu Feb 24 00:24:33 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: runners now run bash with `-o pipefail` in addition to `-e` + + - attention, only affects stuff run through the functions in runners.sh + +lib/functions/logging/runners.sh + +commit cdfe8e12f9940a457f5161798d11c5131c99b81b +Author: Ricardo Pardini +AuthorDate: Wed Feb 23 21:02:10 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: kernel: reduce logging clutter (CC,LD,AR) + + - hide fasthash_debug under `SHOW_FASTHASH` + +lib/functions/compilation/kernel.sh +lib/functions/compilation/patch/fasthash.sh + +commit 9ffb0891d8572ab04126bff74632dcabc31a81b1 +Author: Ricardo Pardini +AuthorDate: Wed Feb 23 21:00:59 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: `armhf` should make `zImage` -- or should it? + +config/sources/armhf.conf + +commit 4d8eab13c18560b8d64735858b2cf2462ac3f644 +Author: Ricardo Pardini +AuthorDate: Wed Feb 23 13:22:21 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: show logs through ccze; avoid ANSI escapes in file; `SHOW_xxx` control + + - `SHOW_DEBUG` shows the debug level + - `SHOW_COMMAND` shows all invoked commands through the runners + - `SHOW_TRAPS` to show 'cleanup' and 'trap' level + - `SHOW_TIMING` to show $SECONDS but pretty + - replace hardcoded traps/cleanups logging + +lib/extensions.sh +lib/functions/compilation/patch/fasthash.sh +lib/functions/general/host.sh +lib/functions/logging/logging.sh +lib/functions/logging/stacktraces.sh +lib/functions/logging/traps.sh +lib/functions/main/default-build.sh + +commit 6cbb8c84798438b5ca5b353829b011cdbc263f1b +Author: Ricardo Pardini +AuthorDate: Tue Feb 22 14:36:41 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: add `KERNEL_MAJOR_MINOR=x.z` to every family, manually from the `KERNELBRANCH` + +config/sources/families/imx6.conf +config/sources/families/imx7d.conf +config/sources/families/include/meson_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +config/sources/families/jetson-nano.conf +config/sources/families/media.conf +config/sources/families/mt7623.conf +config/sources/families/mvebu.conf +config/sources/families/mvebu64.conf +config/sources/families/odroidxu4.conf +config/sources/families/rk322x.conf +config/sources/families/rk3399.conf +config/sources/families/rk35xx.conf +config/sources/families/rockchip.conf +config/sources/families/rockchip64.conf +config/sources/families/rockpis.conf +config/sources/families/s5p6818.conf +config/sources/families/sun50iw9.conf +config/sources/families/virtual.conf +config/sources/families/zynq.conf + +commit 7b907d446bfae3db8c5afb4431d8e9bbd9e5df9e +Author: Ricardo Pardini +AuthorDate: Tue Feb 22 02:27:09 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: cold/warm bundles import/download/export for fetch_from_repo + + - warm remote, if present, can be exported shallow + - if warm remote bundle is present, can be imported shallow too + - fallback to cold bundle if warm not present + - export (from cold, if exists + warm) shallow bundle + - use temp clone and DATE (not rev or tag) for shallowing, WORKS! + - info JSON/CSV, include "config_ok" true/false, kernel/uboot info + - include logs for failed configs too + - core reports ARMBIAN_WILL_BUILD_KERNEL and ARMBIAN_WILL_BUILD_UBOOT now with package names + +lib/functions/compilation/kernel.sh +lib/functions/general/git.sh +lib/functions/main/config-prepare.sh +lib/tools/info.py +lib/tools/json2csv.py + +commit 8eca261f5e3e41d7f363514a79b4fd764c3e9b71 +Author: Ricardo Pardini +AuthorDate: Mon Feb 21 17:39:40 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: `KERNELDIR` is out, `KERNEL_MAJOR_MINOR` is in for all `meson64`, `rpi4b` and `uefi` + +config/sources/families/bcm2711.conf +config/sources/families/include/meson64_common.inc +config/sources/families/include/uefi_common.inc +extensions/grub.sh + +commit 6f046c4f36a156468666b8c7bfff995934c44264 +Author: Ricardo Pardini +AuthorDate: Mon Feb 21 17:37:10 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: new kernel workdir layout: cache/sources/kernel/-- + + - `GIT_FIXED_WORKDIR` is used to ignore 2nd param and use a specific dir + - this now REQUIRES `KERNEL_MAJOR_MINOR` to be set. + - prepare some `WARM_REMOTE_NAME` and related, based on it + +lib/functions/compilation/kernel.sh +lib/functions/general/git.sh +lib/functions/main/config-prepare.sh +lib/functions/main/default-build.sh + +commit e736b5233c440555fa8a1a654f1c3ac9ae664580 +Author: Ricardo Pardini +AuthorDate: Mon Feb 21 16:01:19 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: JUST_KERNEL=yes (opposed to KERNEL_ONLY=yes) is really just the kernel build + +lib/functions/main/default-build.sh + +commit df90ffa11bff94bcb3b90b3460bacd7ed102a567 +Author: Ricardo Pardini +AuthorDate: Mon Feb 21 14:40:47 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: fetch_from_repos now done when actually compiling atf/uboot/kernel, not before + + - lib regen after removing empty files (sources.sh and errors.sh are now gone) + +lib/functions/compilation/atf.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/sources.sh +lib/functions/compilation/uboot.sh +lib/functions/logging/errors.sh +lib/functions/main/default-build.sh +lib/library-functions.sh + +commit a44e91752d1005daa5bba5eb0b0114654199e3e5 +Author: Ricardo Pardini +AuthorDate: Mon Feb 21 01:50:16 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: linux: back to Torvalds bundle, no tags; reminder about export + +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh + +commit 9acef6be57519029f5e4eeccabac183e27e3f845 +Author: Ricardo Pardini +AuthorDate: Sat Feb 19 02:29:27 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: full cached kernel build; refactor all make's in a single place, even for packaging + + - 2nd+ runs build in less than a minute + - kernel: compile and package in a single step, more efficient? + - KERNEL_BUILD_DTBS yes/no to build or not dtbs, replaces KERNEL_EXTRA_TARGETS + - dtbs_install, modules_install and headers_install now called by Armbian, not packaging + - kernel with split, but identical, build and install makes for modules/headers/dtbs + - make mkdebian and builddeb idempotent as possible + - keep a lot more cache, specially 'debian' folder + - filtering logging of install stuff + - might be a few leftovers, revisit gains with packaging later + - keeping the arm64 makefile Image.gz vs Image hack + - fix order of packaging patch byteshift, but still there + - cleaning of scripts tools on cross compile removed (!) + +config/sources/amd64.conf +lib/functions/compilation/kernel.sh +lib/functions/compilation/patch/apply.sh +lib/functions/compilation/patch/fasthash.sh +lib/functions/compilation/patch/kernel-pkg.sh +lib/functions/compilation/sources.sh +lib/functions/main/default-build.sh +packages/armbian/builddeb +packages/armbian/mkdebian + +commit 0e26d1439e8e6ad7ae331247a618db4ea4a4130c +Author: Ricardo Pardini +AuthorDate: Sat Feb 19 01:06:32 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: minor stylistic changes that I end up doing while working on other stuff + + - I am `OFFLINE_WORK`'ing, I don't wanna waste 3 seconds, thanks + - OCD-fix of double `local` declarations + +lib/functions/cli/cli-entrypoint.sh +lib/functions/general/git.sh + +commit 1b0d604efc56025a1dfd8a2d9ef3485799fbbe1b +Author: Ricardo Pardini +AuthorDate: Fri Feb 18 04:26:28 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [giga-wip] rework patching, introducing fasthash + +lib/functions/compilation/kernel.sh +lib/functions/compilation/patch/apply.sh +lib/functions/compilation/patch/fasthash.sh +lib/functions/compilation/patch/kernel-bootsplash.sh +lib/functions/compilation/patch/kernel-drivers.sh +lib/functions/compilation/patch/kernel-pkg.sh +lib/functions/compilation/sources.sh +lib/library-functions.sh + +commit 8939a9142a7e08f0dae8bc866811687119501c5e +Author: Ricardo Pardini +AuthorDate: Fri Feb 18 04:17:22 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [wip] git: experiment with stable kernel bundle, and all tags. nice, but for what? + + - also: never delete working copy, exit with error instead. + +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh + +commit b853358ccab458dce0efca486ec5a15fda4ec193 +Author: Ricardo Pardini +AuthorDate: Fri Feb 18 04:09:37 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [wip] disable make clean during packaging. I wanna rebuild fast, always [NO PR?] + +packages/armbian/builddeb + +commit d61b6ddd982f316604bdedd82a0907beef7cfa0b +Author: Ricardo Pardini +AuthorDate: Thu Feb 17 22:21:33 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: export CHOSEN_KERNEL_WITH_ARCH for reporting info + + - fix info gathering, parse all boards first, and stop if some failed + - fix KERNEL_TARGET regex by including optional "export " + - add export from info to CSV, very basic stuff, but works + +lib/functions/main/config-prepare.sh +lib/tools/info.py +lib/tools/json2csv.py + +commit dcf101ccbcb61fb4bf0af97f8592f6f166a20b92 +Author: Ricardo Pardini +AuthorDate: Thu Feb 17 21:47:02 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [squash] remove ddk bullshit from KERNEL_TARGET + +config/boards/rpi4b.wip +config/boards/uefi-arm64.conf +config/boards/uefi-x86.conf + +commit 7183b3290b9df1c4fce8307813702c23846be817 +Author: Ricardo Pardini +AuthorDate: Thu Feb 17 15:49:27 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: remove file logging of aggregation stuff. config phase can't touch disk anymore. + +lib/functions/configuration/aggregation.sh +lib/functions/configuration/main-config.sh + +commit 4f858ace7b8674c8d5555e311bd053819555648a +Author: Ricardo Pardini +AuthorDate: Thu Feb 17 03:24:08 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [WiP] git cold bundle; no: shallow clones/fetched; yes: locally packed repo + +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +lib/functions/compilation/debs.sh +lib/functions/compilation/extra-drivers.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/patching.sh +lib/functions/compilation/sources.sh +lib/functions/compilation/uboot.sh +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh +lib/functions/multi/build-all.sh + +commit 134877c13df20aa7403185b41d75ee3db95c4485 +Author: Ricardo Pardini +AuthorDate: Wed Feb 16 23:06:37 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: reorder functions in file, they have a ~logical call-tree order + +lib/functions/logging/runners.sh + +commit f148d9aa6b42c96ee1fe9c58053886d693a5c58e +Author: Ricardo Pardini +AuthorDate: Wed Feb 16 23:05:28 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: move `fingerprint_image()` out of `git.sh` into its own file + +lib/functions/general/fingerprint.sh +lib/functions/general/git.sh +lib/library-functions.sh +lib/tools/gen-library.sh + +commit 9f774b4dac5b1c1808c2a57b2cb7b7ed2dd2e308 +Author: Ricardo Pardini +AuthorDate: Wed Feb 16 12:02:32 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + logging: fix for double stderr redirect during `fakeroot_dpkg_deb_build` + +lib/functions/logging/runners.sh + +commit 8164916306b8b4bc06cd8dca5f7d937d0bfee368 +Author: Ricardo Pardini +AuthorDate: Wed Feb 16 11:47:38 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + logging: subdued "command" logging for debugging low level cmd invocations ("frog") + +lib/functions/compilation/kernel.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh + +commit b173dbe20aff3996a3ad8b32860d001336eaa34c +Author: Ricardo Pardini +AuthorDate: Wed Feb 16 02:23:16 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: when showing log, emit all host-side invocations as `debug` too. + +lib/functions/logging/runners.sh + +commit 550e748f1a27d875cf9badfa85d6f1c251fa52aa +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 16:49:58 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + [WiP] trap handler abstraction, somewhat works! + +compile.sh +lib/extensions.sh +lib/functions/cli/cli-entrypoint.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/logging/errors.sh +lib/functions/logging/logging.sh +lib/functions/logging/stacktraces.sh +lib/functions/logging/traps.sh +lib/functions/main/default-build.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/create-cache.sh + +commit 7f06253437a0ae20d4570e09e8babe3302bb8350 +Author: Ricardo Pardini +AuthorDate: Wed Feb 16 00:01:54 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: manual merge (10) of all lib/*.sh changes between revisions a4ae3a22703a66f1e383a193d74655533ff96c3a and 3305d45b8175dbdd647dc1dc53fa6f0a522920c7 - but NOT the git unshallow stuff, that will be rewritten + +config/sources/families/bcm2711.conf +config/sources/families/include/uefi_common.inc +lib/functions/configuration/main-config.sh +lib/functions/image/partitioning.sh +packages/armbian/builddeb + +commit dcbc1fa8d159e9a7423e82c5bc81b223c20dfbc1 +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 14:35:36 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: trapmanager pt1, identifying spots for trap manager intervention + +lib/functions/bsp/bsp-cli.sh +lib/functions/bsp/bsp-desktop.sh +lib/functions/compilation/atf.sh +lib/functions/compilation/debs.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/uboot.sh + +commit d2c3f332f9e9a04ff68d2bf1e694a223999e3304 +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 13:42:44 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: `install_pkg_deb` -> `install_host_side_packages` which is completely rewritten version + + - much simplified; compare installed packages vs wanted, and only update if some missing + +lib/functions/general/host.sh +lib/functions/logging/runners.sh + +commit 3b2d026b59d86cd463119876a9b69b02fd6ecf45 +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 13:27:31 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: force u-boot and kernel's gcc to output colors to make easy to spot warnings and errors + +lib/functions/compilation/kernel.sh +lib/functions/compilation/uboot.sh + +commit fb4be3fa4a0d19043ee8d7ff1304ec3ccdf618cb +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 13:23:51 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + docker: pass the `CI` env var through Docker invocation, for GitHub Actions + +config/templates/config-docker.conf + +commit 3db36a4fd3e6ad8c1b2d47d88d664936274bb875 +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 13:23:09 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: avoid warning if "file" utility not installed + + - should not happen, but better safe than sorry + +lib/functions/logging/runners.sh + +commit d986cbc68bc926d9dc8fca44cbe9b5a19d6a88b6 +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 13:22:33 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: disable long_running `pv` progress bar for custom case too + + - will rework later, for now pipe causes subshell and caos + +lib/functions/logging/runners.sh + +commit 7d49d5f6a72be78fa8afcd362fe7984e34d28614 +Author: Ricardo Pardini +AuthorDate: Sun Feb 13 13:21:12 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: if `CI=true` then `SHOW_LOG=yes` always + +compile.sh + +commit a803a9dbbb8b86301ca930214675c1365e9125a7 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 23:18:05 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + docker: add arm64 toolchain to Dockerfile; warn, but don't break, on modprobe failure + +config/templates/Dockerfile +lib/functions/general/host.sh + +commit aaed9afade2dda38d9e92a7054f3477801468760 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 21:52:01 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: docker: use ubuntu:rolling, fix deps, use `$SRC/cache` as container's cache dir + +config/templates/Dockerfile +config/templates/config-docker.conf + +commit 6e52c4d1b50f4bff209d7536573329f7ea9e5e47 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 23:17:20 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: logging fixes (padding, don't show error more than once, don't remove trap) + +lib/functions/logging/logging.sh +lib/functions/logging/stacktraces.sh +lib/functions/logging/traps.sh + +commit 5022af1c97af824af73d6e79bee988a3bf3773d1 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 21:50:37 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:37 2022 +0200 + + armbian-next: fixes for early error handling and logging + + - split stacktrace-related functions into their own lib file + - simplify the traps + - some stacktrace formatting for readability + +compile.sh +lib/extensions.sh +lib/functions/logging/stacktraces.sh +lib/functions/logging/traps.sh +lib/library-functions.sh + +commit a94d0cf61be12647c9ce5ce05440b6fe44b53cb4 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 21:45:05 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: fix: don't `trap` `ERR` twice, it causes bash to go bananas regarding `caller` + +lib/extensions.sh + +commit 54ce1b35ffac8eb5933a147b264352ac7ceb026a +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 17:01:00 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: `UPSTEM_VER` -> `UBOOT_REPO_VERSION` and related fixes + +lib/functions/image/loop.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/multi/build-all.sh +lib/functions/rootfs/distro-agnostic.sh + +commit e4d30f131db7f9ab15759e4fa7fe5f18117cccd6 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 16:06:30 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: oops, fix some non-lib changes I missed, up to revision ff4346c4682e260be3137a2301ac7a69b97c044d + +config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh +config/sources/families/include/rockchip64_common.inc +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +config/sources/families/jetson-nano.conf +config/sources/families/mvebu64.conf +config/sources/families/odroidxu4.conf +config/sources/families/rk322x.conf +config/sources/families/rk35xx.conf +config/sources/families/rockchip64.conf +config/templates/config-example.conf +packages/armbian/builddeb + +commit 326548a2fb5909159b84ad75d11c714b4dbe42b3 +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 15:46:09 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: manual merge (9) of all lib/*.sh changes between revisions 3b7f5b1f3418b7ad7a7c03f2af6d8da66f20bcb9 and ff4346c4682e260be3137a2301ac7a69b97c044d + +lib/functions/compilation/extra-drivers.sh +lib/functions/configuration/main-config.sh +lib/functions/image/partitioning.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/rootfs/distro-agnostic.sh + +commit 8180b79f136be27a79d225ade02faa823012923f +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 10:18:32 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: more error handling fixes. avoid shortcircuits. + + - store previous error message in `MSG_IF_ERROR` (still to be actually shown somewhere during error) + +lib/functions/compilation/atf.sh +lib/functions/compilation/uboot.sh +lib/functions/image/partitioning.sh +lib/functions/rootfs/apt.sh +lib/functions/rootfs/create-cache.sh +lib/functions/rootfs/distro-agnostic.sh + +commit f549907b967be0199cb10b995f8aa3449e0de8ad +Author: Ricardo Pardini +AuthorDate: Sat Feb 12 09:17:38 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: more error handling fixes. avoid subshells, shortcircuits, and pipes + + - add `CFLAGS=-fdiagnostics-color=always` to kernel compile; would need also for u-boot soon + +lib/functions/compilation/kernel.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh +lib/functions/logging/traps.sh + +commit 6e3a035ec4ba55378e61e0229fb0290f3b0cdf99 +Author: Ricardo Pardini +AuthorDate: Mon Jan 31 20:03:34 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + WiP: indexing JSON into OpenSearch, all-hardcoded version + +lib/tools/index-opensearch.py + +commit a1e81b3a46d9511962246ff6852ae9549b154fb9 +Author: Ricardo Pardini +AuthorDate: Sun Feb 6 01:57:09 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + rpi: add DTB symlink in Debian/Ubuntu standard location /lib/firmware/$version/device-tree; remove build-time-only hacks + + - this allows us to remove the most horrible hack + - should allow for correctly working DTB upgrades + - should NOT impact other families, although a new symlink will be created, nothing uses it. + +config/sources/families/bcm2711.conf +packages/armbian/builddeb + +commit e665d2fb3e9a25b2e9e927e3749ff14065f29ffb +Author: Ricardo Pardini +AuthorDate: Sat Feb 5 23:37:01 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + rpi: fix: flash-kernel fix to ignore kernel 'flavour' for all raspi's + +config/sources/families/bcm2711.conf + +commit acb9b1ee273bb16ab3a5caf47830f63a9eedef37 +Author: Ricardo Pardini +AuthorDate: Sun Feb 6 14:19:04 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: don't try to remove packages that are not installed to begin with + + - much faster + - new chroot_sdcard_with_stdout() runner, without bash or any escaping. + +lib/functions/logging/runners.sh +lib/functions/rootfs/distro-agnostic.sh + +commit c2a084f37049b0a3338e8f8bdf1e103539439c89 +Author: Ricardo Pardini +AuthorDate: Sun Feb 6 12:42:25 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: don't try to enable systemd services for units that don't exist + + - those might be removed by a bsp extension, so check for existence before trying to enable + +lib/functions/rootfs/distro-agnostic.sh + +commit 9291369c6d68660e9a43f43ee3fc94c8ad0fc774 +Author: Ricardo Pardini +AuthorDate: Sun Feb 6 12:12:01 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: don't error/warn on failure to enable bootsplash when systemd units missing + +lib/functions/rootfs/boot_logo.sh + +commit ee634ea265ad9947f4061cd3bc0ffdf7d83d3e78 +Author: Ricardo Pardini +AuthorDate: Sun Feb 6 11:24:33 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: use indented HEREDOCS for all call_extension_method's + +lib/extensions.sh +lib/functions/bsp/bsp-cli.sh +lib/functions/image/partitioning.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/main/default-build.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/customize.sh +lib/functions/rootfs/distro-agnostic.sh +lib/functions/rootfs/post-tweaks.sh + +commit cba342a0ce4843cf69144c11ea881e0ce0b6ba40 +Author: Ricardo Pardini +AuthorDate: Sun Feb 6 14:39:49 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: manual merge (8) of all lib/*.sh changes between revisions 1d499d9ac282d44d4fdb052e5f64fb902688c18f and 3b7f5b1f3418b7ad7a7c03f2af6d8da66f20bcb9 + +lib/functions/compilation/patching.sh + +commit b2b1fdf3dae9193072994369c7b5bac7318366eb +Author: Ricardo Pardini +AuthorDate: Sat Feb 5 22:05:21 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: manual merge (7) of all lib/*.sh changes between revisions d885bfc97d908b09dddac06393c2987995704d0a and 1d499d9ac282d44d4fdb052e5f64fb902688c18f + +lib/functions/compilation/extra-drivers.sh +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/main/default-build.sh +lib/functions/rootfs/distro-agnostic.sh +lib/functions/rootfs/distro-specific.sh + +commit b2849431e1736e9bae4eeddd3ef363a058352465 +Author: Ricardo Pardini +AuthorDate: Sun Jan 30 22:21:50 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: manual merge (6) of all lib/*.sh changes between revisions c7f3c239fe93f8fcfdd1b1edf6f11e143802e379 and d885bfc97d908b09dddac06393c2987995704d0a + +lib/functions/compilation/extra-drivers.sh +lib/functions/compilation/patching.sh +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh +lib/functions/rootfs/create-cache.sh + +commit 4fcb0204e5df9bc6c540806096def9ce8e3126e1 +Author: Ricardo Pardini +AuthorDate: Mon Jan 24 00:16:42 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: avoid writing to disk during configuration; `ANSI_COLOR=none` logging; make CONFIG_DEFS_ONLY=yes runnable without sudo + + - when `CONFIG_DEFS_ONLY=yes`, avoid writing the config summary output.log file. + - refactor that into a function as to be easy to if-out-of + - don't write to disk during aggregate_content() if `CONFIG_DEFS_ONLY=yes` + - don't write to disk during show_checklist_variables() if `CONFIG_DEFS_ONLY=yes` + - don't write to disk during write_deboostrap_list_debug_log() if `CONFIG_DEFS_ONLY=yes` + - don't compress and rotate logs if `CONFIG_DEFS_ONLY=yes` + - don't pretend to be handling errors we can't handle during var capture + - I foresee a world we can build all .debs without sudo + - and a some kind of split of codebase entrypoint due to that future feature + - some python info.py enhancements, not ready yet + +lib/extensions.sh +lib/functions/cli/cli-entrypoint.sh +lib/functions/configuration/aggregation.sh +lib/functions/configuration/main-config.sh +lib/functions/logging/capture.sh +lib/functions/logging/logging.sh +lib/functions/main/config-prepare.sh +lib/tools/info.py + +commit c7785c788f81bce938f2af6b3d576ba9834433b7 +Author: Ricardo Pardini +AuthorDate: Sun Jan 23 23:00:17 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: shellfmt and regen library (after rebase from master n.5) + +lib/functions/compilation/atf.sh +lib/functions/logging/logging.sh +lib/functions/rootfs/create-cache.sh +lib/library-functions.sh + +commit ac99b0432bdbb7d2ee589a5f41a72e17dcbfecee +Author: Ricardo Pardini +AuthorDate: Sun Jan 23 22:59:25 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + tools/shellfmt.sh: exclude "cache" and ".tmp" from formatting, for obvious reasons + +lib/tools/shellfmt.sh + +commit b17bb64ddc739b7084b98d070848aade693f3794 +Author: Ricardo Pardini +AuthorDate: Sun Jan 23 22:58:36 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + tools/gen-library.sh: sort function files, so it does not keep changing between runs on different machines. + + - order should not be important, since files only contain functions, but avoid git churn + +lib/tools/gen-library.sh + +commit d84cbf9f3a367ab068bd619619daa58c56e7c96f +Author: Ricardo Pardini +AuthorDate: Sun Jan 23 22:42:25 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: manual merge (5) of all lib/*.sh changes between revisions 1b18df3c834c5c4166e99f731d53ec88d14caf7d and e7962bb2b555d3afdca0ff168982cc45235ca0a8 + + - most PKG_PREFIX work was already done + +config/sources/families/jetson-nano.conf +lib/functions/general/host.sh +lib/functions/rootfs/distro-agnostic.sh + +commit b18f3c81a1613e4b1550674a471f309a59526167 +Author: Ricardo Pardini +AuthorDate: Sun Jan 23 22:08:16 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: `TMPDIR` for all, many logging fixes, error handling: leave-no-garbage-behind without needing traps. + + - set `MOUNT_UUID` and `WORKDIR`/`MOUNT`/`SDCARD`/`EXTENSION_MANAGER_TMP_DIR`/`DESTIMG` early in do_main_configuration() + - but, they're just _set_ there, dirs are not created early, but on demand later + - still @TODO: actually clean those during error trap. (unhappy path leaves garbage still) + - but does not leave garbage behind during "successful" runs at least (happy path works) + - actually export `TMPDIR` (== `WORKDIR`) during start of build (not config!), so all `mktemp` are subject to it + - `runners.sh` has helpers to avoid passing `TMPDIR` to chroot. Use the helpers! don't call `chroot` directly. + - don't trap/cleanup individual `mktemp` temp dirs during .deb packaging's, all is handled at once now. + - kernel packaging, for example, automatically picks up `TMPDIR` too. So now hosts `/tmp` is mostly left alone. + - fix some "infodumps" that are done into `.log` files directly. + - don't use sudo if `CONFIG_DEFS_ONLY=yes`; we'll only be collecting info, not doing anything. + - simpler logging for `rsync` operations (just dump to stdout, logging will handle it!) + - use padded counter for section logfiles, so we know which order things ran. exported as `CURRENT_LOGGING_COUNTER` + - no reason to use `apt-get` with `-yqq` anymore, since all logging is handled, so now `-y` by default + - desktop: using runners helpers for rootfs-desktop.sh, which should help a lot with acng caching and finding of problems + - extensions: correctly cleanup temp stuff, extensions has its own tmp/workdir now, and is always cleaned up at end of build. + +lib/extensions.sh +lib/functions/bsp/bsp-cli.sh +lib/functions/bsp/bsp-desktop.sh +lib/functions/cli/cli-entrypoint.sh +lib/functions/compilation/atf.sh +lib/functions/compilation/debs.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/patching.sh +lib/functions/compilation/uboot.sh +lib/functions/configuration/main-config.sh +lib/functions/configuration/menu.sh +lib/functions/general/host.sh +lib/functions/image/rootfs-to-image.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh +lib/functions/main/config-prepare.sh +lib/functions/main/default-build.sh +lib/functions/rootfs/rootfs-desktop.sh + +commit 84ad3ec52fa01eacca30bd3754853cff312dde5a +Author: Ricardo Pardini +AuthorDate: Sat Jan 22 10:35:06 2022 +0000 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: bye `PKG_PREFIX`, hello `run_host_x86_binary_logged()` wrapper function; better error handling + + - we've x86-only utilities that might need to be run on non-x86 build machines + - previously duplicated logic in PKG_PREFIX variable refactored into logged function + - added centralized debug logging + - replace all PKG_PREFIX usage with the new wrapper function, which already handles logging and errors. + - mostly FIP tooling invocations + - but also the boot_logo image builder + - wrapper function delegates to common `run_host_command_logged` + - wrap other FIP invocations with `run_host_command_logged` too, for tidy logging + - avoid using conditionals when invoking functions; that completely disables error handling inside the called function + - use explicit bash opts instead of shortcuts like `set -e` + - a _lot_ of debug logging added + +compile.sh +config/sources/families/include/meson64_common.inc +config/sources/families/include/rockchip64_common.inc +config/sources/families/meson-gxbb.conf +config/sources/families/meson-gxl.conf +lib/functions/cli/cli-entrypoint.sh +lib/functions/compilation/uboot.sh +lib/functions/general/host.sh +lib/functions/logging/runners.sh +lib/functions/rootfs/boot_logo.sh +lib/library-functions.sh +lib/tools/gen-library.sh + +commit f9e02b2152c1c82a74312ccf48ef530dac167512 +Author: Ricardo Pardini +AuthorDate: Sat Jan 22 10:32:08 2022 +0000 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:36 2022 +0200 + + armbian-next: always use UPPERCASE labels for FAT32 UEFI filesystems (rpi4b, uefi-*) + +config/sources/families/bcm2711.conf +lib/functions/image/partitioning.sh + +commit acbc2f21da023796c5a72e3b78e0b20f09cf5ed0 +Author: Ricardo Pardini +AuthorDate: Thu Jan 20 23:41:18 2022 +0000 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:34 2022 +0200 + + armbian-next: shellfmt after rebase onto master + +config/sources/families/media.conf + +commit 407ecdb1b9108b57afea57b3ca6a17ed86ef1fcc +Author: Ricardo Pardini +AuthorDate: Thu Jan 20 23:35:46 2022 +0000 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + armbian-next: manual merge (4) of all lib/*.sh changes between revisions 23afccf56e295610340188dc2613143d5323659e and e610f00bc7fdcab5ba4c648fa21148518b4b767b + + - plus ooops + +config/sources/families/bcm2711.conf +config/sources/families/include/sunxi_common.inc +config/sources/families/jethub.conf +lib/functions/configuration/main-config.sh +lib/functions/general/git.sh +lib/functions/general/host.sh + +commit cdf0389ba5f0a747f4c1f9feee9527001aa61a35 +Author: Ricardo Pardini +AuthorDate: Sun Jan 16 23:02:52 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + atf: fix for `set -e` mode; fix CROSS_COMPILE quoting + + Signed-off-by: Ricardo Pardini + +lib/functions/compilation/atf.sh + +commit eea2f5f4041541f8055be549eea4cf8c2f32a901 +Author: Ricardo Pardini +AuthorDate: Sun Jan 16 23:03:45 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: predict the future location of .img file + + - otherwise it's really unhelpful + + Signed-off-by: Ricardo Pardini + +lib/functions/image/rootfs-to-image.sh + +commit 873136d95f303e1acfce017ad7d38464ee0058ec +Author: Ricardo Pardini +AuthorDate: Sat Jan 15 19:37:27 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + uefi: alias `BRANCH=ddk` to `current`'s `DISTRO_GENERIC_KERNEL=yes` + + - no real change, just to match rpi4b's BRANCH=style + - opens space for Armbian-built `current` soon + + Signed-off-by: Ricardo Pardini + +config/boards/uefi-arm64.conf +config/boards/uefi-x86.conf +config/sources/families/include/uefi_common.inc + +commit fe8e12e095465e7098e5f4cff98fdb4ee80769ff +Author: Ricardo Pardini +AuthorDate: Sat Jan 15 02:46:02 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + rpi: `legacy`->`ddk` (distro default kernel), remove overclock + + - common vars in bcm2711.conf moved to top + - removed overclock/overvolt that was leftover my old setup + - confirmed: works with rpi3b too, should work with CM4/CM3 and others + - use valid UPPERCASE FAT label for RPICFG (in place of `rpicfg`) + + Signed-off-by: Ricardo Pardini + +config/boards/rpi4b.wip +config/sources/families/bcm2711.conf + +commit 1390b62e7c08fc0d0e834854ddd5d19c5243aa8d +Author: Ricardo Pardini +AuthorDate: Sat Jan 15 02:37:48 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + armbian-next: shellfmt again after rebase + + Signed-off-by: Ricardo Pardini + +config/boards/rpi4b.wip +config/sources/families/bcm2711.conf + +commit 03b4020135b5915e54895f5dcd53250df25d57e5 +Author: Ricardo Pardini +AuthorDate: Tue Jan 11 11:36:25 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + armbian-next: manual merge (3) of all lib/*.sh changes between revisions 1035905760884fbea567717684c38faae3ef28a4 and e4e4ab0791e60e1e7a204dd0409fa29a1cf7a376 + + - missed non lib change on Several improvements for RPi builds (#3391) + - I just realized I will have to drop all non lib changes + +config/boards/rpi4b.wip +config/sources/families/bcm2711.conf +lib/functions/compilation/debs.sh +lib/functions/general/downloads.sh +lib/functions/general/host.sh + +commit 1f2306a3ad4f0abf5730bb5eb26a70c979d86ff3 +Author: Ricardo Pardini +AuthorDate: Sun Jan 9 15:22:10 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + rockship: fixes for `set -e` mode in rockship armhf family and bsp tweaks + + Signed-off-by: Ricardo Pardini + +config/sources/families/rockchip.conf + +commit 7bfb222e11c2a658ce29df17d17981fce8e03382 +Author: Ricardo Pardini +AuthorDate: Sun Jan 9 15:21:40 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + armhf: enable building armhf targets on amd64 using system toolchains + + - SKIP_EXTERNAL_TOOLCHAINS=yes on amd64 should use the same system toolchains as an arm64 build + + Signed-off-by: Ricardo Pardini + +config/sources/armhf.conf + +commit 79348c956a29a2077e017c2d83e129beed99208d +Author: Ricardo Pardini +AuthorDate: Sun Jan 9 15:20:50 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: better logging about family_tweaks and family_tweaks_bsp + + Signed-off-by: Ricardo Pardini + +lib/functions/bsp/bsp-cli.sh +lib/functions/rootfs/distro-agnostic.sh + +commit eca8ea1ba1b44474c3fd1baae9bdacae5ef7e431 +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 21:26:08 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + kernel: unblock cross compilation, warn about headers package + + Signed-off-by: Ricardo Pardini + +lib/functions/compilation/kernel.sh + +commit 739a4fe4d589a9d9ce58a725ed1d7db76b9aab3b +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 20:02:23 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: fixes for sunxi/megous stuff with `set -e` + + Signed-off-by: Ricardo Pardini + +config/sources/families/include/sunxi64_common.inc +config/sources/families/include/sunxi_common.inc +lib/functions/general/git.sh + +commit 9fc0bd5788857c43c3f4d6e217928539ccd894a9 +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 15:01:03 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: fix shellcheck references generation + + Signed-off-by: Ricardo Pardini + +lib/library-functions.sh +lib/tools/gen-library.sh + +commit 49cdd43f9fa208e13607eae9dad138d4d49a0a5f +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 13:56:36 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: manual merge (2) of all lib/*.sh changes between revisions 117633687e9942ade647a8b7d3f80f01e3145193 and 30830388555e463402161a6e0d6993dd6fb0544e + + Signed-off-by: Ricardo Pardini + +lib/functions/cli/utils-cli.sh +lib/functions/general/host.sh + +commit 496713bb6f122440105626db767b39db7dd41e2f +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 13:35:51 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: renaming function files a bit more consistently + + Signed-off-by: Ricardo Pardini + +lib/functions/cli/utils-cli.sh +lib/functions/compilation/utils-compilation.sh +lib/functions/rootfs/distro-agnostic.sh +lib/functions/rootfs/distro-specific.sh +lib/library-functions.sh + +commit 3c36aa6e495d06ab1fc599585e14c3a66ec14f03 +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 01:46:22 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: removing leftover empty file after all the moving around + + Signed-off-by: Ricardo Pardini + +lib/functions/image.sh +lib/library-functions.sh + +commit 5d19b3686e732d07ac0d49abba76e03b42f4309e +Author: Ricardo Pardini +AuthorDate: Sat Jan 8 01:16:55 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: really insist on set -e during library loading + + Signed-off-by: Ricardo Pardini + +lib/library-functions.sh +lib/tools/gen-library.sh + +commit dc2dd8dd4ced5244a5c615fe815b08455b119bbb +Author: Ricardo Pardini +AuthorDate: Fri Jan 7 23:35:25 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: shellfmt again after rebasing master + + Signed-off-by: Ricardo Pardini + +config/boards/jetson-nano.conf +config/sources/families/jetson-nano.conf +extensions/flash-kernel.sh +lib/functions/configuration/menu.sh +lib/library-functions.sh + +commit ce5bebdb917d1e3c88e36899c268207779716965 +Author: Ricardo Pardini +AuthorDate: Fri Jan 7 23:28:12 2022 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: manual merge of all lib/*.sh changes between revisions f6143eff670d435cc8d15b52335b1b70ccb91e1c and f3388b9aee0d1564a28fbc661c6e7b0415a6dfd0 + + Signed-off-by: Ricardo Pardini + +lib/functions/bsp/bsp-cli.sh +lib/functions/compilation/extra-drivers.sh +lib/functions/extras/buildpkg.sh +lib/functions/general/git.sh +lib/functions/general/host.sh +lib/functions/main/default-build.sh +lib/functions/rootfs/distro_agnostic.sh + +commit 9486f6117f1011dbeefd44fdda9e1d9e7f3c7425 +Author: Ricardo Pardini +AuthorDate: Sun Dec 26 12:39:03 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: generic do_capturing_defs wrapper; Python parser + + - enabled by passing CONFIG_DEFS_ONLY=yes; in this case does not build anything + - [WiP] Python3 info reader / matrix expander + - multithreaded version + + Signed-off-by: Ricardo Pardini + +compile.sh +config/boards/virtual-qemu.wip +lib/functions/cli/cli-entrypoint.sh +lib/functions/configuration/main-config.sh +lib/functions/logging/capture.sh +lib/functions/logging/traps.sh +lib/functions/main/config-prepare.sh +lib/functions/main/default-build.sh +lib/library-functions.sh +lib/tools/info.py + +commit 328c4f75664d68f01579467631672c5645466cdc +Author: Ricardo Pardini +AuthorDate: Sat Dec 25 17:12:19 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: move some interactive parts of config into its own functions + + - mostly from config-prepare; + - there is still a lot of others in main-config + + Signed-off-by: Ricardo Pardini + +lib/functions/configuration/interactive.sh +lib/functions/configuration/main-config.sh +lib/functions/configuration/menu.sh +lib/functions/main/config-prepare.sh +lib/library-functions.sh + +commit 078ad44f58e718d842b6a14d3f441560ac685022 +Author: Ricardo Pardini +AuthorDate: Fri Dec 24 08:43:34 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:31 2022 +0200 + + logging: use chroot_custom for grub and flash-kernel extension logging + + Signed-off-by: Ricardo Pardini + +extensions/flash-kernel.sh +extensions/grub.sh + +commit e4cc689b82986aa917ccf71cefcae121261559bd +Author: Ricardo Pardini +AuthorDate: Fri Dec 24 01:43:23 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:30 2022 +0200 + + logging: use line buffering, fix runner output color for GHA + + Signed-off-by: Ricardo Pardini + +lib/functions/logging/logging.sh + +commit b1cfead3ac2957d5e19a3f10010a814ef0e70297 +Author: Ricardo Pardini +AuthorDate: Wed Dec 22 01:19:47 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:30 2022 +0200 + + logging: wrap dpkg-deb; set TMPDIR (not in chroot); refactor kernel make + + - And a huge amount of @TODO's added + - Add "debug" and "deprecation" `display_alert()` levels + - insist that `install_common` is now `install_distribution_agnostic` + - unrelated: realtek 8822CS is EXTRAWIFI=yes only now, sorry. + - many debug statements for desktop + + Signed-off-by: Ricardo Pardini + +config/sources/amd64.conf +lib/functions/bsp/bsp-cli.sh +lib/functions/bsp/bsp-desktop.sh +lib/functions/compilation/compilation-utils.sh +lib/functions/compilation/debs.sh +lib/functions/compilation/extra-drivers.sh +lib/functions/compilation/kernel.sh +lib/functions/compilation/uboot.sh +lib/functions/configuration/main-config.sh +lib/functions/general/host.sh +lib/functions/image/loop.sh +lib/functions/logging/logging.sh +lib/functions/logging/runners.sh +lib/functions/main/config-prepare.sh +lib/functions/main/rootfs-image.sh +lib/functions/rootfs/apt.sh +lib/functions/rootfs/distro_agnostic.sh + +commit 9869508b622be33fe5114313c02d107b500f79aa +Author: Ricardo Pardini +AuthorDate: Wed Dec 22 19:39:26 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:30 2022 +0200 + + logging: don't bail out on patching error + + Signed-off-by: Ricardo Pardini + +lib/functions/compilation/patching.sh + +commit 91806c9e0934a7d4a01425bf76c013dca110f5f0 +Author: Ricardo Pardini +AuthorDate: Wed Dec 22 01:18:23 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:30 2022 +0200 + + logging: bunch of fixes; no-stdin; traps; better stacks + + - mostly no-stdin dialog handling (desktop et al) + - let ERR trap run together with unmount trap (EXIT etc) + + Signed-off-by: Ricardo Pardini + +compile.sh +lib/extensions.sh +lib/functions/configuration/main-config.sh +lib/functions/configuration/menu.sh +lib/functions/general/repo.sh +lib/functions/logging/traps.sh +lib/functions/main/config-prepare.sh +lib/functions/rootfs/create-cache.sh + +commit 70b9182fb02337c6c8d023469571acb2f1462317 +Author: Ricardo Pardini +AuthorDate: Mon Dec 20 23:29:18 2021 +0100 +Commit: Ricardo Pardini +CommitDate: Sat Oct 8 11:19:30 2022 +0200 + + logging: trap ERR very early, pass-in caller info + + Signed-off-by: Ricardo Pardini + +compile.sh +lib/extensions.sh +lib/functions/logging/runners.sh +lib/functions/logging/traps.sh +lib/functions/main/default-build.sh + +``` + + + +## Full mbox log + +- c9cf3fc241cfb4c872f4aef7bbc41d5854db7ea3 to 6809de3d6063cb041205a8318e19da6a4dee68c9 ref extensions_08_10_2022_pre_v30 + +``` +From 6809de3d6063cb041205a8318e19da6a4dee68c9 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Oct 2022 11:30:37 +0200 +Subject: [PATCH] armbian-next: manual merge (30) of lib changes between + 882f995e21f4791d773bc59efdfdb676494ee6ba and + 31ac6383e1ac7ebddd0813abc0f1f9632a9c9c40 + +--- + lib/functions/configuration/main-config.sh | 12 +++++++++--- + lib/functions/general/downloads.sh | 1 + + 2 files changed, 10 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 91c3844ca..87f772113 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -318,18 +318,24 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + + DEBIAN_MIRROR='deb.debian.org/debian' + DEBIAN_SECURTY='security.debian.org/' +- UBUNTU_MIRROR='ports.ubuntu.com/' ++ [[ "${ARCH}" == "amd64" ]] && ++ UBUNTU_MIRROR='archive.ubuntu.com/ubuntu/' || ++ UBUNTU_MIRROR='ports.ubuntu.com/' + + if [[ $DOWNLOAD_MIRROR == "china" ]]; then + DEBIAN_MIRROR='mirrors.tuna.tsinghua.edu.cn/debian' + DEBIAN_SECURTY='mirrors.tuna.tsinghua.edu.cn/debian-security' +- UBUNTU_MIRROR='mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/' ++ [[ "${ARCH}" == "amd64" ]] && ++ UBUNTU_MIRROR='mirrors.tuna.tsinghua.edu.cn/ubuntu/' || ++ UBUNTU_MIRROR='mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/' + fi + + if [[ $DOWNLOAD_MIRROR == "bfsu" ]]; then + DEBIAN_MIRROR='mirrors.bfsu.edu.cn/debian' + DEBIAN_SECURTY='mirrors.bfsu.edu.cn/debian-security' +- UBUNTU_MIRROR='mirrors.bfsu.edu.cn/ubuntu-ports/' ++ [[ "${ARCH}" == "amd64" ]] && ++ UBUNTU_MIRROR='mirrors.bfsu.edu.cn/ubuntu/' || ++ UBUNTU_MIRROR='mirrors.bfsu.edu.cn/ubuntu-ports/' + fi + + if [[ "${ARCH}" == "amd64" ]]; then +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index e6cfc8beb..482ea0ccb 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -55,6 +55,7 @@ function download_and_verify_internal() { + "9F0E78D5" # Igor Pecovnik + ) + ++ mkdir -p "${SRC}/cache/.aria2" + local aria2_options=( + # Display + --console-log-level=error + +From 404916b083a1f1a9735abe40452d460c65cd412f Mon Sep 17 00:00:00 2001 +From: Igor Pecovnik +Date: Sun, 16 Jan 2022 23:59:47 +0100 +Subject: [PATCH] armbian-next: manual merge (30) of family/board changes + between 882f995e21f4791d773bc59efdfdb676494ee6ba and + 31ac6383e1ac7ebddd0813abc0f1f9632a9c9c40 + +--- + config/sources/families/media.conf | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index eb2711377..b65b6b070 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -8,11 +8,17 @@ elif [[ $BOARD == quartz64a ]]; then + BOOTSOURCE='https://github.com/150balbes/u-boot-rk' + BOOTBRANCH='branch:rk35xx' + BOOTPATCHDIR="u-boot-station-p2" ++elif [[ $BOARD == station-m3 ]]; then ++ BOOTSOURCE='https://github.com/150balbes/u-boot-rk' ++ BOOTBRANCH='branch:rk3588' ++ BOOTPATCHDIR="u-boot-station-p2" + else + BOOTBRANCH="tag:v2022.07" + BOOTPATCHDIR="u-boot-media" + fi + ++SKIP_BOOTSPLASH="yes" ++ + case $BRANCH in + + legacy) +@@ -27,6 +33,13 @@ case $BRANCH in + LINUXCONFIG='linux-station-p2-'$BRANCH + EXTRAWIFI="no" + WIREGUARD="no" ++ elif [[ $BOARD == station-m3 ]]; then ++ KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' ++ KERNELBRANCH='branch:kernel-5.10' ++ LINUXFAMILY=station-m3 ++ LINUXCONFIG='linux-station-m3-'$BRANCH ++ KERNELPATCHDIR='station-m3-'$BRANCH ++ AUFS="no" + elif [[ $BOARD == jetson-nano ]]; then + KERNELDIR='linux-nano' + KERNELSOURCE='https://github.com/150balbes/Jetson-Nano' +@@ -70,6 +83,7 @@ case $BRANCH in + else + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media ++ + if [[ $BOARD == jetson-nano ]]; then + MODULES_INITRD="jetson-nano-current" + fi +@@ -83,7 +97,7 @@ case $BRANCH in + KERNELBRANCH="branch:linux-5.19.y" + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +- SKIP_BOOTSPLASH="yes" ++ + if [[ $BOARD == jetson-nano ]]; then + MODULES_INITRD="jetson-nano-edge" + fi + +From adc5e01444daf4548cba3ef99ea3430d8bbf8335 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 25 Sep 2022 01:49:11 +0200 +Subject: [PATCH] armbian-next: manual merge (29) of family/board changes + between 3435c4636723e9553be0a9ce3666bddb0887069e and + 882f995e21f4791d773bc59efdfdb676494ee6ba (A LOT!) + +--- + config/boards/uefi-arm64.conf | 2 ++ + config/boards/uefi-x86.conf | 2 ++ + config/sources/arm64.conf | 2 +- + config/sources/armhf.conf | 4 ++-- + config/sources/families/bcm2711.conf | 9 +-------- + config/sources/families/include/meson_common.inc | 4 +--- + config/sources/families/uefi-x86.conf | 3 ++- + 7 files changed, 11 insertions(+), 15 deletions(-) + +diff --git a/config/boards/uefi-arm64.conf b/config/boards/uefi-arm64.conf +index 3da87e459..5a705cdeb 100644 +--- a/config/boards/uefi-arm64.conf ++++ b/config/boards/uefi-arm64.conf +@@ -2,3 +2,5 @@ + export BOARD_NAME="UEFI arm64" + export BOARDFAMILY="uefi-arm64" + export KERNEL_TARGET="current,edge" ++ ++export BOOT_LOGO=desktop +diff --git a/config/boards/uefi-x86.conf b/config/boards/uefi-x86.conf +index 0188da545..d6153e717 100644 +--- a/config/boards/uefi-x86.conf ++++ b/config/boards/uefi-x86.conf +@@ -2,3 +2,5 @@ + export BOARD_NAME="UEFI x86" + export BOARDFAMILY="uefi-x86" + export KERNEL_TARGET="current,edge" ++ ++export BOOT_LOGO=desktop +diff --git a/config/sources/arm64.conf b/config/sources/arm64.conf +index 452f58f6a..6bcf3306b 100644 +--- a/config/sources/arm64.conf ++++ b/config/sources/arm64.conf +@@ -42,7 +42,7 @@ fi + [[ -z $UBOOT_USE_GCC ]] && UBOOT_USE_GCC='> 8.0' + [[ -z $BOOTSOURCE ]] && BOOTSOURCE=$MAINLINE_UBOOT_SOURCE + [[ -z $BOOTDIR ]] && BOOTDIR=$MAINLINE_UBOOT_DIR +-[[ -z $BOOTBRANCH ]] && BOOTBRANCH='tag:v2021.10' ++[[ -z $BOOTBRANCH ]] && BOOTBRANCH='tag:v2022.07' + + [[ -z $KERNELDIR ]] && KERNELDIR=$MAINLINE_KERNEL_DIR + [[ -z $KERNELSOURCE ]] && KERNELSOURCE=$MAINLINE_KERNEL_SOURCE +diff --git a/config/sources/armhf.conf b/config/sources/armhf.conf +index 01a9eac47..e70e71edd 100644 +--- a/config/sources/armhf.conf ++++ b/config/sources/armhf.conf +@@ -16,7 +16,7 @@ INITRD_ARCH=arm + QEMU_BINARY="qemu-arm-static" + ARCHITECTURE=arm + ARCH=armhf +-KERNEL_IMAGE_TYPE=zImage ++KERNEL_IMAGE_TYPE=Image + CAN_BUILD_STRETCH=yes + FAST_CREATE_IMAGE="yes" + +@@ -28,7 +28,7 @@ fi + [[ -z $UBOOT_USE_GCC ]] && UBOOT_USE_GCC='> 8.0' + [[ -z $BOOTSOURCE ]] && BOOTSOURCE=$MAINLINE_UBOOT_SOURCE + [[ -z $BOOTDIR ]] && BOOTDIR=$MAINLINE_UBOOT_DIR +-[[ -z $BOOTBRANCH ]] && BOOTBRANCH='tag:v2021.10' ++[[ -z $BOOTBRANCH ]] && BOOTBRANCH='tag:v2022.07' + + if [ "$(uname -m)" = "aarch64" ]; then + [[ -z $KERNEL_COMPILER ]] && KERNEL_COMPILER="arm-linux-gnueabihf-" +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index d031d7e50..57fed76b2 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -5,7 +5,6 @@ export UEFI_FS_LABEL="RPICFG" # Windows/Mac users will see this if + export SKIP_BOOTSPLASH="yes" # video is init-ed before us + export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration + export FK__KERNEL_PACKAGES="" +-export RASPI_ROOT_FS_LABEL="armbian" + export CPUMIN=500000 + export CPUMAX=2000000 + export GOVERNOR=ondemand +@@ -35,15 +34,9 @@ case "${BRANCH}" in + ;; + esac + +-# Add a label to the root partition - this is common, should refactor into a separate segment +-prepare_partitions_custom__add_rootfs_raspi_label_to_mkfs() { +- display_alert "raspi rootfs label ${RASPI_ROOT_FS_LABEL}" "boot with root=LABEL=${RASPI_ROOT_FS_LABEL}" "info" +- mkopts[ext4]="-L ${RASPI_ROOT_FS_LABEL} ${mkopts[ext4]}" +-} +- + pre_initramfs_flash_kernel__write_raspi_cmdline() { + cat <<- EOD > "${FIRMWARE_DIR}/cmdline.txt" +- root=LABEL=${RASPI_ROOT_FS_LABEL} rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1 console=tty1 logo.nologo loglevel=1 ++ root=LABEL=${ROOT_FS_LABEL} rootfstype=ext4 rootwait fixrtc cgroup_enable=memory cgroup_memory=1 console=tty1 logo.nologo loglevel=1 + EOD + } + +diff --git a/config/sources/families/include/meson_common.inc b/config/sources/families/include/meson_common.inc +index ee515aaaf..f0471ac6c 100644 +--- a/config/sources/families/include/meson_common.inc ++++ b/config/sources/families/include/meson_common.inc +@@ -47,10 +47,8 @@ case $BRANCH in + ;; + edge) + +- KERNELDIR='linux-meson' +- KERNELSOURCE='https://github.com/xdarklight/linux' + export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:meson-mx-integration-5.18-20220516" ++ KERNELBRANCH="branch:linux-5.18.y" + KERNELPATCHDIR='meson-'$BRANCH + + ;; +diff --git a/config/sources/families/uefi-x86.conf b/config/sources/families/uefi-x86.conf +index 55923fd7b..7a40a5b00 100644 +--- a/config/sources/families/uefi-x86.conf ++++ b/config/sources/families/uefi-x86.conf +@@ -1,5 +1,6 @@ + # Important: LINUXFAMILY and ARCH are defined _before_ including the common family include +-[[ "$BUILD_DESKTOP" == yes ]] && enable_extension "nvidia" ++[[ "$BUILD_DESKTOP" == yes && "$RELEASE" == jammy ]] && enable_extension "nvidia" ++export UEFI_GRUB_TERMINAL="gfxterm" + export LINUXFAMILY="x86" + export ARCH="amd64" + source "${BASH_SOURCE%/*}/include/uefi_common.inc" + +From c1aef1c25eb29772a754bd3961b69f98c7afa48d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 25 Sep 2022 01:36:43 +0200 +Subject: [PATCH] armbian-next: manual merge (29) of lib changes between + 3435c4636723e9553be0a9ce3666bddb0887069e and + 882f995e21f4791d773bc59efdfdb676494ee6ba (A LOT!) + +--- + extensions/grub.sh | 35 ++- + lib/functions/bsp/bsp-desktop.sh | 1 + + lib/functions/compilation/debs.sh | 62 ++++- + .../compilation/patch/kernel-bootsplash.sh | 25 +- + lib/functions/compilation/patch/kernel-drivers.sh | 32 ++- + lib/functions/configuration/interactive.sh | 3 +- + lib/functions/configuration/main-config.sh | 10 +- + lib/functions/general/chroot-helpers.sh | 4 +- + lib/functions/general/cleaning.sh | 1 + + lib/functions/general/downloads.sh | 278 ++++++++++----------- + lib/functions/host/external-toolchains.sh | 46 ++-- + lib/functions/image/initrd.sh | 2 +- + lib/functions/image/partitioning.sh | 149 +++++------ + lib/functions/image/rootfs-to-image.sh | 6 +- + lib/functions/main/default-build.sh | 7 + + lib/functions/rootfs/create-cache.sh | 121 ++++----- + lib/functions/rootfs/distro-agnostic.sh | 21 ++ + lib/functions/rootfs/distro-specific.sh | 48 ++-- + 18 files changed, 488 insertions(+), 363 deletions(-) + +diff --git a/extensions/grub.sh b/extensions/grub.sh +index e3eacb955..2f64fb172 100644 +--- a/extensions/grub.sh ++++ b/extensions/grub.sh +@@ -1,4 +1,4 @@ +-# This runs *after* user_config. Don't change anything not coming from other variables or meant to be configured by the user. ++# This runs *after* user_config. Don't change anything not coming from other variables or meant to be configured by the u ser. + function extension_prepare_config__prepare_flash_kernel() { + # Extension configuration defaults. + export DISTRO_GENERIC_KERNEL=${DISTRO_GENERIC_KERNEL:-no} # if yes, does not build our own kernel, instead, uses generic one from distro +@@ -6,6 +6,7 @@ function extension_prepare_config__prepare_flash_kernel() { + export UEFI_GRUB_DISABLE_OS_PROBER="${UEFI_GRUB_DISABLE_OS_PROBER:-}" # 'true' will disable os-probing, useful for SD cards. + export UEFI_GRUB_DISTRO_NAME="${UEFI_GRUB_DISTRO_NAME:-Armbian}" # Will be used on grub menu display + export UEFI_GRUB_TIMEOUT=${UEFI_GRUB_TIMEOUT:-0} # Small timeout by default ++ export GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT:-}" # Cmdline by default + export UEFI_ENABLE_BIOS_AMD64="${UEFI_ENABLE_BIOS_AMD64:-yes}" # Enable BIOS too if target is amd64 + export UEFI_EXPORT_KERNEL_INITRD="${UEFI_EXPORT_KERNEL_INITRD:-no}" # Export kernel and initrd for direct kernel boot "kexec" + # User config overrides. +@@ -53,6 +54,7 @@ function extension_prepare_config__prepare_flash_kernel() { + unset KERNELSOURCE # This should make Armbian skip most stuff. At least, I hacked it to. + export INSTALL_ARMBIAN_FIRMWARE=no # Should skip build and install of Armbian-firmware. + else ++ export KERNELDIR="linux-uefi-${LINUXFAMILY}" # Avoid sharing a source tree with others, until we know it's safe. + # Don't install anything. Armbian handles everything. + DISTRO_KERNEL_PACKAGES="" + DISTRO_FIRMWARE_PACKAGES="" +@@ -91,6 +93,10 @@ pre_umount_final_image__install_grub() { + GRUB_DISABLE_OS_PROBER=true + grubCfgFragHostSide + ++ # copy Armbian GRUB wallpaper ++ mkdir -p "${MOUNT}"/usr/share/images/grub/ ++ cp "${SRC}"/packages/blobs/splash/grub.png "${MOUNT}"/usr/share/images/grub/wallpaper.png ++ + # Mount the chroot... + mount_chroot "$chroot_target/" # this already handles /boot/efi which is required for it to work. + +@@ -101,7 +107,7 @@ pre_umount_final_image__install_grub() { + } + fi + +- local install_grub_cmdline="update-initramfs -c -k all && update-grub && grub-install --target=${UEFI_GRUB_TARGET} --no-nvram --removable" # nvram is global to the host, even across chroot. take care. ++ local install_grub_cmdline="update-grub && grub-install --verbose --target=${UEFI_GRUB_TARGET} --no-nvram --removable" # nvram is global to the host, even across chroot. take care. + display_alert "Installing GRUB EFI..." "${UEFI_GRUB_TARGET}" "" + chroot_custom "$chroot_target" "$install_grub_cmdline" || { + exit_with_error "${install_grub_cmdline} failed!" +@@ -136,18 +142,31 @@ pre_umount_final_image__900_export_kernel_and_initramfs() { + } + + configure_grub() { +- display_alert "GRUB EFI kernel cmdline" "console=${SERIALCON} distro=${UEFI_GRUB_DISTRO_NAME} timeout=${UEFI_GRUB_TIMEOUT} grub terminal=${UEFI_GRUB_TERMINAL}" "" +- +- if [[ "_${SERIALCON}_" != "__" ]]; then +- cat <<- grubCfgFrag >> "${MOUNT}"/etc/default/grub.d/98-armbian.cfg +- GRUB_CMDLINE_LINUX_DEFAULT="console=${SERIALCON}" # extra Kernel cmdline is configured here +- grubCfgFrag ++ [[ -n "$SERIALCON" ]] && ++ GRUB_CMDLINE_LINUX_DEFAULT+=" console=${SERIALCON}" ++ ++ [[ "$BOOT_LOGO" == "yes" || "$BOOT_LOGO" == "desktop" && "$BUILD_DESKTOP" == "yes" ]] && ++ GRUB_CMDLINE_LINUX_DEFAULT+=" quiet splash plymouth.ignore-serial-consoles i915.force_probe=* loglevel=3" || ++ GRUB_CMDLINE_LINUX_DEFAULT+=" splash=verbose i915.force_probe=*" ++ ++ # Enable Armbian Wallpaper on GRUB ++ if [[ "${VENDOR}" == Armbian ]]; then ++ mkdir -p "${MOUNT}"/usr/share/desktop-base/ ++ cat <<- grubWallpaper >> "${MOUNT}"/usr/share/desktop-base/grub_background.sh ++ WALLPAPER=/usr/share/images/grub/wallpaper.png ++ COLOR_NORMAL=white/black ++ COLOR_HIGHLIGHT=black/white ++ grubWallpaper + fi + ++ display_alert "GRUB EFI kernel cmdline" "${GRUB_CMDLINE_LINUX_DEFAULT} distro=${UEFI_GRUB_DISTRO_NAME} timeout=${UEFI_GRUB_TIMEOUT}" "" + cat <<- grubCfgFrag >> "${MOUNT}"/etc/default/grub.d/98-armbian.cfg ++ GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT}" + GRUB_TIMEOUT_STYLE=menu # Show the menu with Kernel options (Armbian or -generic)... + GRUB_TIMEOUT=${UEFI_GRUB_TIMEOUT} # ... for ${UEFI_GRUB_TIMEOUT} seconds, then boot the Armbian default. + GRUB_DISTRIBUTOR="${UEFI_GRUB_DISTRO_NAME}" # On GRUB menu will show up as "Armbian GNU/Linux" (will show up in some UEFI BIOS boot menu (F8?) as "armbian", not on others) ++ GRUB_GFXMODE=1024x768 ++ GRUB_GFXPAYLOAD=keep + grubCfgFrag + + if [[ "a${UEFI_GRUB_DISABLE_OS_PROBER}" != "a" ]]; then +diff --git a/lib/functions/bsp/bsp-desktop.sh b/lib/functions/bsp/bsp-desktop.sh +index 8ebc53738..eca6670ed 100644 +--- a/lib/functions/bsp/bsp-desktop.sh ++++ b/lib/functions/bsp/bsp-desktop.sh +@@ -47,6 +47,7 @@ create_desktop_package() { + Priority: optional + Recommends: ${DEBIAN_RECOMMENDS//[:space:]+/,}, armbian-bsp-desktop + Provides: ${CHOSEN_DESKTOP}, armbian-${RELEASE}-desktop ++ Conflicts: gdm3 + Pre-Depends: ${PACKAGE_LIST_PREDEPENDS//[:space:]+/,} + Description: Armbian desktop for ${DISTRIBUTION} ${RELEASE} + EOF +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index 3db0c44d4..10eca1f03 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -14,7 +14,9 @@ compile_firmware() { + if [[ -n $FULL ]]; then + fetch_from_repo "$MAINLINE_FIRMWARE_SOURCE" "linux-firmware-git" "branch:main" + # cp : create hardlinks +- cp -af --reflink=auto "${SRC}"/cache/sources/linux-firmware-git/* "${firmwaretempdir}/${plugin_dir}/lib/firmware/" ++ run_host_command_logged cp -af --reflink=auto "${SRC}"/cache/sources/linux-firmware-git/* "${firmwaretempdir}/${plugin_dir}/lib/firmware/" ++ # cp : create hardlinks for ath11k WCN685x hw2.1 firmware since they are using the same firmware with hw2.0 ++ run_host_command_logged cp -af --reflink=auto "${firmwaretempdir}/${plugin_dir}/lib/firmware/ath11k/WCN6855/hw2.0/" "${firmwaretempdir}/${plugin_dir}/lib/firmware/ath11k/WCN6855/hw2.1/" + fi + # overlay our firmware + # cp : create hardlinks +@@ -129,7 +131,9 @@ compile_armbian-config() { + + fetch_from_repo "https://github.com/armbian/config" "armbian-config" "branch:master" + fetch_from_repo "https://github.com/dylanaraps/neofetch" "neofetch" "tag:7.1.0" +- fetch_from_repo "https://github.com/complexorganizations/wireguard-manager" "wireguard-manager" "tag:v1.0.0.10-26-2021" ++ ++ # @TODO: move this to where it is actually used; not everyone needs to pull this in ++ fetch_from_repo "$GITHUB_SOURCE/complexorganizations/wireguard-manager" "wireguard-manager" "branch:main" + + mkdir -p "${tmp_dir}/${armbian_config_dir}"/{DEBIAN,usr/bin/,usr/sbin/,usr/lib/armbian-config/} + +@@ -188,3 +192,57 @@ compile_xilinx_bootgen() { + + popd + } ++ ++# @TODO: code from master via Igor; not yet armbian-next'fied! warning!! ++compile_plymouth-theme-armbian() { ++ ++ local tmp_dir work_dir ++ tmp_dir=$(mktemp -d) ++ chmod 700 ${tmp_dir} ++ trap "ret=\$?; rm -rf \"${tmp_dir}\" ; exit \$ret" 0 1 2 3 15 ++ plymouth_theme_armbian_dir=armbian-plymouth-theme_${REVISION}_all ++ display_alert "Building deb" "armbian-plymouth-theme" "info" ++ ++ mkdir -p "${tmp_dir}/${plymouth_theme_armbian_dir}"/{DEBIAN,usr/share/plymouth/themes/armbian} ++ ++ # set up control file ++ cat <<- END > "${tmp_dir}/${plymouth_theme_armbian_dir}"/DEBIAN/control ++ Package: armbian-plymouth-theme ++ Version: $REVISION ++ Architecture: all ++ Maintainer: $MAINTAINER <$MAINTAINERMAIL> ++ Depends: plymouth, plymouth-themes ++ Section: universe/x11 ++ Priority: optional ++ Description: boot animation, logger and I/O multiplexer - armbian theme ++ END ++ ++ cp "${SRC}"/packages/plymouth-theme-armbian/debian/{postinst,prerm,postrm} \ ++ "${tmp_dir}/${plymouth_theme_armbian_dir}"/DEBIAN/ ++ chmod 755 "${tmp_dir}/${plymouth_theme_armbian_dir}"/DEBIAN/{postinst,prerm,postrm} ++ ++ convert -resize 256x256 \ ++ "${SRC}"/packages/plymouth-theme-armbian/armbian-logo.png \ ++ "${tmp_dir}/${plymouth_theme_armbian_dir}"/usr/share/plymouth/themes/armbian/bgrt-fallback.png ++ ++ # convert -resize 52x52 \ ++ # "${SRC}"/packages/plymouth-theme-armbian/spinner.gif \ ++ # "${tmp_dir}/${plymouth_theme_armbian_dir}"/usr/share/plymouth/themes/armbian/animation-%04d.png ++ ++ convert -resize 52x52 \ ++ "${SRC}"/packages/plymouth-theme-armbian/spinner.gif \ ++ "${tmp_dir}/${plymouth_theme_armbian_dir}"/usr/share/plymouth/themes/armbian/throbber-%04d.png ++ ++ cp "${SRC}"/packages/plymouth-theme-armbian/watermark.png \ ++ "${tmp_dir}/${plymouth_theme_armbian_dir}"/usr/share/plymouth/themes/armbian/ ++ ++ cp "${SRC}"/packages/plymouth-theme-armbian/{bullet,capslock,entry,keyboard,keymap-render,lock}.png \ ++ "${tmp_dir}/${plymouth_theme_armbian_dir}"/usr/share/plymouth/themes/armbian/ ++ ++ cp "${SRC}"/packages/plymouth-theme-armbian/armbian.plymouth \ ++ "${tmp_dir}/${plymouth_theme_armbian_dir}"/usr/share/plymouth/themes/armbian/ ++ ++ fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "${tmp_dir}/${plymouth_theme_armbian_dir}" > /dev/null ++ rsync --remove-source-files -rq "${tmp_dir}/${plymouth_theme_armbian_dir}.deb" "${DEB_STORAGE}/" ++ rm -rf "${tmp_dir}" ++} +diff --git a/lib/functions/compilation/patch/kernel-bootsplash.sh b/lib/functions/compilation/patch/kernel-bootsplash.sh +index 3a366234c..9939de493 100644 +--- a/lib/functions/compilation/patch/kernel-bootsplash.sh ++++ b/lib/functions/compilation/patch/kernel-bootsplash.sh +@@ -7,28 +7,19 @@ function apply_kernel_patches_for_bootsplash() { + # @TODO: rpardini: so, can we completely remove this? + SKIP_BOOTSPLASH=yes + +- # previously: if linux-version compare "${version}" ge 5.10 && [ $SKIP_BOOTSPLASH != yes ]; then + [[ "${SKIP_BOOTSPLASH}" == "yes" ]] && return 0 +- linux-version compare "${version}" le 5.10 && return 0 +- linux-version compare "${version}" lt 5.19 && return 0 ++ linux-version compare "${version}" le 5.14 && return 0 ++ display_alert "Adding" "Kernel splash file" "info" + +- display_alert "Adding" "Kernel bootsplash patch" "info" +- +- if linux-version compare "${version}" ge 5.11; then +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0000-Revert-fbcon-Avoid-cap-set-but-not-used-warning.patch" "applying" +- fi +- +- if (linux-version compare "${version}" ge 5.18.18 && linux-version compare "${version}" lt 5.19) || +- (linux-version compare "${version}" ge 5.15.61 && linux-version compare "${version}" lt 5.16); then +- process_patch_file "${SRC}/patch/misc/0001-Revert-fbcon-Fix-accelerated-fbdev-scrolling-while-logo-is-still-shown.patch" "applying" ++ if linux-version compare "${version}" ge 5.19.6 || ++ (linux-version compare "${version}" ge 5.15.64 && linux-version compare "${version}" lt 5.16); then ++ process_patch_file "${SRC}/patch/misc/0001-Revert-fbdev-fbcon-Properly-revert-changes-when-vc_r.patch" "applying" + fi + ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0000-Revert-fbcon-Avoid-cap-set-but-not-used-warning.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0001-Revert-fbcon-Fix-accelerated-fbdev-scrolling-while-logo-is-still-shown.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" +- +- if linux-version compare "${version}" ge 5.15; then +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0002-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" +- fi +- ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0002-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0003-Revert-vgacon-remove-software-scrollback-support.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0004-Revert-drivers-video-fbcon-fix-NULL-dereference-in-f.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0005-Revert-fbcon-remove-no-op-fbcon_set_origin.patch" "applying" +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 505a3a89e..46ca22109 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -10,6 +10,15 @@ + # https://github.com/armbian/build/ + + function prepare_extra_kernel_drivers() { ++ # ++ # Returning headers needed for some wireless drivers ++ # ++ ++ if linux-version compare "${version}" ge 5.4 && [ $EXTRAWIFI == yes ]; then ++ display_alert "Adding" "Missing headers" "info" # @TODO: which headers? ++ process_patch_file "${SRC}/patch/misc/wireless-bring-back-headers.patch" "applying" ++ fi ++ + # + # mac80211 wireless driver injection features from Kali Linux + # +@@ -254,20 +263,20 @@ function prepare_extra_kernel_drivers() { + + display_alert "Adding" "Wireless drivers for Xradio XR819 chipsets" "info" + +- fetch_from_repo "https://github.com/karabek/xradio" "xradio" "branch:master" "yes" ++ fetch_from_repo "$GITHUB_SOURCE/dbeinder/xradio" "xradio" "branch:karabek_rebase" "yes" + cd "$kerneldir" || exit + rm -rf "$kerneldir/drivers/net/wireless/xradio" + mkdir -p "$kerneldir/drivers/net/wireless/xradio/" +- cp "${SRC}"/cache/sources/xradio/master/*.{h,c} \ ++ cp "${SRC}"/cache/sources/xradio/karabek_rebase/*.{h,c} \ + "$kerneldir/drivers/net/wireless/xradio/" + + # Makefile +- cp "${SRC}/cache/sources/xradio/master/Makefile" \ ++ cp "${SRC}/cache/sources/xradio/karabek_rebase/Makefile" \ + "$kerneldir/drivers/net/wireless/xradio/Makefile" + + # Kconfig +- sed -i 's/---help---/help/g' "${SRC}/cache/sources/xradio/master/Kconfig" +- cp "${SRC}/cache/sources/xradio/master/Kconfig" \ ++ sed -i 's/---help---/help/g' "${SRC}/cache/sources/xradio/karabek_rebase/Kconfig" ++ cp "${SRC}/cache/sources/xradio/karabek_rebase/Kconfig" \ + "$kerneldir/drivers/net/wireless/xradio/Kconfig" + + # Add to section Makefile +@@ -279,6 +288,10 @@ function prepare_extra_kernel_drivers() { + # add support for K5.13+ + process_patch_file "${SRC}/patch/misc/wireless-xradio-5.13.patch" "applying" + ++ # add support for aarch64 ++ if [[ $ARCH == arm64 ]]; then ++ process_patch_file "${SRC}/patch/misc/wireless-xradio-aarch64.patch" "applying" ++ fi + fi + + # Wireless drivers for Realtek RTL8811CU and RTL8821C chipsets +@@ -377,7 +390,7 @@ function prepare_extra_kernel_drivers() { + # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch +- local rtl88x2buver="branch:fix-6.0" ++ local rtl88x2buver="commit:00f51d93fe8309b0e23782ad621a038c98c7f031" + + display_alert "Adding" "Wireless drivers for Realtek 88x2bu chipsets ${rtl88x2buver}" "info" + +@@ -499,7 +512,12 @@ function prepare_extra_kernel_drivers() { + if linux-version compare $version ge 5.0 && [ "$EXTRAWIFI" == yes ]; then + # @TODO: fasthash for this is... ? remote git hash? + +- local rtl8723duver="branch:master" ++ # attach to specifics tag or branch ++ if linux-version compare $version ge 5.12; then ++ local rtl8723duver="branch:v5.13.4" ++ else ++ local rtl8723duver="branch:master" ++ fi + + display_alert "Adding" "Wireless drivers for Realtek 8723DU chipsets ${rtl8723duver}" "info" + +diff --git a/lib/functions/configuration/interactive.sh b/lib/functions/configuration/interactive.sh +index 743d8a22b..2cee5395d 100644 +--- a/lib/functions/configuration/interactive.sh ++++ b/lib/functions/configuration/interactive.sh +@@ -170,10 +170,11 @@ function interactive_config_ask_release() { + + function interactive_config_ask_desktop_build() { + # don't show desktop option if we choose minimal build +- [[ $BUILD_MINIMAL == yes ]] && BUILD_DESKTOP=no ++ [[ $HAS_VIDEO_OUTPUT == no || $BUILD_MINIMAL == yes ]] && BUILD_DESKTOP=no + + [[ $KERNEL_ONLY == yes ]] && return 0 + [[ -n ${BUILD_DESKTOP} ]] && return 0 ++ + # read distribution support status which is written to the armbian-release file + set_distribution_status + options=() +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index cdae96d38..91c3844ca 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -82,7 +82,7 @@ function do_main_configuration() { + fi + + # small SD card with kernel, boot script and .dtb/.bin files +- [[ $ROOTFS_TYPE == nfs ]] && FIXED_IMAGE_SIZE=64 ++ [[ $ROOTFS_TYPE == nfs ]] && FIXED_IMAGE_SIZE=256 + + # Since we are having too many options for mirror management, + # then here is yet another mirror related option. +@@ -171,6 +171,7 @@ function do_main_configuration() { + [[ -z $WIREGUARD ]] && WIREGUARD="yes" + [[ -z $EXTRAWIFI ]] && EXTRAWIFI="yes" + [[ -z $SKIP_BOOTSPLASH ]] && SKIP_BOOTSPLASH="no" ++ [[ -z $PLYMOUTH ]] && PLYMOUTH="yes" + [[ -z $AUFS ]] && AUFS="yes" + [[ -z $IMAGE_PARTITION_TABLE ]] && IMAGE_PARTITION_TABLE="msdos" + [[ -z $EXTRA_BSP_NAME ]] && EXTRA_BSP_NAME="" +@@ -210,6 +211,13 @@ function do_main_configuration() { + # shellcheck source=/dev/null + source "${SRC}/config/sources/${ARCH}.conf" + ++ if [[ "$HAS_VIDEO_OUTPUT" == "no" ]]; then ++ SKIP_BOOTSPLASH="yes" ++ PLYMOUTH="no" ++ [[ $BUILD_DESKTOP != "no" ]] && exit_with_error "HAS_VIDEO_OUTPUT is set to no. So we shouldn't build desktop environment" ++ fi ++ ++ + ## Extensions: at this point we've sourced all the config files that will be used, + ## and (hopefully) not yet invoked any extension methods. So this is the perfect + ## place to initialize the extension manager. It will create functions +diff --git a/lib/functions/general/chroot-helpers.sh b/lib/functions/general/chroot-helpers.sh +index 8c90cc578..a8425ae99 100644 +--- a/lib/functions/general/chroot-helpers.sh ++++ b/lib/functions/general/chroot-helpers.sh +@@ -5,6 +5,7 @@ + mount_chroot() { + + local target=$1 ++ mount -t tmpfs tmpfs "${target}/tmp" + mount -t proc chproc "${target}"/proc + mount -t sysfs chsys "${target}"/sys + mount -t devtmpfs chdev "${target}"/dev || mount --bind /dev "${target}"/dev +@@ -19,10 +20,11 @@ mount_chroot() { + umount_chroot() { + local target=$1 + display_alert "Unmounting" "$target" "info" +- while grep -Eq "${target}.*(dev|proc|sys)" /proc/mounts; do ++ while grep -Eq "${target}.*(dev|proc|sys|tmp)" /proc/mounts; do + umount --recursive "${target}"/dev > /dev/null 2>&1 || true + umount "${target}"/proc > /dev/null 2>&1 || true + umount "${target}"/sys > /dev/null 2>&1 || true ++ umount "${target}"/tmp > /dev/null 2>&1 || true + sync + done + } +diff --git a/lib/functions/general/cleaning.sh b/lib/functions/general/cleaning.sh +index 833ac4ce7..5d4b51976 100644 +--- a/lib/functions/general/cleaning.sh ++++ b/lib/functions/general/cleaning.sh +@@ -24,6 +24,7 @@ general_cleaning() { + find "${DEB_STORAGE}" -name "${CHOSEN_UBOOT}_*.deb" -delete + find "${DEB_STORAGE}" \( -name "${CHOSEN_KERNEL}_*.deb" -o \ + -name "armbian-*.deb" -o \ ++ -name "plymouth-theme-armbian_*.deb" -o \ + -name "${CHOSEN_KERNEL/image/dtb}_*.deb" -o \ + -name "${CHOSEN_KERNEL/image/headers}_*.deb" -o \ + -name "${CHOSEN_KERNEL/image/source}_*.deb" -o \ +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index 5bbd161fe..e6cfc8beb 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -1,42 +1,42 @@ +-function webseed() { +- +- # list of mirrors that host our files +- unset text +- local CCODE=$(curl -s redirect.armbian.com/geoip | jq '.continent.code' -r) +- +- if [[ "$2" == rootfs* ]]; then +- WEBSEED=($(curl -s ${1}mirrors | jq -r '.'${CCODE}' | .[] | values')) +- else +- WEBSEED=($(curl -s https://redirect.armbian.com/mirrors | jq -r '.'${CCODE}' | .[] | values')) +- fi +- +- # remove dead mirrors to suppress download errors +- while read -r line; do +- REMOVE=$(echo $line | egrep -o 'https?://[^ ]+/') +- WEBSEED=("${WEBSEED[@]/$REMOVE/}") +- done < <( +- for k in ${WEBSEED[@]}; do +- echo "$k$2/$3" +- done | parallel --halt soon,fail=10 --jobs 32 wget -q --spider --timeout=15 --tries=4 --retry-connrefused {} 2>&1 > /dev/null +- ) +- +- # aria2 simply split chunks based on sources count not depending on download speed +- # when selecting china mirrors, use only China mirror, others are very slow there +- if [[ $DOWNLOAD_MIRROR == china ]]; then +- WEBSEED=( +- https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/ +- ) +- elif [[ $DOWNLOAD_MIRROR == bfsu ]]; then +- WEBSEED=( +- https://mirrors.bfsu.edu.cn/armbian-releases/ +- ) +- fi ++function get_urls() { ++ local catalog=$1 ++ local filename=$2 + +- for toolchain in ${WEBSEED[@]}; do +- text="${text} ${toolchain}"$2/"${3}" +- done +- text="${text:1}" +- echo "${text}" ++ case $catalog in ++ toolchain) ++ local CCODE=$(curl --silent --fail https://dl.armbian.com/geoip | jq '.continent.code' -r) ++ local urls=( ++ # "https://dl.armbian.com/_toolchain/${filename}" ++ ++ $( ++ curl --silent --fail "https://dl.armbian.com/mirrors" | ++ jq -r "(${CCODE:+.${CCODE} // } .default) | .[]" | ++ sed "s#\$#/_toolchain/${filename}#" ++ ) ++ ) ++ ;; ++ ++ rootfs) ++ local CCODE=$(curl --silent --fail https://cache.armbian.com/geoip | jq '.continent.code' -r) ++ local urls=( ++ # "https://cache.armbian.com/rootfs/${ROOTFSCACHE_VERSION}/${filename}" ++ "https://github.com/armbian/cache/releases/download/${ROOTFSCACHE_VERSION}/${filename}" ++ ++ $( ++ curl --silent --fail "https://cache.armbian.com/mirrors" | ++ jq -r "(${CCODE:+.${CCODE} // } .default) | .[]" | ++ sed "s#\$#/rootfs/${ROOTFSCACHE_VERSION}/${filename}#" ++ ) ++ ) ++ ;; ++ ++ *) ++ exit_with_error "Unknown catalog" "$catalog" >&2 ++ return ++ ;; ++ esac ++ ++ echo "${urls[@]}" + } + + # Terrible idea, this runs download_and_verify_internal() with error handling disabled. +@@ -45,99 +45,100 @@ function download_and_verify() { + } + + function download_and_verify_internal() { +- local remotedir=$1 +- local filename=$2 +- local localdir=$SRC/cache/${remotedir//_/} +- local dirname=${filename//.tar.xz/} +- [[ -z $DISABLE_IPV6 ]] && DISABLE_IPV6="true" +- +- local server=${ARMBIAN_MIRROR} +- if [[ $DOWNLOAD_MIRROR == china ]]; then +- server="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/" +- elif [[ $DOWNLOAD_MIRROR == bfsu ]]; then +- server="https://mirrors.bfsu.edu.cn/armbian-releases/" +- fi +- +- if [[ "x${server}x" == "xx" ]]; then +- display_alert "ARMBIAN_MIRROR is not set, nor valid DOWNLOAD_MIRROR" "not downloading '${filename}'" "debug" +- return 0 +- fi +- +- if [[ -f ${localdir}/${dirname}/.download-complete ]]; then +- return 0 +- fi + +- # rootfs has its own infra +- if [[ "${remotedir}" == "_rootfs" ]]; then +- local server="https://cache.armbian.com/" +- remotedir="rootfs/$ROOTFSCACHE_VERSION" +- fi +- +- # switch to china mirror if US timeouts +- timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}" +- if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then +- display_alert "Timeout from $server" "retrying" "info" +- server="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/" +- +- # switch to another china mirror if tuna timeouts +- timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} +- if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then +- display_alert "Timeout from $server" "retrying" "info" +- server="https://mirrors.bfsu.edu.cn/armbian-releases/" +- fi +- fi ++ local catalog=$1 ++ local filename=$2 ++ local localdir=$SRC/cache/$catalog + +- # check if file exists on remote server before running aria2 downloader +- [[ ! $(timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename}) ]] && return ++ local keys=( ++ "8F427EAF" # Linaro Toolchain Builder ++ "9F0E78D5" # Igor Pecovnik ++ ) + +- cd "${localdir}" || exit ++ local aria2_options=( ++ # Display ++ --console-log-level=error ++ --summary-interval=0 ++ --download-result=hide ++ ++ # Meta ++ --server-stat-if="${SRC}/cache/.aria2/server_stats" ++ --server-stat-of="${SRC}/cache/.aria2/server_stats" ++ --dht-file-path="${SRC}/cache/.aria2/dht.dat" ++ --rpc-save-upload-metadata=false ++ --auto-save-interval=0 ++ ++ # File ++ --auto-file-renaming=false ++ --allow-overwrite=true ++ --file-allocation=trunc ++ ++ # Connection ++ --disable-ipv6=$DISABLE_IPV6 ++ --connect-timeout=10 ++ --timeout=10 ++ --allow-piece-length-change=true ++ --max-connection-per-server=2 ++ --lowest-speed-limit=500K ++ ++ # BT ++ --seed-time=0 ++ --bt-stop-timeout=30 ++ ) + +- # use local control file +- if [[ -f "${SRC}"/config/torrents/${filename}.asc ]]; then +- local torrent="${SRC}"/config/torrents/${filename}.torrent ++ # use local signature file ++ if [[ -f "${SRC}/config/torrents/${filename}.asc" ]]; then ++ local torrent="${SRC}/config/torrents/${filename}.torrent" + ln -sf "${SRC}/config/torrents/${filename}.asc" "${localdir}/${filename}.asc" +- elif [[ ! $(timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}.asc") ]]; then +- return + else +- # download control file +- local torrent=${server}$remotedir/${filename}.torrent +- run_host_command_logged aria2c --download-result=hide --disable-ipv6=${DISABLE_IPV6} --summary-interval=0 --console-log-level=error --auto-file-renaming=false \ +- --continue=false --allow-overwrite=true --dir="${localdir}" ${server}${remotedir}/${filename}.asc $(webseed "$remotedir/${filename}.asc") -o "${filename}.asc" +- [[ $? -ne 0 ]] && display_alert "Failed to download control file" "" "wrn" ++ # download signature file ++ aria2c "${aria2_options[@]}" \ ++ --continue=false \ ++ --dir="${localdir}" --out="${filename}.asc" \ ++ $(get_urls "${catalog}" "${filename}.asc") ++ ++ local rc=$? ++ if [[ $rc -ne 0 ]]; then ++ # Except `not found` ++ [[ $rc -ne 3 ]] && display_alert "Failed to download signature file. aria2 exit code:" "$rc" "wrn" ++ return $rc ++ fi ++ ++ [[ ${USE_TORRENT} == "yes" ]] && ++ local torrent="$(get_urls "${catalog}" "${filename}.torrent")" + fi + + # download torrent first ++ local direct=yes + if [[ ${USE_TORRENT} == "yes" ]]; then ++ + display_alert "downloading using torrent network" "$filename" +- local ariatorrent="--summary-interval=0 --auto-save-interval=0 --seed-time=0 --bt-stop-timeout=120 --console-log-level=error \ +- --allow-overwrite=true --download-result=hide --rpc-save-upload-metadata=false --auto-file-renaming=false \ +- --file-allocation=trunc --continue=true ${torrent} \ +- --dht-file-path=${SRC}/cache/.aria2/dht.dat --disable-ipv6=${DISABLE_IPV6} --stderr --follow-torrent=mem --dir=$localdir" +- +- # exception. It throws error if dht.dat file does not exists. Error suppress needed only at first download. +- if [[ -f "${SRC}"/cache/.aria2/dht.dat ]]; then +- # shellcheck disable=SC2086 +- run_host_command_logged aria2c ${ariatorrent} +- else +- # shellcheck disable=SC2035 +- run_host_command_logged aria2c ${ariatorrent} +- fi +- # mark complete +- touch "${localdir}/${filename}.complete" ++ aria2c "${aria2_options[@]}" \ ++ --follow-torrent=mem \ ++ --dir="${localdir}" \ ++ ${torrent} ++ ++ [[ $? -eq 0 ]] && direct=no ++ + fi + + # direct download if torrent fails +- if [[ ! -f "${localdir}/${filename}.complete" ]]; then +- if [[ ! $(timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} 2>&1 > /dev/null) ]]; then +- display_alert "downloading from $(echo $server | cut -d'/' -f3 | cut -d':' -f1) using http(s) network" "$filename" +- run_host_command_logged aria2c --allow-overwrite=true --download-result=hide --rpc-save-upload-metadata=false --console-log-level=error \ +- --dht-file-path="${SRC}"/cache/.aria2/dht.dat --disable-ipv6=${DISABLE_IPV6} --summary-interval=0 --auto-file-renaming=false --dir="${localdir}" ${server}${remotedir}/${filename} $(webseed "${remotedir}/${filename}") -o "${filename}" +- # mark complete +- [[ $? -eq 0 ]] && touch "${localdir}/${filename}.complete" && echo "" +- ++ if [[ $direct != "no" ]]; then ++ display_alert "downloading using http(s) network" "$filename" ++ aria2c "${aria2_options[@]}" \ ++ --dir="${localdir}" --out="${filename}" \ ++ $(get_urls "${catalog}" "${filename}") ++ ++ local rc=$? ++ if [[ $rc -ne 0 ]]; then ++ display_alert "Failed to download. aria2 exit code:" "$rc" "wrn" ++ return $rc + fi ++ ++ echo "" + fi + ++ local verified=false + if [[ -f ${localdir}/${filename}.asc ]]; then + + if grep -q 'BEGIN PGP SIGNATURE' "${localdir}/${filename}.asc"; then +@@ -149,42 +150,31 @@ function download_and_verify_internal() { + chmod 600 "${SRC}"/cache/.gpg/gpg.conf + fi + +- # Verify archives with Linaro and Armbian GPG keys +- +- if [ x"" != x"${http_proxy}" ]; then +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 8F427EAF || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ +- --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-options http-proxy="${http_proxy}" \ +- --recv-keys 8F427EAF) ++ for key in "${keys[@]}"; do ++ gpg --homedir "${SRC}/cache/.gpg" --no-permission-warning \ ++ --list-keys "${key}" >> "${DEST}/${LOG_SUBPATH}/output.log" 2>&1 || ++ gpg --homedir "${SRC}/cache/.gpg" --no-permission-warning \ ++ ${http_proxy:+--keyserver-options http-proxy="${http_proxy}"} \ ++ --keyserver "hkp://keyserver.ubuntu.com:80" \ ++ --recv-keys "${key}" >> "${DEST}/${LOG_SUBPATH}/output.log" 2>&1 || ++ exit_with_error "Failed to recieve key" "${key}" ++ done ++ ++ gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --trust-model always \ ++ -q --verify "${localdir}/${filename}.asc" >> "${DEST}/${LOG_SUBPATH}/output.log" 2>&1 ++ [[ ${PIPESTATUS[0]} -eq 0 ]] && verified=true && display_alert "Verified" "PGP" "info" + +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 9F0E78D5 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ +- --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-options http-proxy="${http_proxy}" \ +- --recv-keys 9F0E78D5) +- else +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 8F427EAF || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ +- --keyserver hkp://keyserver.ubuntu.com:80 \ +- --recv-keys 8F427EAF) ++ else + +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 9F0E78D5 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ +- --keyserver hkp://keyserver.ubuntu.com:80 \ +- --recv-keys 9F0E78D5) +- fi ++ [[ "$(md5sum "${localdir}/${filename}" | awk '{printf $1}')" == "$(awk '{printf $1}' ${localdir}/${filename}.asc)" ]] && ++ verified=true && display_alert "Verified" "MD5" "info" + +- gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --verify --trust-model always -q "${localdir}/${filename}.asc" +- [[ ${PIPESTATUS[0]} -eq 0 ]] && verified=true && display_alert "Verified" "PGP" "info" +- else +- md5sum -c --status "${localdir}/${filename}.asc" && verified=true && display_alert "Verified" "MD5" "info" + fi + +- if [[ $verified == true ]]; then +- if [[ "${filename:(-6)}" == "tar.xz" ]]; then +- display_alert "decompressing" +- pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "decompress") ${filename}" "${filename}" | +- xz -dc | +- tar xp --xattrs --no-same-owner --overwrite && +- touch "${localdir}/${dirname}/.download-complete" +- fi +- else ++ if [[ $verified != true ]]; then ++ rm -rf "${localdir}/${filename}"* # We also delete asc file + exit_with_error "verification failed" + fi ++ + fi + } +diff --git a/lib/functions/host/external-toolchains.sh b/lib/functions/host/external-toolchains.sh +index f8733d294..6e5fd80cb 100644 +--- a/lib/functions/host/external-toolchains.sh ++++ b/lib/functions/host/external-toolchains.sh +@@ -15,34 +15,48 @@ function download_external_toolchains() { + # download external Linaro compiler and missing special dependencies since they are needed for certain sources + + local toolchains=( +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz" ++ "gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz" ++ "gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz" ++ "gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz" ++ "gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz" ++ "gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz" ++ "gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz" ++ "gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz" ++ "gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz" ++ "gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" ++ "gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz" ++ "gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz" + ) + + USE_TORRENT_STATUS=${USE_TORRENT} + USE_TORRENT="no" + for toolchain in ${toolchains[@]}; do +- download_and_verify "_toolchain" "${toolchain##*/}" ++ local toolchain_zip="${SRC}/cache/toolchain/${toolchain}" ++ local toolchain_dir="${toolchain_zip%.tar.*}" ++ if [[ ! -f "${toolchain_dir}/.download-complete" ]]; then ++ download_and_verify "toolchain" "${toolchain}" || ++ exit_with_error "Failed to download toolchain" "${toolchain}" ++ ++ display_alert "decompressing" ++ pv -p -b -r -c -N "[ .... ] ${toolchain}" "${toolchain_zip}" | ++ xz -dc | ++ tar xp --xattrs --no-same-owner --overwrite -C "${SRC}/cache/toolchain/" ++ if [[ $? -ne 0 ]]; then ++ rm -rf "${toolchain_dir}" ++ exit_with_error "Failed to decompress toolchain" "${toolchain}" ++ fi ++ ++ touch "${toolchain_dir}/.download-complete" ++ rm -rf "${toolchain_zip}"* # Also delete asc file ++ fi + done + USE_TORRENT=${USE_TORRENT_STATUS} + +- rm -rf "${SRC}"/cache/toolchain/*.tar.xz* + local existing_dirs=($(ls -1 "${SRC}"/cache/toolchain)) + for dir in ${existing_dirs[@]}; do + local found=no + for toolchain in ${toolchains[@]}; do +- local filename=${toolchain##*/} +- local dirname=${filename//.tar.xz/} +- [[ $dir == $dirname ]] && found=yes ++ [[ $dir == ${toolchain%.tar.*} ]] && found=yes + done + if [[ $found == no ]]; then + display_alert "Removing obsolete toolchain" "$dir" +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index 2ba34e759..3a10c5f7a 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -20,7 +20,7 @@ update_initramfs() { + initrd_kern_ver="$(basename "$target_dir")" + initrd_file="${chroot_target}/boot/initrd.img-${initrd_kern_ver}" + +- update_initramfs_cmd="update-initramfs -uv -k ${initrd_kern_ver}" ++ update_initramfs_cmd="TMPDIR=/tmp update-initramfs -uv -k ${initrd_kern_ver}" # @TODO: why? TMPDIR=/tmp + else + exit_with_error "No kernel installed for the version" "${VER}" + fi +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 3340db9e9..267218f06 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -72,9 +72,9 @@ function prepare_partitions() { + UEFISIZE=${UEFISIZE:-0} + BIOSSIZE=${BIOSSIZE:-0} + UEFI_MOUNT_POINT=${UEFI_MOUNT_POINT:-/boot/efi} +- UEFI_FS_LABEL="${UEFI_FS_LABEL:-ARMBIEFI}" # Should be always uppercase +- ROOT_FS_LABEL="${ROOT_FS_LABEL:-armbian_root}" +- BOOT_FS_LABEL="${BOOT_FS_LABEL:-armbianboot}" ++ UEFI_FS_LABEL="${UEFI_FS_LABEL:-armbi_efi}" ++ ROOT_FS_LABEL="${ROOT_FS_LABEL:-armbi_root}" ++ BOOT_FS_LABEL="${BOOT_FS_LABEL:-armbi_boot}" + + call_extension_method "pre_prepare_partitions" "prepare_partitions_custom" <<- 'PRE_PREPARE_PARTITIONS' + *allow custom options for mkfs* +@@ -82,44 +82,28 @@ function prepare_partitions() { + PRE_PREPARE_PARTITIONS + + # stage: determine partition configuration +- if [[ -n $BOOTFS_TYPE ]]; then +- # 2 partition setup with forced /boot type +- local bootfs=$BOOTFS_TYPE +- local bootpart=1 +- local rootpart=2 +- [[ -z $BOOTSIZE || $BOOTSIZE -le 8 ]] && BOOTSIZE=${DEFAULT_BOOTSIZE} +- elif [[ $ROOTFS_TYPE != ext4 && $ROOTFS_TYPE != nfs ]]; then +- # 2 partition setup for non-ext4 local root +- local bootfs=ext4 +- local bootpart=1 +- local rootpart=2 +- [[ -z $BOOTSIZE || $BOOTSIZE -le 8 ]] && BOOTSIZE=${DEFAULT_BOOTSIZE} +- elif [[ $ROOTFS_TYPE == nfs ]]; then +- # single partition ext4 /boot, no root +- local bootfs=ext4 +- local bootpart=1 +- [[ -z $BOOTSIZE || $BOOTSIZE -le 8 ]] && BOOTSIZE=${DEFAULT_BOOTSIZE} # For cleanup processing only +- elif [[ $CRYPTROOT_ENABLE == yes ]]; then +- # 2 partition setup for encrypted /root and non-encrypted /boot +- local bootfs=ext4 +- local bootpart=1 +- local rootpart=2 +- [[ -z $BOOTSIZE || $BOOTSIZE -le 8 ]] && BOOTSIZE=${DEFAULT_BOOTSIZE} +- elif [[ $UEFISIZE -gt 0 ]]; then ++ local next=1 ++ # Check if we need UEFI partition ++ if [[ $UEFISIZE -gt 0 ]]; then + if [[ "${IMAGE_PARTITION_TABLE}" == "gpt" ]]; then +- # efi partition and ext4 root. some juggling is done by parted/sgdisk + local uefipart=15 +- local rootpart=1 ++ # Check if we need BIOS partition ++ [[ $BIOSSIZE -gt 0 ]] && local biospart=14 + else +- # efi partition and ext4 root. +- local uefipart=1 +- local rootpart=2 ++ local uefipart=$((next++)) + fi ++ fi ++ # Check if we need boot partition ++ if [[ -n $BOOTFS_TYPE || $ROOTFS_TYPE != ext4 || $CRYPTROOT_ENABLE == yes ]]; then ++ local bootpart=$((next++)) ++ local bootfs=${BOOTFS_TYPE:-ext4} ++ [[ -z $BOOTSIZE || $BOOTSIZE -le 8 ]] && BOOTSIZE=${DEFAULT_BOOTSIZE} + else +- # single partition ext4 root +- local rootpart=1 + BOOTSIZE=0 + fi ++ # Check if we need root partition ++ [[ $ROOTFS_TYPE != nfs ]] && ++ local rootpart=$((next++)) + + # stage: calculate rootfs size + export rootfs_size=$(du -sm $SDCARD/ | cut -f1) # MiB +@@ -145,9 +129,9 @@ function prepare_partitions() { + # Hardcoded overhead +25% is needed for desktop images, + # for CLI it could be lower. Align the size up to 4MiB + if [[ $BUILD_DESKTOP == yes ]]; then +- local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.30) / 1 + 0) / 4 + 1) * 4") ++ local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.35) / 1 + 0) / 4 + 1) * 4") + else +- local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.25) / 1 + 0) / 4 + 1) * 4") ++ local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.30) / 1 + 0) / 4 + 1) * 4") + fi + fi + +@@ -169,60 +153,53 @@ function prepare_partitions() { + + # stage: create partition table + display_alert "Creating partitions" "${bootfs:+/boot: $bootfs }root: $ROOTFS_TYPE" "info" +- run_host_command_logged parted -s ${SDCARD}.raw -- mklabel ${IMAGE_PARTITION_TABLE} + if [[ "${USE_HOOK_FOR_PARTITION}" == "yes" ]]; then +- display_alert "Using create_partition_table hook_point" "yes" "debug" ++ { [[ "$IMAGE_PARTITION_TABLE" == "msdos" ]] && echo "label: dos" || echo "label: $IMAGE_PARTITION_TABLE"; } | ++ run_host_command_logged sfdisk ${SDCARD}.raw || exit_with_error "Create partition table fail" ++ + call_extension_method "create_partition_table" <<- 'CREATE_PARTITION_TABLE' + *only called when USE_HOOK_FOR_PARTITION=yes to create the complete partition table* + Finally, we can get our own partition table. You have to partition ${SDCARD}.raw + yourself. Good luck. + CREATE_PARTITION_TABLE +- elif [[ $ROOTFS_TYPE == nfs ]]; then +- # single /boot partition +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$bootfs]} ${bootstart}s "100%" +- elif [[ $UEFISIZE -gt 0 ]]; then +- # uefi partition + root partition +- if [[ "${IMAGE_PARTITION_TABLE}" == "gpt" ]]; then +- if [[ ${BIOSSIZE} -gt 0 ]]; then +- display_alert "Creating partitions" "BIOS+UEFI+rootfs" "info" +- # UEFI + GPT automatically get a BIOS partition at 14, EFI at 15 +- local biosstart=$(($OFFSET * 2048)) +- local uefistart=$(($OFFSET * 2048 + ($BIOSSIZE * 2048))) +- local rootstart=$(($uefistart + ($UEFISIZE * 2048))) +- local biosend=$(($uefistart - 1)) +- local uefiend=$(($rootstart - 1)) +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart bios fat32 ${biosstart}s ${biosend}s +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart efi fat32 ${uefistart}s ${uefiend}s +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" +- # transpose so BIOS is in sda14; EFI is in sda15 and root in sda1; requires sgdisk, parted cant do numbers +- run_host_command_logged sgdisk --transpose 1:14 ${SDCARD}.raw +- run_host_command_logged sgdisk --transpose 2:15 ${SDCARD}.raw +- run_host_command_logged sgdisk --transpose 3:1 ${SDCARD}.raw +- # set the ESP (efi) flag on 15 +- run_host_command_logged parted -s ${SDCARD}.raw -- set 14 bios_grub on +- run_host_command_logged parted -s ${SDCARD}.raw -- set 15 esp on +- else +- display_alert "Creating partitions" "UEFI+rootfs (no BIOS)" "info" +- # Simple EFI + root partition on GPT, no BIOS. +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart efi fat32 ${bootstart}s ${bootend}s +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" +- # transpose so EFI is in sda15 and root in sda1; requires sgdisk, parted cant do numbers +- run_host_command_logged sgdisk --transpose 1:15 ${SDCARD}.raw +- run_host_command_logged sgdisk --transpose 2:1 ${SDCARD}.raw +- # set the ESP (efi) flag on 15 +- run_host_command_logged parted -s ${SDCARD}.raw -- set 15 esp on +- fi +- else +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary fat32 ${bootstart}s ${bootend}s +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" +- fi +- elif [[ $BOOTSIZE == 0 ]]; then +- # single root partition +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + else +- # /boot partition + root partition +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$bootfs]} ${bootstart}s ${bootend}s +- run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" ++ { ++ [[ "$IMAGE_PARTITION_TABLE" == "msdos" ]] && echo "label: dos" || echo "label: $IMAGE_PARTITION_TABLE" ++ ++ local next=$OFFSET ++ if [[ -n "$biospart" ]]; then ++ # gpt: BIOS boot ++ local type="21686148-6449-6E6F-744E-656564454649" ++ echo "$biospart : name=\"bios\", start=${next}MiB, size=${BIOSSIZE}MiB, type=${type}" ++ local next=$(($next + $BIOSSIZE)) ++ fi ++ if [[ -n "$uefipart" ]]; then ++ # dos: EFI (FAT-12/16/32) ++ # gpt: EFI System ++ [[ "$IMAGE_PARTITION_TABLE" != "gpt" ]] && local type="ef" || local type="C12A7328-F81F-11D2-BA4B-00A0C93EC93B" ++ echo "$uefipart : name=\"efi\", start=${next}MiB, size=${UEFISIZE}MiB, type=${type}" ++ local next=$(($next + $UEFISIZE)) ++ fi ++ if [[ -n "$bootpart" ]]; then ++ # Linux extended boot ++ [[ "$IMAGE_PARTITION_TABLE" != "gpt" ]] && local type="ea" || local type="BC13C2FF-59E6-4262-A352-B275FD6F7172" ++ if [[ -n "$rootpart" ]]; then ++ echo "$bootpart : name=\"bootfs\", start=${next}MiB, size=${BOOTSIZE}MiB, type=${type}" ++ local next=$(($next + $BOOTSIZE)) ++ else ++ # no `size` argument mean "as much as possible" ++ echo "$bootpart : name=\"bootfs\", start=${next}MiB, type=${type}" ++ fi ++ fi ++ if [[ -n "$rootpart" ]]; then ++ # dos: Linux ++ # gpt: Linux filesystem ++ [[ "$IMAGE_PARTITION_TABLE" != "gpt" ]] && local type="83" || local type="0FC63DAF-8483-4772-8E79-3D69D8477DE4" ++ # no `size` argument mean "as much as possible" ++ echo "$rootpart : name=\"rootfs\", start=${next}MiB, type=${type}" ++ fi ++ } | ++ run_host_command_logged sfdisk ${SDCARD}.raw || exit_with_error "Partition fail." + fi + + call_extension_method "post_create_partitions" <<- 'POST_CREATE_PARTITIONS' +@@ -281,7 +258,12 @@ function prepare_partitions() { + local rootfs="UUID=$(blkid -s UUID -o value $rootdevice)" + fi + echo "$rootfs / ${mkfs[$ROOTFS_TYPE]} defaults,noatime${mountopts[$ROOTFS_TYPE]} 0 1" >> $SDCARD/etc/fstab ++ else ++ # update_initramfs will fail if /lib/modules/ doesn't exist ++ mount --bind --make-private $SDCARD $MOUNT/ ++ echo "/dev/nfs / nfs defaults 0 0" >> $SDCARD/etc/fstab + fi ++ + if [[ -n $bootpart ]]; then + display_alert "Creating /boot" "$bootfs on ${LOOP}p${bootpart}" + check_loop_device "${LOOP}p${bootpart}" +@@ -298,7 +280,6 @@ function prepare_partitions() { + run_host_command_logged mount ${LOOP}p${uefipart} "${MOUNT}${UEFI_MOUNT_POINT}" + echo "UUID=$(blkid -s UUID -o value ${LOOP}p${uefipart}) ${UEFI_MOUNT_POINT} vfat defaults 0 2" >> $SDCARD/etc/fstab + fi +- [[ $ROOTFS_TYPE == nfs ]] && echo "/dev/nfs / nfs defaults 0 0" >> $SDCARD/etc/fstab + echo "tmpfs /tmp tmpfs defaults,nosuid 0 0" >> $SDCARD/etc/fstab + + call_extension_method "format_partitions" <<- 'FORMAT_PARTITIONS' +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 9d128c960..ca8f49a0a 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -75,11 +75,15 @@ create_image_from_sdcard_rootfs() { + Called before unmounting both `/root` and `/boot`. + PRE_UMOUNT_FINAL_IMAGE + ++ # Check the partition table after the uboot code has been written ++ display_alert "nPartition table after write_uboot" "$LOOP" "debug" ++ run_host_command_logged sfdisk -l "${LOOP}" # @TODO: use asset.. ++ + # unmount /boot/efi first, then /boot, rootfs third, image file last + sync + [[ $UEFISIZE != 0 ]] && umount "${MOUNT}${UEFI_MOUNT_POINT}" + [[ $BOOTSIZE != 0 ]] && umount "${MOUNT}/boot" +- [[ $ROOTFS_TYPE != nfs ]] && umount "${MOUNT}" ++ umount "${MOUNT}" + [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose $ROOT_MAPPER + + umount_chroot_recursive "${MOUNT}" # @TODO: wait. NFS is not really unmounted above. +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 6f0823648..ba5516768 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -108,6 +108,13 @@ function main_default_build_single() { + 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 + +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 4ebe8f03f..3ed167b43 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -1,11 +1,5 @@ + # this gets from cache or produces a new rootfs, and leaves a mounted chroot "$SDCARD" at the end. + get_or_create_rootfs_cache_chroot_sdcard() { +- if [[ "$ROOT_FS_CREATE_ONLY" == "yes" ]]; then +- local cycles=1 +- else +- local cycles=3 +- fi +- + # @TODO: this was moved from configuration to this stage, that way configuration can be offline + # if variable not provided, check which is current version in the cache storage in GitHub. + if [[ -z "${ROOTFSCACHE_VERSION}" ]]; then +@@ -15,67 +9,60 @@ get_or_create_rootfs_cache_chroot_sdcard() { + ROOTFSCACHE_VERSION=${ROOTFSCACHE_VERSION:-$(curl -L --silent https://cache.armbian.com/rootfs/latest --fail)} + fi + +- INITIAL_ROOTFSCACHE_VERSION=$ROOTFSCACHE_VERSION ++ local packages_hash=$(get_package_list_hash) ++ local packages_hash=${packages_hash:0:8} + +- # seek last cache, proceed to previous otherwise build it +- for ((n = 0; n < cycles; n++)); do ++ local cache_type="cli" ++ [[ ${BUILD_DESKTOP} == yes ]] && local cache_type="xfce-desktop" ++ [[ -n ${DESKTOP_ENVIRONMENT} ]] && local cache_type="${DESKTOP_ENVIRONMENT}" ++ [[ ${BUILD_MINIMAL} == yes ]] && local cache_type="minimal" + +- ROOTFSCACHE_VERSION=$(expr $INITIAL_ROOTFSCACHE_VERSION - $n) +- ROOTFSCACHE_VERSION=$(printf "%04d\n" ${ROOTFSCACHE_VERSION}) ++ # seek last cache, proceed to previous otherwise build it ++ local cache_list ++ readarray -t cache_list <<< "$(get_rootfs_cache_list "$cache_type" "$packages_hash" | sort -r)" ++ for ROOTFSCACHE_VERSION in "${cache_list[@]}"; do + +- local packages_hash=$(get_package_list_hash "$ROOTFSCACHE_VERSION") +- local cache_type="cli" +- [[ ${BUILD_DESKTOP} == yes ]] && local cache_type="xfce-desktop" +- [[ -n ${DESKTOP_ENVIRONMENT} ]] && local cache_type="${DESKTOP_ENVIRONMENT}" +- [[ ${BUILD_MINIMAL} == yes ]] && local cache_type="minimal" +- local cache_name=${RELEASE}-${cache_type}-${ARCH}.$packages_hash.tar.zst ++ local cache_name=${ARCH}-${RELEASE}-${cache_type}-${packages_hash}-${ROOTFSCACHE_VERSION}.tar.zst + local cache_fname=${SRC}/cache/rootfs/${cache_name} +- local display_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash:0:3}...${packages_hash:29}.tar.zst + + [[ "$ROOT_FS_CREATE_ONLY" == yes ]] && break + +- if [[ -f ${cache_fname} && -f ${cache_fname}.aria2 ]]; then +- rm ${cache_fname}* +- display_alert "Partially downloaded file. Re-start." +- download_and_verify "_rootfs" "$cache_name" +- fi +- +- display_alert "Checking local cache" "$display_name" "info" +- +- if [[ -f $cache_fname ]]; then +- break +- else +- display_alert "searching on servers" +- download_and_verify "_rootfs" "$cache_name" +- [[ -f ${cache_fname} ]] && break +- fi ++ display_alert "Checking cache" "$cache_name" "info" + +- if [[ ! -f $cache_fname ]]; then +- display_alert "not found: try to use previous cache" ++ # if aria2 file exists download didn't succeeded ++ if [[ ! -f $cache_fname || -f ${cache_fname}.aria2 ]]; then ++ display_alert "Downloading from servers" ++ download_and_verify "rootfs" "$cache_name" || ++ continue + fi + ++ [[ -f $cache_fname && ! -f ${cache_fname}.aria2 ]] && break + done + +- # check if cache exists and we want to make it +- if [[ -f ${cache_fname} && "$ROOT_FS_CREATE_ONLY" == "yes" ]]; then +- display_alert "Checking cache integrity" "$display_name" "info" +- zstd -tqq ${cache_fname} || { +- rm $cache_fname +- exit_with_error "Cache $cache_fname is corrupted and was deleted. Please restart!" +- } +- fi ++ ##PRESERVE## # check if cache exists and we want to make it ++ ##PRESERVE## if [[ -f ${cache_fname} && "$ROOT_FS_CREATE_ONLY" == "yes" ]]; then ++ ##PRESERVE## display_alert "Checking cache integrity" "$display_name" "info" ++ ##PRESERVE## zstd -tqq ${cache_fname} || { ++ ##PRESERVE## rm $cache_fname ++ ##PRESERVE## exit_with_error "Cache $cache_fname is corrupted and was deleted. Please restart!" ++ ##PRESERVE## } ++ ##PRESERVE## fi + + # if aria2 file exists download didn't succeeded +- if [[ -f $cache_fname && ! -f $cache_fname.aria2 ]]; then ++ if [[ "$ROOT_FS_CREATE_ONLY" != "yes" && -f $cache_fname && ! -f $cache_fname.aria2 ]]; then + + local date_diff=$((($(date +%s) - $(stat -c %Y $cache_fname)) / 86400)) +- display_alert "Extracting $display_name" "$date_diff days old" "info" +- pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "extract_rootfs") $display_name" "$cache_fname" | zstdmt -dc | tar xp --xattrs -C $SDCARD/ ++ display_alert "Extracting $cache_name" "$date_diff days old" "info" ++ pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "extract_rootfs") $cache_name" "$cache_fname" | zstdmt -dc | tar xp --xattrs -C $SDCARD/ + [[ $? -ne 0 ]] && rm $cache_fname && exit_with_error "Cache $cache_fname is corrupted and was deleted. Restart." + rm $SDCARD/etc/resolv.conf + echo "nameserver $NAMESERVER" >> $SDCARD/etc/resolv.conf + create_sources_list "$RELEASE" "$SDCARD/" + else ++ local ROOT_FS_CREATE_VERSION=${ROOT_FS_CREATE_VERSION:-$(date --utc +"%Y%m%d")} ++ local cache_name=${ARCH}-${RELEASE}-${cache_type}-${packages_hash}-${ROOT_FS_CREATE_VERSION}.tar.zst ++ local cache_fname=${SRC}/cache/rootfs/${cache_name} ++ + display_alert "Creating new rootfs cache for" "$RELEASE" "info" + + create_new_rootfs_cache +@@ -216,7 +203,7 @@ function create_new_rootfs_cache() { + fi + + # stage: check md5 sum of installed packages. Just in case. +- display_alert "Check MD5 sum of installed packages" "info" ++ display_alert "Checking MD5 sum of installed packages" "debsums" "info" + export if_error_detail_message="Check MD5 sum of installed packages failed" + # shellcheck disable=SC2154 # this '$' and '\n' syntax is for dpkg-query + chroot_sdcard dpkg-query -f '"${binary:Package}\n"' -W "|" xargs debsums --silent || true # @TODO: ignore result for now until we can find all the divergences +@@ -242,7 +229,7 @@ function create_new_rootfs_cache() { + display_alert "Mount point" "$(echo -e "$freespace" | grep $MOUNT | head -1 | awk '{print $5}')" "info" + + # create list of installed packages for debug purposes - this captures it's own stdout. +- chroot "${SDCARD}" /bin/bash -c "dpkg --get-selections" | grep -v deinstall | awk '{print $1}' | cut -f1 -d':' > "${cache_fname}.list" ++ chroot "${SDCARD}" /bin/bash -c "dpkg -l | grep ^ii | awk '{ print \$2\",\"\$3 }' > '${cache_fname}.list'" + + # creating xapian index that synaptic runs faster + if [[ $BUILD_DESKTOP == yes ]]; then +@@ -262,7 +249,7 @@ function create_new_rootfs_cache() { + umount_chroot "$SDCARD" + + tar cp --xattrs --directory=$SDCARD/ --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \ +- --exclude='./sys/*' --exclude='./home/*' --exclude='./root/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | zstdmt -5 -c > "${cache_fname}" ++ --exclude='./sys/*' --exclude='./home/*' --exclude='./root/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $cache_name" | zstdmt -5 -c > "${cache_fname}" + + # sign rootfs cache archive that it can be used for web cache once. Internal purposes + if [[ -n "${GPG_PASS}" && "${SUDO_USER}" ]]; then +@@ -270,23 +257,43 @@ function create_new_rootfs_cache() { + echo "${GPG_PASS}" | sudo -H -u ${SUDO_USER} bash -c "gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes ${cache_fname}" || exit 1 + fi + ++ # needed for backend to keep current only ++ echo "$cache_fname" > $cache_fname.current ++ + return 0 # protect against possible future short-circuiting above this + } + + # get_package_list_hash + # + # returns md5 hash for current package list and rootfs cache version +-get_package_list_hash() { ++get_package_list_hash() ++{ + local package_arr exclude_arr + local list_content + read -ra package_arr <<< "${DEBOOTSTRAP_LIST} ${PACKAGE_LIST}" + read -ra exclude_arr <<< "${PACKAGE_LIST_EXCLUDE}" + ( +- ( +- printf "%s\n" "${package_arr[@]}" +- printf -- "-%s\n" "${exclude_arr[@]}" +- ) | sort -u +- echo "${1}" +- ) | +- md5sum | cut -d' ' -f 1 ++ printf "%s\n" "${package_arr[@]}" ++ printf -- "-%s\n" "${exclude_arr[@]}" ++ ) | sort -u | md5sum | cut -d' ' -f 1 ++} ++ ++# get_rootfs_cache_list ++# ++# return a list of versions of all avaiable cache from remote and local. ++get_rootfs_cache_list() { ++ local cache_type=$1 ++ local packages_hash=$2 ++ ++ { ++ # Temportally disable Github API because we don't support to download from it ++ # curl --silent --fail -L "https://api.github.com/repos/armbian/cache/releases?per_page=3" | jq -r '.[].tag_name' \ ++ # || curl --silent --fail -L https://cache.armbian.com/rootfs/list ++ curl --silent --fail -L https://cache.armbian.com/rootfs/list ++ ++ find ${SRC}/cache/rootfs/ -mtime -7 -name "${ARCH}-${RELEASE}-${cache_type}-${packages_hash}-*.tar.zst" | ++ sed -e 's#^.*/##' | ++ sed -e 's#\..*$##' | ++ awk -F'-' '{print $5}' ++ } | sort | uniq + } +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 9844d0b39..1c9a0d2f8 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -395,6 +395,15 @@ function install_distribution_agnostic() { + fi + fi + ++ # install plymouth-theme-armbian ++ if [[ $PLYMOUTH == yes ]]; then ++ if [[ "${REPOSITORY_INSTALL}" != *plymouth-theme-armbian* ]]; then ++ install_deb_chroot "${DEB_STORAGE}/armbian-plymouth-theme_${REVISION}_all.deb" ++ else ++ install_deb_chroot "armbian-plymouth-theme" "remote" ++ fi ++ fi ++ + # install kernel sources + if [[ -f ${DEB_STORAGE}/${CHOSEN_KSRC}_${REVISION}_all.deb && $INSTALL_KSRC == yes ]]; then + install_deb_chroot "${DEB_STORAGE}/${CHOSEN_KSRC}_${REVISION}_all.deb" +@@ -587,6 +596,18 @@ function install_distribution_agnostic() { + # build logo in any case + boot_logo + ++ # Show logo ++ if [[ $PLYMOUTH == yes ]]; then ++ if [[ $BOOT_LOGO == yes || $BOOT_LOGO == desktop && $BUILD_DESKTOP == yes ]]; then ++ [[ -f "${SDCARD}"/boot/armbianEnv.txt ]] && grep -q '^bootlogo' "${SDCARD}"/boot/armbianEnv.txt && ++ sed -i 's/^bootlogo.*/bootlogo=true/' "${SDCARD}"/boot/armbianEnv.txt || ++ echo 'bootlogo=true' >> "${SDCARD}"/boot/armbianEnv.txt ++ ++ [[ -f "${SDCARD}"/boot/boot.ini ]] && ++ sed -i 's/^setenv bootlogo.*/setenv bootlogo "true"/' "${SDCARD}"/boot/boot.ini ++ fi ++ fi ++ + # disable MOTD for first boot - we want as clean 1st run as possible + chmod -x "${SDCARD}"/etc/update-motd.d/* + +diff --git a/lib/functions/rootfs/distro-specific.sh b/lib/functions/rootfs/distro-specific.sh +index 3a0b1ec44..86e452777 100644 +--- a/lib/functions/rootfs/distro-specific.sh ++++ b/lib/functions/rootfs/distro-specific.sh +@@ -2,11 +2,10 @@ install_distribution_specific() { + display_alert "Applying distribution specific tweaks for" "$RELEASE" "info" + + case $RELEASE in +- buster | sid) +- # remove doubled uname from motd +- [[ -f "${SDCARD}"/etc/update-motd.d/10-uname ]] && rm "${SDCARD}"/etc/update-motd.d/10-uname +- # rc.local is not existing but one might need it +- install_rclocal ++ sid) ++ # (temporally) disable broken service ++ chroot_sdcard "systemctl --no-reload disable smartmontools.service" ++ + ;; + + bullseye) +@@ -23,17 +22,7 @@ install_distribution_specific() { + # by using default lz4 initrd compression leads to corruption, go back to proven method + sed -i "s/^COMPRESS=.*/COMPRESS=gzip/" "${SDCARD}"/etc/initramfs-tools/initramfs.conf + +- # cleanup motd services and related files +- chroot "${SDCARD}" /bin/bash -c "systemctl disable motd-news.service >/dev/null 2>&1" +- chroot "${SDCARD}" /bin/bash -c "systemctl disable motd-news.timer >/dev/null 2>&1" +- +- rm -f "${SDCARD}"/etc/update-motd.d/{10-uname,10-help-text,50-motd-news,80-esm,80-livepatch,90-updates-available,91-release-upgrade,95-hwe-eol} +- +- # remove motd news from motd.ubuntu.com +- [[ -f "${SDCARD}"/etc/default/motd-news ]] && sed -i "s/^ENABLED=.*/ENABLED=0/" "${SDCARD}"/etc/default/motd-news +- +- # rc.local is not existing but one might need it +- install_rclocal ++ run_host_command_logged rm -fv "${SDCARD}"/etc/update-motd.d/{10-uname,10-help-text,50-motd-news,80-esm,80-livepatch,90-updates-available,91-release-upgrade,95-hwe-eol} + + if [ -d "${SDCARD}"/etc/NetworkManager ]; then + local RENDERER=NetworkManager +@@ -41,13 +30,6 @@ install_distribution_specific() { + local RENDERER=networkd + fi + +- # Basic Netplan config. Let NetworkManager/networkd manage all devices on this system +- [[ -d "${SDCARD}"/etc/netplan ]] && cat <<- EOF > "${SDCARD}"/etc/netplan/armbian-default.yaml +- network: +- version: 2 +- renderer: $RENDERER +- EOF +- + # DNS fix + if [ -n "$NAMESERVER" ]; then + sed -i "s/#DNS=.*/DNS=$NAMESERVER/g" "${SDCARD}"/etc/systemd/resolved.conf +@@ -67,6 +49,26 @@ install_distribution_specific() { + ;; + esac + ++ # Basic Netplan config. Let NetworkManager/networkd manage all devices on this system ++ [[ -d "${SDCARD}"/etc/netplan ]] && cat <<- EOF > "${SDCARD}"/etc/netplan/armbian-default.yaml ++ network: ++ version: 2 ++ renderer: $RENDERER ++ EOF ++ ++ # cleanup motd services and related files ++ chroot_sdcard systemctl disable motd-news.service ++ chroot_sdcard systemctl disable motd-news.timer ++ ++ # remove motd news from motd.ubuntu.com ++ [[ -f "${SDCARD}"/etc/default/motd-news ]] && sed -i "s/^ENABLED=.*/ENABLED=0/" "${SDCARD}"/etc/default/motd-news ++ ++ # remove doubled uname from motd ++ [[ -f "${SDCARD}"/etc/update-motd.d/10-uname ]] && rm "${SDCARD}"/etc/update-motd.d/10-uname ++ ++ # rc.local is not existing but one might need it ++ install_rclocal ++ + # use list modules INITRAMFS + if [ -f "${SRC}"/config/modules/"${MODULES_INITRD}" ]; then + display_alert "Use file list modules INITRAMFS" "${MODULES_INITRD}" + +From dde4db8ee4d9f984b35f8fb909785622316207a8 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 27 Aug 2022 12:52:47 +0200 +Subject: [PATCH] armbian-next: manual merge (28) of lib changes between + revisions af6ceee6c55bd4726139fb8b1ad77641d385515a and + 38df56fbf39739b48b31b5e393f15261d053b3cd + +--- + .../compilation/patch/kernel-bootsplash.sh | 10 +++++++++ + lib/functions/compilation/patch/kernel-drivers.sh | 26 ++++++++++++++-------- + lib/functions/image/fingerprint.sh | 10 ++++----- + lib/functions/image/partitioning.sh | 2 +- + 4 files changed, 33 insertions(+), 15 deletions(-) + +diff --git a/lib/functions/compilation/patch/kernel-bootsplash.sh b/lib/functions/compilation/patch/kernel-bootsplash.sh +index c5aff9692..3a366234c 100644 +--- a/lib/functions/compilation/patch/kernel-bootsplash.sh ++++ b/lib/functions/compilation/patch/kernel-bootsplash.sh +@@ -2,6 +2,11 @@ + # Linux splash file + # + function apply_kernel_patches_for_bootsplash() { ++ # disable it. ++ # todo: cleanup logo generation code and bring in plymouth ++ # @TODO: rpardini: so, can we completely remove this? ++ SKIP_BOOTSPLASH=yes ++ + # previously: if linux-version compare "${version}" ge 5.10 && [ $SKIP_BOOTSPLASH != yes ]; then + [[ "${SKIP_BOOTSPLASH}" == "yes" ]] && return 0 + linux-version compare "${version}" le 5.10 && return 0 +@@ -13,6 +18,11 @@ function apply_kernel_patches_for_bootsplash() { + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0000-Revert-fbcon-Avoid-cap-set-but-not-used-warning.patch" "applying" + fi + ++ if (linux-version compare "${version}" ge 5.18.18 && linux-version compare "${version}" lt 5.19) || ++ (linux-version compare "${version}" ge 5.15.61 && linux-version compare "${version}" lt 5.16); then ++ process_patch_file "${SRC}/patch/misc/0001-Revert-fbcon-Fix-accelerated-fbdev-scrolling-while-logo-is-still-shown.patch" "applying" ++ fi ++ + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" + + if linux-version compare "${version}" ge 5.15; then +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index eec269607..505a3a89e 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -139,6 +139,9 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8189es\/Kconfig"' \ + "$kerneldir/drivers/net/wireless/Kconfig" + ++ # add support for 5.19.2 ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8189es-5.19.2.patch" "applying" ++ + fi + + # Wireless drivers for Realtek 8189FS chipsets +@@ -172,6 +175,9 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8189fs\/Kconfig"' \ + "$kerneldir/drivers/net/wireless/Kconfig" + ++ # add support for 5.19.2 ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8189fs-5.19.2.patch" "applying" ++ + fi + + # Wireless drivers for Realtek 8192EU chipsets +@@ -213,7 +219,7 @@ function prepare_extra_kernel_drivers() { + # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch +- local rtl8812auver="branch:v5.6.4.2" ++ local rtl8812auver="commit:41532e3b16dcf27f06e6fe5a26314f3aa24d4f87" + + display_alert "Adding" "Wireless drivers for Realtek 8811, 8812, 8814 and 8821 chipsets ${rtl8812auver}" "info" + +@@ -237,6 +243,9 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8812au\/Kconfig"' \ + "$kerneldir/drivers/net/wireless/Kconfig" + ++ # add support for 5.19.2 ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8812au-5.19.2.patch" "applying" ++ + fi + + # Wireless drivers for Xradio XR819 chipsets +@@ -313,6 +322,9 @@ function prepare_extra_kernel_drivers() { + # add support for 5.18.y + process_patch_file "${SRC}/patch/misc/wireless-rtl8821cu.patch" "applying" + ++ # add support for 5.19.2 ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8811cu-5.19.2.patch" "applying" ++ + fi + + # Wireless drivers for Realtek 8188EU 8188EUS and 8188ETV chipsets +@@ -365,7 +377,7 @@ function prepare_extra_kernel_drivers() { + # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch +- local rtl88x2buver="branch:5.8.7.1_35809.20191129_COEX20191120-7777" ++ local rtl88x2buver="branch:fix-6.0" + + display_alert "Adding" "Wireless drivers for Realtek 88x2bu chipsets ${rtl88x2buver}" "info" + +@@ -479,6 +491,7 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8723ds\/Kconfig"' \ + "$kerneldir/drivers/net/wireless/Kconfig" + ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8723ds-5.19.2.patch" "applying" + fi + + # Wireless drivers for Realtek 8723DU chipsets +@@ -486,12 +499,7 @@ function prepare_extra_kernel_drivers() { + if linux-version compare $version ge 5.0 && [ "$EXTRAWIFI" == yes ]; then + # @TODO: fasthash for this is... ? remote git hash? + +- # attach to specifics tag or branch +- if linux-version compare $version ge 5.12; then +- local rtl8723duver="branch:v5.13.4" +- else +- local rtl8723duver="branch:master" +- fi ++ local rtl8723duver="branch:master" + + display_alert "Adding" "Wireless drivers for Realtek 8723DU chipsets ${rtl8723duver}" "info" + +@@ -515,7 +523,7 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8723du\/Kconfig"' \ + $kerneldir/drivers/net/wireless/Kconfig + +- process_patch_file "${SRC}/patch/misc/wireless-rtl8723du.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8723du-5.19.2.patch" "applying" + fi + + # Wireless drivers for Realtek 8822BS chipsets +diff --git a/lib/functions/image/fingerprint.sh b/lib/functions/image/fingerprint.sh +index 6fc7c43fb..bb4fd4c3e 100644 +--- a/lib/functions/image/fingerprint.sh ++++ b/lib/functions/image/fingerprint.sh +@@ -27,15 +27,15 @@ fingerprint_image() { + CPU configuration: $CPUMIN - $CPUMAX with $GOVERNOR + -------------------------------------------------------------------------------- + Verify GPG signature: +- gpg --verify $2.img.asc ++ gpg --verify $2.img.xz.asc + + Verify image file integrity: +- sha256sum --check $2.img.sha ++ sha256sum --check $2.img.xz.sha + +- Prepare SD card (four methodes): +- zcat $2.img.gz | pv | dd of=/dev/mmcblkX bs=1M ++ Prepare SD card (four methods): ++ xzcat $2.img.xz | pv | dd of=/dev/mmcblkX bs=1M + dd if=$2.img of=/dev/mmcblkX bs=1M +- balena-etcher $2.img.gz -d /dev/mmcblkX ++ balena-etcher $2.img.xz -d /dev/mmcblkX + balena-etcher $2.img -d /dev/mmcblkX + EOF + fi +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 2c584ff06..3340db9e9 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -74,7 +74,7 @@ function prepare_partitions() { + UEFI_MOUNT_POINT=${UEFI_MOUNT_POINT:-/boot/efi} + UEFI_FS_LABEL="${UEFI_FS_LABEL:-ARMBIEFI}" # Should be always uppercase + ROOT_FS_LABEL="${ROOT_FS_LABEL:-armbian_root}" +- BOOT_FS_LABEL="${BOOT_FS_LABEL:-armbian_boot}" ++ BOOT_FS_LABEL="${BOOT_FS_LABEL:-armbianboot}" + + call_extension_method "pre_prepare_partitions" "prepare_partitions_custom" <<- 'PRE_PREPARE_PARTITIONS' + *allow custom options for mkfs* + +From 0ae75757f23941e025ed29dae1aacf44cd2249ac Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 27 Aug 2022 12:41:42 +0200 +Subject: [PATCH] armbian-next: manual merge (28) of sources/families changes + between revisions af6ceee6c55bd4726139fb8b1ad77641d385515a and + 38df56fbf39739b48b31b5e393f15261d053b3cd + +--- + config/sources/families/include/meson_common.inc | 54 ++++++++++++------------ + config/sources/families/media.conf | 1 + + config/sources/families/odroidxu4.conf | 4 +- + 3 files changed, 30 insertions(+), 29 deletions(-) + +diff --git a/config/sources/families/include/meson_common.inc b/config/sources/families/include/meson_common.inc +index 6600b199a..ee515aaaf 100644 +--- a/config/sources/families/include/meson_common.inc ++++ b/config/sources/families/include/meson_common.inc +@@ -1,23 +1,36 @@ + ARCH=armhf +-BOOTSOURCE='https://github.com/hardkernel/u-boot.git' +-BOOTBRANCH='branch:odroidc-v2011.03' +-BOOTDIR='u-boot-odroidc1' +-UBOOT_COMPILER="arm-linux-gnueabihf-" +-UBOOT_USE_GCC='< 4.9' +-SERIALCON="ttyAML0" +-UBOOT_TARGET_MAP=';;sd_fuse/bl1.bin.hardkernel sd_fuse/u-boot.bin' +-SRC_LOADADDR='LOADADDR=0x00208000' +-KERNEL_IMAGE_TYPE=uImage + LINUXFAMILY=meson ++KERNEL_IMAGE_TYPE=uImage ++SRC_LOADADDR='LOADADDR=0x00208000' ++ ++SERIALCON="ttyAML0" ++ + CPUMIN=504000 + CPUMAX=1632000 + GOVERNOR=ondemand + ++SKIP_BOOTSPLASH="yes" ++ ++case $BOARD in ++ odroidc1) ++ ++ BOOTDIR='u-boot-odroidc1' ++ BOOTSOURCE='https://github.com/hardkernel/u-boot.git' ++ BOOTBRANCH='branch:odroidc-v2011.03' ++ ++ UBOOT_COMPILER="arm-linux-gnueabihf-" ++ UBOOT_USE_GCC='< 4.9' ++ ++ UBOOT_TARGET_MAP=';;sd_fuse/bl1.bin.hardkernel sd_fuse/u-boot.bin' ++ ++ ;; ++esac ++ + case $BRANCH in + legacy) + +- export KERNEL_MAJOR_MINOR="5.11" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.11.y" ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.10.y" + KERNELPATCHDIR='meson-'$BRANCH + + BUILD_DESKTOP=no +@@ -25,8 +38,8 @@ case $BRANCH in + ;; + current) + +- export KERNEL_MAJOR_MINOR="5.14" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.14.y" ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.15.y" + KERNELPATCHDIR='meson-'$BRANCH + + BUILD_DESKTOP=no +@@ -37,25 +50,12 @@ case $BRANCH in + KERNELDIR='linux-meson' + KERNELSOURCE='https://github.com/xdarklight/linux' + export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:meson-mx-integration-5.18-20220417" ++ KERNELBRANCH="branch:meson-mx-integration-5.18-20220516" + KERNELPATCHDIR='meson-'$BRANCH + + ;; + esac + +-case $BOARD in +- odroidc1) +- +- BOOTSCRIPT="boot-odroid-c1.ini:boot.ini" +- +- ;; +- onecloud) +- +- BOOTSCRIPT="boot-onecloud.cmd:boot.cmd" +- +- ;; +-esac +- + write_uboot_platform() { + dd if=$1/bl1.bin.hardkernel of=$2 bs=1 count=442 conv=fsync > /dev/null 2>&1 + dd if=$1/bl1.bin.hardkernel of=$2 bs=512 skip=1 seek=1 conv=fsync > /dev/null 2>&1 +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 0355128ca..eb2711377 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -62,6 +62,7 @@ case $BRANCH in + export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.18.y" + LINUXCONFIG='linux-media-'$BRANCH ++ SKIP_BOOTSPLASH="yes" + + if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == quartz64a || $BOARD == bananapir2pro ]]; then + KERNELPATCHDIR='station-p2-'$BRANCH +diff --git a/config/sources/families/odroidxu4.conf b/config/sources/families/odroidxu4.conf +index 75916a25b..1fac905f6 100644 +--- a/config/sources/families/odroidxu4.conf ++++ b/config/sources/families/odroidxu4.conf +@@ -26,8 +26,8 @@ case $BRANCH in + + edge) + KERNELSOURCE='https://github.com/tobetter/linux' +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:odroid-5.18.y' ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:odroid-5.19.y' + KERNELDIR='linux-odroidxu4' + ;; + + +From e3e84f5c72e34013ea09dbd556c30870017b43a8 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 13 Aug 2022 13:53:57 +0200 +Subject: [PATCH] armbian-next: manual merge (27) of `lib` changes between + revisions 9c52562176390624d33c93634e63a8f91cc0815b and + af6ceee6c55bd4726139fb8b1ad77641d385515a + +--- + lib/functions/bsp/bsp-cli.sh | 5 +- + .../compilation/patch/kernel-bootsplash.sh | 1 + + lib/functions/compilation/patch/kernel-drivers.sh | 6 +- + lib/functions/general/cleaning.sh | 2 +- + lib/functions/general/downloads.sh | 10 ++- + lib/functions/image/partitioning.sh | 20 ++++-- + lib/functions/main/rootfs-image.sh | 2 +- + lib/functions/rootfs/create-cache.sh | 75 +++++++++------------- + lib/functions/rootfs/distro-agnostic.sh | 2 +- + 9 files changed, 64 insertions(+), 59 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index a20ea1e57..62fa5cfd1 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -12,7 +12,7 @@ create_board_package() { + copy_all_packages_files_for "bsp-cli" + + # install copy of boot script & environment file +- if [[ "${BOOTCONFIG}" != "none" ]]; then ++ if [[ -z "${BOOTSCRIPT}" ]]; then # @TODO: used to be: if [[ "${BOOTCONFIG}" != "none" ]]; then + # @TODO: add extension method bsp_prepare_bootloader(), refactor into u-boot extension + local bootscript_src=${BOOTSCRIPT%%:*} + local bootscript_dst=${BOOTSCRIPT##*:} +@@ -29,8 +29,9 @@ create_board_package() { + else + run_host_command_logged cp -pv "${SRC}/config/bootscripts/${bootscript_src}" "${destination}/usr/share/armbian/${bootscript_dst}" + fi +- [[ -n $BOOTENV_FILE && -f $SRC/config/bootenv/$BOOTENV_FILE ]] && ++ if [[ -n $BOOTENV_FILE && -f $SRC/config/bootenv/$BOOTENV_FILE ]]; then + run_host_command_logged cp -pv "${SRC}/config/bootenv/${BOOTENV_FILE}" "${destination}"/usr/share/armbian/armbianEnv.txt ++ fi + else + display_alert "Using extlinux, regular bootscripts ignored" "SRC_EXTLINUX=${SRC_EXTLINUX}" "warn" + fi +diff --git a/lib/functions/compilation/patch/kernel-bootsplash.sh b/lib/functions/compilation/patch/kernel-bootsplash.sh +index cbd929513..c5aff9692 100644 +--- a/lib/functions/compilation/patch/kernel-bootsplash.sh ++++ b/lib/functions/compilation/patch/kernel-bootsplash.sh +@@ -5,6 +5,7 @@ function apply_kernel_patches_for_bootsplash() { + # previously: if linux-version compare "${version}" ge 5.10 && [ $SKIP_BOOTSPLASH != yes ]; then + [[ "${SKIP_BOOTSPLASH}" == "yes" ]] && return 0 + linux-version compare "${version}" le 5.10 && return 0 ++ linux-version compare "${version}" lt 5.19 && return 0 + + display_alert "Adding" "Kernel bootsplash patch" "info" + +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 9df0b81ca..eec269607 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -31,7 +31,7 @@ function prepare_extra_kernel_drivers() { + # + # Older versions have AUFS support with a patch + +- if linux-version compare "${version}" gt 5.11 && linux-version compare "${version}" lt 5.19 && [ "$AUFS" == yes ]; then ++ if linux-version compare "${version}" gt 5.11 && linux-version compare "${version}" lt 5.20 && [ "$AUFS" == yes ]; then + # attach to specifics tag or branch + local aufstag + aufstag=$(echo "${version}" | cut -f 1-2 -d ".") +@@ -240,8 +240,8 @@ function prepare_extra_kernel_drivers() { + fi + + # Wireless drivers for Xradio XR819 chipsets +- if linux-version compare "${version}" ge 4.19 && [[ "$LINUXFAMILY" == sunxi* ]] && [[ "$EXTRAWIFI" == yes ]]; then +- # @TODO: fasthash for this is... ? remote git hash? ++ if linux-version compare "${version}" ge 4.19 && linux-version compare "${version}" le 5.19 && ++ [[ "$LINUXFAMILY" == sunxi* ]] && [[ "$EXTRAWIFI" == yes ]]; then + + display_alert "Adding" "Wireless drivers for Xradio XR819 chipsets" "info" + +diff --git a/lib/functions/general/cleaning.sh b/lib/functions/general/cleaning.sh +index 72a6f4b1f..833ac4ce7 100644 +--- a/lib/functions/general/cleaning.sh ++++ b/lib/functions/general/cleaning.sh +@@ -65,7 +65,7 @@ general_cleaning() { + ;; + + oldcache) # remove old `cache/rootfs` except for the newest 8 files +- if [[ -d "${SRC}"/cache/rootfs && $(ls -1 "${SRC}"/cache/rootfs/*.lz4 2> /dev/null | wc -l) -gt "${ROOTFS_CACHE_MAX}" ]]; then ++ if [[ -d "${SRC}"/cache/rootfs && $(ls -1 "${SRC}"/cache/rootfs/*.zst* 2> /dev/null | wc -l) -gt "${ROOTFS_CACHE_MAX}" ]]; then + display_alert "Cleaning" "rootfs cache (old)" "info" + ( + cd "${SRC}"/cache/rootfs +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index 97afb81a4..5bbd161fe 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -4,7 +4,7 @@ function webseed() { + unset text + local CCODE=$(curl -s redirect.armbian.com/geoip | jq '.continent.code' -r) + +- if [[ "$2" == "rootfs" ]]; then ++ if [[ "$2" == rootfs* ]]; then + WEBSEED=($(curl -s ${1}mirrors | jq -r '.'${CCODE}' | .[] | values')) + else + WEBSEED=($(curl -s https://redirect.armbian.com/mirrors | jq -r '.'${CCODE}' | .[] | values')) +@@ -67,6 +67,12 @@ function download_and_verify_internal() { + return 0 + fi + ++ # rootfs has its own infra ++ if [[ "${remotedir}" == "_rootfs" ]]; then ++ local server="https://cache.armbian.com/" ++ remotedir="rootfs/$ROOTFSCACHE_VERSION" ++ fi ++ + # switch to china mirror if US timeouts + timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}" + if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then +@@ -124,7 +130,7 @@ function download_and_verify_internal() { + if [[ ! -f "${localdir}/${filename}.complete" ]]; then + if [[ ! $(timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} 2>&1 > /dev/null) ]]; then + display_alert "downloading from $(echo $server | cut -d'/' -f3 | cut -d':' -f1) using http(s) network" "$filename" +- run_host_command_logged aria2c --download-result=hide --rpc-save-upload-metadata=false --console-log-level=error \ ++ run_host_command_logged aria2c --allow-overwrite=true --download-result=hide --rpc-save-upload-metadata=false --console-log-level=error \ + --dht-file-path="${SRC}"/cache/.aria2/dht.dat --disable-ipv6=${DISABLE_IPV6} --summary-interval=0 --auto-file-renaming=false --dir="${localdir}" ${server}${remotedir}/${filename} $(webseed "${remotedir}/${filename}") -o "${filename}" + # mark complete + [[ $? -eq 0 ]] && touch "${localdir}/${filename}.complete" && echo "" +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 471050a30..2c584ff06 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -18,7 +18,7 @@ function prepare_partitions() { + + # array copying in old bash versions is tricky, so having filesystems as arrays + # with attributes as keys is not a good idea +- declare -A parttype mkopts mkfs mountopts ++ declare -A parttype mkopts mkopts_label mkfs mountopts + + parttype[ext4]=ext4 + parttype[ext2]=ext2 +@@ -35,13 +35,21 @@ function prepare_partitions() { + if [[ $HOSTRELEASE =~ buster|bullseye|focal|jammy|sid ]]; then + mkopts[ext4]="-q -m 2 -O ^64bit,^metadata_csum -N $((128 * node_number))" + fi +- mkopts[fat]='-n BOOT' ++ # mkopts[fat] is empty + mkopts[ext2]='-q' + # mkopts[f2fs] is empty + mkopts[btrfs]='-m dup' + # mkopts[xfs] is empty + # mkopts[nfs] is empty + ++ mkopts_label[ext4]='-L ' ++ mkopts_label[ext2]='-L ' ++ mkopts_label[fat]='-n ' ++ mkopts_label[f2fs]='-l ' ++ mkopts_label[btrfs]='-L ' ++ mkopts_label[xfs]='-L ' ++ # mkopts_label[nfs] is empty ++ + mkfs[ext4]=ext4 + mkfs[ext2]=ext2 + mkfs[fat]=vfat +@@ -65,6 +73,8 @@ function prepare_partitions() { + BIOSSIZE=${BIOSSIZE:-0} + UEFI_MOUNT_POINT=${UEFI_MOUNT_POINT:-/boot/efi} + UEFI_FS_LABEL="${UEFI_FS_LABEL:-ARMBIEFI}" # Should be always uppercase ++ ROOT_FS_LABEL="${ROOT_FS_LABEL:-armbian_root}" ++ BOOT_FS_LABEL="${BOOT_FS_LABEL:-armbian_boot}" + + call_extension_method "pre_prepare_partitions" "prepare_partitions_custom" <<- 'PRE_PREPARE_PARTITIONS' + *allow custom options for mkfs* +@@ -230,7 +240,7 @@ function prepare_partitions() { + + check_loop_device "$LOOP" + +- run_host_command_logged losetup -P $LOOP ${SDCARD}.raw ++ run_host_command_logged losetup $LOOP ${SDCARD}.raw # @TODO: had a '-P- here, what was it? + + # loop device was grabbed here, unlock + flock -u $FD +@@ -254,7 +264,7 @@ function prepare_partitions() { + + check_loop_device "$rootdevice" + display_alert "Creating rootfs" "$ROOTFS_TYPE on $rootdevice" +- run_host_command_logged mkfs.${mkfs[$ROOTFS_TYPE]} "${mkopts[$ROOTFS_TYPE]}" "$rootdevice" ++ run_host_command_logged mkfs.${mkfs[$ROOTFS_TYPE]} ${mkopts[$ROOTFS_TYPE]} ${mkopts_label[$ROOTFS_TYPE]:+${mkopts_label[$ROOTFS_TYPE]}"$ROOT_FS_LABEL"} "${rootdevice}" + [[ $ROOTFS_TYPE == ext4 ]] && run_host_command_logged tune2fs -o journal_data_writeback "$rootdevice" + if [[ $ROOTFS_TYPE == btrfs && $BTRFS_COMPRESSION != none ]]; then + local fscreateopt="-o compress-force=${BTRFS_COMPRESSION}" +@@ -275,7 +285,7 @@ function prepare_partitions() { + if [[ -n $bootpart ]]; then + display_alert "Creating /boot" "$bootfs on ${LOOP}p${bootpart}" + check_loop_device "${LOOP}p${bootpart}" +- run_host_command_logged mkfs.${mkfs[$bootfs]} ${mkopts[$bootfs]} ${LOOP}p${bootpart} 2>&1 ++ run_host_command_logged mkfs.${mkfs[$bootfs]} ${mkopts[$bootfs]} ${mkopts_label[$bootfs]:+${mkopts_label[$bootfs]}"$BOOT_FS_LABEL"} ${LOOP}p${bootpart} + mkdir -p $MOUNT/boot/ + run_host_command_logged mount ${LOOP}p${bootpart} $MOUNT/boot/ + echo "UUID=$(blkid -s UUID -o value ${LOOP}p${bootpart}) /boot ${mkfs[$bootfs]} defaults${mountopts[$bootfs]} 0 2" >> $SDCARD/etc/fstab +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 590ca1f84..dc1c08c16 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -9,7 +9,7 @@ + # https://github.com/armbian/build/ + + function build_rootfs_and_image() { +- display_alert "Starting rootfs and image building process for" "${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" "info" ++ display_alert "Checking for rootfs cache" "$(echo "${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" | tr -s " ")" "info" + + [[ $ROOTFS_TYPE != ext4 ]] && display_alert "Assuming ${BOARD} ${BRANCH} kernel supports ${ROOTFS_TYPE}" "" "wrn" + +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 635631232..4ebe8f03f 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -1,61 +1,48 @@ + # this gets from cache or produces a new rootfs, and leaves a mounted chroot "$SDCARD" at the end. + get_or_create_rootfs_cache_chroot_sdcard() { +- if [[ "$ROOT_FS_CREATE_ONLY" == "force" ]]; then ++ if [[ "$ROOT_FS_CREATE_ONLY" == "yes" ]]; then + local cycles=1 + else +- local cycles=2 ++ local cycles=3 + fi + ++ # @TODO: this was moved from configuration to this stage, that way configuration can be offline + # if variable not provided, check which is current version in the cache storage in GitHub. + if [[ -z "${ROOTFSCACHE_VERSION}" ]]; then +- display_alert "ROOTFSCACHE_VERSION not set, getting remotely" "https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version" "debug" +- ROOTFSCACHE_VERSION=$(wget --tries=10 -O - -o /dev/null https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version || true) +- ROOTFSCACHE_VERSION=${ROOTFSCACHE_VERSION:-"0"} ++ display_alert "ROOTFSCACHE_VERSION not set, getting remotely" "Github API and armbian/mirror " "debug" ++ ROOTFSCACHE_VERSION=$(curl https://api.github.com/repos/armbian/cache/releases/latest -s --fail | jq .tag_name -r || true) ++ # anonymous API access is very limited which is why we need a fallback ++ ROOTFSCACHE_VERSION=${ROOTFSCACHE_VERSION:-$(curl -L --silent https://cache.armbian.com/rootfs/latest --fail)} + fi + ++ INITIAL_ROOTFSCACHE_VERSION=$ROOTFSCACHE_VERSION ++ + # seek last cache, proceed to previous otherwise build it + for ((n = 0; n < cycles; n++)); do + +- FORCED_MONTH_OFFSET=${n} +- +- local packages_hash +- packages_hash=$(get_package_list_hash "$(date -d "$D -${FORCED_MONTH_OFFSET} month" +"%Y-%m-module$ROOTFSCACHE_VERSION" | sed 's/^0*//')") ++ ROOTFSCACHE_VERSION=$(expr $INITIAL_ROOTFSCACHE_VERSION - $n) ++ ROOTFSCACHE_VERSION=$(printf "%04d\n" ${ROOTFSCACHE_VERSION}) + ++ local packages_hash=$(get_package_list_hash "$ROOTFSCACHE_VERSION") + local cache_type="cli" +- [[ ${BUILD_DESKTOP} == yes ]] && cache_type="xfce-desktop" +- [[ -n ${DESKTOP_ENVIRONMENT} ]] && cache_type="${DESKTOP_ENVIRONMENT}" +- [[ ${BUILD_MINIMAL} == yes ]] && cache_type="minimal" +- +- local cache_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash}.tar.zst ++ [[ ${BUILD_DESKTOP} == yes ]] && local cache_type="xfce-desktop" ++ [[ -n ${DESKTOP_ENVIRONMENT} ]] && local cache_type="${DESKTOP_ENVIRONMENT}" ++ [[ ${BUILD_MINIMAL} == yes ]] && local cache_type="minimal" ++ local cache_name=${RELEASE}-${cache_type}-${ARCH}.$packages_hash.tar.zst + local cache_fname=${SRC}/cache/rootfs/${cache_name} + local display_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash:0:3}...${packages_hash:29}.tar.zst + +- [[ "$ROOT_FS_CREATE_ONLY" == force ]] && break ++ [[ "$ROOT_FS_CREATE_ONLY" == yes ]] && break + + if [[ -f ${cache_fname} && -f ${cache_fname}.aria2 ]]; then +- rm "${cache_fname}"* ++ rm ${cache_fname}* + display_alert "Partially downloaded file. Re-start." + download_and_verify "_rootfs" "$cache_name" + fi + + display_alert "Checking local cache" "$display_name" "info" + +- if [[ -f ${cache_fname} && -n "$ROOT_FS_CREATE_ONLY" ]]; then +- echo "$cache_fname" > $cache_fname.current +- display_alert "Checking cache integrity" "$display_name" "info" +- +- sudo zstd -tqq "${cache_fname}" || { +- rm -f "${cache_fname}" +- exit_with_error "Cache ${cache_fname} is corrupted and was deleted. Please restart!" +- } +- +- # sign if signature is missing +- if [[ -n "${GPG_PASS}" && "${SUDO_USER}" && ! -f ${cache_fname}.asc ]]; then +- [[ -n ${SUDO_USER} ]] && sudo chown -R ${SUDO_USER}:${SUDO_USER} "${DEST}"/images/ +- echo "${GPG_PASS}" | sudo -H -u ${SUDO_USER} bash -c "gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes ${cache_fname}" || exit 1 +- fi +- break +- elif [[ -f ${cache_fname} ]]; then ++ if [[ -f $cache_fname ]]; then + break + else + display_alert "searching on servers" +@@ -69,17 +56,17 @@ get_or_create_rootfs_cache_chroot_sdcard() { + + done + +- if [[ -f $cache_fname && ! -f $cache_fname.aria2 ]]; then ++ # check if cache exists and we want to make it ++ if [[ -f ${cache_fname} && "$ROOT_FS_CREATE_ONLY" == "yes" ]]; then ++ display_alert "Checking cache integrity" "$display_name" "info" ++ zstd -tqq ${cache_fname} || { ++ rm $cache_fname ++ exit_with_error "Cache $cache_fname is corrupted and was deleted. Please restart!" ++ } ++ fi + +- # speed up checking +- if [[ -n "$ROOT_FS_CREATE_ONLY" ]]; then +- echo "$cache_fname" > $cache_fname.current +- umount --lazy "$SDCARD" +- rm -rf $SDCARD +- # remove exit trap +- remove_all_trap_handlers INT TERM EXIT +- exit +- fi ++ # if aria2 file exists download didn't succeeded ++ if [[ -f $cache_fname && ! -f $cache_fname.aria2 ]]; then + + local date_diff=$((($(date +%s) - $(stat -c %Y $cache_fname)) / 86400)) + display_alert "Extracting $display_name" "$date_diff days old" "info" +@@ -89,7 +76,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + echo "nameserver $NAMESERVER" >> $SDCARD/etc/resolv.conf + create_sources_list "$RELEASE" "$SDCARD/" + else +- display_alert "... remote not found" "Creating new rootfs cache for $RELEASE" "info" ++ display_alert "Creating new rootfs cache for" "$RELEASE" "info" + + create_new_rootfs_cache + +@@ -99,7 +86,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + fi + + # used for internal purposes. Faster rootfs cache rebuilding +- if [[ -n "$ROOT_FS_CREATE_ONLY" ]]; then ++ if [[ "$ROOT_FS_CREATE_ONLY" == "yes" ]]; then + umount --lazy "$SDCARD" + rm -rf $SDCARD + # remove exit trap +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index cd3462409..9844d0b39 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -174,7 +174,7 @@ function install_distribution_agnostic() { + fi + else + +- if [[ "${BOOTCONFIG}" != "none" ]]; then ++ if [[ -n "${BOOTSCRIPT}" ]]; then # @TODO: this used to check BOOTCONFIG not being 'none' + if [ -f "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" ]; then + run_host_command_logged cp -pv "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" "${SDCARD}/boot/${bootscript_dst}" + else + +From d08b0971d93456143e2648b94341fedc5a612049 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 13 Aug 2022 13:24:53 +0200 +Subject: [PATCH] armbian-next: manual merge (27) of `sources/families` changes + between revisions 9c52562176390624d33c93634e63a8f91cc0815b and + af6ceee6c55bd4726139fb8b1ad77641d385515a + +--- + config/sources/families/bcm2711.conf | 4 +-- + config/sources/families/imx6.conf | 4 +-- + config/sources/families/include/meson64_common.inc | 4 +-- + config/sources/families/include/meson_common.inc | 10 +++++++- + .../sources/families/include/rockchip64_common.inc | 30 +++++++++++++++++++--- + config/sources/families/include/sunxi64_common.inc | 6 ++--- + config/sources/families/include/sunxi_common.inc | 6 ++--- + config/sources/families/include/uefi_common.inc | 4 +-- + config/sources/families/jethub.conf | 13 +++++----- + config/sources/families/media.conf | 20 ++++++++++++++- + config/sources/families/mvebu64.conf | 4 +-- + config/sources/families/rk322x.conf | 4 +-- + config/sources/families/rockchip-rk3588.conf | 6 ++--- + config/sources/families/rockchip.conf | 4 +-- + 14 files changed, 83 insertions(+), 36 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 5ae60578a..d031d7e50 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -28,8 +28,8 @@ case "${BRANCH}" in + edge) + export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. For mainline caching. +- export KERNELBRANCH="branch:rpi-5.18.y" ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:rpi-5.19.y" + export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" + export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; +diff --git a/config/sources/families/imx6.conf b/config/sources/families/imx6.conf +index 9a7bd9331..843c824f8 100644 +--- a/config/sources/families/imx6.conf ++++ b/config/sources/families/imx6.conf +@@ -16,8 +16,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.18.y' ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.19.y' + + ;; + +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index d902756e7..2e69f58de 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -36,8 +36,8 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. For mainline caching. +- KERNELBRANCH='branch:linux-5.17.y' ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. For mainline caching. ++ KERNELBRANCH='branch:linux-5.19.y' + KERNELPATCHDIR='meson64-edge' + ;; + +diff --git a/config/sources/families/include/meson_common.inc b/config/sources/families/include/meson_common.inc +index 5b53ff90c..6600b199a 100644 +--- a/config/sources/families/include/meson_common.inc ++++ b/config/sources/families/include/meson_common.inc +@@ -68,5 +68,13 @@ family_tweaks() { + } + + family_tweaks_bsp() { +- : ++ mkdir -p "$destination/etc/X11/xorg.conf.d" ++ cat <<- EOF > "$destination/etc/X11/xorg.conf.d/02-driver.conf" ++ Section "OutputClass" ++ Identifier "Amlogic" ++ MatchDriver "meson" ++ Driver "modesetting" ++ Option "PrimaryGPU" "true" ++ EndSection ++ EOF + } +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 44d4d22dc..e31b81341 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -88,6 +88,12 @@ elif [[ $BOOT_SOC == rk3568 ]]; then + DDR_BLOB="${DDR_BLOB:=rk35/rk3568_ddr_1560MHz_v1.10.bin}" + BL31_BLOB='rk35/rk3568_bl31_v1.28.elf' + ++elif [[ $BOOT_SOC == rk3588 ]]; then ++ ++ BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" ++ DDR_BLOB="${DDR_BLOB:=rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.07.bin}" ++ BL31_BLOB='rk35/rk3588_bl31_v1.25.elf' ++ + elif [[ $BOARD == rockpi-s ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=only-blobs}" +@@ -117,8 +123,8 @@ case $BRANCH in + edge) + + KERNELPATCHDIR='rockchip64-'$BRANCH +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.18.y" ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.19.y" + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH + +@@ -162,7 +168,7 @@ prepare_boot_configuration() { + + if [[ $BOOT_SUPPORT_SPI == yes ]]; then + +- if [[ $BOARD != "rock-3a" ]]; then ++ if [[ $BOARD != "rock-3a" ]] && [[ $BOARD != "rock-5b" ]]; then + UBOOT_TARGET_MAP="BL31=$RKBIN_DIR/$BL31_BLOB tpl/u-boot-tpl.bin spl/u-boot-spl.bin u-boot.itb ${UBOOT_TARGET_MAP} rkspi_loader.img" + else + UBOOT_TARGET_MAP="${UBOOT_TARGET_MAP} rkspi_loader.img" +@@ -193,7 +199,7 @@ uboot_custom_postprocess() { + fi + + if [[ $BOOT_SUPPORT_SPI == yes ]]; then +- if [[ $BOARD == "rock-3a" ]]; then ++ if [[ $BOARD == "rock-3a" ]] || [[ $BOARD == "rock-5b" ]]; then + dd if=/dev/zero of=rkspi_loader.img bs=1M count=0 seek=16 + /sbin/parted -s rkspi_loader.img mklabel gpt + /sbin/parted -s rkspi_loader.img unit s mkpart idbloader 64 7167 +@@ -318,6 +324,22 @@ family_tweaks() { + + fi + ++ if [[ $BOARD == jetson-nano ]]; then ++ install -m 755 $SRC/packages/blobs/jetson/jetson.sh $SDCARD/etc/initramfs-tools/hooks/jetson.sh ++ if [[ $BRANCH == legacy ]]; then ++ install -m 755 $SRC/packages/blobs/jetson/tegra21x_xusb_firmware $SDCARD/lib/firmware/tegra21x_xusb_firmware ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf.tegrahda ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrasndt210ref $SDCARD/etc/asound.conf.tegrasndt210ref ++ install -m 755 $SRC/packages/blobs/jetson/tegra-hda.conf $SDCARD/usr/share/alsa/cards/tegra-hda.conf ++ install -m 755 $SRC/packages/blobs/jetson/tegra-snd-t210r.conf $SDCARD/usr/share/alsa/cards/tegra-snd-t210r.conf ++ sed -e 's/exit 0//g' -i $SDCARD/etc/rc.local ++ echo "su -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'" >> $SDCARD/etc/rc.local ++ echo "exit 0" >> $SDCARD/etc/rc.local ++ else ++ cp -R $SRC/packages/blobs/jetson/firmware/* $SDCARD/lib/firmware/ ++ fi ++ fi + } + + family_tweaks_bsp() { +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index 299d16253..cb49b4ef0 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -26,9 +26,9 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- export KERNELBRANCH="branch:linux-5.18.y" +- export KERNELBRANCH_MEGOUS="branch:orange-pi-5.18" ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ export KERNELBRANCH="branch:linux-5.19.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.19" + ;; + esac + +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index 9d120c711..6660ec812 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -27,9 +27,9 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- export KERNELBRANCH="branch:linux-5.18.y" +- export KERNELBRANCH_MEGOUS="branch:orange-pi-5.18" ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ export KERNELBRANCH="branch:linux-5.19.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.19" + ;; + esac + +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index 699d09e4a..9e8c9deb1 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -22,8 +22,8 @@ case "${BRANCH}" in + edge) + export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. For mainline caching. +- export KERNELBRANCH="branch:linux-5.18.y" # Branch or tag to build from. It should match MAJOR_MINOR ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:linux-5.19.y" # Branch or tag to build from. It should match MAJOR_MINOR + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. + ;; + esac +diff --git a/config/sources/families/jethub.conf b/config/sources/families/jethub.conf +index 16481c176..382f2d796 100644 +--- a/config/sources/families/jethub.conf ++++ b/config/sources/families/jethub.conf +@@ -153,24 +153,24 @@ family_tweaks() { + comment_default_rsyslog_rules || display_alert "Unable to comment default rsyslog rules" "${BOARD}" "wrn" + + # Hardware init +- chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable jethub-initer.service >/dev/null 2>&1" ++ chroot_sdcard systemctl --no-reload enable jethub-initer.service + + # AR-1098 userland fix for net interface does not up at boot +- chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable jethub-ethreset.service >/dev/null 2>&1" ++ chroot_sdcard systemctl --no-reload enable jethub-ethreset.service + + # pip3 packages +- chroot "${SDCARD}" /bin/bash -c "pip3 install pyserial intelhex python-magic" >> "${DEST}"/debug/install.log 2>&1 ++ chroot_sdcard pip3 install pyserial intelhex python-magic + + # Hostapd +- chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload disable hostapd.service >/dev/null 2>&1" ++ chroot_sdcard systemctl --no-reload disable hostapd.service + + if [[ "$BOARD" == jethubj80 ]]; then + # Bluetooth +- chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable jethub-rtk-hciattach.service >/dev/null 2>&1" ++ chroot_sdcard systemctl --no-reload enable jethub-rtk-hciattach.service + fi + + display_alert "Adding JetHome repository and authentication key" "/etc/apt/sources.list.d/jethome.list" "info" +- cp "${SRC}"/packages/bsp/jethub/jethome.gpg "${SDCARD}/etc/apt/trusted.gpg.d/" ++ run_host_command_logged cp -pv "${SRC}"/packages/bsp/jethub/jethome.gpg "${SDCARD}/etc/apt/trusted.gpg.d/" + + echo "deb http://repo.jethome.ru"$([[ $BETA == yes ]] && echo "/beta")" ${RELEASE} jethome-${RELEASE}" \ + >> "${SDCARD}"/etc/apt/sources.list.d/jethome.list +@@ -189,7 +189,6 @@ family_tweaks_bsp() { + cp "$SRC/packages/bsp/jethub/jethub-initer.service" "$destination/lib/systemd/system/" || exit_with_error "Unable to copy jethub-initer.service" + cp "$SRC/packages/bsp/jethub/${BOARD}/jethub-init" "$destination/usr/lib/armbian/" || exit_with_error "Unable to copy jethub-init" + +- + # AR-1098 userland fix for net interface does not up at boot + cp "$SRC/packages/bsp/jethub/jethub-ethreset.service" "$destination/lib/systemd/system/" || exit_with_error "Unable to copy jethub-ethreset.service" + cp "$SRC/packages/bsp/jethub/jethub-ethreset" "$destination/usr/lib/armbian/" || exit_with_error "Unable to copy jethub-ethreset" +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 46ae3c100..0355128ca 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -27,6 +27,18 @@ case $BRANCH in + LINUXCONFIG='linux-station-p2-'$BRANCH + EXTRAWIFI="no" + WIREGUARD="no" ++ elif [[ $BOARD == jetson-nano ]]; then ++ KERNELDIR='linux-nano' ++ KERNELSOURCE='https://github.com/150balbes/Jetson-Nano' ++ export KERNEL_MAJOR_MINOR="4.9" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:4.9.201' ++ KERNELPATCHDIR='jetson-nano-'$BRANCH ++ LINUXFAMILY=jetson-nano ++ LINUXCONFIG='linux-jetson-nano-'$BRANCH ++ EXTRAWIFI="no" ++ BOOT_FDT_FILE="none" ++ SRC_CMDLINE='console=ttyS0,115200n8 console=tty0 tegraid=21.1.2.0.0 ddr_die=4096M@2048M section=512M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb debug_uartport=lsport,4 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=0x1000@0xff780000 core_edp_mv=1075 core_edp_ma=4000 tegra_fbmem=0x800000@0x92ca9000 is_hdmi_initialised=1 earlycon=uart8250,mmio32,0x70006000 fbcon=map:0' ++ MODULES_INITRD="jetson-nano-legacy" + else + if [[ $BOARD == nanopct4 ]]; then + KERNELSOURCE='https://github.com/friendlyarm/kernel-rockchip' +@@ -57,6 +69,9 @@ case $BRANCH in + else + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media ++ if [[ $BOARD == jetson-nano ]]; then ++ MODULES_INITRD="jetson-nano-current" ++ fi + fi + + ;; +@@ -64,10 +79,13 @@ case $BRANCH in + edge) + export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. + KERNELPATCHDIR='media-'$BRANCH +- KERNELBRANCH="tag:v5.19-rc6" ++ KERNELBRANCH="branch:linux-5.19.y" + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH + SKIP_BOOTSPLASH="yes" ++ if [[ $BOARD == jetson-nano ]]; then ++ MODULES_INITRD="jetson-nano-edge" ++ fi + ;; + esac + +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index 283761378..3c7ab8cf8 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -49,8 +49,8 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.18.y' ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.19.y' + ;; + + esac +diff --git a/config/sources/families/rk322x.conf b/config/sources/families/rk322x.conf +index 3c62bbab0..1023d79d0 100644 +--- a/config/sources/families/rk322x.conf ++++ b/config/sources/families/rk322x.conf +@@ -27,8 +27,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.18.y' ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.19.y' + + ;; + +diff --git a/config/sources/families/rockchip-rk3588.conf b/config/sources/families/rockchip-rk3588.conf +index d794a5626..b58680299 100644 +--- a/config/sources/families/rockchip-rk3588.conf ++++ b/config/sources/families/rockchip-rk3588.conf +@@ -14,16 +14,16 @@ case $BRANCH in + BOOTDIR='u-boot-rockchip64' + KERNELDIR='linux-rockchip64' + KERNELSOURCE='https://github.com/radxa/kernel' ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. + KERNELBRANCH='branch:stable-5.10-rock5' + KERNELPATCHDIR='rockchip-rk3588-legacy' + +- ;; ++ ;; + + esac + + prepare_boot_configuration + +-family_tweaks_bsp() +-{ ++family_tweaks_bsp() { + : + } +diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf +index c971cba34..100210070 100644 +--- a/config/sources/families/rockchip.conf ++++ b/config/sources/families/rockchip.conf +@@ -33,8 +33,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.18.y' ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.19.y' + + ;; + + +From 2306f2c90751a293dfed429819496b1c7cce3ab0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 29 Jun 2022 10:38:41 +0200 +Subject: [PATCH] armbian-next: move `ROOTFSCACHE_VERSION` resolution from + GitHub from `main-config` down to `create-cache` + +- this way config does not depend on remote... +--- + lib/functions/configuration/main-config.sh | 7 ------- + lib/functions/rootfs/create-cache.sh | 7 +++++++ + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 87faa24e0..cdae96d38 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -33,13 +33,6 @@ function do_main_configuration() { + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit + +- # if variable not provided, check which is current version in the cache storage +- if [[ -z "${ROOTFSCACHE_VERSION}" ]]; then +- display_alert "ROOTFSCACHE_VERSION not set, getting remotely" "https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version" "warn" +- ROOTFSCACHE_VERSION=$(wget --tries=10 -O - -o /dev/null https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version || true) +- ROOTFSCACHE_VERSION=${ROOTFSCACHE_VERSION:-"0"} +- fi +- + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote | grep origin)") + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty) +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 8f060c88a..635631232 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -6,6 +6,13 @@ get_or_create_rootfs_cache_chroot_sdcard() { + local cycles=2 + fi + ++ # if variable not provided, check which is current version in the cache storage in GitHub. ++ if [[ -z "${ROOTFSCACHE_VERSION}" ]]; then ++ display_alert "ROOTFSCACHE_VERSION not set, getting remotely" "https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version" "debug" ++ ROOTFSCACHE_VERSION=$(wget --tries=10 -O - -o /dev/null https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version || true) ++ ROOTFSCACHE_VERSION=${ROOTFSCACHE_VERSION:-"0"} ++ fi ++ + # seek last cache, proceed to previous otherwise build it + for ((n = 0; n < cycles; n++)); do + + +From dfcfcbc5e08b81d294170bb901900f7772abc0ae Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 29 Jun 2022 13:26:06 +0200 +Subject: [PATCH] armbian-next: move `ARMBIAN_MIRROR` selection (network) from + `main-config` to `prepare-host` + +- this way CONFIG_DEFS_ONLY can run without touching the network +--- + lib/functions/configuration/main-config.sh | 19 ------------------- + lib/functions/host/prepare-host.sh | 20 ++++++++++++++++++++ + 2 files changed, 20 insertions(+), 19 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index b8369c436..87faa24e0 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -345,25 +345,6 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + fi + fi + +- # don't use mirrors that throws garbage on 404 +- if [[ -z ${ARMBIAN_MIRROR} && "${SKIP_ARMBIAN_REPO}" != "yes" ]]; then +- declare -i armbian_mirror_tries=1 +- while true; do +- display_alert "Obtaining Armbian mirror" "via https://redirect.armbian.com" "debug" +- ARMBIAN_MIRROR=$(wget -SO- -T 1 -t 1 https://redirect.armbian.com 2>&1 | egrep -i "Location" | awk '{print $2}' | head -1) +- if [[ ${ARMBIAN_MIRROR} != *armbian.hosthatch* ]]; then # @TODO: hosthatch is not good enough. Why? +- display_alert "Obtained Armbian mirror OK" "${ARMBIAN_MIRROR}" "debug" +- break +- else +- display_alert "Obtained Armbian mirror is invalid, retrying..." "${ARMBIAN_MIRROR}" "debug" +- fi +- armbian_mirror_tries=$((armbian_mirror_tries + 1)) +- if [[ $armbian_mirror_tries -ge 5 ]]; then +- exit_with_error "Unable to obtain ARMBIAN_MIRROR after ${armbian_mirror_tries} tries. Please set ARMBIAN_MIRROR to a valid mirror manually, or avoid the automatic mirror selection by setting SKIP_ARMBIAN_REPO=yes" +- fi +- done +- fi +- + # Control aria2c's usage of ipv6. + [[ -z $DISABLE_IPV6 ]] && DISABLE_IPV6="true" + +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index 99fbbf787..c91c50c25 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -25,6 +25,26 @@ prepare_host() { + + export LC_ALL="en_US.UTF-8" + ++ # don't use mirrors that throws garbage on 404 ++ if [[ -z ${ARMBIAN_MIRROR} && "${SKIP_ARMBIAN_REPO}" != "yes" ]]; then ++ display_alert "Determining best Armbian mirror to use" "via redirector" "debug" ++ declare -i armbian_mirror_tries=1 ++ while true; do ++ display_alert "Obtaining Armbian mirror" "via https://redirect.armbian.com" "debug" ++ ARMBIAN_MIRROR=$(wget -SO- -T 1 -t 1 https://redirect.armbian.com 2>&1 | egrep -i "Location" | awk '{print $2}' | head -1) ++ if [[ ${ARMBIAN_MIRROR} != *armbian.hosthatch* ]]; then # @TODO: hosthatch is not good enough. Why? ++ display_alert "Obtained Armbian mirror OK" "${ARMBIAN_MIRROR}" "debug" ++ break ++ else ++ display_alert "Obtained Armbian mirror is invalid, retrying..." "${ARMBIAN_MIRROR}" "debug" ++ fi ++ armbian_mirror_tries=$((armbian_mirror_tries + 1)) ++ if [[ $armbian_mirror_tries -ge 5 ]]; then ++ exit_with_error "Unable to obtain ARMBIAN_MIRROR after ${armbian_mirror_tries} tries. Please set ARMBIAN_MIRROR to a valid mirror manually, or avoid the automatic mirror selection by setting SKIP_ARMBIAN_REPO=yes" ++ fi ++ done ++ fi ++ + # packages list for host + # NOTE: please sync any changes here with the Dockerfile and Vagrantfile + declare -a host_dependencies=( + +From 8f2922f37b7ccc5c790c77d96bcc25ba5f13118b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Jul 2022 15:37:15 +0200 +Subject: [PATCH] armbian-next: manual merge (26) of MD5-checking via debsums + (3955) re-imagined + +- @TODO make sure +--- + lib/functions/rootfs/create-cache.sh | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 2a4e42d13..8f060c88a 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -221,6 +221,12 @@ function create_new_rootfs_cache() { + chroot_sdcard_apt_get install ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP + fi + ++ # stage: check md5 sum of installed packages. Just in case. ++ display_alert "Check MD5 sum of installed packages" "info" ++ export if_error_detail_message="Check MD5 sum of installed packages failed" ++ # shellcheck disable=SC2154 # this '$' and '\n' syntax is for dpkg-query ++ chroot_sdcard dpkg-query -f '"${binary:Package}\n"' -W "|" xargs debsums --silent || true # @TODO: ignore result for now until we can find all the divergences ++ + # Remove packages from packages.uninstall + display_alert "Uninstall packages" "$PACKAGE_LIST_UNINSTALL" "info" + # shellcheck disable=SC2086 + +From 733b9bfb06ea36373049b98751f42e13905247d5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Jul 2022 15:26:08 +0200 +Subject: [PATCH] armbian-next: manual merge (26) of sources/families changes + between revisions 20ee8c54502f877bfa563e113d67709cb80dc6f9 and + 9c52562176390624d33c93634e63a8f91cc0815b + +--- + config/sources/families/jetson-nano.conf | 10 +++++----- + config/sources/families/media.conf | 27 ++++++++++++++++++--------- + 2 files changed, 23 insertions(+), 14 deletions(-) + +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +index 7f7f07c72..f09f15845 100644 +--- a/config/sources/families/jetson-nano.conf ++++ b/config/sources/families/jetson-nano.conf +@@ -22,8 +22,8 @@ case $BRANCH in + ;; + + current) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.17.y" ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.18.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +@@ -31,9 +31,9 @@ case $BRANCH in + ;; + + edge) +- #SKIP_BOOTSPLASH="yes" +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.18.y" ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. ++ #KERNELBRANCH="branch:linux-5.19.y" ++ KERNELBRANCH="tag:v5.19-rc6" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 2b9f4e074..46ae3c100 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -3,10 +3,13 @@ source "${BASH_SOURCE%/*}/include/rockchip64_common.inc" + if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == bananapir2pro ]]; then + BOOTSOURCE='https://github.com/150balbes/u-boot-rk' + BOOTBRANCH='branch:rk356x' +- BOOTPATCHDIR="u-boot-media" ++ BOOTPATCHDIR="u-boot-station-p2" + elif [[ $BOARD == quartz64a ]]; then + BOOTSOURCE='https://github.com/150balbes/u-boot-rk' + BOOTBRANCH='branch:rk35xx' ++ BOOTPATCHDIR="u-boot-station-p2" ++else ++ BOOTBRANCH="tag:v2022.07" + BOOTPATCHDIR="u-boot-media" + fi + +@@ -44,21 +47,27 @@ case $BRANCH in + ;; + + current) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.17.y" +- KERNELBRANCH="tag:v5.17.9" +- KERNELPATCHDIR='media-'$BRANCH +- LINUXFAMILY=media ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.18.y" + LINUXCONFIG='linux-media-'$BRANCH ++ ++ if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == quartz64a || $BOARD == bananapir2pro ]]; then ++ KERNELPATCHDIR='station-p2-'$BRANCH ++ LINUXFAMILY=station-p2 ++ else ++ KERNELPATCHDIR='media-'$BRANCH ++ LINUXFAMILY=media ++ fi ++ + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.18.y" +- KERNELBRANCH="tag:v5.18" ++ export KERNEL_MAJOR_MINOR="5.19" # Major and minor versions of this kernel. + KERNELPATCHDIR='media-'$BRANCH ++ KERNELBRANCH="tag:v5.19-rc6" + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH ++ SKIP_BOOTSPLASH="yes" + ;; + esac + + +From 63aa49ecac9c0401f359bb3ad801af6f7618a5ce Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Jul 2022 15:17:50 +0200 +Subject: [PATCH] armbian-next: manual merge (26) of lib changes between + revisions 20ee8c54502f877bfa563e113d67709cb80dc6f9 and + 9c52562176390624d33c93634e63a8f91cc0815b + +- @TODO NOT including the md5/debsums check, that needs further rewrite +--- + lib/functions/configuration/interactive.sh | 2 +- + lib/functions/main/config-prepare.sh | 2 +- + lib/functions/rootfs/apt-install.sh | 3 --- + 3 files changed, 2 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/configuration/interactive.sh b/lib/functions/configuration/interactive.sh +index 325553433..743d8a22b 100644 +--- a/lib/functions/configuration/interactive.sh ++++ b/lib/functions/configuration/interactive.sh +@@ -1,5 +1,5 @@ + function interactive_config_prepare_terminal() { +- if [[ $BUILD_ALL != "yes" && -z $ROOT_FS_CREATE_ONLY ]]; then ++ if [[ -z $ROOT_FS_CREATE_ONLY ]]; then + if [[ -t 0 ]]; then # "-t fd return True if file descriptor fd is open and refers to a terminal". 0 = stdin, 1 = stdout, 2 = stderr, 3+ custom + # override stty size, if stdin is a terminal. + [[ -n $COLUMNS ]] && stty cols $COLUMNS +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 0264b0d9e..d39d7c4be 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -117,7 +117,7 @@ function prepare_and_config_main_build_single() { + + if [[ $BETA == yes ]]; then + IMAGE_TYPE=nightly +- elif [[ $BETA != "yes" && $BUILD_ALL == yes ]]; then ++ elif [[ $BETA != "yes" ]]; then + IMAGE_TYPE=stable + else + IMAGE_TYPE=user-built +diff --git a/lib/functions/rootfs/apt-install.sh b/lib/functions/rootfs/apt-install.sh +index b2406f339..256d9bec9 100644 +--- a/lib/functions/rootfs/apt-install.sh ++++ b/lib/functions/rootfs/apt-install.sh +@@ -25,9 +25,6 @@ install_deb_chroot() { + + display_alert "Installing${desc}" "${name/\/root\//}" + +- # when building in bulk from remote, lets make sure we have up2date index +- [[ $BUILD_ALL == yes && ${variant} == remote ]] && chroot_sdcard_apt_get update +- + # install in chroot via apt-get, not dpkg, so dependencies are also installed from repo if needed. + export if_error_detail_message="Installation of $name failed ${BOARD} ${RELEASE} ${BUILD_DESKTOP} ${LINUXFAMILY}" + chroot_sdcard_apt_get --no-install-recommends install "${name}" + +From a71814dfd278aa138d679c56026f7de1d4d6d892 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 29 Jun 2022 10:06:29 +0200 +Subject: [PATCH] armbian-next: manual merge (25) of lib changes between + revisions fe972621c61f339c9b84aaf94fd851fa789882e8 and + 20ee8c54502f877bfa563e113d67709cb80dc6f9 + +- @TODO hmm Igor is now going out to the network for rootfs cache version during configuration phase!!! BAD BAD BAD +--- + lib/functions/configuration/main-config.sh | 9 ++++++++- + lib/functions/general/downloads.sh | 16 +++++++++++----- + lib/functions/rootfs/create-cache.sh | 12 +++++++----- + 3 files changed, 26 insertions(+), 11 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 0fdb35bdd..b8369c436 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,14 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=20 ++ ++ # if variable not provided, check which is current version in the cache storage ++ if [[ -z "${ROOTFSCACHE_VERSION}" ]]; then ++ display_alert "ROOTFSCACHE_VERSION not set, getting remotely" "https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version" "warn" ++ ROOTFSCACHE_VERSION=$(wget --tries=10 -O - -o /dev/null https://github.com/armbian/mirror/releases/download/rootfs/rootfscache.version || true) ++ ROOTFSCACHE_VERSION=${ROOTFSCACHE_VERSION:-"0"} ++ fi ++ + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote | grep origin)") + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty) +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index ecd383e12..97afb81a4 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -1,17 +1,22 @@ + function webseed() { ++ + # list of mirrors that host our files + unset text +- # Hardcoded to EU mirrors since + local CCODE=$(curl -s redirect.armbian.com/geoip | jq '.continent.code' -r) +- WEBSEED=($(curl -s https://redirect.armbian.com/mirrors | jq -r '.'${CCODE}' | .[] | values')) ++ ++ if [[ "$2" == "rootfs" ]]; then ++ WEBSEED=($(curl -s ${1}mirrors | jq -r '.'${CCODE}' | .[] | values')) ++ else ++ WEBSEED=($(curl -s https://redirect.armbian.com/mirrors | jq -r '.'${CCODE}' | .[] | values')) ++ fi ++ + # remove dead mirrors to suppress download errors +- FILE=".control" + while read -r line; do + REMOVE=$(echo $line | egrep -o 'https?://[^ ]+/') + WEBSEED=("${WEBSEED[@]/$REMOVE/}") + done < <( + for k in ${WEBSEED[@]}; do +- echo "$k$FILE" ++ echo "$k$2/$3" + done | parallel --halt soon,fail=10 --jobs 32 wget -q --spider --timeout=15 --tries=4 --retry-connrefused {} 2>&1 > /dev/null + ) + +@@ -26,8 +31,9 @@ function webseed() { + https://mirrors.bfsu.edu.cn/armbian-releases/ + ) + fi ++ + for toolchain in ${WEBSEED[@]}; do +- text="${text} ${toolchain}${1}" ++ text="${text} ${toolchain}"$2/"${3}" + done + text="${text:1}" + echo "${text}" +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index fab43781b..2a4e42d13 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -9,9 +9,10 @@ get_or_create_rootfs_cache_chroot_sdcard() { + # seek last cache, proceed to previous otherwise build it + for ((n = 0; n < cycles; n++)); do + +- [[ -z ${FORCED_MONTH_OFFSET} ]] && FORCED_MONTH_OFFSET=${n} ++ FORCED_MONTH_OFFSET=${n} ++ + local packages_hash +- packages_hash=$(get_package_list_hash "$(date -d "$D +${FORCED_MONTH_OFFSET} month" +"%Y-%m-module$ROOTFSCACHE_VERSION" | sed 's/^0*//')") ++ packages_hash=$(get_package_list_hash "$(date -d "$D -${FORCED_MONTH_OFFSET} month" +"%Y-%m-module$ROOTFSCACHE_VERSION" | sed 's/^0*//')") + + local cache_type="cli" + [[ ${BUILD_DESKTOP} == yes ]] && cache_type="xfce-desktop" +@@ -33,7 +34,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + display_alert "Checking local cache" "$display_name" "info" + + if [[ -f ${cache_fname} && -n "$ROOT_FS_CREATE_ONLY" ]]; then +- touch "${cache_fname}.current" ++ echo "$cache_fname" > $cache_fname.current + display_alert "Checking cache integrity" "$display_name" "info" + + sudo zstd -tqq "${cache_fname}" || { +@@ -52,6 +53,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + else + display_alert "searching on servers" + download_and_verify "_rootfs" "$cache_name" ++ [[ -f ${cache_fname} ]] && break + fi + + if [[ ! -f $cache_fname ]]; then +@@ -64,7 +66,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + + # speed up checking + if [[ -n "$ROOT_FS_CREATE_ONLY" ]]; then +- touch $cache_fname.current ++ echo "$cache_fname" > $cache_fname.current + umount --lazy "$SDCARD" + rm -rf $SDCARD + # remove exit trap +@@ -85,7 +87,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + create_new_rootfs_cache + + # needed for backend to keep current only +- touch "${cache_fname}.current" ++ echo "$cache_fname" > $cache_fname.current + + fi + + +From 7b782918ecd066682e15b10a37a076d8ab07c70c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 29 Jun 2022 09:59:36 +0200 +Subject: [PATCH] armbian-next: manual merge (25) of family changes between + revisions fe972621c61f339c9b84aaf94fd851fa789882e8 and + 20ee8c54502f877bfa563e113d67709cb80dc6f9 + +--- + config/sources/families/include/rockchip64_common.inc | 10 ++++------ + config/sources/families/media.conf | 4 ++-- + 2 files changed, 6 insertions(+), 8 deletions(-) + +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index e69a41cf0..44d4d22dc 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -439,12 +439,10 @@ family_tweaks_bsp() { + fi + + if [[ $BOARD == rk3318-box ]]; then +- +- # Optional board dtbo selection script +- mkdir -p $destination/usr/local/bin +- install -m 755 $SRC/packages/bsp/rk3318/rk3318-config $destination/usr/sbin +- +- fi ++ # Optional board dtbo selection script ++ mkdir -p $destination/usr/local/bin ++ install -m 755 $SRC/packages/bsp/rk3318/rk3318-config $destination/usr/sbin ++ fi + + if [[ $BOARD == pinebook-pro ]]; then + +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 3b5bbe589..2b9f4e074 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -1,6 +1,6 @@ + source "${BASH_SOURCE%/*}/include/rockchip64_common.inc" + +-if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then ++if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == bananapir2pro ]]; then + BOOTSOURCE='https://github.com/150balbes/u-boot-rk' + BOOTBRANCH='branch:rk356x' + BOOTPATCHDIR="u-boot-media" +@@ -15,7 +15,7 @@ case $BRANCH in + legacy) + KERNELDIR='linux-rockchip64' + +- if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then ++ if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == bananapir2pro ]]; then + KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' + export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='branch:kernel-4.19' + +From 35a5ec860a5729794add0bc3f5b71f4dc09cd708 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 22 Jun 2022 20:23:12 +0200 +Subject: [PATCH] armbian-next: manual merge (24) of families changes between + revisions 9ca9120420aa2a39b91ab7283a7dafe113de42e8 and + 560531a63505eb610d269b26858689307a9483f5 + +--- + config/sources/families/include/meson64_common.inc | 3 +- + .../sources/families/include/rockchip64_common.inc | 46 ++++++++++++++-------- + 2 files changed, 32 insertions(+), 17 deletions(-) + +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index 7d79b6930..d902756e7 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -25,7 +25,8 @@ case $BRANCH in + legacy) + KERNELSOURCE='https://github.com/hardkernel/linux' + export KERNEL_MAJOR_MINOR="4.9" # Major and minor versions of this kernel. For mainline caching. +- KERNELBRANCH='branch:odroidg12-4.9.y' ++ #KERNELBRANCH='branch:odroidg12-4.9.y' ++ KERNELBRANCH='tag:4.9.277-122' + ;; + + current) +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index be6951bff..e69a41cf0 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -16,8 +16,24 @@ PACKAGE_LIST_FAMILY="ethtool" + + RKBIN_DIR="$SRC/cache/sources/rkbin-tools" + ++# Common variables: ++# BOOT_SCENARIO - determines which tpl (ddrbin), spl and ATF combination to use ++# ++# Different boot scenario can arrange: ++# * Phase 1: DDR initialization (proprietary rockchip ddrbin or u-boot TPL) ++# * Phase 2: Initial system and clock initialization (proprietary rockchip miniload or u-boot SPL) ++# * Phase 3: Arm Trusted Firmware (proprietary rockchip or mainline opensource) ++# * Phase 4: u-boot proper is always the mainline one ++# ++# Available options for BOOT_SCENARIO are: ++# - only-blobs: proprietary rockchip ddrbin, miniloader and ATF ++# - spl-blobs: proprietary rockchip ddrin and ATF, but uses mainline u-boot SPL in place of rockchip miniloader ++# - tpl-spl-blob: uses mainline u-boot TPL and SPL with proprietary rockchip ATF blob ++# - tpl-blob-atf-mainline: proprietary rockchip ddrbin + mainline u-boot SPL + mainline ATF ++# - blobless: mainline u-boot TPL + mainline u-boot SPL + mainline ATF ++ ++#BOOT_SOC=`expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*'` + BOOT_SOC=${BOOT_SOC:=$(expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*')} +-display_alert "BOOT_SOC:" "$BOOT_SOC" "debug" + + CPUMIN=${CPUMIN:="408000"} + +@@ -42,44 +58,41 @@ fi + if [[ $BOOT_SOC == rk3328 ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=only-blobs}" +- DDR_BLOB='rk33/rk3328_ddr_333MHz_v1.16.bin' ++ DDR_BLOB="${DDR_BLOB:=rk33/rk3328_ddr_333MHz_v1.16.bin}" + MINILOADER_BLOB='rk33/rk322xh_miniloader_v2.50.bin' + BL31_BLOB='rk33/rk322xh_bl31_v1.44.elf' + + elif [[ $BOOT_SOC == rk3399 ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=only-blobs}" +- DDR_BLOB='rk33/rk3399_ddr_933MHz_v1.25.bin' ++ DDR_BLOB="${DDR_BLOB:=rk33/rk3399_ddr_933MHz_v1.25.bin}" + MINILOADER_BLOB='rk33/rk3399_miniloader_v1.26.bin' + BL31_BLOB='rk33/rk3399_bl31_v1.35.elf' + + elif [[ $BOOT_SOC == rk3399pro ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=only-blobs}" +- DDR_BLOB='rk33/rk3399pro_npu_ddr_933MHz_v1.02.bin' ++ DDR_BLOB="${DDR_BLOB:=rk33/rk3399pro_npu_ddr_933MHz_v1.02.bin}" + MINILOADER_BLOB='rk33/rk3399pro_miniloader_v1.26.bin' + BL31_BLOB='rk33/rk3399pro_bl31_v1.35.elf' + + elif [[ $BOOT_SOC == rk3566 ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" +- DDR_BLOB='rk35/rk3566_ddr_1056MHz_v1.10.bin' ++ DDR_BLOB="${DDR_BLOB:=rk35/rk3566_ddr_1056MHz_v1.10.bin}" + BL31_BLOB='rk35/rk3568_bl31_v1.29.elf' + + elif [[ $BOOT_SOC == rk3568 ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" +- DDR_BLOB="${DDR_BLOB:-"rk35/rk3568_ddr_1560MHz_v1.10.bin"}" +- BL31_BLOB="${BL31_BLOB:-"rk35/rk3568_bl31_v1.28.elf"}" +- display_alert "BOOT_SCENARIO:" "$BOOT_SCENARIO" "debug" +- display_alert "DDR_BLOB:" "$DDR_BLOB" "debug" +- display_alert "BL31_BLOB:" "$BL31_BLOB" "debug" ++ DDR_BLOB="${DDR_BLOB:=rk35/rk3568_ddr_1560MHz_v1.10.bin}" ++ BL31_BLOB='rk35/rk3568_bl31_v1.28.elf' + + elif [[ $BOARD == rockpi-s ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=only-blobs}" + BOOT_SOC=rk3308 +- DDR_BLOB='rk33/rk3308_ddr_589MHz_uart2_m1_v1.30.bin' ++ DDR_BLOB="${DDR_BLOB:=rk33/rk3308_ddr_589MHz_uart2_m1_v1.30.bin}" + MINILOADER_BLOB='rk33/rk3308_miniloader_v1.22.bin' + BL31_BLOB='rk33/rk3308_bl31_v2.22.elf' + +@@ -114,7 +127,7 @@ case $BRANCH in + esac + + prepare_boot_configuration() { +- if [[ $BOOT_SCENARIO == "blobless" ]]; then ++ if [[ $BOOT_SCENARIO == "blobless" || $BOOT_SCENARIO == "tpl-blob-atf-mainline" ]]; then + + UBOOT_TARGET_MAP="BL31=bl31.elf idbloader.img u-boot.itb;;idbloader.img u-boot.itb" + ATFSOURCE='https://github.com/ARM-software/arm-trusted-firmware' +@@ -125,6 +138,8 @@ prepare_boot_configuration() { + ATF_TARGET_MAP="M0_CROSS_COMPILE=arm-linux-gnueabi- PLAT=$BOOT_SOC bl31;;build/$BOOT_SOC/release/bl31/bl31.elf:bl31.elf" + ATF_TOOLCHAIN2="arm-linux-gnueabi-:< 10.0" + ++ [[ $BOOT_SCENARIO == "tpl-blob-atf-mainline" ]] && UBOOT_TARGET_MAP="BL31=bl31.elf idbloader.img u-boot.itb;;idbloader.img u-boot.itb" ++ + elif [[ $BOOT_SCENARIO == "tpl-spl-blob" ]]; then + + UBOOT_TARGET_MAP="BL31=$RKBIN_DIR/$BL31_BLOB idbloader.img u-boot.itb;;idbloader.img u-boot.itb" +@@ -133,7 +148,6 @@ prepare_boot_configuration() { + + elif [[ $BOOT_SCENARIO == "spl-blobs" ]]; then + +- display_alert "BOOT Scenario is" "spl-blobs" "debug" + UBOOT_TARGET_MAP="BL31=$RKBIN_DIR/$BL31_BLOB spl/u-boot-spl.bin u-boot.dtb u-boot.itb;;idbloader.img u-boot.itb" + ATFSOURCE='' + ATF_COMPILE='no' +@@ -161,8 +175,8 @@ uboot_custom_postprocess() { + + if [[ $BOOT_SCENARIO == "blobless" || $BOOT_SCENARIO == "tpl-spl-blob" ]]; then + : +- elif [[ $BOOT_SCENARIO == "spl-blobs" ]]; then +- display_alert "mkimage for $BOOT_SOC with $BOOT_SCENARIO" "spl-blobs" "debug" ++ elif [[ $BOOT_SCENARIO == "spl-blobs" || $BOOT_SCENARIO == "tpl-blob-atf-mainline" ]]; then ++ display_alert "mkimage for $BOOT_SOC with $BOOT_SCENARIO" "spl-blobs/tpl-blob-atf-mainline" "debug" + run_host_command_logged tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img + + elif [[ $BOOT_SCENARIO == "only-blobs" ]]; then +@@ -372,7 +386,7 @@ family_tweaks_bsp() { + fi + + if [[ $BOARD == orangepi4-lts ]]; then +- ++ + # Bluetooth on orangepi 4 LTS board is handled by a Spreadtrum (sprd) chip and requires + # a custom hciattach_opi binary, plus a systemd service to run it at boot time + install -m 755 $SRC/packages/bsp/rk3399/hciattach_opi $destination/usr/bin + +From ac26f77b6eaebec9d11537995eeadb07bf87c54a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 22 Jun 2022 20:22:08 +0200 +Subject: [PATCH] armbian-next: manual merge (24) of lib changes between + revisions 9ca9120420aa2a39b91ab7283a7dafe113de42e8 and + 560531a63505eb610d269b26858689307a9483f5 + +--- + lib/functions/configuration/main-config.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 59dcdbe7f..0fdb35bdd 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=19 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=20 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote | grep origin)") + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty) + +From d868b7b64ae2da0614078cccefab59804715542c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 17 Jun 2022 12:19:32 +0200 +Subject: [PATCH] armbian-next: manual merge (23) of all changes between + revisions 17b4fb913c76233d1e2126cfd35ecb85acfa5a25 and + 9ca9120420aa2a39b91ab7283a7dafe113de42e8 + +--- + config/sources/families/sun50iw6.conf | 12 ++++++++++++ + lib/functions/configuration/main-config.sh | 2 +- + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/config/sources/families/sun50iw6.conf b/config/sources/families/sun50iw6.conf +index 874e12e1f..6b05a17b9 100644 +--- a/config/sources/families/sun50iw6.conf ++++ b/config/sources/families/sun50iw6.conf +@@ -26,6 +26,11 @@ case $BRANCH in + esac + + family_tweaks_s() { ++ if [[ -f $SDCARD/lib/systemd/system/aw859a-bluetooth.service ]]; then ++ # install and enable Bluetooth ++ chroot $SDCARD /bin/bash -c "apt-get -y -qq install rfkill bluetooth bluez bluez-tools >/dev/null 2>&1" ++ chroot $SDCARD /bin/bash -c "systemctl --no-reload enable aw859a-bluetooth.service >/dev/null 2>&1" ++ fi + + if [[ $BUILD_DESKTOP == yes && $BOARD == orangepi3-lts ]]; then + +@@ -34,5 +39,12 @@ family_tweaks_s() { + echo "load-module module-alsa-sink device=hw:1,0 sink_name=HDMI-Playback sink_properties=\"device.description='HDMI Audio'\"" >> ${SDCARD}/etc/pulse/default.pa + + fi ++} ++ ++family_tweaks_bsp() { ++ if [[ ${BOARD} == orangepi3-lts ]]; then ++ cp $SRC/packages/bsp/sunxi/aw859a-bluetooth.service $destination/lib/systemd/system/ ++ fi + ++ install -m 755 $SRC/packages/blobs/bt/hciattach/hciattach_opi_${ARCH} $destination/usr/bin/hciattach_opi + } +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 31c4d6280..59dcdbe7f 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=18 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=19 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote | grep origin)") + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty) + +From d4904385fe7e7506638e68638e348d9f0b412bd7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 12 Jun 2022 14:03:44 +0200 +Subject: [PATCH] armbian-next: manual merge (22) of all changes between + revisions 0eb8fe7497aebf341bead2b3b0fb7309fd7bdc14 and + 1dddf78cd0ed096edd6506241cfd9aa8cc27ba4e + +- @TODO EXCEPT the insanity about locales/eval/VERYSILENT in #3850, requires deep review +--- + config/sources/families/bcm2711.conf | 4 +-- + config/sources/families/imx6.conf | 4 +-- + config/sources/families/include/meson_common.inc | 14 ++++++++- + .../sources/families/include/rockchip64_common.inc | 34 +++++++++++++++++----- + config/sources/families/include/sunxi64_common.inc | 6 ++-- + config/sources/families/include/sunxi_common.inc | 6 ++-- + config/sources/families/include/uefi_common.inc | 4 +-- + config/sources/families/mvebu64.conf | 10 +++---- + config/sources/families/odroidxu4.conf | 6 ++-- + config/sources/families/rk322x.conf | 4 +-- + config/sources/families/rockchip.conf | 8 ++--- + lib/functions/compilation/patch/kernel-drivers.sh | 16 +++++----- + lib/functions/compilation/uboot.sh | 5 ++-- + lib/functions/extras/buildpkg.sh | 29 +++++++++++++----- + lib/functions/host/prepare-host.sh | 2 +- + lib/functions/image/partitioning.sh | 2 +- + 16 files changed, 99 insertions(+), 55 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 2b19132e2..5ae60578a 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -28,8 +28,8 @@ case "${BRANCH}" in + edge) + export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. For mainline caching. +- export KERNELBRANCH="branch:rpi-5.17.y" ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:rpi-5.18.y" + export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" + export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; +diff --git a/config/sources/families/imx6.conf b/config/sources/families/imx6.conf +index f2bcf95a1..9a7bd9331 100644 +--- a/config/sources/families/imx6.conf ++++ b/config/sources/families/imx6.conf +@@ -16,8 +16,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.17.y' ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.18.y' + + ;; + +diff --git a/config/sources/families/include/meson_common.inc b/config/sources/families/include/meson_common.inc +index e83c382de..5b53ff90c 100644 +--- a/config/sources/families/include/meson_common.inc ++++ b/config/sources/families/include/meson_common.inc +@@ -4,7 +4,6 @@ BOOTBRANCH='branch:odroidc-v2011.03' + BOOTDIR='u-boot-odroidc1' + UBOOT_COMPILER="arm-linux-gnueabihf-" + UBOOT_USE_GCC='< 4.9' +-BOOTSCRIPT="boot-odroid-c1.ini:boot.ini" + SERIALCON="ttyAML0" + UBOOT_TARGET_MAP=';;sd_fuse/bl1.bin.hardkernel sd_fuse/u-boot.bin' + SRC_LOADADDR='LOADADDR=0x00208000' +@@ -44,6 +43,19 @@ case $BRANCH in + ;; + esac + ++case $BOARD in ++ odroidc1) ++ ++ BOOTSCRIPT="boot-odroid-c1.ini:boot.ini" ++ ++ ;; ++ onecloud) ++ ++ BOOTSCRIPT="boot-onecloud.cmd:boot.cmd" ++ ++ ;; ++esac ++ + write_uboot_platform() { + dd if=$1/bl1.bin.hardkernel of=$2 bs=1 count=442 conv=fsync > /dev/null 2>&1 + dd if=$1/bl1.bin.hardkernel of=$2 bs=512 skip=1 seek=1 conv=fsync > /dev/null 2>&1 +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 7fc026892..be6951bff 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -116,14 +116,14 @@ esac + prepare_boot_configuration() { + if [[ $BOOT_SCENARIO == "blobless" ]]; then + +- UBOOT_TARGET_MAP="BL31=bl31.bin idbloader.img u-boot.itb;;idbloader.img u-boot.itb" ++ UBOOT_TARGET_MAP="BL31=bl31.elf idbloader.img u-boot.itb;;idbloader.img u-boot.itb" + ATFSOURCE='https://github.com/ARM-software/arm-trusted-firmware' + ATF_COMPILER='aarch64-linux-gnu-' + ATFDIR='arm-trusted-firmware' + ATFBRANCH='tag:v2.6' + ATF_USE_GCC='> 6.3' +- ATF_TARGET_MAP="M0_CROSS_COMPILE=arm-linux-gnueabi- PLAT=$BOOT_SOC bl31;;build/$BOOT_SOC/release/bl31/bl31.elf:bl31.bin" +- ATF_TOOLCHAIN2="arm-linux-gnueabi-:> 5.0" ++ ATF_TARGET_MAP="M0_CROSS_COMPILE=arm-linux-gnueabi- PLAT=$BOOT_SOC bl31;;build/$BOOT_SOC/release/bl31/bl31.elf:bl31.elf" ++ ATF_TOOLCHAIN2="arm-linux-gnueabi-:< 10.0" + + elif [[ $BOOT_SCENARIO == "tpl-spl-blob" ]]; then + +@@ -148,7 +148,11 @@ prepare_boot_configuration() { + + if [[ $BOOT_SUPPORT_SPI == yes ]]; then + +- UBOOT_TARGET_MAP="BL31=$RKBIN_DIR/$BL31_BLOB tpl/u-boot-tpl.bin spl/u-boot-spl.bin u-boot.itb ${UBOOT_TARGET_MAP} rkspi_loader.img" ++ if [[ $BOARD != "rock-3a" ]]; then ++ UBOOT_TARGET_MAP="BL31=$RKBIN_DIR/$BL31_BLOB tpl/u-boot-tpl.bin spl/u-boot-spl.bin u-boot.itb ${UBOOT_TARGET_MAP} rkspi_loader.img" ++ else ++ UBOOT_TARGET_MAP="${UBOOT_TARGET_MAP} rkspi_loader.img" ++ fi + + fi + } +@@ -175,10 +179,24 @@ uboot_custom_postprocess() { + fi + + if [[ $BOOT_SUPPORT_SPI == yes ]]; then +- tools/mkimage -n $BOOT_SOC -T rkspi -d tpl/u-boot-tpl.bin:spl/u-boot-spl.bin rkspi_tpl_spl.img +- dd if=/dev/zero of=rkspi_loader.img count=8128 status=none +- dd if=rkspi_tpl_spl.img of=rkspi_loader.img conv=notrunc status=none +- dd if=u-boot.itb of=rkspi_loader.img seek=768 conv=notrunc status=none ++ if [[ $BOARD == "rock-3a" ]]; then ++ dd if=/dev/zero of=rkspi_loader.img bs=1M count=0 seek=16 ++ /sbin/parted -s rkspi_loader.img mklabel gpt ++ /sbin/parted -s rkspi_loader.img unit s mkpart idbloader 64 7167 ++ /sbin/parted -s rkspi_loader.img unit s mkpart vnvm 7168 7679 ++ /sbin/parted -s rkspi_loader.img unit s mkpart reserved_space 7680 8063 ++ /sbin/parted -s rkspi_loader.img unit s mkpart reserved1 8064 8127 ++ /sbin/parted -s rkspi_loader.img unit s mkpart uboot_env 8128 8191 ++ /sbin/parted -s rkspi_loader.img unit s mkpart reserved2 8192 16383 ++ /sbin/parted -s rkspi_loader.img unit s mkpart uboot 16384 32734 ++ dd if=idbloader.img of=rkspi_loader.img seek=64 conv=notrunc ++ dd if=u-boot.itb of=rkspi_loader.img seek=16384 conv=notrunc ++ else ++ tools/mkimage -n $BOOT_SOC -T rkspi -d tpl/u-boot-tpl.bin:spl/u-boot-spl.bin rkspi_tpl_spl.img ++ dd if=/dev/zero of=rkspi_loader.img count=8128 status=none ++ dd if=rkspi_tpl_spl.img of=rkspi_loader.img conv=notrunc status=none ++ dd if=u-boot.itb of=rkspi_loader.img seek=768 conv=notrunc status=none ++ fi + fi + } + +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index 61addb39b..299d16253 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -26,9 +26,9 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- export KERNELBRANCH="branch:linux-5.17.y" +- export KERNELBRANCH_MEGOUS="branch:orange-pi-5.17" ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ export KERNELBRANCH="branch:linux-5.18.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.18" + ;; + esac + +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index 8ac7a5551..9d120c711 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -27,9 +27,9 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- export KERNELBRANCH="branch:linux-5.17.y" +- export KERNELBRANCH_MEGOUS="branch:orange-pi-5.17" ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ export KERNELBRANCH="branch:linux-5.18.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.18" + ;; + esac + +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index 821ed660a..699d09e4a 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -22,8 +22,8 @@ case "${BRANCH}" in + edge) + export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. For mainline caching. +- export KERNELBRANCH="branch:linux-5.17.y" # Branch or tag to build from. It should match MAJOR_MINOR ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:linux-5.18.y" # Branch or tag to build from. It should match MAJOR_MINOR + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. + ;; + esac +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index fe35a0055..283761378 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -49,8 +49,8 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.17.y' ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.18.y' + ;; + + esac +@@ -75,14 +75,14 @@ family_tweaks() { + [[ -f $SDCARD/etc/netplan/armbian-default.yaml ]] && sed -i "s/^ renderer.*/ renderer: networkd/" $SDCARD/etc/netplan/armbian-default.yaml + cp $SRC/packages/bsp/mvebu64/networkd/10* $SDCARD/etc/systemd/network/ + if [[ $BOARD = "espressobin" ]]; then +- echo "#Marvell Espressobin Console" >> $SDCARD/etc/securetty +- echo "ttyMV0" >> $SDCARD/etc/securetty ++ echo "#Marvell Espressobin Console" >> $SDCARD/etc/securetty ++ echo "ttyMV0" >> $SDCARD/etc/securetty + fi + } + + family_tweaks_bsp() { + if [[ $BOARD = "espressobin" ]]; then +- cp "$SRC/packages/bsp/mvebu64/initramfs/99-uboot-fit" "$destination/etc/initramfs/post-update.d/" ++ cp "$SRC/packages/bsp/mvebu64/initramfs/99-uboot-fit" "$destination/etc/initramfs/post-update.d/" + fi + } + +diff --git a/config/sources/families/odroidxu4.conf b/config/sources/families/odroidxu4.conf +index 992b2bbb2..75916a25b 100644 +--- a/config/sources/families/odroidxu4.conf ++++ b/config/sources/families/odroidxu4.conf +@@ -25,8 +25,10 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.17.y' ++ KERNELSOURCE='https://github.com/tobetter/linux' ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:odroid-5.18.y' ++ KERNELDIR='linux-odroidxu4' + ;; + + esac +diff --git a/config/sources/families/rk322x.conf b/config/sources/families/rk322x.conf +index d707d55c8..3c62bbab0 100644 +--- a/config/sources/families/rk322x.conf ++++ b/config/sources/families/rk322x.conf +@@ -27,8 +27,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.17.y' ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.18.y' + + ;; + +diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf +index a264c669f..c971cba34 100644 +--- a/config/sources/families/rockchip.conf ++++ b/config/sources/families/rockchip.conf +@@ -6,9 +6,9 @@ OVERLAY_PREFIX='rockchip' + UBOOT_TARGET_MAP=";;$SRC/packages/blobs/rockchip/rk3288_boot.bin u-boot-rockchip-with-spl.bin" + BOOTDELAY=1 + if [[ $BOARD == miqi ]]; then +-BOOTBRANCH='tag:v2017.11' ++ BOOTBRANCH='tag:v2017.11' + else +-BOOTBRANCH='tag:v2022.04' ++ BOOTBRANCH='tag:v2022.04' + fi + + SERIALCON=ttyS2 +@@ -33,8 +33,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.17.y' ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.18.y' + + ;; + +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 91b5d5070..9df0b81ca 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -31,15 +31,14 @@ function prepare_extra_kernel_drivers() { + # + # Older versions have AUFS support with a patch + +- if linux-version compare "${version}" ge 5.10 && linux-version compare "${version}" lt 5.15 && [ "$AUFS" == yes ]; then +- # @TODO: Fasthash for this whole block is only the git hash of revision we'd apply from Mr. Okajima ++ if linux-version compare "${version}" gt 5.11 && linux-version compare "${version}" lt 5.19 && [ "$AUFS" == yes ]; then + # attach to specifics tag or branch + local aufstag + aufstag=$(echo "${version}" | cut -f 1-2 -d ".") + + # manual overrides + if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufstag="5.10.82"; fi +- if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufstag="5.15.5"; fi ++ if linux-version compare "${version}" ge 5.15.41 && linux-version compare "${version}" le 5.16; then aufstag="5.15.41"; fi + if linux-version compare "${version}" ge 5.17.3 && linux-version compare "${version}" le 5.18; then aufstag="5.17.3"; fi + + # check if Mr. Okajima already made a branch for this version +@@ -276,14 +275,13 @@ function prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek RTL8811CU and RTL8821C chipsets + + if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then +- # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch +- local rtl8811cuver="commit:2bebdb9a35c1d9b6e6a928e371fa39d5fcec8a62" ++ local rtl8811cuver="commit:8c2226a74ae718439d56248bd2e44ccf717086d5" + + display_alert "Adding" "Wireless drivers for Realtek RTL8811CU and RTL8821C chipsets ${rtl8811cuver}" "info" + +- fetch_from_repo "https://github.com/brektrou/rtl8821CU" "rtl8811cu" "${rtl8811cuver}" "yes" ++ fetch_from_repo "$GITHUB_SOURCE/brektrou/rtl8821CU" "rtl8811cu" "${rtl8811cuver}" "yes" + cd "$kerneldir" || exit + rm -rf "$kerneldir/drivers/net/wireless/rtl8811cu" + mkdir -p "$kerneldir/drivers/net/wireless/rtl8811cu/" +@@ -303,7 +301,7 @@ function prepare_extra_kernel_drivers() { + sed -i "s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/" \ + "$kerneldir/drivers/net/wireless/rtl8811cu/Makefile" + +- # Address ARM related bug https://github.com/aircrack-ng/rtl8812au/issues/233 ++ # Address ARM related bug $GITHUB_SOURCE/aircrack-ng/rtl8812au/issues/233 + sed -i "s/^CONFIG_MP_VHT_HW_TX_MODE.*/CONFIG_MP_VHT_HW_TX_MODE = n/" \ + "$kerneldir/drivers/net/wireless/rtl8811cu/Makefile" + +@@ -312,8 +310,8 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8811cu\/Kconfig"' \ + "$kerneldir/drivers/net/wireless/Kconfig" + +- # add support for K5.17+ +- process_patch_file "${SRC}/patch/misc/wireless-realtek-8811cu-5.17.patch" "applying" ++ # add support for 5.18.y ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8821cu.patch" "applying" + + fi + +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 699946406..af62d3c4d 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -32,8 +32,9 @@ function compile_uboot_target() { + + if [[ -n $ATFSOURCE && -d "${atftempdir}" ]]; then + display_alert "Copying over bins from atftempdir" "${atftempdir}" "debug" +- cp -Rv "${atftempdir}"/*.bin . +- rm -rf "${atftempdir}" ++ run_host_command_logged cp -Rv "${atftempdir}"/*.bin . ++ run_host_command_logged cp -Rv "${atftempdir}"/*.elf . ++ run_host_command_logged rm -rf "${atftempdir}" + fi + + display_alert "${uboot_prefix}Preparing u-boot config" "${version} ${target_make}" "info" +diff --git a/lib/functions/extras/buildpkg.sh b/lib/functions/extras/buildpkg.sh +index e79924426..8bd4f046f 100644 +--- a/lib/functions/extras/buildpkg.sh ++++ b/lib/functions/extras/buildpkg.sh +@@ -36,7 +36,7 @@ create_chroot() { + components['focal']='main,universe,multiverse' + components['jammy']='main,universe,multiverse' + display_alert "Creating build chroot" "$release/$arch" "info" +- local includes="ccache,locales,git,ca-certificates,devscripts,libfile-fcntllock-perl,debhelper,rsync,python3,distcc,apt-utils" ++ local includes="ccache,locales,git,ca-certificates,libfile-fcntllock-perl,rsync,python3,distcc,apt-utils" + + # perhaps a temporally workaround + case $release in +@@ -68,9 +68,15 @@ create_chroot() { + mkdir -p "${target_dir}"/usr/share/keyrings/ && + cp /usr/share/keyrings/debian-archive-keyring.gpg "${target_dir}"/usr/share/keyrings/ + +- chroot "${target_dir}" /bin/bash -c "/debootstrap/debootstrap --second-stage" ++ eval 'LC_ALL=C LANG=C chroot "${target_dir}" \ ++ /bin/bash -c "/debootstrap/debootstrap --second-stage"' + [[ $? -ne 0 || ! -f "${target_dir}"/bin/bash ]] && exit_with_error "Create chroot second stage failed" + ++ [[ -f "${target_dir}"/etc/locale.gen ]] && ++ sed -i '/en_US.UTF-8/s/^# //g' "${target_dir}"/etc/locale.gen ++ eval 'LC_ALL=C LANG=C chroot "${target_dir}" \ ++ /bin/bash -c "locale-gen; update-locale --reset LANG=en_US.UTF-8"' ++ + create_sources_list "$release" "${target_dir}" + [[ $NO_APT_CACHER != yes ]] && + echo 'Acquire::http { Proxy "http://localhost:3142"; };' > "${target_dir}"/etc/apt/apt.conf.d/02proxy +@@ -78,9 +84,6 @@ create_chroot() { + APT::Install-Recommends "0"; + APT::Install-Suggests "0"; + EOF +- [[ -f "${target_dir}"/etc/locale.gen ]] && +- sed -i "s/^# en_US.UTF-8/en_US.UTF-8/" "${target_dir}"/etc/locale.gen +- chroot "${target_dir}" /bin/bash -c "locale-gen; update-locale LANG=en_US:en LC_ALL=en_US.UTF-8" + + printf '#!/bin/sh\nexit 101' > "${target_dir}"/usr/sbin/policy-rc.d + chmod 755 "${target_dir}"/usr/sbin/policy-rc.d +@@ -93,15 +96,25 @@ create_chroot() { + rm -rf "${target_dir}"/var/lock 2> /dev/null + mkdir -p "${target_dir}"/var/lock + fi +- chroot "${target_dir}" /bin/bash -c "/usr/sbin/update-ccache-symlinks" ++ eval 'LC_ALL=C LANG=C chroot "${target_dir}" \ ++ /bin/bash -c "/usr/sbin/update-ccache-symlinks"' + + display_alert "Upgrading packages in" "${target_dir}" "info" +- chroot "${target_dir}" /bin/bash -c "apt-get -q update; apt-get -q -y upgrade; apt-get clean" ++ eval 'LC_ALL=C LANG=C chroot "${target_dir}" \ ++ /bin/bash -c "apt-get -q update; apt-get -q -y upgrade; apt-get clean"' + date +%s > "$target_dir/root/.update-timestamp" + ++ # Install some packages with a large list of dependencies after the update. ++ # This optimizes the process and eliminates looping when calculating ++ # dependencies. ++ eval 'LC_ALL=C LANG=C chroot "${target_dir}" \ ++ /bin/bash -c "apt-get install \ ++ -q -y --no-install-recommends debhelper devscripts"' ++ + case $release in + bullseye | focal | hirsute | sid) +- chroot "${target_dir}" /bin/bash -c "apt-get install python-is-python3" ++ eval 'LC_ALL=C LANG=C chroot "${target_dir}" \ ++ /bin/bash -c "apt-get install python-is-python3"' + ;; + esac + +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index 0acd721b0..99fbbf787 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -34,7 +34,7 @@ prepare_host() { + debian-archive-keyring debian-keyring debootstrap device-tree-compiler + dialog dirmngr dosfstools dwarves f2fs-tools fakeroot flex gawk + gnupg gpg imagemagick jq kmod libbison-dev +- libelf-dev libfdt-dev libfile-fcntllock-perl ++ libelf-dev libfdt-dev libfile-fcntllock-perl libmpc-dev + libfl-dev liblz4-tool libncurses-dev libssl-dev + libusb-1.0-0-dev linux-base locales ncurses-base ncurses-term + ntpdate patchutils +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index e3d2220e0..471050a30 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -230,7 +230,7 @@ function prepare_partitions() { + + check_loop_device "$LOOP" + +- run_host_command_logged losetup $LOOP ${SDCARD}.raw ++ run_host_command_logged losetup -P $LOOP ${SDCARD}.raw + + # loop device was grabbed here, unlock + flock -u $FD + +From 3459a57c661ce495eba407216a8c38f6f297b617 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 28 May 2022 12:44:49 +0200 +Subject: [PATCH] armbian-next: manual merge (21) of all changes between + revisions e7d7dab1bb50c1172206629a44f983c1794f8359 and + 0eb8fe7497aebf341bead2b3b0fb7309fd7bdc14 + +--- + config/sources/families/include/meson_common.inc | 22 +++--- + .../sources/families/include/rockchip64_common.inc | 6 +- + config/sources/families/media.conf | 4 +- + config/sources/families/mvebu64.conf | 8 ++- + config/sources/families/sun50iw9.conf | 2 +- + lib/functions/compilation/debs.sh | 4 +- + lib/functions/compilation/patch/kernel-drivers.sh | 78 ++++++++++++++++------ + lib/functions/host/prepare-host.sh | 2 +- + lib/functions/image/partitioning.sh | 2 +- + 9 files changed, 88 insertions(+), 40 deletions(-) + +diff --git a/config/sources/families/include/meson_common.inc b/config/sources/families/include/meson_common.inc +index d24ac85ee..e83c382de 100644 +--- a/config/sources/families/include/meson_common.inc ++++ b/config/sources/families/include/meson_common.inc +@@ -17,23 +17,29 @@ GOVERNOR=ondemand + case $BRANCH in + legacy) + +- export KERNEL_MAJOR_MINOR="5.4" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.4.y" ++ export KERNEL_MAJOR_MINOR="5.11" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.11.y" + KERNELPATCHDIR='meson-'$BRANCH + ++ BUILD_DESKTOP=no ++ + ;; + current) + +- export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.10.y" +- KERNELPATCHDIR='meson-current' ++ export KERNEL_MAJOR_MINOR="5.14" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.14.y" ++ KERNELPATCHDIR='meson-'$BRANCH ++ ++ BUILD_DESKTOP=no + + ;; + edge) + +- export KERNEL_MAJOR_MINOR="5.11" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.11.y" +- KERNELPATCHDIR='meson-current' ++ KERNELDIR='linux-meson' ++ KERNELSOURCE='https://github.com/xdarklight/linux' ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:meson-mx-integration-5.18-20220417" ++ KERNELPATCHDIR='meson-'$BRANCH + + ;; + esac +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 42e028e7d..7fc026892 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -104,8 +104,8 @@ case $BRANCH in + edge) + + KERNELPATCHDIR='rockchip64-'$BRANCH +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.17.y" ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.18.y" + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH + +@@ -278,8 +278,6 @@ family_tweaks() { + cp -R $SRC/packages/blobs/rtl8723bt_fw/* $SDCARD/lib/firmware/rtl_bt/ + cp -R $SRC/packages/blobs/station/firmware/* $SDCARD/lib/firmware/ + if [[ $BRANCH == legacy && ($BOARD == station-m1) ]]; then +- cp $SRC/packages/blobs/rtl8723bt_fw/rtl8723ds_config.bin $SDCARD/lib/firmware/rtlbt/rtl8723d_config +- cp $SRC/packages/blobs/rtl8723bt_fw/rtl8723ds_fw.bin $SDCARD/lib/firmware/rtlbt/rtl8723d_fw + install -m 755 $SRC/packages/bsp/rk3328/m1/rtk_hciattach $SDCARD/usr/bin/rtk_hciattach + sed -e 's/exit 0//g' -i $SDCARD/etc/rc.local + echo "su -c '/usr/bin/rtk_hciattach -n -s 115200 /dev/ttyS2 rtk_h5 &'" >> $SDCARD/etc/rc.local +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 747eb86a5..3b5bbe589 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -46,7 +46,7 @@ case $BRANCH in + current) + export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.17.y" +- KERNELBRANCH="tag:v5.17.5" ++ KERNELBRANCH="tag:v5.17.9" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +@@ -55,7 +55,7 @@ case $BRANCH in + edge) + export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.18.y" +- KERNELBRANCH="tag:v5.18-rc5" ++ KERNELBRANCH="tag:v5.18" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index d9ae12786..fe35a0055 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -2,7 +2,7 @@ enable_extension "marvell-tools" + ARCH=arm64 + BOOTBRANCH='branch:v2022.04' + BOOTENV_FILE='mvebu64.txt' +-BOOTSCRIPT_OUTPUT='boot.scr.uimg' ++BOOTSCRIPT_OUTPUT='boot.scr' + ATFSOURCE='https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git' + ATFDIR='arm-trusted-firmware-espressobin' + ATFBRANCH='branch:master' +@@ -74,12 +74,16 @@ family_tweaks() { + chroot_sdcard_apt_get remove --auto-remove linux-sound-base alsa-base alsa-utils bluez + [[ -f $SDCARD/etc/netplan/armbian-default.yaml ]] && sed -i "s/^ renderer.*/ renderer: networkd/" $SDCARD/etc/netplan/armbian-default.yaml + cp $SRC/packages/bsp/mvebu64/networkd/10* $SDCARD/etc/systemd/network/ ++ if [[ $BOARD = "espressobin" ]]; then + echo "#Marvell Espressobin Console" >> $SDCARD/etc/securetty + echo "ttyMV0" >> $SDCARD/etc/securetty ++ fi + } + + family_tweaks_bsp() { ++ if [[ $BOARD = "espressobin" ]]; then + cp "$SRC/packages/bsp/mvebu64/initramfs/99-uboot-fit" "$destination/etc/initramfs/post-update.d/" ++ fi + } + + atf_custom_postprocess() { +@@ -110,7 +114,7 @@ uboot_custom_postprocess() { + display_alert "Building $FILENAME" "" "info" + # http://wiki.macchiatobin.net/tiki-index.php?page=Build+from+source+-+Bootloader#Building_ATF + run_host_command_logged make distclean +- run_host_command_logged make USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr PLAT=a80x0_mcbin CROSS_COMPILE=$ATF1 BL33=$BL33 all fip $CTHREADS ++ run_host_command_logged make USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr PLAT=a80x0_mcbin CROSS_COMPILE=$ATF1 BL33=$BL33 mrvl_flash $CTHREADS + run_host_command_logged cp -pv build/a80x0_mcbin/release/flash-image.bin $ubootdir/$FILENAME + else + cd $moxbootdir +diff --git a/config/sources/families/sun50iw9.conf b/config/sources/families/sun50iw9.conf +index c8b311493..c314ea1ee 100644 +--- a/config/sources/families/sun50iw9.conf ++++ b/config/sources/families/sun50iw9.conf +@@ -43,7 +43,7 @@ case $BRANCH in + ATFBRANCH='branch:master' + ATF_PLAT="sun50i_h616" + ATF_TARGET_MAP='PLAT=sun50i_h616 DEBUG=1 bl31;;build/sun50i_h616/debug/bl31.bin' +- LINUXCONFIG='linux-sunxi64-edge' ++ BOOTSCRIPT='boot-sun50i-next.cmd:boot.cmd' + + ;; + esac +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index 6e52631c8..3db0c44d4 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -56,8 +56,8 @@ compile_armbian-zsh() { + armbian_zsh_dir=armbian-zsh_${REVISION}_all + display_alert "Building deb" "armbian-zsh" "info" + +- fetch_from_repo "https://github.com/robbyrussell/oh-my-zsh" "oh-my-zsh" "branch:master" +- fetch_from_repo "https://github.com/mroth/evalcache" "evalcache" "branch:master" ++ fetch_from_repo "$GITHUB_SOURCE/ohmyzsh/ohmyzsh" "oh-my-zsh" "branch:master" ++ fetch_from_repo "$GITHUB_SOURCE/mroth/evalcache" "evalcache" "branch:master" + + mkdir -p "${tmp_dir}/${armbian_zsh_dir}"/{DEBIAN,etc/skel/,etc/oh-my-zsh/,/etc/skel/.oh-my-zsh/cache} + +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 8529e4ba1..91b5d5070 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -31,32 +31,38 @@ function prepare_extra_kernel_drivers() { + # + # Older versions have AUFS support with a patch + +- if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" lt 5.15 && [ "$AUFS" == yes ]; then ++ if linux-version compare "${version}" ge 5.10 && linux-version compare "${version}" lt 5.15 && [ "$AUFS" == yes ]; then + # @TODO: Fasthash for this whole block is only the git hash of revision we'd apply from Mr. Okajima +- local aufs_tag # attach to specifics tag or branch +- aufs_tag=$(echo "${version}" | cut -f 1-2 -d ".") ++ # attach to specifics tag or branch ++ local aufstag ++ aufstag=$(echo "${version}" | cut -f 1-2 -d ".") + + # manual overrides +- if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5; then aufstag="5.4.3"; fi + if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufstag="5.10.82"; fi + if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufstag="5.15.5"; fi + if linux-version compare "${version}" ge 5.17.3 && linux-version compare "${version}" le 5.18; then aufstag="5.17.3"; fi + +- # check if Mr. Okajima already made a branch for this version, otherwise use RC. +- git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufs_tag}" > /dev/null || { +- aufs_tag="5.x-rcN" # then use rc branch +- git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufs_tag}" > /dev/null +- } +- display_alert "Adding" "AUFS ${aufs_tag}" "info" +- local aufs_branch="branch:aufs${aufs_tag}" +- fetch_from_repo "https://github.com/sfjro/aufs5-standalone" "aufs5" "branch:${aufs_branch}" "yes" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-kbuild.patch" "applying" +- process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-base.patch" "applying" +- process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-mmap.patch" "applying" +- process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-standalone.patch" "applying" +- cp -R "${SRC}/cache/sources/aufs5/${aufs_branch#*:}"/{Documentation,fs} . +- cp "${SRC}/cache/sources/aufs5/${aufs_branch#*:}"/include/uapi/linux/aufs_type.h include/uapi/linux/ ++ # check if Mr. Okajima already made a branch for this version ++ improved_git ls-remote --exit-code --heads $GITHUB_SOURCE/sfjro/aufs5-standalone "aufs${aufstag}" > /dev/null ++ ++ if [ "$?" -ne "0" ]; then ++ # then use rc branch ++ aufstag="5.x-rcN" ++ improved_git ls-remote --exit-code --heads $GITHUB_SOURCE/sfjro/aufs5-standalone "aufs${aufstag}" > /dev/null ++ fi ++ ++ if [ "$?" -eq "0" ]; then ++ display_alert "Adding" "AUFS ${aufstag}" "info" ++ local aufsver="branch:aufs${aufstag}" ++ fetch_from_repo "$GITHUB_SOURCE/sfjro/aufs5-standalone" "aufs5" "branch:${aufsver}" "yes" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-kbuild.patch" "applying" ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-base.patch" "applying" ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-mmap.patch" "applying" ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-standalone.patch" "applying" ++ cp -R "${SRC}/cache/sources/aufs5/${aufsver#*:}"/{Documentation,fs} . ++ cp "${SRC}/cache/sources/aufs5/${aufsver#*:}"/include/uapi/linux/aufs_type.h include/uapi/linux/ ++ fi + fi + + # WireGuard VPN for Linux 3.10 - 5.5 +@@ -546,6 +552,40 @@ function prepare_extra_kernel_drivers() { + + fi + ++ # Exfat driver ++ ++ if linux-version compare "${version}" ge 4.9 && linux-version compare "${version}" le 5.4; then ++ ++ # attach to specifics tag or branch ++ display_alert "Adding" "exfat driver ${exfatsver}" "info" ++ ++ local exfatsver="branch:master" ++ fetch_from_repo "$GITHUB_SOURCE/arter97/exfat-linux" "exfat" "${exfatsver}" "yes" ++ cd "$kerneldir" || exit ++ mkdir -p $kerneldir/fs/exfat/ ++ cp -R "${SRC}/cache/sources/exfat/${exfatsver#*:}"/{*.c,*.h} \ ++ $kerneldir/fs/exfat/ ++ ++ # Add to section Makefile ++ echo "obj-\$(CONFIG_EXFAT_FS) += exfat/" >> $kerneldir/fs/Makefile ++ ++ # Makefile ++ cat <<- EOF > "$kerneldir/fs/exfat/Makefile" ++ # SPDX-License-Identifier: GPL-2.0-or-later ++ # ++ # Makefile for the linux exFAT filesystem support. ++ # ++ obj-\$(CONFIG_EXFAT_FS) += exfat.o ++ exfat-y := inode.o namei.o dir.o super.o fatent.o cache.o nls.o misc.o file.o balloc.o xattr.o ++ EOF ++ ++ # Kconfig ++ sed -i '$i\source "fs\/exfat\/Kconfig"' $kerneldir/fs/Kconfig ++ cp "${SRC}/cache/sources/exfat/${exfatsver#*:}/Kconfig" \ ++ "$kerneldir/fs/exfat/Kconfig" ++ ++ fi ++ + if linux-version compare $version ge 4.4 && linux-version compare $version lt 5.8; then + display_alert "Adjusting" "Framebuffer driver for ST7789 IPS display" "info" + process_patch_file "${SRC}/patch/misc/fbtft-st7789v-invert-color.patch" "applying" +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index c5045e966..0acd721b0 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -40,7 +40,7 @@ prepare_host() { + ntpdate patchutils + pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig + systemd-container u-boot-tools udev uuid-dev whiptail +- zlib1g-dev ++ zlib1g-dev busybox + + # python2, including headers, mostly used by some u-boot builds (2017 et al, odroidxu4 and others). + python2 python2-dev +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index b06055335..e3d2220e0 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -336,7 +336,7 @@ function prepare_partitions() { + # if we have a headless device, set console to DEFAULT_CONSOLE + if [[ -n $DEFAULT_CONSOLE && -f $SDCARD/boot/armbianEnv.txt ]]; then + if grep -lq "^console=" $SDCARD/boot/armbianEnv.txt; then +- sed -i "s/console=.*/console=$DEFAULT_CONSOLE/" $SDCARD/boot/armbianEnv.txt ++ sed -i "s/^console=.*/console=$DEFAULT_CONSOLE/" $SDCARD/boot/armbianEnv.txt + else + echo "console=$DEFAULT_CONSOLE" >> $SDCARD/boot/armbianEnv.txt + fi + +From e4d0f9c279b4b8859b23e4828579337ea415f175 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 23 May 2022 20:35:54 +0200 +Subject: [PATCH] armbian-next: fix: patching CREATE_PATCHES=yes + +- needed to create output dir +--- + lib/functions/compilation/patch/patching.sh | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/lib/functions/compilation/patch/patching.sh b/lib/functions/compilation/patch/patching.sh +index 3b7762707..fd7e3e594 100644 +--- a/lib/functions/compilation/patch/patching.sh ++++ b/lib/functions/compilation/patch/patching.sh +@@ -148,6 +148,7 @@ userpatch_create() { + git add . + git -c user.name='Armbian User' -c user.email='user@example.org' commit -q -m "Cleaning working copy" + ++ mkdir -p "${DEST}/patch" + local patch="$DEST/patch/$1-$LINUXFAMILY-$BRANCH.patch" + + # apply previous user debug mode created patches + +From 2058ba0f88aa1196667089faedd64e469c7d7f32 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 21 May 2022 21:36:33 +0200 +Subject: [PATCH] armbian-next: add `python2-dev` dep for old uboots + +- cleanup some comments +--- + lib/functions/host/prepare-host.sh | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index 55ae01988..c5045e966 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -42,8 +42,8 @@ prepare_host() { + systemd-container u-boot-tools udev uuid-dev whiptail + zlib1g-dev + +- # python2, mostly used by some u-boot builds (2018 et al, odroidxu4 and others). +- python2 ++ # python2, including headers, mostly used by some u-boot builds (2017 et al, odroidxu4 and others). ++ python2 python2-dev + + # non-mess below? + file ccze colorized-logs tree # logging utilities +@@ -59,10 +59,8 @@ prepare_host() { + + if [[ $(dpkg --print-architecture) == amd64 ]]; then + : +- #host_dependencies+=(distcc lib32ncurses-dev lib32stdc++6 libc6-i386) +- #grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 # @TODO: WHY?! don't do this! we don't want 32-bit x86 ever + elif [[ $(dpkg --print-architecture) == arm64 ]]; then +- host_dependencies+=(libc6 libc6-amd64-cross qemu) # What? ++ host_dependencies+=(libc6-amd64-cross qemu) # Support for running x86 binaries on ARM64 under qemu. + else + display_alert "Please read documentation to set up proper compilation environment" + display_alert "https://www.armbian.com/using-armbian-tools/" + +From 79185a3bad52301322e806a22103922b430f99fc Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 21 May 2022 18:52:18 +0200 +Subject: [PATCH] armbian-next: manual merge (20) of all changes between + revisions 6b72ae3c864fc020c6aadea473997ca033a0d8cc and + 247c4c45fd18aa370575998443fc837466c02971 + +--- + .../sources/families/include/rockchip64_common.inc | 36 ++++++++++++++++++++-- + lib/functions/compilation/debs.sh | 5 +-- + lib/functions/extras/buildpkg.sh | 5 ++- + lib/functions/image/fingerprint.sh | 1 + + 4 files changed, 38 insertions(+), 9 deletions(-) + +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 21d07fda2..42e028e7d 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -297,12 +297,44 @@ family_tweaks_bsp() { + cat <<- EOF > "$destination"/etc/X11/xorg.conf.d/02-driver.conf + # set fbdev as default driver. + Section "Device" +- Identifier "NOGPU" +- Driver "fbdev" ++ Identifier "NOGPU" ++ Driver "fbdev" + EndSection + EOF + fi + ++ if [[ $BOARD == clockworkpi-a06 ]]; then ++ # rotate screen & disable dpms ++ mkdir -p "$destination"/etc/X11/xorg.conf.d ++ cat <<- EOF > "$destination"/etc/X11/xorg.conf.d/10-monitor.conf ++ # set monitor ++ Section "Monitor" ++ Identifier "DSI-1" ++ Option "Rotate" "right" ++ Option "DPMS" "false" ++ EndSection ++ ++ Section "ServerLayout" ++ Identifier "ServerLayout0" ++ Option "BlankTime" "0" ++ Option "StandbyTime" "0" ++ Option "SuspendTime" "0" ++ Option "OffTime" "0" ++ EndSection ++ EOF ++ # fan support ++ install -Dm644 $SRC/packages/bsp/clockworkpi-a06/temp_fan_daemon_a06.py $destination/usr/share/clockworkpi-a06-fan-daemon/bin/temp_fan_daemon_a06.py ++ cp $SRC/packages/bsp/clockworkpi-a06/clockworkpi-a06-fan-daemon.service $destination/lib/systemd/system/ ++ ++ # alsa-ucm-conf profile for DevTerm A06 ++ mkdir -p $destination/usr/share/alsa/ucm2/Rockchip/es8388 ++ install -Dm644 $SRC/packages/bsp/clockworkpi-a06/es8388.conf $destination/usr/share/alsa/ucm2/Rockchip/es8388/es8388.conf ++ install -Dm644 $SRC/packages/bsp/clockworkpi-a06/HiFi.conf $destination/usr/share/alsa/ucm2/Rockchip/es8388/HiFi.conf ++ mkdir -p $destination/usr/share/alsa/ucm2/conf.d/simple-card ++ ln -sfv /usr/share/alsa/ucm2/Rockchip/es8388/es8388.conf \ ++ $destination/usr/share/alsa/ucm2/conf.d/simple-card/rockchip,es8388-codec.conf ++ fi ++ + if [[ $BOARD == z28pro ]]; then + + mkdir -p $destination/usr/local/bin +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index 8816314af..6e52631c8 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -105,11 +105,8 @@ compile_armbian-zsh() { + # define theme + sed -i 's/^ZSH_THEME=.*/ZSH_THEME="mrtazz"/' "${tmp_dir}/${armbian_zsh_dir}"/etc/skel/.zshrc + +- # disable prompt while update +- sed -i 's/# DISABLE_UPDATE_PROMPT="true"/DISABLE_UPDATE_PROMPT="true"/g' "${tmp_dir}/${armbian_zsh_dir}"/etc/skel/.zshrc +- + # disable auto update since we provide update via package +- sed -i 's/# DISABLE_AUTO_UPDATE="true"/DISABLE_AUTO_UPDATE="true"/g' "${tmp_dir}/${armbian_zsh_dir}"/etc/skel/.zshrc ++ sed -i "s/^# zstyle ':omz:update' mode disabled.*/zstyle ':omz:update' mode disabled/g" "${tmp_dir}/${armbian_zsh_dir}"/etc/skel/.zshrc + + # define default plugins + sed -i 's/^plugins=.*/plugins=(evalcache git git-extras debian tmux screen history extract colorize web-search docker)/' "${tmp_dir}/${armbian_zsh_dir}"/etc/skel/.zshrc +diff --git a/lib/functions/extras/buildpkg.sh b/lib/functions/extras/buildpkg.sh +index 09dd5d2e6..e79924426 100644 +--- a/lib/functions/extras/buildpkg.sh ++++ b/lib/functions/extras/buildpkg.sh +@@ -351,9 +351,8 @@ create_build_script() { + + package_builddeps="$package_builddeps" + if [ -z "\$package_builddeps" ]; then +- # Calculate build dependencies by a standard function and +- # еxclude special comparison characters like "|" "(>= 9)" +- package_builddeps="\$(dpkg-checkbuilddeps |& awk -F":" '{gsub(/[|]|[(].*[)]/, " ", \$0); print \$NF}')" ++ # Calculate build dependencies by a standard dpkg function ++ package_builddeps="\$(dpkg-checkbuilddeps |& awk -F":" '{print \$NF}')" + fi + if [[ -n "\${package_builddeps}" ]]; then + install_pkg_deb \${package_builddeps} +diff --git a/lib/functions/image/fingerprint.sh b/lib/functions/image/fingerprint.sh +index 566f76faf..6fc7c43fb 100644 +--- a/lib/functions/image/fingerprint.sh ++++ b/lib/functions/image/fingerprint.sh +@@ -8,6 +8,7 @@ fingerprint_image() { + Title: ${VENDOR} $REVISION ${BOARD^} $BRANCH + Kernel: Linux $VER + Build date: $(date +'%d.%m.%Y') ++ Builder rev: ${BUILD_REPOSITORY_COMMIT} + Maintainer: $MAINTAINER <$MAINTAINERMAIL> + Authors: https://www.armbian.com/authors + Sources: https://github.com/armbian/ + +From 449ce337d3997a00b867dcb9baae9624983fefdb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 21 May 2022 16:22:58 +0200 +Subject: [PATCH] armbian-next: fix: pass `TERM` to kernel's make, so `make + menuconfig` can work + +--- + lib/functions/compilation/kernel.sh | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 3ecc4c3d6..ee54c8453 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -7,6 +7,7 @@ function run_kernel_make() { + "PATH=\"${toolchain}:${PATH}\"" # Insert the toolchain first into the PATH. + "DPKG_COLORS=always" # Use colors for dpkg + "XZ_OPT='--threads=0'" # Use parallel XZ compression ++ "TERM='${TERM}'" # Pass the terminal type, so that 'make menuconfig' can work. + ) + + common_make_params_quoted=( + +From 61c3306cdf3f79c318f93aa677b26da072d003bc Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 18 May 2022 11:49:04 +0200 +Subject: [PATCH] armbian-next: fix: git: read commit UNIX timestamp/local date + correctly + +- `checked_out_revision_ts` was correct; git outputs `%ct` as a UNIX timestamp, UTC-based +- `checked_out_revision_mtime` was incorrect: git output it without converting to local time +- manually convert using `date @xx` so it has correct local time, whatever it is. +- add debugging to `get_file_modification_time()` too +--- + lib/functions/compilation/patch/fasthash.sh | 1 + + lib/functions/general/git.sh | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index 771837b89..26874517f 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -52,6 +52,7 @@ function get_file_modification_time() { # @TODO: This is almost always called fr + # YYYYMMDDhhmm.ss - it is NOT a valid integer, but is what 'touch' wants for its "-t" parameter + # YYYYMMDDhhmmss - IS a valid integer and we can do math to it. 'touch' code will format it later + file_date=$(date +%Y%m%d%H%M%S -r "${1}") ++ display_alert "Read modification date for file" "${1} - ${file_date}" "timestamp" + echo -n "${file_date}" + return 0 + } +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 89b108a86..e5b5bd341 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -180,8 +180,8 @@ fetch_from_repo() { + fi + + # should be declared in outside scope, so can be read. +- checked_out_revision_mtime="$(git log --date='format:%Y%m%d%H%M%S' --format='format:%ad' -1 "${checkout_from}")" +- checked_out_revision_ts="$(git log -1 --pretty=%ct "${checkout_from}")" ++ checked_out_revision_ts="$(git log -1 --pretty=%ct "${checkout_from}")" # unix timestamp of the commit date ++ checked_out_revision_mtime="$(date +%Y%m%d%H%M%S -d "@${checked_out_revision_ts}")" # convert timestamp to local date/time + display_alert "checked_out_revision_mtime set!" "${checked_out_revision_mtime} - ${checked_out_revision_ts}" "git" + + display_alert "Cleaning git dir" "$(git status -s 2> /dev/null | wc -l) files" # working directory is not clean, show it + +From 73dba5953b8b76715005d8f8096040c4d5bcc153 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 17 May 2022 11:06:22 +0200 +Subject: [PATCH] armbian-next: abstract `$QEMU_BINARY` to `qemu-static.sh`: + `deploy_qemu_binary_to_chroot()`/`undeploy_qemu_binary_from_chroot()` + +- add hackish logic to avoid removing binary that would be needed if image actually contains `qemu-user-static` package +--- + config/sources/amd64.conf | 2 +- + extensions/flash-kernel.sh | 6 +++--- + lib/functions/image/initrd.sh | 7 ++++--- + lib/functions/rootfs/create-cache.sh | 2 +- + lib/functions/rootfs/post-tweaks.sh | 16 ++++++++++------ + lib/functions/rootfs/qemu-static.sh | 28 ++++++++++++++++++++++++++++ + lib/library-functions.sh | 9 +++++++++ + 7 files changed, 56 insertions(+), 14 deletions(-) + +diff --git a/config/sources/amd64.conf b/config/sources/amd64.conf +index 8b208bab2..20df57d45 100644 +--- a/config/sources/amd64.conf ++++ b/config/sources/amd64.conf +@@ -1,6 +1,6 @@ + export ARCH=amd64 # Debian name $(dpkg-architecture -qDEB_HOST_ARCH) + export ARCHITECTURE=x86_64 # "kernel" arch +-export QEMU_BINARY="qemu-x86_64-static" # Hopefully you have this installed. ++export QEMU_BINARY="qemu-x86_64-static" # Installed via 'qemu-user-static'. + export KERNEL_COMPILER=' ' # hack: use single space for host gcc. won't work on arm64 hosts + export KERNEL_USE_GCC=' ' # more hacks. + export KERNEL_IMAGE_TYPE="bzImage" # Passed to kernel's `make` +diff --git a/extensions/flash-kernel.sh b/extensions/flash-kernel.sh +index ab5d308d8..14286cf4d 100644 +--- a/extensions/flash-kernel.sh ++++ b/extensions/flash-kernel.sh +@@ -71,7 +71,7 @@ pre_umount_final_image__remove_uboot_initramfs_hook_flash_kernel() { + + function pre_update_initramfs__setup_flash_kernel() { + local chroot_target=$MOUNT +- cp /usr/bin/"$QEMU_BINARY" "$chroot_target"/usr/bin/ ++ deploy_qemu_binary_to_chroot "${chroot_target}" + mount_chroot "$chroot_target/" # this already handles /boot/firmware which is required for it to work. + # hack, umount the chroot's /sys, otherwise flash-kernel tries to EFI flash due to the build host (!) being EFI + umount "$chroot_target/sys" +@@ -109,8 +109,8 @@ function pre_update_initramfs__setup_flash_kernel() { + chroot_custom "$chroot_target" chmod -v +x "/etc/kernel/postinst.d/initramfs-tools" + chroot_custom "$chroot_target" chmod -v +x "/etc/initramfs/post-update.d/flash-kernel" + +- umount_chroot "$chroot_target/" +- rm "$chroot_target"/usr/bin/"$QEMU_BINARY" ++ umount_chroot "${chroot_target}/" ++ undeploy_qemu_binary_from_chroot "${chroot_target}" + + display_alert "Disabling Armbian-core update_initramfs, was already done above." "${EXTENSION}" + unset KERNELSOURCE # ugly. sorry. we'll have better mechanism for this soon. this is tested at lib/debootstrap.sh:844 +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index 695864a77..2ba34e759 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -49,7 +49,8 @@ update_initramfs() { + display_alert "initrd cache hash" "${initrd_hash}" "debug" + + display_alert "Mounting chroot for update-initramfs" "update-initramfs" "debug" +- cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ ++ deploy_qemu_binary_to_chroot "${chroot_target}" ++ + mount_chroot "$chroot_target/" + + if [[ -f "${initrd_cache_file_path}" ]]; then +@@ -96,8 +97,8 @@ update_initramfs() { + chroot_custom "$chroot_target" chmod -v +x /etc/kernel/postinst.d/initramfs-tools + + display_alert "Unmounting chroot" "update-initramfs" "debug" +- umount_chroot "$chroot_target/" +- rm "$chroot_target/usr/bin/$QEMU_BINARY" ++ umount_chroot "${chroot_target}/" ++ undeploy_qemu_binary_from_chroot "${chroot_target}" + + # no need to remove ${initrd_cache_current_manifest_filepath} manually, since it's under ${WORKDIR} + return 0 # avoid future short-circuit problems +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 7d7fc87e9..fab43781b 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -125,7 +125,7 @@ function create_new_rootfs_cache() { + } + [[ ! -f ${SDCARD}/debootstrap/debootstrap ]] && exit_with_error "Debootstrap first stage did not produce marker file" + +- run_host_command_logged cp -pv "/usr/bin/$QEMU_BINARY" "$SDCARD/usr/bin/" # @TODO: who cleans this up later? ++ deploy_qemu_binary_to_chroot "${SDCARD}" # this is cleaned-up later by post_debootstrap_tweaks() + + mkdir -p "${SDCARD}/usr/share/keyrings/" + run_host_command_logged cp -pv /usr/share/keyrings/*-archive-keyring.gpg "${SDCARD}/usr/share/keyrings/" +diff --git a/lib/functions/rootfs/post-tweaks.sh b/lib/functions/rootfs/post-tweaks.sh +index ec26f46af..4a0db646a 100644 +--- a/lib/functions/rootfs/post-tweaks.sh ++++ b/lib/functions/rootfs/post-tweaks.sh +@@ -1,10 +1,14 @@ +-post_debootstrap_tweaks() { ++function post_debootstrap_tweaks() { ++ display_alert "Applying post-tweaks" "post_debootstrap_tweaks" "debug" + +- # remove service start blockers and QEMU binary +- rm -f "${SDCARD}"/sbin/initctl "${SDCARD}"/sbin/start-stop-daemon +- chroot "${SDCARD}" /bin/bash -c "dpkg-divert --quiet --local --rename --remove /sbin/initctl" +- chroot "${SDCARD}" /bin/bash -c "dpkg-divert --quiet --local --rename --remove /sbin/start-stop-daemon" +- rm -f "${SDCARD}"/usr/sbin/policy-rc.d "${SDCARD}/usr/bin/${QEMU_BINARY}" ++ # remove service start blockers ++ run_host_command_logged rm -fv "${SDCARD}"/sbin/initctl "${SDCARD}"/sbin/start-stop-daemon ++ chroot_sdcard dpkg-divert --quiet --local --rename --remove /sbin/initctl ++ chroot_sdcard dpkg-divert --quiet --local --rename --remove /sbin/start-stop-daemon ++ run_host_command_logged rm -fv "${SDCARD}"/usr/sbin/policy-rc.d ++ ++ # remove the qemu static binary ++ undeploy_qemu_binary_from_chroot "${SDCARD}" + + call_extension_method "post_post_debootstrap_tweaks" "config_post_debootstrap_tweaks" <<- 'POST_POST_DEBOOTSTRAP_TWEAKS' + *run after removing diversions and qemu with chroot unmounted* +diff --git a/lib/functions/rootfs/qemu-static.sh b/lib/functions/rootfs/qemu-static.sh +new file mode 100644 +index 000000000..91569cbe1 +--- /dev/null ++++ b/lib/functions/rootfs/qemu-static.sh +@@ -0,0 +1,28 @@ ++function deploy_qemu_binary_to_chroot() { ++ local chroot_target="${1}" ++ ++ # @TODO: rpardini: Only deploy the binary if we're actually building a different architecture? otherwise unneeded. ++ ++ if [[ ! -f "${chroot_target}/usr/bin/${QEMU_BINARY}" ]]; then ++ display_alert "Deploying qemu-user-static binary to chroot" "${QEMU_BINARY}" "debug" ++ run_host_command_logged cp -pv "/usr/bin/${QEMU_BINARY}" "${chroot_target}/usr/bin/" ++ else ++ display_alert "qemu-user-static binary already deployed, skipping" "${QEMU_BINARY}" "debug" ++ fi ++} ++ ++function undeploy_qemu_binary_from_chroot() { ++ local chroot_target="${1}" ++ ++ # Hack: Check for magic "/usr/bin/qemu-s390x-static" marker; if that exists, it means "qemu-user-static" was installed ++ # in the chroot, and we shouldn't remove the binary, otherwise it's gonna be missing in the final image. ++ if [[ -f "${chroot_target}/usr/bin/qemu-s390x-static" ]]; then ++ display_alert "Not removing qemu binary, qemu-user-static package is installed in the chroot" "${QEMU_BINARY}" "debug" ++ return 0 ++ fi ++ ++ if [[ -f "${chroot_target}/usr/bin/${QEMU_BINARY}" ]]; then ++ display_alert "Removing qemu-user-static binary from chroot" "${QEMU_BINARY}" "debug" ++ run_host_command_logged rm -fv "${chroot_target}/usr/bin/${QEMU_BINARY}" ++ fi ++} +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 5bad7883a..ff42ed61f 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -496,6 +496,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/rootfs/post-tweaks.sh + source "${SRC}"/lib/functions/rootfs/post-tweaks.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/qemu-static.sh ++# shellcheck source=lib/functions/rootfs/qemu-static.sh ++source "${SRC}"/lib/functions/rootfs/qemu-static.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + +From ef945476dee668f7ab3889f0cc2994467613b0d7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 16 May 2022 18:06:25 +0200 +Subject: [PATCH] armbian-next: fix `uuidgen` basic dep check; use fake bash + `$RANDOM` if uuidgen not available + +- not good: we need uuidgen to begin logging, but it may not be installed yet. workaround. +--- + lib/functions/cli/cli-entrypoint.sh | 8 +++++++- + lib/functions/host/basic-deps.sh | 2 +- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 65ad2b88e..82026963e 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -68,8 +68,14 @@ function cli_entrypoint() { + display_alert "Output directory DEST:" "${DEST}" "debug" + + # set unique mounting directory for this build. ++ # basic deps, which include "uuidgen", will be installed _after_ this, so we gotta tolerate it not being there yet. + declare -g ARMBIAN_BUILD_UUID +- ARMBIAN_BUILD_UUID="$(uuidgen)" ++ if [[ -f /usr/bin/uuidgen ]]; then ++ ARMBIAN_BUILD_UUID="$(uuidgen)" ++ else ++ display_alert "uuidgen not found" "uuidgen not installed yet" "info" ++ ARMBIAN_BUILD_UUID="no-uuidgen-yet-${RANDOM}-$((1 + $RANDOM % 10))$((1 + $RANDOM % 10))$((1 + $RANDOM % 10))$((1 + $RANDOM % 10))" ++ fi + display_alert "Build UUID:" "${ARMBIAN_BUILD_UUID}" "debug" + + # Super-global variables, used everywhere. The directories are NOT _created_ here, since this very early stage. +diff --git a/lib/functions/host/basic-deps.sh b/lib/functions/host/basic-deps.sh +index 4cce0f8bf..bb46fd155 100644 +--- a/lib/functions/host/basic-deps.sh ++++ b/lib/functions/host/basic-deps.sh +@@ -11,7 +11,7 @@ prepare_host_basic() { + "dialog:dialog" + "fuser:psmisc" + "getfacl:acl" +- "uuid:uuid uuid-runtime" ++ "uuidgen:uuid-runtime" + "curl:curl" + "gpg:gnupg" + "gawk:gawk" + +From bc644378ffa202f368e6c0bc705d7c3b05709f21 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 11 May 2022 21:15:18 +0200 +Subject: [PATCH] armbian-next: retry 3 times download-only also for + `PACKAGE_LIST_BOARD` + +- acng is really not helping +--- + lib/functions/rootfs/distro-agnostic.sh | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 4b664acc1..cd3462409 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -255,6 +255,9 @@ function install_distribution_agnostic() { + if [[ -n ${PACKAGE_LIST_BOARD} ]]; then + _pkg_list=${PACKAGE_LIST_BOARD} + display_alert "Installing PACKAGE_LIST_BOARD packages" "${_pkg_list}" ++ # shellcheck disable=SC2086 # we need to expand here. retry 3 times download-only to counter apt-cacher-ng failures. ++ do_with_retries 3 chroot_sdcard_apt_get_install_download_only ${_pkg_list} ++ + # shellcheck disable=SC2086 # we need to expand. + chroot_sdcard_apt_get_install ${_pkg_list} + fi + +From 37a7eb9cbbf8fdf02054e2c9b5fd9eb924aa2524 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 11 May 2022 16:51:09 +0200 +Subject: [PATCH] armbian-next: allow customizing UBUNTU_MIRROR (ports mirror) + with `CUSTOM_UBUNTU_MIRROR_ARM64=host/path` + +--- + lib/functions/configuration/main-config.sh | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 5100e6d35..31c4d6280 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -331,6 +331,13 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + fi + fi + ++ if [[ "${ARCH}" == "arm64" ]]; then ++ if [[ -n ${CUSTOM_UBUNTU_MIRROR_ARM64} ]]; then ++ display_alert "Using custom ports/arm64 mirror" "${CUSTOM_UBUNTU_MIRROR_ARM64}" "info" ++ UBUNTU_MIRROR="${CUSTOM_UBUNTU_MIRROR_ARM64}" ++ fi ++ fi ++ + # don't use mirrors that throws garbage on 404 + if [[ -z ${ARMBIAN_MIRROR} && "${SKIP_ARMBIAN_REPO}" != "yes" ]]; then + declare -i armbian_mirror_tries=1 + +From 6533471c376936d076fe884304b27e904af6d54e Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 9 May 2022 20:41:47 +0200 +Subject: [PATCH] armbian-next: WiP: kernel make via `env -i` for clean env; + show produced /boot tree + +--- + lib/functions/compilation/kernel-debs.sh | 3 +++ + lib/functions/compilation/kernel.sh | 4 ++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index dd5a143c7..3cae7845a 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -153,6 +153,9 @@ function kernel_package_callback_linux_image() { + declare installed_image_path="boot/vmlinuz-${kernel_version_family}" # using old mkdebian terminology here. + declare image_name="Image" # for arm64. or, "zImage" for arm, or "vmlinuz" for others. Why? See where u-boot puts them. + ++ display_alert "Showing contents of Kbuild produced /boot" "linux-image" "debug" ++ run_host_command_logged tree -C --du -h "${tmp_kernel_install_dirs[INSTALL_PATH]}" ++ + run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_PATH]}" "${package_directory}/" # /boot stuff + run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}/lib" "${package_directory}/" # so "lib" stuff sits at the root + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 86235f767..3ecc4c3d6 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -27,8 +27,8 @@ function run_kernel_make() { + "KGZIP=pigz" "KBZIP2=pbzip2" # Parallel compression, use explicit parallel compressors https://lore.kernel.org/lkml/20200901151002.988547791@linuxfoundation.org/ + ) + +- # last statement, so it passes the result to calling function. +- full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" ++ # last statement, so it passes the result to calling function. "env -i" is used for empty env ++ full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "env" "-i" "${common_make_envs[@]}" + make "${common_make_params_quoted[@]@Q}" "$@" "${make_filter}") + "${full_command[@]}" # and exit with it's code, since it's the last statement + } + +From 514a63ddef96369aa2be85175544eedb000779c5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 8 May 2022 20:50:42 +0200 +Subject: [PATCH] armbian-next: manual merge (19) of all changes between + revisions b23498b94909a855d8b0fda1a95ccfc0ab17c747 and + e621d25adc8ee66b0d14c94605ef462a13464b85 + +- the ssh firstrun revert stuff mostly +--- + lib/functions/main/rootfs-image.sh | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 87821d253..590ca1f84 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -67,9 +67,6 @@ function build_rootfs_and_image() { + # install from apt.armbian.com # @TODO: armbian-nextify this eventually + [[ $EXTERNAL_NEW == prebuilt ]] && LOG_SECTION="packages_prebuilt" do_with_logging chroot_installpackages "yes" + +- # remove existing ssh keys. They will be created in 1st boot process +- rm -f "${SDCARD}"/etc/ssh/ssh_host* +- + # stage: user customization script + # NOTE: installing too many packages may fill tmpfs mount + LOG_SECTION="customize_image" do_with_logging customize_image + +From 896c4e78d75f23a8dfa21354773cd8254f34d196 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 7 May 2022 03:55:49 +0200 +Subject: [PATCH] armbian-next: *breaking change* remove `LIB_TAG` and + `.ignore_changes` completely + +- one day should be replaced with an "update checker" extension, or even "update-enforcer" +- for now this just causes chaos +--- + config/templates/config-example.conf | 1 - + lib/functions/cli/cli-entrypoint.sh | 3 -- + lib/functions/cli/utils-cli.sh | 71 ------------------------------------ + 3 files changed, 75 deletions(-) + +diff --git a/config/templates/config-example.conf b/config/templates/config-example.conf +index e07496dc8..3a524d1ce 100644 +--- a/config/templates/config-example.conf ++++ b/config/templates/config-example.conf +@@ -22,7 +22,6 @@ DEST_LANG="en_US.UTF-8" # sl_SI.UTF-8, en_US.UTF-8 + # advanced + EXTERNAL_NEW="prebuilt" # compile and install or install prebuilt additional packages + INSTALL_HEADERS="" # install kernel headers package +-LIB_TAG="master" # change to "branchname" to use any branch currently available. + USE_TORRENT="no" # use torrent network for faster toolchain and cache download + DOWNLOAD_MIRROR="" # set to "china" to use chinese mirrors + CARD_DEVICE="" # device name /dev/sdx of your SD card to burn directly to the card when done +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index c6d0459ed..65ad2b88e 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -9,9 +9,6 @@ function cli_entrypoint() { + trap 'echo "${BASH_LINENO[@]}|${BASH_SOURCE[@]}|${FUNCNAME[@]}" >> ${SRC}/output/call-traces/calls.txt ;' RETURN + fi + +- check_args "$@" +- do_update_src "$@" +- + if [[ "${EUID}" == "0" ]] || [[ "${1}" == "vagrant" ]]; then + : + elif [[ "${1}" == docker || "${1}" == dockerpurge || "${1}" == docker-shell ]] && grep -q "$(whoami)" <(getent group docker); then +diff --git a/lib/functions/cli/utils-cli.sh b/lib/functions/cli/utils-cli.sh +index a48de5d3a..40764c2d7 100644 +--- a/lib/functions/cli/utils-cli.sh ++++ b/lib/functions/cli/utils-cli.sh +@@ -1,76 +1,5 @@ + # Misc functions from compile.sh + +-# Add the variables needed at the beginning of the path +-check_args() { +- for p in "$@"; do +- case "${p%=*}" in +- LIB_TAG) +- # Take a variable if the branch exists locally +- if [ "${p#*=}" == "$(git branch | +- gawk -v b="${p#*=}" '{if ( $NF == b ) {print $NF}}')" ]; then +- echo -e "[\e[0;35m warn \x1B[0m] Setting $p" +- eval "$p" +- else +- echo -e "[\e[0;35m warn \x1B[0m] Skip $p setting as LIB_TAG=\"\"" +- eval LIB_TAG="" +- fi +- ;; +- esac +- done +-} +- +-function do_update_src() { +- TMPFILE=$(mktemp) +- chmod 644 "${TMPFILE}" +- { +- echo SRC="$SRC" +- echo LIB_TAG="$LIB_TAG" +- declare -f update_src # this writes the source of 'update_src' there +- echo "update_src" +- } > "$TMPFILE" +- +- #do not update/checkout git with root privileges to messup files onwership. +- #due to in docker/VM, we can't su to a normal user, so do not update/checkout git. +- if [[ $(systemd-detect-virt) == 'none' ]]; then +- if [[ "${EUID}" == "0" ]]; then +- su "$(stat --format=%U "${SRC}"/.git)" -c "bash ${TMPFILE}" +- else +- bash "${TMPFILE}" +- fi +- fi +- rm "${TMPFILE}" +-} +- +-update_src() { +- cd "${SRC}" || exit +- if [[ ! -f "${SRC}"/.ignore_changes ]]; then +- echo -e "[\e[0;32m o.k. \x1B[0m] This script will try to update" +- +- CHANGED_FILES=$(git diff --name-only) +- if [[ -n "${CHANGED_FILES}" ]]; then +- echo -e "[\e[0;35m warn \x1B[0m] Can't update since you made changes to: \e[0;32m\n${CHANGED_FILES}\x1B[0m" +- while true; do +- echo -e "Press \e[0;33m\x1B[0m or \e[0;33mexit\x1B[0m to abort compilation" \ +- ", \e[0;33m\x1B[0m to ignore and continue, \e[0;33mdiff\x1B[0m to display changes" +- read -r +- if [[ "${REPLY}" == "diff" ]]; then +- git diff +- elif [[ "${REPLY}" == "exit" ]]; then +- exit 1 +- elif [[ "${REPLY}" == "" ]]; then +- break +- else +- echo "Unknown command!" +- fi +- done +- elif [[ $(git branch | grep "*" | awk '{print $2}') != "${LIB_TAG}" && -n "${LIB_TAG}" ]]; then +- git checkout "${LIB_TAG:-master}" +- git pull +- fi +- fi +- +-} +- + function handle_docker_vagrant() { + # Check for Vagrant + if [[ "${1}" == vagrant && -z "$(command -v vagrant)" ]]; then + +From d20902020953d75c3f7d1a9c27ec9c553825660a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 8 May 2022 14:15:32 +0200 +Subject: [PATCH] armbian-next: `python2` is required for some u-boot builds + +- would be "use `python-is-python2` so /usr/bin/python exists and points to Python 2.x" but Jammy does not have that anymore +- python2 is required for some u-boot builds. +- that said, python 2.x is deprecated for a while and needs work thus @TODO +--- + lib/functions/host/prepare-host.sh | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index b48f666b1..55ae01988 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -42,6 +42,9 @@ prepare_host() { + systemd-container u-boot-tools udev uuid-dev whiptail + zlib1g-dev + ++ # python2, mostly used by some u-boot builds (2018 et al, odroidxu4 and others). ++ python2 ++ + # non-mess below? + file ccze colorized-logs tree # logging utilities + unzip zip p7zip-full pigz pixz pbzip2 lzop zstd # compressors et al + +From cec6a1b3ebe5c7df20dc8be8f7687416843d5db9 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 8 May 2022 13:45:19 +0200 +Subject: [PATCH] armbian-next: bump Python info gatherer to RELEASE=jammy too + +--- + lib/tools/info.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/tools/info.py b/lib/tools/info.py +index 6319a1427..f452b37ab 100755 +--- a/lib/tools/info.py ++++ b/lib/tools/info.py +@@ -119,7 +119,7 @@ common_compile_params = { + } + + board_compile_params = { +- "RELEASE": "impish", ++ "RELEASE": "jammy", + "BUILD_DESKTOP": "no" + } + + +From 75a638f13bfeeb3327510ad9c1ef3ce3adb166bd Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 8 May 2022 13:44:28 +0200 +Subject: [PATCH] armbian-next: add `KERNEL_MAJOR_MINOR` info to `media` kernel + (@balbes150) + +- 5.18 is not yet released so might be a problem here +--- + config/sources/families/media.conf | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index ef89b8f07..747eb86a5 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -17,6 +17,7 @@ case $BRANCH in + + if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then + KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' ++ export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='branch:kernel-4.19' + KERNELPATCHDIR='station-p2-'$BRANCH + LINUXFAMILY=station-p2 +@@ -26,12 +27,14 @@ case $BRANCH in + else + if [[ $BOARD == nanopct4 ]]; then + KERNELSOURCE='https://github.com/friendlyarm/kernel-rockchip' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:nanopi4-linux-v4.4.y' + KERNELPATCHDIR='rk3399-'$BRANCH + LINUXFAMILY=rk3399 + LINUXCONFIG='linux-rk3399-'$BRANCH + else + KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' + KERNELPATCHDIR='rockchip64-'$BRANCH + LINUXFAMILY=rockchip64 +@@ -41,6 +44,7 @@ case $BRANCH in + ;; + + current) ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.17.y" + KERNELBRANCH="tag:v5.17.5" + KERNELPATCHDIR='media-'$BRANCH +@@ -49,6 +53,7 @@ case $BRANCH in + ;; + + edge) ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.18.y" + KERNELBRANCH="tag:v5.18-rc5" + KERNELPATCHDIR='media-'$BRANCH + +From 91db9e2a305cd385077289363ffe1212a7c614f2 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 8 May 2022 00:18:35 +0200 +Subject: [PATCH] armbian-next: allow to skip submodules during + `fetch_from_repo`; introduce hook `fetch_custom_uboot` + +- via GIT_SKIP_SUBMODULES=yes, which disables all submodules everywhere +- via UBOOT_GIT_SKIP_SUBMODULES=yes, which disables fetching of submodules during uboot fetch (hidden rkbins anyone?) +- extension hook `fetch_custom_uboot` so we can fetch our own stuff if needed +--- + lib/functions/compilation/uboot.sh | 9 ++++++++- + lib/functions/general/git.sh | 34 +++++++++++++++++++--------------- + 2 files changed, 27 insertions(+), 16 deletions(-) + +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index f87470eb7..699946406 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -107,7 +107,14 @@ function compile_uboot_target() { + compile_uboot() { + if [[ -n $BOOTSOURCE ]] && [[ "${BOOTSOURCE}" != "none" ]]; then + display_alert "Downloading sources" "u-boot" "git" +- fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo ++ GIT_SKIP_SUBMODULES="${UBOOT_GIT_SKIP_SUBMODULES}" fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo ++ ++ display_alert "Extensions: fetch custom uboot" "fetch_custom_uboot" "debug" ++ call_extension_method "fetch_custom_uboot" <<- 'FETCH_CUSTOM_UBOOT' ++ *allow extensions to fetch extra uboot sources* ++ For downstream uboot et al. ++ This is done after `GIT_SKIP_SUBMODULES="${UBOOT_GIT_SKIP_SUBMODULES}" fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes"` ++ FETCH_CUSTOM_UBOOT + fi + + # not optimal, but extra cleaning before overlayfs_wrapper should keep sources directory clean +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index c8086f728..89b108a86 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -198,21 +198,25 @@ fetch_from_repo() { + #fasthash_debug "after setting checkout time for $dir $ref_name" #yeah + + if [[ -f .gitmodules ]]; then +- display_alert "Updating submodules" "" "ext" +- # FML: http://stackoverflow.com/a/17692710 +- for i in $(git config -f .gitmodules --get-regexp path | awk '{ print $2 }'); do +- cd "${git_work_dir}" || exit +- local surl sref +- surl=$(git config -f .gitmodules --get "submodule.$i.url") +- sref=$(git config -f .gitmodules --get "submodule.$i.branch" || true) +- if [[ -n $sref ]]; then +- sref="branch:$sref" +- else +- sref="head" +- fi +- # @TODO: in case of the bundle stuff this will fail terribly +- fetch_from_repo "$surl" "$workdir/$i" "$sref" +- done ++ if [[ "${GIT_SKIP_SUBMODULES}" == "yes" ]]; then ++ display_alert "Skipping submodules" "GIT_SKIP_SUBMODULES=yes" "debug" ++ else ++ display_alert "Updating submodules" "" "ext" ++ # FML: http://stackoverflow.com/a/17692710 ++ for i in $(git config -f .gitmodules --get-regexp path | awk '{ print $2 }'); do ++ cd "${git_work_dir}" || exit ++ local surl sref ++ surl=$(git config -f .gitmodules --get "submodule.$i.url") ++ sref=$(git config -f .gitmodules --get "submodule.$i.branch" || true) ++ if [[ -n $sref ]]; then ++ sref="branch:$sref" ++ else ++ sref="head" ++ fi ++ # @TODO: in case of the bundle stuff this will fail terribly ++ fetch_from_repo "$surl" "$workdir/$i" "$sref" ++ done ++ fi + fi + + display_alert "Final working copy size" "$(du -h -s | awk '{print $1}')" "git" + +From fb3add638441223317735bf5eb826badfe8c0924 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 9 May 2022 12:15:08 +0200 +Subject: [PATCH] armbian-next: `initrd` caching fixes (always enable hook; if + cache hit, convert to uImage too) + +--- + lib/functions/image/initrd.sh | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index 817bdf78a..695864a77 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -48,6 +48,10 @@ update_initramfs() { + initrd_cache_file_path="${SRC}/cache/initrd/${initrd_cache_key}" + display_alert "initrd cache hash" "${initrd_hash}" "debug" + ++ display_alert "Mounting chroot for update-initramfs" "update-initramfs" "debug" ++ cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ ++ mount_chroot "$chroot_target/" ++ + if [[ -f "${initrd_cache_file_path}" ]]; then + display_alert "initrd cache hit" "${initrd_cache_key}" "cachehit" + run_host_command_logged cp -pv "${initrd_cache_file_path}" "${initrd_file}" +@@ -55,6 +59,11 @@ update_initramfs() { + if [[ -f "${initrd_cache_last_manifest_filepath}" ]]; then + touch "${initrd_cache_last_manifest_filepath}" # touch the manifest file timestamp; LRU bump. + fi ++ ++ # Convert to bootscript expected format, by calling into the script manually. ++ if [[ -f "${chroot_target}"/etc/initramfs/post-update.d/99-uboot ]]; then ++ chroot_custom "$chroot_target" /etc/initramfs/post-update.d/99-uboot "${initrd_kern_ver}" "/boot/initrd.img-${initrd_kern_ver}" ++ fi + else + display_alert "Cache miss for initrd cache" "${initrd_cache_key}" "debug" + +@@ -67,9 +76,6 @@ update_initramfs() { + fi + + display_alert "Updating initramfs..." "$update_initramfs_cmd" "" +- cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ +- mount_chroot "$chroot_target/" +- + local logging_filter="2>&1 | grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary ' -e 'Adding module ' -e 'Adding firmware ' " + chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" "${logging_filter}" + display_alert "Updated initramfs." "${update_initramfs_cmd}" "info" +@@ -84,13 +90,14 @@ update_initramfs() { + # 60: keep the last 30 initrd + manifest pairs. this should be higher than the total number of kernels we support, otherwise churn will be high + find "${SRC}/cache/initrd" -type f -printf "%T@ %p\\n" | sort -n -r | sed "1,60d" | xargs rm -fv + fi ++ fi + +- display_alert "Re-enabling" "initramfs-tools hook for kernel" +- chroot_custom "$chroot_target" chmod -v +x /etc/kernel/postinst.d/initramfs-tools ++ display_alert "Re-enabling" "initramfs-tools hook for kernel" ++ chroot_custom "$chroot_target" chmod -v +x /etc/kernel/postinst.d/initramfs-tools + +- umount_chroot "$chroot_target/" +- rm "$chroot_target/usr/bin/$QEMU_BINARY" +- fi ++ display_alert "Unmounting chroot" "update-initramfs" "debug" ++ umount_chroot "$chroot_target/" ++ rm "$chroot_target/usr/bin/$QEMU_BINARY" + + # no need to remove ${initrd_cache_current_manifest_filepath} manually, since it's under ${WORKDIR} + return 0 # avoid future short-circuit problems + +From a732119d010bf7008caaacf3e50b3659c8dbf472 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 17 Apr 2022 05:19:46 +0200 +Subject: [PATCH] armbian-next: introduce `initramfs`/`initrd` caching + +- using hashes of (hopefully) all involved files +- cache hits are rewarded with sprinkly hearts. + - why? this proves we got a reproducible kernel modules build! + - also, you just saved yourself 2-10 minutes of pain +--- + lib/functions/image/initrd.sh | 87 +++++++++++++++++++++++++++++++++------- + lib/functions/logging/logging.sh | 5 +++ + 2 files changed, 78 insertions(+), 14 deletions(-) + +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index feb4143c8..817bdf78a 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -13,26 +13,85 @@ + # see: https://github.com/armbian/build/issues/1584 + update_initramfs() { + local chroot_target=$1 +- local target_dir="$(find "${chroot_target}/lib/modules"/ -maxdepth 1 -type d -name "*${VER}*")" ++ local target_dir="$(find "${chroot_target}/lib/modules"/ -maxdepth 1 -type d -name "*${VER}*")" # @TODO: rpardini: this will break when we add multi-kernel images ++ local initrd_kern_ver initrd_file initrd_cache_key initrd_cache_file_path initrd_hash ++ local initrd_cache_current_manifest_filepath initrd_cache_last_manifest_filepath + if [ "$target_dir" != "" ]; then +- update_initramfs_cmd="update-initramfs -uv -k $(basename "$target_dir")" ++ initrd_kern_ver="$(basename "$target_dir")" ++ initrd_file="${chroot_target}/boot/initrd.img-${initrd_kern_ver}" ++ ++ update_initramfs_cmd="update-initramfs -uv -k ${initrd_kern_ver}" + else + exit_with_error "No kernel installed for the version" "${VER}" + fi +- display_alert "Updating initramfs..." "$update_initramfs_cmd" "" +- cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ +- mount_chroot "$chroot_target/" + +- local logging_filter="2>&1 | grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary ' -e 'Adding module ' -e 'Adding firmware ' " +- chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" "${logging_filter}" || { +- exit_with_error "Updating initramfs FAILED" +- } +- display_alert "Updated initramfs." "${update_initramfs_cmd}" "info" ++ # Caching. ++ # Find all modules and all firmware in the target. ++ # Find all initramfs configuration in /etc ++ # Find all bash, cpio and gzip binaries in /bin ++ # Hash the contents of them all. ++ # If there's a match, use the cache. ++ ++ display_alert "computing initrd cache hash" "${chroot_target}" "debug" ++ mkdir -p "${SRC}/cache/initrd" ++ initrd_cache_current_manifest_filepath="${WORKDIR}/initrd.img-${initrd_kern_ver}.${ARMBIAN_BUILD_UUID}.manifest" ++ initrd_cache_last_manifest_filepath="${SRC}/cache/initrd/initrd.manifest-${initrd_kern_ver}.last.manifest" ++ ++ # Find all the affected files; parallel md5sum sum them; invert hash and path, and remove chroot prefix. ++ find "${target_dir}" "${chroot_target}/usr/bin/bash" "${chroot_target}/etc/initramfs" \ ++ "${chroot_target}/etc/initramfs-tools" -type f | parallel -X md5sum | ++ awk '{print $2 " - " $1}' | ++ sed -e "s|^${chroot_target}||g" | LC_ALL=C sort > "${initrd_cache_current_manifest_filepath}" ++ ++ initrd_hash="$(cat "${initrd_cache_current_manifest_filepath}" | md5sum | cut -d ' ' -f 1)" # hash of the hashes. ++ initrd_cache_key="initrd.img-${initrd_kern_ver}-${initrd_hash}" ++ initrd_cache_file_path="${SRC}/cache/initrd/${initrd_cache_key}" ++ display_alert "initrd cache hash" "${initrd_hash}" "debug" ++ ++ if [[ -f "${initrd_cache_file_path}" ]]; then ++ display_alert "initrd cache hit" "${initrd_cache_key}" "cachehit" ++ run_host_command_logged cp -pv "${initrd_cache_file_path}" "${initrd_file}" ++ touch "${initrd_cache_file_path}" # touch cached file timestamp; LRU bump. ++ if [[ -f "${initrd_cache_last_manifest_filepath}" ]]; then ++ touch "${initrd_cache_last_manifest_filepath}" # touch the manifest file timestamp; LRU bump. ++ fi ++ else ++ display_alert "Cache miss for initrd cache" "${initrd_cache_key}" "debug" ++ ++ # Show the differences between the last and the current, so we realize why it isn't hit (eg; what changed). ++ if [[ -f "${initrd_cache_last_manifest_filepath}" ]]; then ++ if [[ "${SHOW_DEBUG}" == "yes" ]]; then ++ display_alert "Showing diff between last and current initrd cache manifests" "initrd" "debug" ++ run_host_command_logged diff -u --color=always "${initrd_cache_last_manifest_filepath}" "${initrd_cache_current_manifest_filepath}" "|| true" # no errors please ++ fi ++ fi ++ ++ display_alert "Updating initramfs..." "$update_initramfs_cmd" "" ++ cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ ++ mount_chroot "$chroot_target/" ++ ++ local logging_filter="2>&1 | grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary ' -e 'Adding module ' -e 'Adding firmware ' " ++ chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" "${logging_filter}" ++ display_alert "Updated initramfs." "${update_initramfs_cmd}" "info" + +- display_alert "Re-enabling" "initramfs-tools hook for kernel" +- chroot "$chroot_target" /bin/bash -c "chmod -v +x /etc/kernel/postinst.d/initramfs-tools" 2>&1 ++ display_alert "Storing initrd in cache" "${initrd_cache_key}" "debug" # notice there's no -p here: no need to touch LRU ++ run_host_command_logged cp -v "${initrd_file}" "${initrd_cache_file_path}" # store the new initrd in the cache. ++ run_host_command_logged cp -v "${initrd_cache_current_manifest_filepath}" "${initrd_cache_last_manifest_filepath}" # store the current contents in the last file. + +- umount_chroot "$chroot_target/" +- rm $chroot_target/usr/bin/$QEMU_BINARY ++ # clean old cache files so they don't pile up forever. ++ if [[ "${SHOW_DEBUG}" == "yes" ]]; then ++ display_alert "Showing which initrd caches would be removed/expired" "initrd" "debug" ++ # 60: keep the last 30 initrd + manifest pairs. this should be higher than the total number of kernels we support, otherwise churn will be high ++ find "${SRC}/cache/initrd" -type f -printf "%T@ %p\\n" | sort -n -r | sed "1,60d" | xargs rm -fv ++ fi ++ ++ display_alert "Re-enabling" "initramfs-tools hook for kernel" ++ chroot_custom "$chroot_target" chmod -v +x /etc/kernel/postinst.d/initramfs-tools ++ ++ umount_chroot "$chroot_target/" ++ rm "$chroot_target/usr/bin/$QEMU_BINARY" ++ fi + ++ # no need to remove ${initrd_cache_current_manifest_filepath} manually, since it's under ${WORKDIR} ++ return 0 # avoid future short-circuit problems + } +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 6550d714d..6cc1621e7 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -151,6 +151,11 @@ function display_alert() { + inline_logs_color="\e[0;32m" + ;; + ++ cachehit) ++ level_indicator="💖" ++ inline_logs_color="\e[0;32m" ++ ;; ++ + cleanup | trap) + if [[ "${SHOW_TRAPS}" != "yes" ]]; then # enable debug for many, many debugging msgs + skip_screen=1 + +From 220529f8f779673746843fa55b84d23753f1e037 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 7 May 2022 16:54:00 +0200 +Subject: [PATCH] armbian-next: manual merge (18) of changes between revisions + 08cf31de73de5f5ba1986348e4556b00d77af09f and + c8855aa08dafaa02c939039e55e01967bad61c28 + +- heh; most bash code changes are for things already done in -next, or no longer used +- some version bumps, etc +--- + config/sources/families/bcm2711.conf | 4 +-- + config/sources/families/imx6.conf | 4 +-- + config/sources/families/include/meson64_common.inc | 2 -- + .../sources/families/include/rockchip64_common.inc | 4 +-- + config/sources/families/jetson-nano.conf | 8 ++--- + config/sources/families/media.conf | 37 ++++++++++++++-------- + config/sources/families/mvebu.conf | 6 ++-- + config/sources/families/mvebu64.conf | 14 +++++--- + config/sources/families/odroidxu4.conf | 4 +-- + config/sources/families/rk35xx.conf | 4 --- + config/sources/families/virtual.conf | 4 +-- + lib/functions/bsp/bsp-cli.sh | 2 +- + .../compilation/patch/kernel-bootsplash.sh | 5 ++- + lib/functions/compilation/patch/kernel-drivers.sh | 15 ++++----- + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/general/downloads.sh | 21 ++++++++++-- + lib/functions/general/repo.sh | 16 +++++++--- + lib/functions/image/partitioning.sh | 8 +++-- + lib/functions/main/rootfs-image.sh | 3 ++ + lib/functions/rootfs/distro-agnostic.sh | 22 ++++++++----- + 20 files changed, 115 insertions(+), 70 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index a6bee376e..2b19132e2 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -28,8 +28,8 @@ case "${BRANCH}" in + edge) + export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. For mainline caching. +- export KERNELBRANCH="branch:rpi-5.16.y" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:rpi-5.17.y" + export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" + export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; +diff --git a/config/sources/families/imx6.conf b/config/sources/families/imx6.conf +index d63f84266..f2bcf95a1 100644 +--- a/config/sources/families/imx6.conf ++++ b/config/sources/families/imx6.conf +@@ -16,8 +16,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.16.y' ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.17.y' + + ;; + +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index 21c71e5bd..7d79b6930 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -245,8 +245,6 @@ write_uboot_platform() { + family_tweaks_bsp() { + mkdir -p $destination/etc/udev/rules.d + mkdir -p $destination/usr/local/bin +- cp $SRC/packages/bsp/rockchip/hdmi.rules $destination/etc/udev/rules.d +- install -m 755 $SRC/packages/bsp/rockchip/hdmi-hotplug $destination/usr/local/bin + + mkdir -p "$destination"/etc/X11/xorg.conf.d + case "${BOARD}" in +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 688097ae7..21d07fda2 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -104,8 +104,8 @@ case $BRANCH in + edge) + + KERNELPATCHDIR='rockchip64-'$BRANCH +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.16.y" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.17.y" + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH + +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +index 9001baf0b..7f7f07c72 100644 +--- a/config/sources/families/jetson-nano.conf ++++ b/config/sources/families/jetson-nano.conf +@@ -22,8 +22,8 @@ case $BRANCH in + ;; + + current) +- export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.15.y" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.17.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +@@ -32,8 +32,8 @@ case $BRANCH in + + edge) + #SKIP_BOOTSPLASH="yes" +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.16.y" ++ export KERNEL_MAJOR_MINOR="5.18" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.18.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index cd23586ce..ef89b8f07 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -3,7 +3,11 @@ source "${BASH_SOURCE%/*}/include/rockchip64_common.inc" + if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then + BOOTSOURCE='https://github.com/150balbes/u-boot-rk' + BOOTBRANCH='branch:rk356x' +- BOOTPATCHDIR="u-boot-station-p2" ++ BOOTPATCHDIR="u-boot-media" ++elif [[ $BOARD == quartz64a ]]; then ++ BOOTSOURCE='https://github.com/150balbes/u-boot-rk' ++ BOOTBRANCH='branch:rk35xx' ++ BOOTPATCHDIR="u-boot-media" + fi + + case $BRANCH in +@@ -13,35 +17,40 @@ case $BRANCH in + + if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then + KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' +- export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='branch:kernel-4.19' + KERNELPATCHDIR='station-p2-'$BRANCH +- LINUXCONFIG='linux-station-p2-'$BRANCH + LINUXFAMILY=station-p2 ++ LINUXCONFIG='linux-station-p2-'$BRANCH + EXTRAWIFI="no" + WIREGUARD="no" + else +- KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' +- export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. +- KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' +- KERNELPATCHDIR='rockchip64-'$BRANCH +- LINUXCONFIG='linux-rockchip64-'$BRANCH +- LINUXFAMILY=rockchip64 ++ if [[ $BOARD == nanopct4 ]]; then ++ KERNELSOURCE='https://github.com/friendlyarm/kernel-rockchip' ++ KERNELBRANCH='branch:nanopi4-linux-v4.4.y' ++ KERNELPATCHDIR='rk3399-'$BRANCH ++ LINUXFAMILY=rk3399 ++ LINUXCONFIG='linux-rk3399-'$BRANCH ++ else ++ KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' ++ KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' ++ KERNELPATCHDIR='rockchip64-'$BRANCH ++ LINUXFAMILY=rockchip64 ++ LINUXCONFIG='linux-rockchip64-'$BRANCH ++ fi + fi + ;; + + current) +- export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.15.y" ++ KERNELBRANCH="branch:linux-5.17.y" ++ KERNELBRANCH="tag:v5.17.5" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH + ;; + + edge) +- #SKIP_BOOTSPLASH="yes" +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.17.y" ++ KERNELBRANCH="branch:linux-5.18.y" ++ KERNELBRANCH="tag:v5.18-rc5" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +diff --git a/config/sources/families/mvebu.conf b/config/sources/families/mvebu.conf +index ad240d6b6..c8a3affb2 100644 +--- a/config/sources/families/mvebu.conf ++++ b/config/sources/families/mvebu.conf +@@ -25,9 +25,9 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.16.y' +- ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.17.y' ++ + LINUXCONFIG='linux-mvebu-edge' + KERNELPATCHDIR="mvebu-edge" + +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index 88cc752d4..d9ae12786 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -2,6 +2,7 @@ enable_extension "marvell-tools" + ARCH=arm64 + BOOTBRANCH='branch:v2022.04' + BOOTENV_FILE='mvebu64.txt' ++BOOTSCRIPT_OUTPUT='boot.scr.uimg' + ATFSOURCE='https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git' + ATFDIR='arm-trusted-firmware-espressobin' + ATFBRANCH='branch:master' +@@ -48,8 +49,8 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.16.y' ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.17.y' + ;; + + esac +@@ -72,11 +73,15 @@ write_uboot_platform() { + family_tweaks() { + chroot_sdcard_apt_get remove --auto-remove linux-sound-base alsa-base alsa-utils bluez + [[ -f $SDCARD/etc/netplan/armbian-default.yaml ]] && sed -i "s/^ renderer.*/ renderer: networkd/" $SDCARD/etc/netplan/armbian-default.yaml +- cp $SRC/packages/bsp/mvebu64/10* $SDCARD/etc/systemd/network/ ++ cp $SRC/packages/bsp/mvebu64/networkd/10* $SDCARD/etc/systemd/network/ + echo "#Marvell Espressobin Console" >> $SDCARD/etc/securetty + echo "ttyMV0" >> $SDCARD/etc/securetty + } + ++family_tweaks_bsp() { ++ cp "$SRC/packages/bsp/mvebu64/initramfs/99-uboot-fit" "$destination/etc/initramfs/post-update.d/" ++} ++ + atf_custom_postprocess() { + # prepare compilers for postprocess + ubootdir="$SRC/cache/sources/$BOOTDIR/${BOOTBRANCH##*:}" +@@ -109,11 +114,12 @@ uboot_custom_postprocess() { + run_host_command_logged cp -pv build/a80x0_mcbin/release/flash-image.bin $ubootdir/$FILENAME + else + cd $moxbootdir ++ make clean # @TODO: rpardini: why? + run_host_command_logged make CROSS_CM3=$ATF2 wtmi_app.bin + cd $atfdir + + clocks=(600_600 800_800 1000_800 1200_750) +- topology=(512m_1cs_0 512m_2cs_0 1g_2cs_2 1g_1cs_4 2g_2cs_7 1g_1cs_5 2g_2cs_6) ++ topology=(512m_1cs_0 1g_2cs_2 1g_1cs_4 2g_2cs_7 1g_1cs_5 2g_2cs_6) + for i in "${clocks[@]}"; do + for j in "${topology[@]}"; do + if [[ $j = *cs_5 || $j = *cs_6 ]]; then local ddrname="DDR4"; else ddrname="DDR3"; fi +diff --git a/config/sources/families/odroidxu4.conf b/config/sources/families/odroidxu4.conf +index 02a9947a9..992b2bbb2 100644 +--- a/config/sources/families/odroidxu4.conf ++++ b/config/sources/families/odroidxu4.conf +@@ -25,8 +25,8 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.16.y' ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.17.y' + ;; + + esac +diff --git a/config/sources/families/rk35xx.conf b/config/sources/families/rk35xx.conf +index 1a05d42d1..22cc76952 100644 +--- a/config/sources/families/rk35xx.conf ++++ b/config/sources/families/rk35xx.conf +@@ -25,12 +25,8 @@ case $BRANCH in + # temporary until kernel 5.16 is well supported for rockchip64 + # it has to be its own family too + edge) +- export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.17.y" +- KERNELPATCHDIR='rk35xx-'$BRANCH + SKIP_BOOTSPLASH="yes" + LINUXFAMILY=rk35xx +- LINUXCONFIG='linux-rk35xx-'$BRANCH + + ;; + +diff --git a/config/sources/families/virtual.conf b/config/sources/families/virtual.conf +index 3745afee6..b5be13db8 100644 +--- a/config/sources/families/virtual.conf ++++ b/config/sources/families/virtual.conf +@@ -1,7 +1,7 @@ + BOOTBRANCH='tag:v2021.04' + +-export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. +-KERNELBRANCH='branch:linux-5.10.y' ++export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. ++KERNELBRANCH='branch:linux-5.15.y' + + ARCH=arm64 + #UBOOT_TARGET_MAP=";;u-boot.bin" +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index 688bd94c3..a20ea1e57 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -242,7 +242,7 @@ create_board_package() { + fi + + # Reload services +- systemctl --no-reload enable armbian-hardware-monitor.service armbian-hardware-optimize.service armbian-zram-config.service >/dev/null 2>&1 ++ systemctl --no-reload enable armbian-hardware-monitor.service armbian-hardware-optimize.service armbian-zram-config.service armbian-led-state.service >/dev/null 2>&1 + exit 0 + EOF + +diff --git a/lib/functions/compilation/patch/kernel-bootsplash.sh b/lib/functions/compilation/patch/kernel-bootsplash.sh +index f4e078bfb..cbd929513 100644 +--- a/lib/functions/compilation/patch/kernel-bootsplash.sh ++++ b/lib/functions/compilation/patch/kernel-bootsplash.sh +@@ -8,7 +8,10 @@ function apply_kernel_patches_for_bootsplash() { + + display_alert "Adding" "Kernel bootsplash patch" "info" + +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0000-Revert-fbcon-Avoid-cap-set-but-not-used-warning.patch" "applying" ++ if linux-version compare "${version}" ge 5.11; then ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0000-Revert-fbcon-Avoid-cap-set-but-not-used-warning.patch" "applying" ++ fi ++ + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" + + if linux-version compare "${version}" ge 5.15; then +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 6631eb445..8529e4ba1 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -31,16 +31,16 @@ function prepare_extra_kernel_drivers() { + # + # Older versions have AUFS support with a patch + +- if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" le 5.18 && [ "$AUFS" == yes ]; then ++ if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" lt 5.15 && [ "$AUFS" == yes ]; then + # @TODO: Fasthash for this whole block is only the git hash of revision we'd apply from Mr. Okajima + local aufs_tag # attach to specifics tag or branch + aufs_tag=$(echo "${version}" | cut -f 1-2 -d ".") + + # manual overrides +- if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5 ; then aufstag="5.4.3"; fi +- if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11 ; then aufstag="5.10.82"; fi +- if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16 ; then aufstag="5.15.5"; fi +- if linux-version compare "${version}" ge 5.17.3 && linux-version compare "${version}" le 5.18 ; then aufstag="5.17.3"; fi ++ if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5; then aufstag="5.4.3"; fi ++ if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufstag="5.10.82"; fi ++ if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufstag="5.15.5"; fi ++ if linux-version compare "${version}" ge 5.17.3 && linux-version compare "${version}" le 5.18; then aufstag="5.17.3"; fi + + # check if Mr. Okajima already made a branch for this version, otherwise use RC. + git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufs_tag}" > /dev/null || { +@@ -516,7 +516,7 @@ function prepare_extra_kernel_drivers() { + + # Wireless drivers for Realtek 8822BS chipsets + +- if linux-version compare "${version}" ge 4.4 && [ "$EXTRAWIFI" == yes ]; then ++ if linux-version compare "${version}" ge 4.4 && linux-version compare "${version}" le 5.16 && [ "$EXTRAWIFI" == yes ]; then + # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch +@@ -544,9 +544,6 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8822bs\/Kconfig"' \ + $kerneldir/drivers/net/wireless/Kconfig + +- # add support for K5.11+ +- process_patch_file "${SRC}/patch/misc/wireless-rtl8822bs.patch" "applying" +- + fi + + if linux-version compare $version ge 4.4 && linux-version compare $version lt 5.8; then +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 5b83ff600..5100e6d35 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=17 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=18 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote | grep origin)") + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty) +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index e3df91fe8..ecd383e12 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -4,14 +4,29 @@ function webseed() { + # Hardcoded to EU mirrors since + local CCODE=$(curl -s redirect.armbian.com/geoip | jq '.continent.code' -r) + WEBSEED=($(curl -s https://redirect.armbian.com/mirrors | jq -r '.'${CCODE}' | .[] | values')) ++ # remove dead mirrors to suppress download errors ++ FILE=".control" ++ while read -r line; do ++ REMOVE=$(echo $line | egrep -o 'https?://[^ ]+/') ++ WEBSEED=("${WEBSEED[@]/$REMOVE/}") ++ done < <( ++ for k in ${WEBSEED[@]}; do ++ echo "$k$FILE" ++ done | parallel --halt soon,fail=10 --jobs 32 wget -q --spider --timeout=15 --tries=4 --retry-connrefused {} 2>&1 > /dev/null ++ ) ++ + # aria2 simply split chunks based on sources count not depending on download speed + # when selecting china mirrors, use only China mirror, others are very slow there + if [[ $DOWNLOAD_MIRROR == china ]]; then +- WEBSEED=(https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/) ++ WEBSEED=( ++ https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/ ++ ) + elif [[ $DOWNLOAD_MIRROR == bfsu ]]; then +- WEBSEED=(https://mirrors.bfsu.edu.cn/armbian-releases/) ++ WEBSEED=( ++ https://mirrors.bfsu.edu.cn/armbian-releases/ ++ ) + fi +- for toolchain in "${WEBSEED[@]}"; do ++ for toolchain in ${WEBSEED[@]}; do + text="${text} ${toolchain}${1}" + done + text="${text:1}" +diff --git a/lib/functions/general/repo.sh b/lib/functions/general/repo.sh +index 155151300..a68424bd1 100644 +--- a/lib/functions/general/repo.sh ++++ b/lib/functions/general/repo.sh +@@ -29,6 +29,14 @@ addtorepo() { + + for release in "${distributions[@]}"; do + ++ ADDING_PACKAGES="false" ++ if [[ -d "config/distributions/${release}/" ]]; then ++ [[ -n "$(cat config/distributions/${release}/support | grep "csc\|supported" 2> /dev/null)" ]] && ADDING_PACKAGES="true" ++ else ++ display_alert "Skipping adding packages (not supported)" "$release" "wrn" ++ continue ++ fi ++ + local forceoverwrite="" + + # let's drop from publish if exits +@@ -58,7 +66,7 @@ addtorepo() { + + # adding main + if find "${DEB_STORAGE}"/ -maxdepth 1 -type f -name "*.deb" 2> /dev/null | grep -q .; then +- adding_packages "$release" "" "main" ++ [[ "${ADDING_PACKAGES}" == true ]] && adding_packages "$release" "" "main" + else + aptly repo add -config="${SCRIPTPATH}config/${REPO_CONFIG}" "${release}" "${SCRIPTPATH}config/templates/example.deb" > /dev/null + fi +@@ -67,7 +75,7 @@ addtorepo() { + + # adding main distribution packages + if find "${DEB_STORAGE}/${release}" -maxdepth 1 -type f -name "*.deb" 2> /dev/null | grep -q .; then +- adding_packages "${release}-utils" "/${release}" "release packages" ++ [[ "${ADDING_PACKAGES}" == true ]] && adding_packages "${release}-utils" "/${release}" "release packages" + else + # workaround - add dummy package to not trigger error + aptly repo add -config="${SCRIPTPATH}config/${REPO_CONFIG}" "${release}" "${SCRIPTPATH}config/templates/example.deb" > /dev/null +@@ -75,7 +83,7 @@ addtorepo() { + + # adding release-specific utils + if find "${DEB_STORAGE}/extra/${release}-utils" -maxdepth 1 -type f -name "*.deb" 2> /dev/null | grep -q .; then +- adding_packages "${release}-utils" "/extra/${release}-utils" "release utils" ++ [[ "${ADDING_PACKAGES}" == true ]] && adding_packages "${release}-utils" "/extra/${release}-utils" "release utils" + else + aptly repo add -config="${SCRIPTPATH}config/${REPO_CONFIG}" "${release}-utils" "${SCRIPTPATH}config/templates/example.deb" > /dev/null + fi +@@ -83,7 +91,7 @@ addtorepo() { + + # adding desktop + if find "${DEB_STORAGE}/extra/${release}-desktop" -maxdepth 1 -type f -name "*.deb" 2> /dev/null | grep -q .; then +- adding_packages "${release}-desktop" "/extra/${release}-desktop" "desktop" ++ [[ "${ADDING_PACKAGES}" == true ]] && adding_packages "${release}-desktop" "/extra/${release}-desktop" "desktop" + else + # workaround - add dummy package to not trigger error + aptly repo add -config="${SCRIPTPATH}config/${REPO_CONFIG}" "${release}-desktop" "${SCRIPTPATH}config/templates/example.deb" > /dev/null +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 335ea584d..b06055335 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -343,8 +343,12 @@ function prepare_partitions() { + fi + + # recompile .cmd to .scr if boot.cmd exists +- [[ -f $SDCARD/boot/boot.cmd ]] && +- run_host_command_logged mkimage -C none -A arm -T script -d $SDCARD/boot/boot.cmd $SDCARD/boot/boot.scr ++ if [[ -f $SDCARD/boot/boot.cmd ]]; then ++ if [ -z $BOOTSCRIPT_OUTPUT ]; then ++ BOOTSCRIPT_OUTPUT=boot.scr ++ fi ++ run_host_command_logged mkimage -C none -A arm -T script -d $SDCARD/boot/boot.cmd $SDCARD/boot/${BOOTSCRIPT_OUTPUT} ++ fi + + # complement extlinux config if it exists; remove armbianEnv in this case. + if [[ -f $SDCARD/boot/extlinux/extlinux.conf ]]; then +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 590ca1f84..87821d253 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -67,6 +67,9 @@ function build_rootfs_and_image() { + # install from apt.armbian.com # @TODO: armbian-nextify this eventually + [[ $EXTERNAL_NEW == prebuilt ]] && LOG_SECTION="packages_prebuilt" do_with_logging chroot_installpackages "yes" + ++ # remove existing ssh keys. They will be created in 1st boot process ++ rm -f "${SDCARD}"/etc/ssh/ssh_host* ++ + # stage: user customization script + # NOTE: installing too many packages may fill tmpfs mount + LOG_SECTION="customize_image" do_with_logging customize_image +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 02b79eaad..4b664acc1 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -154,17 +154,23 @@ function install_distribution_agnostic() { + if [[ $SRC_EXTLINUX == yes ]]; then + display_alert "Using extlinux, SRC_EXTLINUX: ${SRC_EXTLINUX}" "image will be incompatible with nand-sata-install" "warn" + mkdir -p $SDCARD/boot/extlinux ++ local bootpart_prefix ++ if [[ -n $BOOTFS_TYPE ]]; then ++ bootpart_prefix=/ ++ else ++ bootpart_prefix=/boot/ ++ fi + cat <<- EOF > "$SDCARD/boot/extlinux/extlinux.conf" + label ${VENDOR} +- kernel /boot/$NAME_KERNEL +- initrd /boot/$NAME_INITRD ++ kernel ${bootpart_prefix}$NAME_KERNEL ++ initrd ${bootpart_prefix}$NAME_INITRD + EOF + if [[ -n $BOOT_FDT_FILE ]]; then + if [[ $BOOT_FDT_FILE != "none" ]]; then +- echo " fdt /boot/dtb/$BOOT_FDT_FILE" >> "$SDCARD/boot/extlinux/extlinux.conf" ++ echo " fdt ${bootpart_prefix}dtb/$BOOT_FDT_FILE" >> "$SDCARD/boot/extlinux/extlinux.conf" + fi + else +- echo " fdtdir /boot/dtb/" >> "$SDCARD/boot/extlinux/extlinux.conf" ++ echo " fdtdir ${bootpart_prefix}dtb/" >> "$SDCARD/boot/extlinux/extlinux.conf" + fi + else + +@@ -431,14 +437,13 @@ function install_distribution_agnostic() { + [[ -f "${SDCARD}"/lib/systemd/system/armbian-ramlog.service ]] && chroot_sdcard systemctl --no-reload enable armbian-ramlog.service + [[ -f "${SDCARD}"/lib/systemd/system/armbian-resize-filesystem.service ]] && chroot_sdcard systemctl --no-reload enable armbian-resize-filesystem.service + [[ -f "${SDCARD}"/lib/systemd/system/armbian-hardware-monitor.service ]] && chroot_sdcard systemctl --no-reload enable armbian-hardware-monitor.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-led-state.service ]] && chroot_sdcard systemctl --no-reload enable armbian-led-state.service + + # copy "first run automated config, optional user configured" + cp "${SRC}"/packages/bsp/armbian_first_run.txt.template "${SDCARD}"/boot/armbian_first_run.txt.template + + # switch to beta repository at this stage if building nightly images +- [[ $IMAGE_TYPE == nightly ]] && +- echo "deb https://beta.armbian.com $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" \ +- > "${SDCARD}"/etc/apt/sources.list.d/armbian.list ++ [[ $IMAGE_TYPE == nightly ]] && sed -i 's/apt/beta/' "${SDCARD}"/etc/apt/sources.list.d/armbian.list + + # fix for https://bugs.launchpad.net/ubuntu/+source/blueman/+bug/1542723 @TODO: from ubuntu 15. maybe gone? + chroot "${SDCARD}" /bin/bash -c "chown root:messagebus /usr/lib/dbus-1.0/dbus-daemon-launch-helper" +@@ -457,7 +462,8 @@ function install_distribution_agnostic() { + sed '/daemon\.\*\;mail.*/,/xconsole/ s/.*/#&/' -i "${SDCARD}"/etc/rsyslog.d/50-default.conf + + # disable deprecated parameter +- sed '/.*$KLogPermitNonKernelFacility.*/,// s/.*/#&/' -i "${SDCARD}"/etc/rsyslog.conf ++ [[ -f "${SDCARD}"/etc/rsyslog.conf ]] && ++ sed '/.*$KLogPermitNonKernelFacility.*/,// s/.*/#&/' -i "${SDCARD}"/etc/rsyslog.conf + + # enable getty on multiple serial consoles + # and adjust the speed if it is defined and different than 115200 + +From eb38c77729431d0c89ae1f0546ab56e450429acc Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 7 May 2022 13:09:55 +0200 +Subject: [PATCH] armbian-next: cleanup entrypoint and shuffle + `prepare_host_basic()` into logging section + +--- + lib/functions/cli/cli-entrypoint.sh | 33 +++++++++++++++------------------ + lib/functions/host/basic-deps.sh | 4 ++-- + 2 files changed, 17 insertions(+), 20 deletions(-) + +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 4cd37537d..c6d0459ed 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -4,9 +4,9 @@ function cli_entrypoint() { + + if [[ "${ARMBIAN_ENABLE_CALL_TRACING}" == "yes" ]]; then + set -T # inherit return/debug traps +- mkdir -p "${SRC}"/output/debug +- echo -n "" > "${SRC}"/output/debug/calls.txt +- trap 'echo "${BASH_LINENO[@]}|${BASH_SOURCE[@]}|${FUNCNAME[@]}" >> ${SRC}/output/debug/calls.txt ;' RETURN ++ mkdir -p "${SRC}"/output/call-traces ++ echo -n "" > "${SRC}"/output/call-traces/calls.txt ++ trap 'echo "${BASH_LINENO[@]}|${BASH_SOURCE[@]}|${FUNCNAME[@]}" >> ${SRC}/output/call-traces/calls.txt ;' RETURN + fi + + check_args "$@" +@@ -21,16 +21,6 @@ function cli_entrypoint() { + else + display_alert "This script requires root privileges, trying to use sudo" "" "wrn" + sudo "${SRC}/compile.sh" "$@" +- exit $? +- fi +- +- # The only way to get this is via ENV var... +- if [ "${OFFLINE_WORK}" == "yes" ]; then +- display_alert "* " "You are working offline!" +- display_alert "* " "Sources, time and host will not be checked" +- else +- # check and install the basic utilities here # @TODO: logging? +- prepare_host_basic + fi + + # Purge Armbian Docker images +@@ -45,7 +35,6 @@ function cli_entrypoint() { + # Docker shell + if [[ "${1}" == docker-shell ]]; then + shift +- #shellcheck disable=SC2034 + SHELL_ONLY=yes + set -- "docker" "$@" + fi +@@ -75,7 +64,6 @@ function cli_entrypoint() { + CONFIG_PATH=$(dirname "${CONFIG_FILE}") + + # DEST is the main output dir. +- # destination. # @TODO: logging this is when we can start logging to file. make sure. + declare DEST="${SRC}/output" + if [ -d "$CONFIG_PATH/output" ]; then + DEST="${CONFIG_PATH}/output" +@@ -83,7 +71,8 @@ function cli_entrypoint() { + display_alert "Output directory DEST:" "${DEST}" "debug" + + # set unique mounting directory for this build. +- export ARMBIAN_BUILD_UUID="$(uuidgen)" ++ declare -g ARMBIAN_BUILD_UUID ++ ARMBIAN_BUILD_UUID="$(uuidgen)" + display_alert "Build UUID:" "${ARMBIAN_BUILD_UUID}" "debug" + + # Super-global variables, used everywhere. The directories are NOT _created_ here, since this very early stage. +@@ -97,6 +86,14 @@ function cli_entrypoint() { + LOG_SECTION=entrypoint start_logging_section # This creates LOGDIR. + add_cleanup_handler trap_handler_cleanup_logging # cleanup handler for logs; it rolls it up from LOGDIR into DEST/logs + ++ if [ "${OFFLINE_WORK}" == "yes" ]; then ++ display_alert "* " "You are working offline!" ++ display_alert "* " "Sources, time and host will not be checked" ++ else ++ # check and install the basic utilities. ++ LOG_SECTION="prepare_host_basic" do_with_logging prepare_host_basic ++ fi ++ + # Source the extensions manager library at this point, before sourcing the config. + # This allows early calls to enable_extension(), but initialization proper is done later. + # shellcheck source=lib/extensions.sh +@@ -140,12 +137,12 @@ function cli_entrypoint() { + if [[ -z $1 ]]; then + main_default_build_single + else +- # @TODO: check this with extensions usage? ++ # @TODO: rpardini: check this with extensions usage? + eval "$@" + fi + fi + + # Build done, run the cleanup handlers explicitly. +- # This zeroes out the list of cleanups, so it's not done again when the main script exits. ++ # This zeroes out the list of cleanups, so it's not done again when the main script exits normally and trap = 0 runs. + run_cleanup_handlers + } +diff --git a/lib/functions/host/basic-deps.sh b/lib/functions/host/basic-deps.sh +index fff94fbad..4cce0f8bf 100644 +--- a/lib/functions/host/basic-deps.sh ++++ b/lib/functions/host/basic-deps.sh +@@ -23,8 +23,8 @@ prepare_host_basic() { + + if [[ -n $install_pack ]]; then + display_alert "Installing basic packages" "$install_pack" +- # @TODO: wait, why sudo? we should already be sudo'ed when this executes. +- sudo bash -c "apt-get -qq update && apt-get install -qq -y --no-install-recommends $install_pack" ++ run_host_command_logged sudo apt-get -qq update ++ run_host_command_logged sudo apt-get install -qq -y --no-install-recommends $install_pack + fi + + } + +From 91af44294685e7747b5df793778a1790756e8ce7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 20 Apr 2022 15:32:16 +0200 +Subject: [PATCH] armbian-next: *breaking change* add global extlinux + killswitch `ALLOW_EXTLINUX` + +- unless you set `ALLOW_EXTLINUX=yes`, then `SRC_EXTLINUX` will be disabled globally. +- add a bunch of logging regarding extlinux, armbianEnv and bootscripts for clarity during build +- this is due to nand-sata-install problems with extlinux +- some boards _only work_ with extlinux; we'll have to handle it later +--- + lib/functions/bsp/bsp-cli.sh | 8 +++++--- + lib/functions/configuration/main-config.sh | 10 ++++++++++ + lib/functions/image/partitioning.sh | 5 +++-- + lib/functions/rootfs/distro-agnostic.sh | 13 +++++++------ + 4 files changed, 25 insertions(+), 11 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index 5ee670582..688bd94c3 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -25,12 +25,14 @@ create_board_package() { + # if not using extlinux, copy armbianEnv from template; prefer userpatches source + if [[ $SRC_EXTLINUX != yes ]]; then + if [ -f "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" ]; then +- cp "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" "${destination}/usr/share/armbian/${bootscript_dst}" ++ run_host_command_logged cp -pv "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" "${destination}/usr/share/armbian/${bootscript_dst}" + else +- cp "${SRC}/config/bootscripts/${bootscript_src}" "${destination}/usr/share/armbian/${bootscript_dst}" ++ run_host_command_logged cp -pv "${SRC}/config/bootscripts/${bootscript_src}" "${destination}/usr/share/armbian/${bootscript_dst}" + fi + [[ -n $BOOTENV_FILE && -f $SRC/config/bootenv/$BOOTENV_FILE ]] && +- cp "${SRC}/config/bootenv/${BOOTENV_FILE}" "${destination}"/usr/share/armbian/armbianEnv.txt ++ run_host_command_logged cp -pv "${SRC}/config/bootenv/${BOOTENV_FILE}" "${destination}"/usr/share/armbian/armbianEnv.txt ++ else ++ display_alert "Using extlinux, regular bootscripts ignored" "SRC_EXTLINUX=${SRC_EXTLINUX}" "warn" + fi + + # add configuration for setting uboot environment from userspace with: fw_setenv fw_printenv +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 77e15b7b8..5b83ff600 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -223,6 +223,16 @@ function do_main_configuration() { + it is often used to in turn override those. + POST_FAMILY_CONFIG + ++ # A global killswitch for extlinux. ++ if [[ "${SRC_EXTLINUX}" == "yes" ]]; then ++ if [[ "${ALLOW_EXTLINUX}" != "yes" ]]; then ++ display_alert "Disabling extlinux support" "extlinux global killswitch; set ALLOW_EXTLINUX=yes to avoid" "info" ++ export SRC_EXTLINUX=no ++ else ++ display_alert "Both SRC_EXTLINUX=yes and ALLOW_EXTLINUX=yes" "enabling extlinux, expect breakage" "warn" ++ fi ++ fi ++ + interactive_desktop_main_configuration + + [[ -n $ATFSOURCE && -z $ATF_USE_GCC ]] && exit_with_error "Error in configuration: ATF_USE_GCC is unset" +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 108326aaa..335ea584d 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -346,10 +346,11 @@ function prepare_partitions() { + [[ -f $SDCARD/boot/boot.cmd ]] && + run_host_command_logged mkimage -C none -A arm -T script -d $SDCARD/boot/boot.cmd $SDCARD/boot/boot.scr + +- # create extlinux config ++ # complement extlinux config if it exists; remove armbianEnv in this case. + if [[ -f $SDCARD/boot/extlinux/extlinux.conf ]]; then + echo " append root=$rootfs $SRC_CMDLINE $MAIN_CMDLINE" >> $SDCARD/boot/extlinux/extlinux.conf +- [[ -f $SDCARD/boot/armbianEnv.txt ]] && rm $SDCARD/boot/armbianEnv.txt ++ display_alert "extlinux.conf exists" "removing armbianEnv.txt" "warn" ++ [[ -f $SDCARD/boot/armbianEnv.txt ]] && run_host_command_logged rm -v $SDCARD/boot/armbianEnv.txt + fi + + return 0 # there is a shortcircuit above! very tricky btw! +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 3e8121a7e..02b79eaad 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -152,6 +152,7 @@ function install_distribution_agnostic() { + + # create extlinux config file @TODO: refactor into extensions u-boot, extlinux + if [[ $SRC_EXTLINUX == yes ]]; then ++ display_alert "Using extlinux, SRC_EXTLINUX: ${SRC_EXTLINUX}" "image will be incompatible with nand-sata-install" "warn" + mkdir -p $SDCARD/boot/extlinux + cat <<- EOF > "$SDCARD/boot/extlinux/extlinux.conf" + label ${VENDOR} +@@ -169,17 +170,17 @@ function install_distribution_agnostic() { + + if [[ "${BOOTCONFIG}" != "none" ]]; then + if [ -f "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" ]; then +- cp "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" "${SDCARD}/boot/${bootscript_dst}" ++ run_host_command_logged cp -pv "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" "${SDCARD}/boot/${bootscript_dst}" + else +- cp "${SRC}/config/bootscripts/${bootscript_src}" "${SDCARD}/boot/${bootscript_dst}" ++ run_host_command_logged cp -pv "${SRC}/config/bootscripts/${bootscript_src}" "${SDCARD}/boot/${bootscript_dst}" + fi + fi + + if [[ -n $BOOTENV_FILE ]]; then + if [[ -f $USERPATCHES_PATH/bootenv/$BOOTENV_FILE ]]; then +- cp "$USERPATCHES_PATH/bootenv/${BOOTENV_FILE}" "${SDCARD}"/boot/armbianEnv.txt ++ run_host_command_logged cp -pv "$USERPATCHES_PATH/bootenv/${BOOTENV_FILE}" "${SDCARD}"/boot/armbianEnv.txt + elif [[ -f $SRC/config/bootenv/$BOOTENV_FILE ]]; then +- cp "${SRC}/config/bootenv/${BOOTENV_FILE}" "${SDCARD}"/boot/armbianEnv.txt ++ run_host_command_logged cp -pv "${SRC}/config/bootenv/${BOOTENV_FILE}" "${SDCARD}"/boot/armbianEnv.txt + fi + fi + +@@ -188,9 +189,9 @@ function install_distribution_agnostic() { + if [[ $ROOTFS_TYPE == nfs ]]; then + display_alert "Copying NFS boot script template" + if [[ -f $USERPATCHES_PATH/nfs-boot.cmd ]]; then +- cp "$USERPATCHES_PATH"/nfs-boot.cmd "${SDCARD}"/boot/boot.cmd ++ run_host_command_logged cp -pv "$USERPATCHES_PATH"/nfs-boot.cmd "${SDCARD}"/boot/boot.cmd + else +- cp "${SRC}"/config/templates/nfs-boot.cmd.template "${SDCARD}"/boot/boot.cmd ++ run_host_command_logged cp -pv "${SRC}"/config/templates/nfs-boot.cmd.template "${SDCARD}"/boot/boot.cmd + fi + fi + + +From 03516ad0f6d5fc598f67c896e6dc28eb91b54ddf Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 6 May 2022 10:25:26 +0200 +Subject: [PATCH] armbian-next: extensions: `image-output-{qcow2|ovf}`: virtual + output formats + +- which use `qemu-utils` for `qemu-img` conversion of the .img +--- + extensions/image-output-ovf.sh | 111 +++++++++++++++++++++++++++++++++++++++ + extensions/image-output-qcow2.sh | 16 ++++++ + 2 files changed, 127 insertions(+) + +diff --git a/extensions/image-output-ovf.sh b/extensions/image-output-ovf.sh +new file mode 100644 +index 000000000..d3b4617e2 +--- /dev/null ++++ b/extensions/image-output-ovf.sh +@@ -0,0 +1,111 @@ ++enable_extension "image-output-qcow2" ++ ++#### *run before installing host dependencies* ++function add_host_dependencies__ovf_host_deps() { ++ export EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} qemu-utils" ++} ++ ++#### *allow extensions to prepare their own config, after user config is done* ++function extension_prepare_config__prepare_ovf_config() { ++ export OVF_VM_CPUS="${OVF_VM_CPUS:-4}" # Number of CPUs ++ export OVF_VM_RAM_GB="${OVF_VM_RAM_GB:-4}" # RAM in Gigabytes ++ export OVF_KEEP_QCOW2="${OVF_KEEP_QCOW2:-no}" # keep the qcow2 image after conversion to OVF ++} ++ ++#### *custom post build hook* ++function post_build_image__920_create_ovf() { ++ local OVF_VM_NAME="${OVF_VM_NAME:-${version}}" # The name of the VM when imported into Fusion/Player/Workstation; no spaces please ++ local original_qcow2_image="${QCOW2_IMAGE_FILE}" # Original from qcow2 output extension ++ local temp_qcow2_image="${DESTIMG}/${version}_temp.qcow2" # shadow qcow2 for resize ++ ++ local base_vmware_dirname="${OVF_VM_NAME}_vmware" # directory for vmx format, name only ++ local full_vmware_dirname="${DESTIMG}/${base_vmware_dirname}" # directory for vmx format, full path ++ local full_vmx_filename="${full_vmware_dirname}/${OVF_VM_NAME}.vmx" # vmx in vmx format dir ++ local base_file_vmdk="${OVF_VM_NAME}-disk1-efi-rootfs.vmdk" # target temp vmdk (filename) ++ local full_file_vmdk="${full_vmware_dirname}/${base_file_vmdk}" # target temp vmdk (full path) ++ local final_vmx_zip_file="${DESTIMG}/${OVF_VM_NAME}.vmware.zip" # final vmx zip artifact - defaults to UEFI boot ++ mkdir -p "${full_vmware_dirname}" # pre-create it ++ ++ display_alert "Converting image to OVF-compatible VMDK format" "${EXTENSION}" "info" ++ run_host_command_logged qemu-img create -f qcow2 -F qcow2 -b "${original_qcow2_image}" "${temp_qcow2_image}" # create a new, temporary, qcow2 with the original as backing image ++ run_host_command_logged qemu-img resize "${temp_qcow2_image}" +47G # resize the temporary ++ run_host_command_logged qemu-img convert -f qcow2 -O vmdk "${temp_qcow2_image}" "${full_file_vmdk}" # convert the big temp to vmdk ++ run_host_command_logged rm -vf "${temp_qcow2_image}" # remove the temporary large qcow2, free space ++ if [[ "${OVF_KEEP_QCOW2}" != "yes" ]]; then # check if told to keep the qcow2 image ++ display_alert "Discarding qcow2 image after" "conversion to VMDK" "debug" # debug ++ run_host_command_logged rm -vf "${original_qcow2_image}" # remove the original qcow2, free space ++ fi # /check ++ run_host_command_logged qemu-img info "${full_file_vmdk}" # show info ++ ++ display_alert "Creating .vmx file" "${EXTENSION}" "info" ++ ++ cat <<- VMX_FILE > "${full_vmx_filename}" ++ .encoding = "UTF-8" ++ displayname = "${OVF_VM_NAME}" ++ guestos = "ubuntu-64" ++ virtualhw.version = "18" ++ config.version = "8" ++ numvcpus = "${OVF_VM_CPUS}" ++ cpuid.coresPerSocket = "${OVF_VM_CPUS}" ++ memsize = "$((OVF_VM_RAM_GB * 1024))" ++ pciBridge0.present = "TRUE" ++ pciBridge4.present = "TRUE" ++ pciBridge4.virtualDev = "pcieRootPort" ++ pciBridge4.functions = "8" ++ pciBridge5.present = "TRUE" ++ pciBridge5.virtualDev = "pcieRootPort" ++ pciBridge5.functions = "8" ++ pciBridge6.present = "TRUE" ++ pciBridge6.virtualDev = "pcieRootPort" ++ pciBridge6.functions = "8" ++ pciBridge7.present = "TRUE" ++ pciBridge7.virtualDev = "pcieRootPort" ++ pciBridge7.functions = "8" ++ vmci0.present = "TRUE" ++ floppy0.present = "FALSE" ++ mks.enable3d = "true" ++ scsi0:0.present = "TRUE" ++ scsi0:0.deviceType = "disk" ++ scsi0:0.fileName = "${base_file_vmdk}" ++ scsi0:0.allowguestconnectioncontrol = "false" ++ scsi0:0.mode = "persistent" ++ scsi0.virtualDev = "pvscsi" ++ scsi0.present = "TRUE" ++ ethernet0.present = "TRUE" ++ ethernet0.virtualDev = "vmxnet3" ++ ethernet0.connectionType = "nat" ++ ethernet0.startConnected = "TRUE" ++ ethernet0.addressType = "generated" ++ ethernet0.wakeonpcktrcv = "false" ++ ethernet0.allowguestconnectioncontrol = "true" ++ sata0.present = "TRUE" ++ vmci0.unrestricted = "false" ++ vcpu.hotadd = "true" ++ mem.hotadd = "true" ++ tools.syncTime = "true" ++ toolscripts.afterpoweron = "true" ++ toolscripts.afterresume = "true" ++ toolscripts.beforepoweroff = "true" ++ toolscripts.beforesuspend = "true" ++ powerType.powerOff = "soft" ++ powerType.reset = "soft" ++ powerType.suspend = "soft" ++ usb.present = "TRUE" ++ ehci.present = "TRUE" ++ usb_xhci.present = "TRUE" ++ hard-disk.hostBuffer = "enabled" ++ ulm.disableMitigations = "TRUE" ++ vhv.enable = "TRUE" ++ vmx.buildType = "release" ++ firmware = "efi" ++ VMX_FILE ++ ++ # Now wrap the .vmx in a zip, with minimal compression. (release will .zst it later) ++ display_alert "Zipping/storing vmx" "${EXTENSION}" "info" ++ cd "${DESTIMG}" || false ++ run_host_command_logged zip -0 "${final_vmx_zip_file}" "${base_vmware_dirname}"/* ++ cd - || false ++ ++ display_alert "Done, cleaning up" "${EXTENSION}" "info" ++ rm -rf "${full_vmware_dirname}" ++} +diff --git a/extensions/image-output-qcow2.sh b/extensions/image-output-qcow2.sh +new file mode 100644 +index 000000000..2633062ed +--- /dev/null ++++ b/extensions/image-output-qcow2.sh +@@ -0,0 +1,16 @@ ++add_host_dependencies__ovf_host_deps() { ++ [[ "${SKIP_QCOW2}" == "yes" ]] && return 0 ++ export EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} qemu-utils" ++} ++ ++function post_build_image__900_convert_to_qcow2_img() { ++ [[ "${SKIP_QCOW2}" == "yes" ]] && return 0 ++ display_alert "Converting image to qcow2" "${EXTENSION}" "info" ++ export QCOW2_IMAGE_FILE="${DESTIMG}/${version}.img.qcow2" ++ run_host_command_logged qemu-img convert -f raw -O qcow2 "${DESTIMG}/${version}.img" "${QCOW2_IMAGE_FILE}" ++ run_host_command_logged qemu-img info "${QCOW2_IMAGE_FILE}" ++ if [[ "${QCOW2_RESIZE_AMOUNT}" != "" ]]; then ++ display_alert "Resizing qcow2 image by '${QCOW2_RESIZE_AMOUNT}' " "${EXTENSION}" "info" ++ qemu-img resize "${QCOW2_IMAGE_FILE}" "${QCOW2_RESIZE_AMOUNT}" ++ fi ++} + +From 36a2c3741d28a6280af99bcd7d8f9d3a339a7fcb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 6 May 2022 10:24:10 +0200 +Subject: [PATCH] armbian-next: extension: `kernel-localmodconfig`: + faster/slimmer kernel builds with `make localmodconfig` + +--- + extensions/kernel-localmodconfig.sh | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/extensions/kernel-localmodconfig.sh b/extensions/kernel-localmodconfig.sh +new file mode 100644 +index 000000000..40248bafe +--- /dev/null ++++ b/extensions/kernel-localmodconfig.sh +@@ -0,0 +1,21 @@ ++function extension_prepare_config__prepare_localmodconfig() { ++ # If defined, ${KERNEL_CONFIG_FROM_LSMOD} can contain a lsmod to apply to the kernel configuration. ++ # to get a file for this run 'lsmod > my_machine.lsmod' and then put it in userpatches/lsmod/ ++ export KERNEL_CONFIG_FROM_LSMOD="${KERNEL_CONFIG_FROM_LSMOD:-}" ++ display_alert "localmodconfig INIT lsmod" "${KERNEL_CONFIG_FROM_LSMOD}" "warn" ++ ++ # If there, make sure it exists ++ local lsmod_file="${SRC}/userpatches/lsmod/${KERNEL_CONFIG_FROM_LSMOD}.lsmod" ++ if [[ ! -f "${lsmod_file}" ]]; then ++ exit_with_error "Can't find lsmod file ${lsmod_file}, configure with KERNEL_CONFIG_FROM_LSMOD=xxx" ++ fi ++} ++ ++# This needs much more love than this. can be used to make "light" versions of kernels, that compile 3x-5x faster or more ++function custom_kernel_config_post_defconfig__apply_localmodconfig() { ++ display_alert "localmodconfig with lsmod" "${KERNEL_CONFIG_FROM_LSMOD}" "warn" ++ if [[ "a${KERNEL_CONFIG_FROM_LSMOD}a" != "aa" ]]; then ++ local lsmod_file="${SRC}/userpatches/lsmod/${KERNEL_CONFIG_FROM_LSMOD}.lsmod" ++ run_kernel_make "LSMOD=${lsmod_file}" localmodconfig ++ fi ++} + +From 981a9f5856ba100eaad07c9ffe7e24f578e93003 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 6 May 2022 10:23:29 +0200 +Subject: [PATCH] armbian-next: extension: `cleanup-space-final-image`: + zerofree, slim down firmware, show used space + +--- + extensions/cleanup-space-final-image.sh | 37 +++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +diff --git a/extensions/cleanup-space-final-image.sh b/extensions/cleanup-space-final-image.sh +new file mode 100644 +index 000000000..62321285b +--- /dev/null ++++ b/extensions/cleanup-space-final-image.sh +@@ -0,0 +1,37 @@ ++add_host_dependencies__ovf_host_deps() { ++ export EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} zerofree" ++} ++ ++function post_customize_image__998_cleanup_apt_stuff() { ++ display_alert "Cleaning up apt package lists and cache" "${EXTENSION}" "info" ++ chroot_sdcard "apt-get clean && rm -rf /var/lib/apt/lists" ++ ++ declare -a too_big_firmware=("netronome" "qcom" "mrv" "qed" "mellanox") # maybe: "amdgpu" "radeon" but I have an AMD GPU. ++ for big_firm in "${too_big_firmware[@]}"; do ++ local firm_dir="${SDCARD}/usr/lib/firmware/${big_firm}" ++ if [[ -d "${firm_dir}" ]]; then ++ display_alert "Cleaning too-big firmware" "${big_firm}" "info" ++ rm -rf "${firm_dir}" ++ fi ++ done ++} ++ ++# Zerofree the image early after umounting it ++function post_umount_final_image__200_zerofree() { ++ display_alert "Zerofreeing image" "${EXTENSION}" "info" ++ for partDev in "${LOOP}"p?; do ++ local partType ++ partType="$(file -s "${partDev}" | awk -F ': ' '{print $2}')" ++ if [[ "${partType}" == *"ext4"* ]]; then ++ display_alert "Zerofreeing ext4 partition ${partDev}" "${EXTENSION}" "info" ++ run_host_command_logged zerofree "${partDev}" ++ else ++ display_alert "Skipping zerofreeing partition ${partDev} of type '${partType}'" "${EXTENSION}" "info" ++ fi ++ done ++} ++ ++function pre_umount_final_image__999_show_space_usage() { ++ display_alert "Calculating used space in image" "${EXTENSION}" "info" ++ run_host_command_logged "cd ${MOUNT} && " du -h -d 4 -x "." "| sort -h | tail -20" ++} + +From 5d51b5559c28815deb56d27e1ca22765dc22e853 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 23 Apr 2022 16:07:44 +0200 +Subject: [PATCH] armbian-next: introduce `do_with_ccache_statistics` and use + it for kernel compile + +- some TODOs +- better logging for .config copying +--- + lib/functions/compilation/kernel.sh | 27 +++++++++++++++++++++------ + 1 file changed, 21 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index d6dd30920..86235f767 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -3,16 +3,18 @@ function run_kernel_make() { + declare -a common_make_params_quoted common_make_envs full_command + + common_make_envs=( +- "CCACHE_BASEDIR=\"$(pwd)\"" # Base directory for ccache, for cache reuse ++ "CCACHE_BASEDIR=\"$(pwd)\"" # Base directory for ccache, for cache reuse # @TODO: experiment with this and the source path to maximize hit rate + "PATH=\"${toolchain}:${PATH}\"" # Insert the toolchain first into the PATH. + "DPKG_COLORS=always" # Use colors for dpkg + "XZ_OPT='--threads=0'" # Use parallel XZ compression + ) + + common_make_params_quoted=( ++ # @TODO: introduce O=path/to/binaries, so sources and bins are not in the same dir. ++ + "$CTHREADS" # Parallel compile, "-j X" for X cpus + "ARCH=${ARCHITECTURE}" # Key param. Everything depends on this. +- "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family. Changing this causes recompiles ++ "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family. Changing this causes recompiles # @TODO change to "localversion" file + + "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # added as prefix to every compiler invocation by make + "KCFLAGS=-fdiagnostics-color=always -Wno-error=misleading-indentation" # Force GCC colored messages, downgrade misleading indentation to warning +@@ -133,6 +135,8 @@ function kernel_prepare_patching() { + cd "${kernel_work_dir}" || exit + + # @TODO: why would we delete localversion? ++ # @TODO: it should be the opposite, writing localversion to disk, _instead_ of passing it via make. ++ # @TODO: if it turns out to be the case, do a commit with it... (possibly later, after patching?) + rm -f localversion + + # read kernel version +@@ -204,17 +208,17 @@ function kernel_config() { + + if [[ $KERNEL_KEEP_CONFIG == yes && -f "${DEST}"/config/$LINUXCONFIG.config ]]; then + display_alert "Using previous kernel config" "${DEST}/config/$LINUXCONFIG.config" "info" +- cp -p "${DEST}/config/${LINUXCONFIG}.config" .config ++ run_host_command_logged cp -pv "${DEST}/config/${LINUXCONFIG}.config" .config + else + if [[ -f $USERPATCHES_PATH/$LINUXCONFIG.config ]]; then + display_alert "Using kernel config provided by user" "userpatches/$LINUXCONFIG.config" "info" +- cp -p "${USERPATCHES_PATH}/${LINUXCONFIG}.config" .config ++ run_host_command_logged cp -pv "${USERPATCHES_PATH}/${LINUXCONFIG}.config" .config + elif [[ -f "${USERPATCHES_PATH}/config/kernel/${LINUXCONFIG}.config" ]]; then + display_alert "Using kernel config provided by user in config/kernel folder" "config/kernel/${LINUXCONFIG}.config" "info" +- cp -p "${USERPATCHES_PATH}/config/kernel/${LINUXCONFIG}.config" .config ++ run_host_command_logged cp -pv "${USERPATCHES_PATH}/config/kernel/${LINUXCONFIG}.config" .config + else + display_alert "Using kernel config file" "config/kernel/$LINUXCONFIG.config" "info" +- cp -p "${SRC}/config/kernel/${LINUXCONFIG}.config" .config ++ run_host_command_logged cp -pv "${SRC}/config/kernel/${LINUXCONFIG}.config" .config + COPY_CONFIG_BACK_TO="${SRC}/config/kernel/${LINUXCONFIG}.config" + fi + fi +@@ -362,6 +366,7 @@ function kernel_build_and_package() { + display_alert "Building kernel" "${LINUXCONFIG} ${build_targets[*]}" "info" + fasthash_debug "build" + make_filter="| grep --line-buffered -v -e 'CC' -e 'LD' -e 'AR' -e 'INSTALL' -e 'SIGN' -e 'XZ' " \ ++ do_with_ccache_statistics \ + run_kernel_make_long_running "${install_make_params_quoted[@]@Q}" "${build_targets[@]}" + fasthash_debug "build" + +@@ -370,3 +375,13 @@ function kernel_build_and_package() { + + display_alert "Kernel built and packaged in" "$((SECONDS - ts)) seconds - ${version}-${LINUXFAMILY}" "info" + } ++ ++function do_with_ccache_statistics() { ++ display_alert "Clearing ccache statistics" "ccache" "debug" ++ ccache --zero-stats ++ ++ "$@" ++ ++ display_alert "Display ccache statistics" "ccache" "debug" ++ run_host_command_logged ccache --show-stats ++} + +From 0a29ad6f91eae99594e52173724fdf87b5b186d5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 19:23:13 +0200 +Subject: [PATCH] armbian-next: *breaking change* really disable apt sources + for non-desktop builds + +--- + lib/functions/rootfs/apt-sources.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/rootfs/apt-sources.sh b/lib/functions/rootfs/apt-sources.sh +index bc17a3a9b..a3451e5ed 100644 +--- a/lib/functions/rootfs/apt-sources.sh ++++ b/lib/functions/rootfs/apt-sources.sh +@@ -8,7 +8,7 @@ add_apt_sources() { + # @TODO: rpardini: The logic here is meant to be evolved over time. Originally, all of this only ran when BUILD_DESKTOP=yes. + # Igor had bumped it to run on all builds, but that adds external sources to cli and minimal. + # Here I'm tuning it down to 1/4th of the original, eg: no nala on my cli builds, thanks. +- [[ "${BUILD_MINIMAL}" != "yes" ]] && get_all_potential_paths "${DEBOOTSTRAP_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" ++ [[ "${BUILD_DESKTOP}" != "yes" ]] && get_all_potential_paths "${DEBOOTSTRAP_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" + [[ "${BUILD_DESKTOP}" == "yes" ]] && get_all_potential_paths "${CLI_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" + [[ "${BUILD_DESKTOP}" == "yes" ]] && get_all_potential_paths "${DESKTOP_ENVIRONMENTS_SEARCH_RELATIVE_DIRS}" "." "sources/apt" + [[ "${BUILD_DESKTOP}" == "yes" ]] && get_all_potential_paths "${DESKTOP_APPGROUPS_SEARCH_RELATIVE_DIRS}" "${DESKTOP_APPGROUPS_SELECTED}" "sources/apt" + +From fc0621decc383f2aed1194f882035b26de49c0aa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 29 Apr 2022 17:55:47 +0200 +Subject: [PATCH] armbian-next: fix: don't manage apt-cacher-ng if told NOT to, + not the other way around + +--- + lib/functions/host/apt-cacher-ng.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/host/apt-cacher-ng.sh b/lib/functions/host/apt-cacher-ng.sh +index 4801784c7..120c39001 100644 +--- a/lib/functions/host/apt-cacher-ng.sh ++++ b/lib/functions/host/apt-cacher-ng.sh +@@ -54,7 +54,7 @@ function acng_configure_and_restart_acng() { + } + + function acng_check_status_or_restart() { +- [[ $NO_APT_CACHER != yes ]] && return 0 # don't if told not to ++ [[ $NO_APT_CACHER == yes ]] && return 0 # don't if told not to + [[ "${APT_PROXY_ADDR:-localhost:3142}" != "localhost:3142" ]] && return 0 # also not if acng not local to builder machine + + if ! systemctl -q is-active apt-cacher-ng.service; then + +From bdb9aba47d9b70cfb04089866bafe176a1e6dab6 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 14:55:43 +0200 +Subject: [PATCH] armbian-next: `JUST_UBOOT=yes` + hooks + `build_custom_uboot()`/`post_write_uboot_platform()` + +- post_write_uboot_platform() + - only runs during build, for now (not on device) +- build_custom_uboot() + - allow fully custom, extension driven, building of u-boot + - also partial preparation of uboot source combined with default Armbian build +- HACK: u-boot: downgrade some errors to warnings via KCFLAGS +- fix copy of atf bins to uboot, don't do it if atf's not there +--- + lib/functions/compilation/uboot.sh | 47 +++++++++++++++++++++++++------------ + lib/functions/image/loop.sh | 26 +++++++++++++------- + lib/functions/main/default-build.sh | 17 +++++++++++--- + 3 files changed, 63 insertions(+), 27 deletions(-) + +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index fd3ae385a..f87470eb7 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -30,7 +30,8 @@ function compile_uboot_target() { + # create patch for manual source changes + [[ $CREATE_PATCHES == yes ]] && userpatch_create "u-boot" + +- if [[ -n $ATFSOURCE ]]; then ++ if [[ -n $ATFSOURCE && -d "${atftempdir}" ]]; then ++ display_alert "Copying over bins from atftempdir" "${atftempdir}" "debug" + cp -Rv "${atftempdir}"/*.bin . + rm -rf "${atftempdir}" + fi +@@ -72,7 +73,9 @@ function compile_uboot_target() { + + display_alert "${uboot_prefix}Compiling u-boot" "${version} ${target_make}" "info" + export if_error_detail_message="${uboot_prefix}Failed to build u-boot ${version} ${target_make}" +- run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" make "$target_make" "$CTHREADS" "${cross_compile}" "KCFLAGS=-fdiagnostics-color=always" ++ KCFLAGS="-fdiagnostics-color=always -Wno-error=maybe-uninitialized -Wno-error=misleading-indentation" \ ++ run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ ++ make "$target_make" "$CTHREADS" "${cross_compile}" + + if [[ $(type -t uboot_custom_postprocess) == function ]]; then + display_alert "${uboot_prefix}Postprocessing u-boot" "${version} ${target_make}" +@@ -93,7 +96,7 @@ function compile_uboot_target() { + fi + display_alert "${uboot_prefix}Deploying u-boot binary target" "${version} ${target_make} :: ${f_dst}" + [[ ! -f $f_src ]] && exit_with_error "U-boot artifact not found" "$(basename "${f_src}")" +- run_host_command_logged cp -v "${f_src}" "$uboottempdir/${uboot_name}/usr/lib/${uboot_name}/${f_dst}" ++ run_host_command_logged cp -v "${f_src}" "${uboottempdir}/${uboot_name}/usr/lib/${uboot_name}/${f_dst}" + #display_alert "Done with binary target" "${version} ${target_make} :: ${f_dst}" + done + +@@ -151,18 +154,32 @@ compile_uboot() { + chmod 700 "${uboottempdir}" + mkdir -p "$uboottempdir/$uboot_name/usr/lib/u-boot" "$uboottempdir/$uboot_name/usr/lib/$uboot_name" "$uboottempdir/$uboot_name/DEBIAN" + +- # Try very hard, to fault even, to avoid using subshells while reading a newline-delimited string. +- # Sorry for the juggling with IFS. +- local _old_ifs="${IFS}" _new_ifs=$'\n' uboot_target_counter=1 +- IFS="${_new_ifs}" # split on newlines only +- for target in ${UBOOT_TARGET_MAP}; do +- IFS="${_old_ifs}" # restore for the body of loop +- export target uboot_name uboottempdir toolchain version uboot_target_counter +- compile_uboot_target +- uboot_target_counter=$((uboot_target_counter + 1)) +- IFS="${_new_ifs}" # split on newlines only for rest of loop +- done +- IFS="${_old_ifs}" ++ # Allow extension-based u-boot bulding. We call the hook, and if EXTENSION_BUILT_UBOOT="yes" afterwards, we skip our own compilation. ++ # This is to make it easy to build vendor/downstream uboot with their own quirks. ++ ++ display_alert "Extensions: build custom uboot" "build_custom_uboot" "debug" ++ call_extension_method "build_custom_uboot" <<- 'BUILD_CUSTOM_UBOOT' ++ *allow extensions to build their own uboot* ++ For downstream uboot et al. ++ Set \`EXTENSION_BUILT_UBOOT=yes\` to then skip the normal compilation. ++ BUILD_CUSTOM_UBOOT ++ ++ if [[ "${EXTENSION_BUILT_UBOOT}" != "yes" ]]; then ++ # Try very hard, to fault even, to avoid using subshells while reading a newline-delimited string. ++ # Sorry for the juggling with IFS. ++ local _old_ifs="${IFS}" _new_ifs=$'\n' uboot_target_counter=1 ++ IFS="${_new_ifs}" # split on newlines only ++ for target in ${UBOOT_TARGET_MAP}; do ++ IFS="${_old_ifs}" # restore for the body of loop ++ export target uboot_name uboottempdir toolchain version uboot_target_counter ++ compile_uboot_target ++ uboot_target_counter=$((uboot_target_counter + 1)) ++ IFS="${_new_ifs}" # split on newlines only for rest of loop ++ done ++ IFS="${_old_ifs}" ++ else ++ display_alert "Extensions: custom uboot built by extension" "not building regular uboot" "debug" ++ fi + + display_alert "Preparing u-boot general packaging. all_worked:${all_worked} any_worked:${any_worked} " "${version} ${target_make}" + +diff --git a/lib/functions/image/loop.sh b/lib/functions/image/loop.sh +index 97ee1891e..9d79f8139 100644 +--- a/lib/functions/image/loop.sh ++++ b/lib/functions/image/loop.sh +@@ -36,9 +36,9 @@ write_uboot_to_loop_image() { + revision=${REVISION} + if [[ -n $UBOOT_REPO_VERSION ]]; then + revision=${UBOOT_REPO_VERSION} +- dpkg -x "${DEB_STORAGE}/linux-u-boot-${BOARD}-${BRANCH}_${revision}_${ARCH}.deb" ${TEMP_DIR}/ 2>&1 ++ run_host_command_logged dpkg -x "${DEB_STORAGE}/linux-u-boot-${BOARD}-${BRANCH}_${revision}_${ARCH}.deb" ${TEMP_DIR}/ + else +- dpkg -x "${DEB_STORAGE}/${CHOSEN_UBOOT}_${revision}_${ARCH}.deb" ${TEMP_DIR}/ 2>&1 ++ run_host_command_logged dpkg -x "${DEB_STORAGE}/${CHOSEN_UBOOT}_${revision}_${ARCH}.deb" ${TEMP_DIR}/ + fi + + if [[ ! -f "${TEMP_DIR}/usr/lib/u-boot/platform_install.sh" ]]; then +@@ -46,15 +46,23 @@ write_uboot_to_loop_image() { + fi + + display_alert "Sourcing u-boot install functions" "$loop" "info" +- source ${TEMP_DIR}/usr/lib/u-boot/platform_install.sh 2>&1 ++ source ${TEMP_DIR}/usr/lib/u-boot/platform_install.sh ++ set -e # make sure, we just included something that might disable it + + display_alert "Writing u-boot bootloader" "$loop" "info" +- write_uboot_platform "${TEMP_DIR}${DIR}" "$loop" 2>&1 +- [[ $? -ne 0 ]] && { +- rm -rf ${TEMP_DIR} +- exit_with_error "U-boot bootloader failed to install" "@host" +- } +- rm -rf ${TEMP_DIR} ++ write_uboot_platform "${TEMP_DIR}${DIR}" "$loop" # @TODO: rpardini: what is ${DIR} ? ++ ++ export UBOOT_CHROOT_DIR="${TEMP_DIR}${DIR}" ++ ++ call_extension_method "post_write_uboot_platform" <<- 'POST_WRITE_UBOOT_PLATFORM' ++ *allow custom writing of uboot -- only during image build* ++ Called after `write_uboot_platform()`. ++ It receives `UBOOT_CHROOT_DIR` with the full path to the u-boot dir in the chroot. ++ Important: this is only called inside the build system. ++ Consider that `write_uboot_platform()` is also called board-side, when updating uboot, eg: nand-sata-install. ++ POST_WRITE_UBOOT_PLATFORM ++ ++ #rm -rf ${TEMP_DIR} + + return 0 + } +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 8f051610f..6f0823648 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -29,8 +29,15 @@ function main_default_build_single() { + + # 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" do_host_tools="yes" +- if [[ "${JUST_KERNEL}" == "yes" ]]; then ++ 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" +@@ -67,6 +74,10 @@ function main_default_build_single() { + 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 +@@ -78,7 +89,7 @@ function main_default_build_single() { + fi + fi + if [[ "${exit_after_kernel_build}" == "yes" ]]; then +- display_alert "Only building kernel and exiting" "NOW" "debug" ++ display_alert "Only building kernel and exiting" "JUST_KERNEL=yes" "debug" + exit 0 + fi + fi + +From 893b8615a1a976ee6246e186f59aba468ad1a7b5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 28 Apr 2022 09:35:26 +0200 +Subject: [PATCH] armbian-next: fix: no use testing the host for resolvconf if + we're manipulating the SDCARD + +--- + lib/functions/rootfs/distro-agnostic.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 238bdb9d0..3e8121a7e 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -504,7 +504,7 @@ function install_distribution_agnostic() { + cp "${SDCARD}"/etc/armbian-release "${SDCARD}"/etc/armbian-image-release + + # DNS fix. package resolvconf is not available everywhere +- if [ -d /etc/resolvconf/resolv.conf.d ] && [ -n "$NAMESERVER" ]; then ++ if [ -d "${SDCARD}"/etc/resolvconf/resolv.conf.d ] && [ -n "$NAMESERVER" ]; then + echo "nameserver $NAMESERVER" > "${SDCARD}"/etc/resolvconf/resolv.conf.d/head + fi + + +From 25a8de27bb2b240734c1647a71826688b474b0a0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 24 Apr 2022 09:32:14 +0200 +Subject: [PATCH] armbian-next: sunxi_common: avoid shortcircuit error on + family_tweaks_bsp when family_tweaks_bsp_s is not defined + +--- + config/sources/families/include/sunxi_common.inc | 2 ++ + lib/functions/bsp/bsp-cli.sh | 6 +++--- + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index a16180506..8ac7a5551 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -52,6 +52,8 @@ family_tweaks() { + family_tweaks_bsp() { + # execute specific tweaks function if present + [[ $(type -t family_tweaks_bsp_s) == function ]] && family_tweaks_bsp_s ++ ++ return 0 # short-circuit above, avoid errors on exit. + } + + write_uboot_platform() { +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index c52910403..5ee670582 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -288,9 +288,9 @@ create_board_package() { + + # execute $LINUXFAMILY-specific tweaks + if [[ $(type -t family_tweaks_bsp) == function ]]; then +- display_alert "Running family_tweaks_bsp" "${LINUXFAMILY}" "debug" +- family_tweaks_bsp 2>&1 +- display_alert "Done with family_tweaks_bsp" "${LINUXFAMILY}" "debug" ++ display_alert "Running family_tweaks_bsp" "${LINUXFAMILY} - ${BOARDFAMILY}" "debug" ++ family_tweaks_bsp ++ display_alert "Done with family_tweaks_bsp" "${LINUXFAMILY} - ${BOARDFAMILY}" "debug" + fi + + call_extension_method "post_family_tweaks_bsp" <<- 'POST_FAMILY_TWEAKS_BSP' + +From c46418fd00b24879e4a4f18f77c19ccb887a9346 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 22 Apr 2022 12:50:21 +0200 +Subject: [PATCH] armbian-next: fix: add `zstd` and `parallel` to hostdeps + +--- + lib/functions/host/prepare-host.sh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index da443e4fb..b48f666b1 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -43,11 +43,11 @@ prepare_host() { + zlib1g-dev + + # non-mess below? +- file ccze colorized-logs tree # logging utilities +- unzip zip p7zip-full pigz pixz pbzip2 lzop # compressors et al +- parted gdisk # partition tools +- aria2 curl wget # downloaders et al +- ++ file ccze colorized-logs tree # logging utilities ++ unzip zip p7zip-full pigz pixz pbzip2 lzop zstd # compressors et al ++ parted gdisk # partition tools ++ aria2 curl wget # downloaders et al ++ parallel # do things in parallel + # toolchains. NEW: using metapackages, allow us to have same list of all arches; brings both C and C++ compilers + crossbuild-essential-armhf crossbuild-essential-armel # for ARM 32-bit, both HF and EL are needed in some cases. + crossbuild-essential-arm64 # For ARM 64-bit, arm64. + +From 6d5a8490804d8427c6f4578389b0ae73c746ed61 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 20 Apr 2022 12:49:20 +0200 +Subject: [PATCH] armbian-next: manual merge (17) of all changes between + revisions 64410fb74b44cca82e9affbdf93a59d5692862ff and + 08cf31de73de5f5ba1986348e4556b00d77af09f + +- changes about `git safe dir` ignored, I've done the same in a different way +- hash calculation changes ignored, fasthash is completely different +--- + config/sources/families/include/sunxi64_common.inc | 6 +++--- + config/sources/families/include/sunxi_common.inc | 6 +++--- + config/sources/families/include/uefi_common.inc | 4 ++-- + config/sources/families/mvebu64.conf | 4 ++-- + lib/functions/compilation/patch/kernel-drivers.sh | 7 ++++--- + lib/functions/host/external-toolchains.sh | 2 ++ + 6 files changed, 16 insertions(+), 13 deletions(-) + +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index 323d67c1c..61addb39b 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -26,9 +26,9 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- export KERNELBRANCH="branch:linux-5.16.y" +- export KERNELBRANCH_MEGOUS="branch:orange-pi-5.16" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ export KERNELBRANCH="branch:linux-5.17.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.17" + ;; + esac + +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index a9f14f950..a16180506 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -27,9 +27,9 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- export KERNELBRANCH="branch:linux-5.16.y" +- export KERNELBRANCH_MEGOUS="branch:orange-pi-5.16" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ export KERNELBRANCH="branch:linux-5.17.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.17" + ;; + esac + +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index 175fcae2f..821ed660a 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -22,8 +22,8 @@ case "${BRANCH}" in + edge) + export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. For mainline caching. +- export KERNELBRANCH="branch:linux-5.16.y" # Branch or tag to build from. It should match MAJOR_MINOR ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:linux-5.17.y" # Branch or tag to build from. It should match MAJOR_MINOR + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. + ;; + esac +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index bc79e1ec6..88cc752d4 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -1,6 +1,6 @@ + enable_extension "marvell-tools" + ARCH=arm64 +-BOOTBRANCH='branch:v2022.01' ++BOOTBRANCH='branch:v2022.04' + BOOTENV_FILE='mvebu64.txt' + ATFSOURCE='https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git' + ATFDIR='arm-trusted-firmware-espressobin' +@@ -84,7 +84,7 @@ atf_custom_postprocess() { + if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]]; then + export TOOLCHAIN_NAME="arm-linux-gnueabi-" + else +- export TOOLCHAIN_NAME="arm-none-eabi-" ++ export TOOLCHAIN_NAME="arm-none-linux-gnueabihf-" + fi + export ATF2=$(find_toolchain "$TOOLCHAIN_NAME" "> 10.0")/$TOOLCHAIN_NAME + export BL33=$ubootdir"/u-boot.bin" +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 25f78b90c..6631eb445 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -37,9 +37,10 @@ function prepare_extra_kernel_drivers() { + aufs_tag=$(echo "${version}" | cut -f 1-2 -d ".") + + # manual overrides +- if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5; then aufs_tag="5.4.3"; fi +- if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufs_tag="5.10.82"; fi +- if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufs_tag="5.15.5"; fi ++ if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5 ; then aufstag="5.4.3"; fi ++ if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11 ; then aufstag="5.10.82"; fi ++ if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16 ; then aufstag="5.15.5"; fi ++ if linux-version compare "${version}" ge 5.17.3 && linux-version compare "${version}" le 5.18 ; then aufstag="5.17.3"; fi + + # check if Mr. Okajima already made a branch for this version, otherwise use RC. + git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufs_tag}" > /dev/null || { +diff --git a/lib/functions/host/external-toolchains.sh b/lib/functions/host/external-toolchains.sh +index f2db2d6ea..f8733d294 100644 +--- a/lib/functions/host/external-toolchains.sh ++++ b/lib/functions/host/external-toolchains.sh +@@ -24,6 +24,8 @@ function download_external_toolchains() { + "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz" + "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz" + "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz" + ) + + USE_TORRENT_STATUS=${USE_TORRENT} + +From 8341a778f0a1b9678858904eaddb540f43129b58 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 19 Apr 2022 13:48:06 +0200 +Subject: [PATCH] armbian-next: add `crossbuild-essential-armel` so + `arm-linux-gnueabi-gcc` is available with system toolchains + +- need to for some ATF builds, at least. +--- + lib/functions/host/prepare-host.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index bae3b3e7c..da443e4fb 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -49,9 +49,9 @@ prepare_host() { + aria2 curl wget # downloaders et al + + # toolchains. NEW: using metapackages, allow us to have same list of all arches; brings both C and C++ compilers +- crossbuild-essential-armhf +- crossbuild-essential-arm64 +- crossbuild-essential-amd64 ++ crossbuild-essential-armhf crossbuild-essential-armel # for ARM 32-bit, both HF and EL are needed in some cases. ++ crossbuild-essential-arm64 # For ARM 64-bit, arm64. ++ crossbuild-essential-amd64 # For AMD 64-bit, x86_64. + ) + + if [[ $(dpkg --print-architecture) == amd64 ]]; then + +From 8fdc420cc001b9ad79784ff486461eb0a2af6be8 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 19 Apr 2022 00:18:04 +0200 +Subject: [PATCH] armbian-next: rockchip64_common: lotsa logging and debugging + +- supposedly no practical changes +--- + .../sources/families/include/rockchip64_common.inc | 38 ++++++++++++---------- + 1 file changed, 20 insertions(+), 18 deletions(-) + +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index cd9541c3b..688097ae7 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -17,6 +17,7 @@ PACKAGE_LIST_FAMILY="ethtool" + RKBIN_DIR="$SRC/cache/sources/rkbin-tools" + + BOOT_SOC=${BOOT_SOC:=$(expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*')} ++display_alert "BOOT_SOC:" "$BOOT_SOC" "debug" + + CPUMIN=${CPUMIN:="408000"} + +@@ -68,8 +69,11 @@ elif [[ $BOOT_SOC == rk3566 ]]; then + elif [[ $BOOT_SOC == rk3568 ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" +- DDR_BLOB='rk35/rk3568_ddr_1560MHz_v1.10.bin' +- BL31_BLOB='rk35/rk3568_bl31_v1.28.elf' ++ DDR_BLOB="${DDR_BLOB:-"rk35/rk3568_ddr_1560MHz_v1.10.bin"}" ++ BL31_BLOB="${BL31_BLOB:-"rk35/rk3568_bl31_v1.28.elf"}" ++ display_alert "BOOT_SCENARIO:" "$BOOT_SCENARIO" "debug" ++ display_alert "DDR_BLOB:" "$DDR_BLOB" "debug" ++ display_alert "BL31_BLOB:" "$BL31_BLOB" "debug" + + elif [[ $BOARD == rockpi-s ]]; then + +@@ -129,6 +133,7 @@ prepare_boot_configuration() { + + elif [[ $BOOT_SCENARIO == "spl-blobs" ]]; then + ++ display_alert "BOOT Scenario is" "spl-blobs" "debug" + UBOOT_TARGET_MAP="BL31=$RKBIN_DIR/$BL31_BLOB spl/u-boot-spl.bin u-boot.dtb u-boot.itb;;idbloader.img u-boot.itb" + ATFSOURCE='' + ATF_COMPILE='no' +@@ -153,13 +158,13 @@ uboot_custom_postprocess() { + if [[ $BOOT_SCENARIO == "blobless" || $BOOT_SCENARIO == "tpl-spl-blob" ]]; then + : + elif [[ $BOOT_SCENARIO == "spl-blobs" ]]; then +- +- tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img ++ display_alert "mkimage for $BOOT_SOC with $BOOT_SCENARIO" "spl-blobs" "debug" ++ run_host_command_logged tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img + + elif [[ $BOOT_SCENARIO == "only-blobs" ]]; then + + local tempfile=$(mktemp) +- tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB idbloader.bin ++ run_host_command_logged tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB idbloader.bin + cat $RKBIN_DIR/$MINILOADER_BLOB >> idbloader.bin + run_host_x86_binary_logged $RKBIN_DIR/tools/loaderimage --pack --uboot ./u-boot-dtb.bin uboot.img 0x200000 + run_host_x86_binary_logged $RKBIN_DIR/tools/trust_merger --replace bl31.elf $RKBIN_DIR/$BL31_BLOB trust.ini +@@ -178,25 +183,22 @@ uboot_custom_postprocess() { + } + + write_uboot_platform() { +- if [[ -f $1/rksd_loader.img ]]; then # legacy rk3399 loader +- +- dd if=$1/rksd_loader.img of=$2 seek=64 conv=notrunc status=none > /dev/null 2>&1 ++ # This is run board-side too, so account for the non-existance of run_host_command_logged ++ local logging_prelude="" ++ [[ $(type -t run_host_command_logged) == function ]] && logging_prelude="run_host_command_logged" + ++ if [[ -f $1/rksd_loader.img ]]; then # legacy rk3399 loader ++ ${logging_prelude} dd if=$1/rksd_loader.img of=$2 seek=64 conv=notrunc status=none + elif [[ -f $1/u-boot.itb ]]; then # $BOOT_SCENARIO == "blobless" || $BOOT_SCENARIO == "tpl-spl-blob" +- +- dd if=$1/idbloader.img of=$2 seek=64 conv=notrunc status=none > /dev/null 2>&1 +- dd if=$1/u-boot.itb of=$2 seek=16384 conv=notrunc status=none > /dev/null 2>&1 +- ++ ${logging_prelude} dd if=$1/idbloader.img of=$2 seek=64 conv=notrunc status=none ++ ${logging_prelude} dd if=$1/u-boot.itb of=$2 seek=16384 conv=notrunc status=none + elif [[ -f $1/uboot.img ]]; then # $BOOT_SCENARIO == "only-blobs" +- +- dd if=$1/idbloader.bin of=$2 seek=64 conv=notrunc status=none > /dev/null 2>&1 +- dd if=$1/uboot.img of=$2 seek=16384 conv=notrunc status=none > /dev/null 2>&1 +- dd if=$1/trust.bin of=$2 seek=24576 conv=notrunc status=none > /dev/null 2>&1 +- ++ ${logging_prelude} dd if=$1/idbloader.bin of=$2 seek=64 conv=notrunc status=none ++ ${logging_prelude} dd if=$1/uboot.img of=$2 seek=16384 conv=notrunc status=none ++ ${logging_prelude} dd if=$1/trust.bin of=$2 seek=24576 conv=notrunc status=none + else + echo "Unsupported u-boot processing configuration!" + exit 1 +- + fi + } + + +From 52922a6b105279e73ccb760523e43fa6f7b0d5e0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Apr 2022 10:56:34 +0200 +Subject: [PATCH] armbian-next: grub: better logging + +--- + extensions/grub.sh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/extensions/grub.sh b/extensions/grub.sh +index 0ae97ed43..e3eacb955 100644 +--- a/extensions/grub.sh ++++ b/extensions/grub.sh +@@ -129,13 +129,14 @@ pre_umount_final_image__900_export_kernel_and_initramfs() { + display_alert "Exporting Kernel and Initrd for" "kexec" "info" + # this writes to ${DESTIMG} directly, since debootstrap.sh will move them later. + # capture the $MOUNT/boot/vmlinuz and initrd and send it out ${DESTIMG} +- cp "$MOUNT"/boot/vmlinuz-* "${DESTIMG}/${version}.kernel" +- cp "$MOUNT"/boot/initrd.img-* "${DESTIMG}/${version}.initrd" ++ run_host_command_logged ls -la "${MOUNT}"/boot/vmlinuz-* "${MOUNT}"/boot/initrd.img-* || true ++ run_host_command_logged cp -pv "${MOUNT}"/boot/vmlinuz-* "${DESTIMG}/${version}.kernel" || true ++ run_host_command_logged cp -pv "${MOUNT}"/boot/initrd.img-* "${DESTIMG}/${version}.initrd" || true + fi + } + + configure_grub() { +- display_alert "GRUB EFI kernel cmdline" "console=${SERIALCON} distro=${UEFI_GRUB_DISTRO_NAME} timeout=${UEFI_GRUB_TIMEOUT}" "" ++ display_alert "GRUB EFI kernel cmdline" "console=${SERIALCON} distro=${UEFI_GRUB_DISTRO_NAME} timeout=${UEFI_GRUB_TIMEOUT} grub terminal=${UEFI_GRUB_TERMINAL}" "" + + if [[ "_${SERIALCON}_" != "__" ]]; then + cat <<- grubCfgFrag >> "${MOUNT}"/etc/default/grub.d/98-armbian.cfg + +From 7bf6574305c5d2b7230225007fa4a62e0f19a817 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Apr 2022 11:23:10 +0200 +Subject: [PATCH] armbian-next: fix for chaos caused by git's fix of + CVE-2022-24765 otherwise "fatal: unsafe repository" + +- might not be the best solution, but it's the only one I found +--- + compile.sh | 4 +++- + lib/functions/compilation/debs.sh | 2 +- + lib/functions/configuration/main-config.sh | 4 ++-- + lib/functions/general/git.sh | 9 +++++++++ + 4 files changed, 15 insertions(+), 4 deletions(-) + +diff --git a/compile.sh b/compile.sh +index 2bc765f9f..67de1a20f 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -36,7 +36,6 @@ if [[ ! -f "${SRC}"/lib/single.sh ]]; then + exit 255 + fi + +- + # shellcheck source=lib/single.sh + source "${SRC}"/lib/single.sh + +@@ -46,6 +45,9 @@ logging_init + # initialize the traps + traps_init + ++# make sure git considers our build system dir as a safe dir (only if actually building) ++[[ "${CONFIG_DEFS_ONLY}" != "yes" ]] && git_ensure_safe_directory "${SRC}" ++ + # Execute the main CLI entrypoint. + cli_entrypoint "$@" + +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index 2af1af793..8816314af 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -174,7 +174,7 @@ compile_armbian-config() { + + compile_xilinx_bootgen() { + # Source code checkout +- (fetch_from_repo "https://github.com/Xilinx/bootgen.git" "xilinx-bootgen" "branch:master") ++ fetch_from_repo "https://github.com/Xilinx/bootgen.git" "xilinx-bootgen" "branch:master" + + pushd "${SRC}"/cache/sources/xilinx-bootgen || exit + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 44a23bb66..77e15b7b8 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -34,8 +34,8 @@ function do_main_configuration() { + cd "${SRC}" || exit + [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=17 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 +- BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote 2> /dev/null | grep origin)" 2> /dev/null) +- BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) ++ BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote | grep origin)") ++ BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty) + ROOTFS_CACHE_MAX=200 # max number of rootfs cache, older ones will be cleaned up + + # .deb compression. xz is standard, but is slow, so if avoided by default if not running in CI. one day, zstd. +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index baf7f54d2..c8086f728 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -27,6 +27,13 @@ function improved_git_fetch() { + improved_git fetch --progress --verbose --no-auto-maintenance "$@" + } + ++# workaround new limitations imposed by CVE-2022-24765 fix in git, otherwise "fatal: unsafe repository" ++function git_ensure_safe_directory() { ++ local git_dir="$1" ++ display_alert "git: Marking directory as safe" "$git_dir" "debug" ++ run_host_command_logged git config --global --add safe.directory "$git_dir" ++} ++ + # fetch_from_repo + # : remote repository URL + # : local directory; subdir for branch/tag will be created +@@ -84,6 +91,8 @@ fetch_from_repo() { + + display_alert "Git working dir" "${git_work_dir}" "git" + ++ git_ensure_safe_directory "${git_work_dir}" ++ + local expected_origin_url actual_origin_url + expected_origin_url="$(echo -n "${url}" | sed 's/^.*@//' | sed 's/^.*\/\///')" + + +From ad315fb153cd743614eb2d4102ad8a61d8be99aa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Apr 2022 23:14:20 +0200 +Subject: [PATCH] partitioning: fix: don't try fixing a bootscript that's not + there + +- this fixes a bug when "rootpart=2" without rootpart 1 being /boot +--- + lib/functions/image/partitioning.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 1c9597553..108326aaa 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -311,7 +311,7 @@ function prepare_partitions() { + You can write to `"${SDCARD}/boot/armbianEnv.txt"` here, it is guaranteed to exist. + IMAGE_SPECIFIC_ARMBIAN_ENV_READY + +- elif [[ $rootpart != 1 ]]; then ++ elif [[ $rootpart != 1 && -f "${SDCARD}/boot/${bootscript_dst}" ]]; then + local bootscript_dst=${BOOTSCRIPT##*:} + sed -i 's/mmcblk0p1/mmcblk0p2/' $SDCARD/boot/$bootscript_dst + sed -i -e "s/rootfstype=ext4/rootfstype=$ROOTFS_TYPE/" \ + +From 1661922e79f34bec964fdd86e278489e28945b4d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Apr 2022 23:15:29 +0200 +Subject: [PATCH] armbian-next: cleanups: umount tmpfs-based $SDCARD during + cleanup too + +--- + lib/functions/main/rootfs-image.sh | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 1e4f27c20..590ca1f84 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -120,6 +120,9 @@ function trap_handler_cleanup_rootfs_and_image() { + umount_chroot_recursive "${SDCARD}" || true + umount_chroot_recursive "${MOUNT}" || true + ++ # unmount tmpfs mounted on SDCARD if it exists. ++ mountpoint -q "${SDCARD}" && umount "${SDCARD}" ++ + mountpoint -q "${SRC}"/cache/toolchain && umount -l "${SRC}"/cache/toolchain >&2 # @TODO: why does Igor uses lazy umounts? nfs? + mountpoint -q "${SRC}"/cache/rootfs && umount -l "${SRC}"/cache/rootfs >&2 + [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose "${ROOT_MAPPER}" >&2 + +From 7253f98a262253eab6094b29640293079b673ab0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 18 Apr 2022 23:16:32 +0200 +Subject: [PATCH] armbian-next: indented heredoc, no functional changes + +--- + lib/functions/image/rootfs-to-image.sh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index a8f0796cc..9d128c960 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -70,10 +70,10 @@ create_image_from_sdcard_rootfs() { + # fix wrong / permissions + chmod 755 "${MOUNT}" + +- call_extension_method "pre_umount_final_image" "config_pre_umount_final_image" << 'PRE_UMOUNT_FINAL_IMAGE' +-*allow config to hack into the image before the unmount* +-Called before unmounting both `/root` and `/boot`. +-PRE_UMOUNT_FINAL_IMAGE ++ call_extension_method "pre_umount_final_image" "config_pre_umount_final_image" <<- 'PRE_UMOUNT_FINAL_IMAGE' ++ *allow config to hack into the image before the unmount* ++ Called before unmounting both `/root` and `/boot`. ++ PRE_UMOUNT_FINAL_IMAGE + + # unmount /boot/efi first, then /boot, rootfs third, image file last + sync + +From 1ac36b752e2982dbf59336c3ee857c91080ed8cf Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 19:23:00 +0200 +Subject: [PATCH] armbian-next: fix shortcircuit as last statement in case of + extlinux + +- yes, I wasted 3 hours on this tiny bit, so *you* don't have to! +- better logging for rootfs `mkfs` et al +- introduce `PRESERVE_SDCARD_MOUNT=yes` to preserve SDCARD, MOUNT, and LOOP for debugging +--- + lib/functions/image/partitioning.sh | 14 ++++++++------ + lib/functions/main/rootfs-image.sh | 5 +++++ + 2 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 76c26a22c..1c9597553 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -6,7 +6,7 @@ + # + # LOGGING: this is run under the log manager. so just redirect unwanted stderr to stdout, and it goes to log. + # this is under the logging manager. so just log to stdout (no redirections), and redirect stderr to stdout unless you want it on screen. +-prepare_partitions() { ++function prepare_partitions() { + display_alert "Preparing image file for rootfs" "$BOARD $RELEASE" "info" + + # possible partition combinations +@@ -161,6 +161,7 @@ prepare_partitions() { + display_alert "Creating partitions" "${bootfs:+/boot: $bootfs }root: $ROOTFS_TYPE" "info" + run_host_command_logged parted -s ${SDCARD}.raw -- mklabel ${IMAGE_PARTITION_TABLE} + if [[ "${USE_HOOK_FOR_PARTITION}" == "yes" ]]; then ++ display_alert "Using create_partition_table hook_point" "yes" "debug" + call_extension_method "create_partition_table" <<- 'CREATE_PARTITION_TABLE' + *only called when USE_HOOK_FOR_PARTITION=yes to create the complete partition table* + Finally, we can get our own partition table. You have to partition ${SDCARD}.raw +@@ -253,11 +254,13 @@ prepare_partitions() { + + check_loop_device "$rootdevice" + display_alert "Creating rootfs" "$ROOTFS_TYPE on $rootdevice" +- mkfs.${mkfs[$ROOTFS_TYPE]} ${mkopts[$ROOTFS_TYPE]} $rootdevice 2>&1 +- [[ $ROOTFS_TYPE == ext4 ]] && tune2fs -o journal_data_writeback $rootdevice > /dev/null ++ run_host_command_logged mkfs.${mkfs[$ROOTFS_TYPE]} "${mkopts[$ROOTFS_TYPE]}" "$rootdevice" ++ [[ $ROOTFS_TYPE == ext4 ]] && run_host_command_logged tune2fs -o journal_data_writeback "$rootdevice" + if [[ $ROOTFS_TYPE == btrfs && $BTRFS_COMPRESSION != none ]]; then + local fscreateopt="-o compress-force=${BTRFS_COMPRESSION}" + fi ++ sync # force writes to be really flushed ++ display_alert "Mounting rootfs" "$rootdevice" + run_host_command_logged mount ${fscreateopt} $rootdevice $MOUNT/ + # create fstab (and crypttab) entry + if [[ $CRYPTROOT_ENABLE == yes ]]; then +@@ -308,9 +311,7 @@ prepare_partitions() { + You can write to `"${SDCARD}/boot/armbianEnv.txt"` here, it is guaranteed to exist. + IMAGE_SPECIFIC_ARMBIAN_ENV_READY + +- elif +- [[ $rootpart != 1 ]] +- then ++ elif [[ $rootpart != 1 ]]; then + local bootscript_dst=${BOOTSCRIPT##*:} + sed -i 's/mmcblk0p1/mmcblk0p2/' $SDCARD/boot/$bootscript_dst + sed -i -e "s/rootfstype=ext4/rootfstype=$ROOTFS_TYPE/" \ +@@ -351,4 +352,5 @@ prepare_partitions() { + [[ -f $SDCARD/boot/armbianEnv.txt ]] && rm $SDCARD/boot/armbianEnv.txt + fi + ++ return 0 # there is a shortcircuit above! very tricky btw! + } +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 86ad03594..1e4f27c20 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -124,6 +124,11 @@ function trap_handler_cleanup_rootfs_and_image() { + mountpoint -q "${SRC}"/cache/rootfs && umount -l "${SRC}"/cache/rootfs >&2 + [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose "${ROOT_MAPPER}" >&2 + ++ if [[ "${PRESERVE_SDCARD_MOUNT}" == "yes" ]]; then ++ display_alert "Preserving SD card mount" "trap_handler_cleanup_rootfs_and_image" "warn" ++ return 0 ++ fi ++ + # shellcheck disable=SC2153 # global var. + if [[ -b "${LOOP}" ]]; then + display_alert "Freeing loop" "trap_handler_cleanup_rootfs_and_image ${LOOP}" "wrn" + +From ef3709d30ee099523db2ad28e3f65e0d17754f50 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 12:13:07 +0200 +Subject: [PATCH] armbian-next: kernel-headers: less verbose, trimmed down + tools a bit (perf and testing) + +--- + lib/functions/compilation/kernel-debs.sh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index e0788518d..dd5a143c7 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -280,12 +280,9 @@ function kernel_package_callback_linux_headers() { + find $(find "arch/${SRC_ARCH}" -name include -o -name scripts -type d) -type f + find arch/${SRC_ARCH}/include Module.symvers include scripts -type f + } +- # Include the byteshift utilities shared between kernel proper and the build scripts/tools. ++ # tools/include/tools has the byteshift utilities shared between kernel proper and the build scripts/tools. + # This replaces 'headers-debian-byteshift.patch' which was used for years in Armbian. +- #find tools/include/tools/be_byteshift.h tools/include/tools/le_byteshift.h -type f +- #find tools/objtool -type f +- #find tools/build -type f +- find tools -type f # all tools. all of it? we might get away with a little less. eg: tools/perf and tools/testing ++ find tools -type f # all tools; will trim a bit later + find arch/x86/lib/insn.c # required by objtool stuff... + + if is_enabled CONFIG_GCC_PLUGINS; then +@@ -300,8 +297,11 @@ function kernel_package_callback_linux_headers() { + + # Now, make the script dirs clean. + # This is run in our _target_ dir, not the source tree, so we're free to make clean as we wish without invalidating the next build's cache. +- run_host_command_logged cd "${headers_target_dir}" "&&" make "ARCH=${SRC_ARCH}" "M=scripts" clean +- run_host_command_logged cd "${headers_target_dir}/tools" "&&" make "ARCH=${SRC_ARCH}" clean ++ run_host_command_logged cd "${headers_target_dir}" "&&" make -s "ARCH=${SRC_ARCH}" "M=scripts" clean ++ run_host_command_logged cd "${headers_target_dir}/tools" "&&" make -s "ARCH=${SRC_ARCH}" clean ++ ++ # Trim down on the tools dir a bit after cleaning. ++ rm -rf "${headers_target_dir}/tools/perf" "${headers_target_dir}/tools/testing" + + # Hack: after cleaning, copy over the scripts/module.lds file from the source tree. It will only exist on 5.10+ + # See https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1906131 + +From 20c29c1d6e04783ac8e8151f27f57b52b8531342 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 11:23:13 +0200 +Subject: [PATCH] khadas-vim3l: add asound.state for Khadas VIM3L + +--- + config/boards/khadas-vim3l.conf | 1 + + .../blobs/asound.state/asound.state.khadas-vim3l | 780 +++++++++++++++++++++ + 2 files changed, 781 insertions(+) + +diff --git a/config/boards/khadas-vim3l.conf b/config/boards/khadas-vim3l.conf +index e11310414..171e580f4 100644 +--- a/config/boards/khadas-vim3l.conf ++++ b/config/boards/khadas-vim3l.conf +@@ -7,3 +7,4 @@ FULL_DESKTOP="yes" + SERIALCON="ttyAML0" + BOOT_LOGO="desktop" + BOOT_FDT_FILE="amlogic/meson-sm1-khadas-vim3l.dtb" ++ASOUND_STATE="asound.state.khadas-vim3l" +diff --git a/packages/blobs/asound.state/asound.state.khadas-vim3l b/packages/blobs/asound.state/asound.state.khadas-vim3l +new file mode 100644 +index 000000000..0246c8126 +--- /dev/null ++++ b/packages/blobs/asound.state/asound.state.khadas-vim3l +@@ -0,0 +1,780 @@ ++state.KHADASVIM3 { ++ control.1 { ++ iface MIXER ++ name 'TDMOUT_A Lane 0 Volume' ++ value.0 0 ++ value.1 0 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.2 { ++ iface MIXER ++ name 'TDMOUT_A Lane 1 Volume' ++ value.0 0 ++ value.1 0 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.3 { ++ iface MIXER ++ name 'TDMOUT_A Lane 2 Volume' ++ value.0 0 ++ value.1 0 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.4 { ++ iface MIXER ++ name 'TDMOUT_A Lane 3 Volume' ++ value.0 0 ++ value.1 0 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.5 { ++ iface MIXER ++ name 'TDMOUT_A Gain Enable Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.6 { ++ iface PCM ++ device 5 ++ name 'Playback Channel Map' ++ value.0 0 ++ value.1 0 ++ value.2 0 ++ value.3 0 ++ value.4 0 ++ value.5 0 ++ value.6 0 ++ value.7 0 ++ comment { ++ access read ++ type INTEGER ++ count 8 ++ range '0 - 36' ++ } ++ } ++ control.7 { ++ iface PCM ++ device 5 ++ name ELD ++ value '100008006a10000100000000000000004cf45601416f58696e5975616e200907070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ++ comment { ++ access 'read volatile' ++ type BYTES ++ count 128 ++ } ++ } ++ control.8 { ++ iface MIXER ++ name 'FRDDR_A SRC 1 EN Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.9 { ++ iface MIXER ++ name 'FRDDR_A SRC 2 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.10 { ++ iface MIXER ++ name 'FRDDR_A SRC 3 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.11 { ++ iface MIXER ++ name 'FRDDR_A SINK 1 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.12 { ++ iface MIXER ++ name 'FRDDR_A SINK 2 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.13 { ++ iface MIXER ++ name 'FRDDR_A SINK 3 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.14 { ++ iface MIXER ++ name 'FRDDR_B SRC 1 EN Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.15 { ++ iface MIXER ++ name 'FRDDR_B SRC 2 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.16 { ++ iface MIXER ++ name 'FRDDR_B SRC 3 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.17 { ++ iface MIXER ++ name 'FRDDR_B SINK 1 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.18 { ++ iface MIXER ++ name 'FRDDR_B SINK 2 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.19 { ++ iface MIXER ++ name 'FRDDR_B SINK 3 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.20 { ++ iface MIXER ++ name 'FRDDR_C SRC 1 EN Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.21 { ++ iface MIXER ++ name 'FRDDR_C SRC 2 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.22 { ++ iface MIXER ++ name 'FRDDR_C SRC 3 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.23 { ++ iface MIXER ++ name 'FRDDR_C SINK 1 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.24 { ++ iface MIXER ++ name 'FRDDR_C SINK 2 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.25 { ++ iface MIXER ++ name 'FRDDR_C SINK 3 SEL' ++ value 'OUT 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.26 { ++ iface MIXER ++ name 'TOHDMITX I2S SRC' ++ value 'I2S A' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'I2S A' ++ item.1 'I2S B' ++ item.2 'I2S C' ++ } ++ } ++ control.27 { ++ iface MIXER ++ name 'TOHDMITX Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.28 { ++ iface MIXER ++ name 'TOHDMITX SPDIF SRC' ++ value 'SPDIF A' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'SPDIF A' ++ item.1 'SPDIF B' ++ } ++ } ++ control.29 { ++ iface MIXER ++ name 'TDMOUT_A SRC SEL' ++ value 'IN 0' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'IN 0' ++ item.1 'IN 1' ++ item.2 'IN 2' ++ } ++ } ++} ++state.G12BKHADASVIM3 { ++ control.1 { ++ iface MIXER ++ name 'TDMOUT_A Lane 0 Volume' ++ value.0 255 ++ value.1 255 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.2 { ++ iface MIXER ++ name 'TDMOUT_A Lane 1 Volume' ++ value.0 255 ++ value.1 255 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.3 { ++ iface MIXER ++ name 'TDMOUT_A Lane 2 Volume' ++ value.0 255 ++ value.1 255 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.4 { ++ iface MIXER ++ name 'TDMOUT_A Lane 3 Volume' ++ value.0 255 ++ value.1 255 ++ comment { ++ access 'read write' ++ type INTEGER ++ count 2 ++ range '0 - 255' ++ } ++ } ++ control.5 { ++ iface MIXER ++ name 'TDMOUT_A Gain Enable Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.6 { ++ iface PCM ++ device 5 ++ name 'Playback Channel Map' ++ value.0 0 ++ value.1 0 ++ value.2 0 ++ value.3 0 ++ value.4 0 ++ value.5 0 ++ value.6 0 ++ value.7 0 ++ comment { ++ access read ++ type INTEGER ++ count 8 ++ range '0 - 36' ++ } ++ } ++ control.7 { ++ iface PCM ++ device 5 ++ name ELD ++ value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ++ comment { ++ access 'read volatile' ++ type BYTES ++ count 128 ++ } ++ } ++ control.8 { ++ iface MIXER ++ name 'FRDDR_A SRC 1 EN Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.9 { ++ iface MIXER ++ name 'FRDDR_A SRC 2 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.10 { ++ iface MIXER ++ name 'FRDDR_A SRC 3 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.11 { ++ iface MIXER ++ name 'FRDDR_A SINK 1 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.12 { ++ iface MIXER ++ name 'FRDDR_A SINK 2 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.13 { ++ iface MIXER ++ name 'FRDDR_A SINK 3 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.14 { ++ iface MIXER ++ name 'FRDDR_B SRC 1 EN Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.15 { ++ iface MIXER ++ name 'FRDDR_B SRC 2 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.16 { ++ iface MIXER ++ name 'FRDDR_B SRC 3 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.17 { ++ iface MIXER ++ name 'FRDDR_B SINK 1 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.18 { ++ iface MIXER ++ name 'FRDDR_B SINK 2 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.19 { ++ iface MIXER ++ name 'FRDDR_B SINK 3 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.20 { ++ iface MIXER ++ name 'FRDDR_C SRC 1 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.21 { ++ iface MIXER ++ name 'FRDDR_C SRC 2 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.22 { ++ iface MIXER ++ name 'FRDDR_C SRC 3 EN Switch' ++ value false ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.23 { ++ iface MIXER ++ name 'FRDDR_C SINK 1 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.24 { ++ iface MIXER ++ name 'FRDDR_C SINK 2 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.25 { ++ iface MIXER ++ name 'FRDDR_C SINK 3 SEL' ++ value 'OUT 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'OUT 0' ++ item.1 'OUT 1' ++ item.2 'OUT 2' ++ item.3 'OUT 3' ++ item.4 'OUT 4' ++ item.5 'OUT 5' ++ item.6 'OUT 6' ++ item.7 'OUT 7' ++ } ++ } ++ control.26 { ++ iface MIXER ++ name 'TOHDMITX I2S SRC' ++ value 'I2S A' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'I2S A' ++ item.1 'I2S B' ++ item.2 'I2S C' ++ } ++ } ++ control.27 { ++ iface MIXER ++ name 'TOHDMITX Switch' ++ value true ++ comment { ++ access 'read write' ++ type BOOLEAN ++ count 1 ++ } ++ } ++ control.28 { ++ iface MIXER ++ name 'TOHDMITX SPDIF SRC' ++ value 'SPDIF A' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'SPDIF A' ++ item.1 'SPDIF B' ++ } ++ } ++ control.29 { ++ iface MIXER ++ name 'TDMOUT_A SRC SEL' ++ value 'IN 1' ++ comment { ++ access 'read write' ++ type ENUMERATED ++ count 1 ++ item.0 'IN 0' ++ item.1 'IN 1' ++ item.2 'IN 2' ++ } ++ } ++} + +From a22979940d28a816571644e92f157fe8e0af431f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 11:14:23 +0200 +Subject: [PATCH] armbian-next: introduce hook `extension_finish_config()` - + late hook for ext configuration + +- `extension_finish_config()` is the last thing done in config phase + - use it for determining stuff based on kernel version details, package names, etc +- also tune down some logging which was too verbose +- CI logs with no ANSI escape codes +--- + extensions/nvidia.sh | 2 +- + extensions/zfs.sh | 2 +- + lib/functions/logging/logging.sh | 5 ++--- + lib/functions/main/config-prepare.sh | 10 +++++++++- + lib/functions/rootfs/apt-sources.sh | 4 ++-- + 5 files changed, 15 insertions(+), 8 deletions(-) + +diff --git a/extensions/nvidia.sh b/extensions/nvidia.sh +index 801d61010..20f979728 100644 +--- a/extensions/nvidia.sh ++++ b/extensions/nvidia.sh +@@ -1,4 +1,4 @@ +-function extension_prepare_config__build_nvidia_kernel_module() { ++function extension_finish_config__build_nvidia_kernel_module() { + if [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]]; then + display_alert "Kernel version has no working headers package" "skipping nVidia for kernel v${KERNEL_MAJOR_MINOR}" "warn" + return 0 +diff --git a/extensions/zfs.sh b/extensions/zfs.sh +index eb41afd28..f1baa63ed 100644 +--- a/extensions/zfs.sh ++++ b/extensions/zfs.sh +@@ -1,4 +1,4 @@ +-function extension_prepare_config__build_zfs_kernel_module() { ++function extension_finish_config__build_zfs_kernel_module() { + if [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]]; then + display_alert "Kernel version has no working headers package" "skipping ZFS for kernel v${KERNEL_MAJOR_MINOR}" "warn" + return 0 +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 66bcda39e..6550d714d 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -144,7 +144,6 @@ function display_alert() { + ext) + level_indicator="✨" # or ✅ ? + inline_logs_color="\e[1;32m" +- ci_log="notice" + ;; + + info) +@@ -240,9 +239,9 @@ function display_alert() { + [[ -n $2 ]] && extra=" [${inline_logs_color} ${2} ${normal_color}]" + echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker}${timing_info}${pids_info}${bashopts_info} ${normal_color}${message}${extra}${normal_color}" >&2 + +- # Now write to CI, if we're running on it ++ # Now write to CI, if we're running on it. Remove ANSI escapes which confuse GitHub Actions. + if [[ "${CI}" == "true" ]] && [[ "${ci_log}" != "" ]]; then +- echo "::${ci_log} ::" "$@" >&2 ++ echo -e "::${ci_log} ::" "$@" | sed 's/\x1b\[[0-9;]*m//g' >&2 + fi + + return 0 # make sure to exit with success, always +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 6c1570bcd..0264b0d9e 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -99,7 +99,7 @@ function prepare_and_config_main_build_single() { + [[ ${KERNEL_CONFIGURE} == prebuilt ]] && [[ -z ${REPOSITORY_INSTALL} ]] && + REPOSITORY_INSTALL="u-boot,kernel,bsp,armbian-zsh,armbian-config,armbian-bsp-cli,armbian-firmware${BUILD_DESKTOP:+,armbian-desktop,armbian-bsp-desktop}" + +- do_main_configuration # This initializes the extension manager among a lot of other things ++ do_main_configuration # This initializes the extension manager among a lot of other things, and call extension_prepare_config() hook + + # @TODO: this does not belong in configuration. it's a compilation thing. move there + # optimize build time with 100% CPU usage +@@ -176,6 +176,14 @@ function prepare_and_config_main_build_single() { + export ARMBIAN_WILL_BUILD_UBOOT=no + fi + ++ display_alert "Extensions: finish configuration" "extension_finish_config" "debug" ++ call_extension_method "extension_finish_config" <<- 'EXTENSION_FINISH_CONFIG' ++ *allow extensions a last chance at configuration just before it is done* ++ After kernel versions are set, package names determined, etc. ++ This runs *late*, and is the final step before finishing configuration. ++ Don't change anything not coming from other variables or meant to be configured by the user. ++ EXTENSION_FINISH_CONFIG ++ + display_alert "Done with prepare_and_config_main_build_single" "${BOARD}.${BOARD_TYPE}" "info" + } + +diff --git a/lib/functions/rootfs/apt-sources.sh b/lib/functions/rootfs/apt-sources.sh +index ff373a98b..bc17a3a9b 100644 +--- a/lib/functions/rootfs/apt-sources.sh ++++ b/lib/functions/rootfs/apt-sources.sh +@@ -36,7 +36,7 @@ add_apt_sources() { + if [[ "${new_apt_source}" == ppa* ]]; then + chroot_sdcard add-apt-repository -y -n "${new_apt_source}" # -y -> Assume yes, -n -> no apt-get update + if [[ -f "${apt_source_gpg_filepath}" ]]; then +- display_alert "Adding GPG Key" "via apt-key add (deprecated): ${apt_source_gpg_filename}" "warn" ++ display_alert "Adding GPG Key" "via apt-key add (deprecated): ${apt_source_gpg_filename}" + run_host_command_logged cp -pv "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" + chroot_sdcard apt-key add "/tmp/${apt_source_gpg_filename}" + fi +@@ -44,7 +44,7 @@ add_apt_sources() { + # installation without software-common-properties, sources.list + key.gpg + echo "${new_apt_source}" > "${SDCARD}/etc/apt/sources.list.d/${apt_source_filename}" + if [[ -f "${apt_source_gpg_filepath}" ]]; then +- display_alert "Adding GPG Key" "via keyrings: ${apt_source_gpg_filename}" "warn" ++ display_alert "Adding GPG Key" "via keyrings: ${apt_source_gpg_filename}" + mkdir -p "${SDCARD}"/usr/share/keyrings/ + run_host_command_logged cp -pv "${apt_source_gpg_filepath}" "${SDCARD}"/usr/share/keyrings/ + fi + +From bedd3aa1a4c661bc177af7dd0db3062296d7ec5f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 16 Apr 2022 00:45:30 +0200 +Subject: [PATCH] armbian-next: shuffle around code and logic of + `add_desktop_package_sources()` + +- @TODO: still needs proper asset logging for sources.list(.d) +- @TODO: tunes down adding of sources/packages to CLI builds, check with Igor +--- + lib/functions/rootfs/{apt.sh => apt-install.sh} | 2 +- + lib/functions/rootfs/apt-sources.sh | 56 ++++++++++++++++++ + lib/functions/rootfs/create-cache.sh | 11 +++- + lib/functions/rootfs/rootfs-desktop.sh | 78 ------------------------- + lib/library-functions.sh | 15 ++++- + 5 files changed, 77 insertions(+), 85 deletions(-) + +diff --git a/lib/functions/rootfs/apt.sh b/lib/functions/rootfs/apt-install.sh +similarity index 93% +rename from lib/functions/rootfs/apt.sh +rename to lib/functions/rootfs/apt-install.sh +index e062d5284..b2406f339 100644 +--- a/lib/functions/rootfs/apt.sh ++++ b/lib/functions/rootfs/apt-install.sh +@@ -16,7 +16,7 @@ install_deb_chroot() { + # also won't require cleanup later + + name="/root/"$(basename "${package}") +- [[ ! -f "${SDCARD}${name}" ]] && cp "${package}" "${SDCARD}${name}" ++ [[ ! -f "${SDCARD}${name}" ]] && run_host_command_logged cp -pv "${package}" "${SDCARD}${name}" + desc="" + else + name=$1 +diff --git a/lib/functions/rootfs/apt-sources.sh b/lib/functions/rootfs/apt-sources.sh +new file mode 100644 +index 000000000..ff373a98b +--- /dev/null ++++ b/lib/functions/rootfs/apt-sources.sh +@@ -0,0 +1,56 @@ ++add_apt_sources() { ++ local potential_paths="" ++ local sub_dirs_to_check=". " ++ if [[ ! -z "${SELECTED_CONFIGURATION+x}" ]]; then ++ sub_dirs_to_check+="config_${SELECTED_CONFIGURATION}" ++ fi ++ ++ # @TODO: rpardini: The logic here is meant to be evolved over time. Originally, all of this only ran when BUILD_DESKTOP=yes. ++ # Igor had bumped it to run on all builds, but that adds external sources to cli and minimal. ++ # Here I'm tuning it down to 1/4th of the original, eg: no nala on my cli builds, thanks. ++ [[ "${BUILD_MINIMAL}" != "yes" ]] && get_all_potential_paths "${DEBOOTSTRAP_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" ++ [[ "${BUILD_DESKTOP}" == "yes" ]] && get_all_potential_paths "${CLI_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" ++ [[ "${BUILD_DESKTOP}" == "yes" ]] && get_all_potential_paths "${DESKTOP_ENVIRONMENTS_SEARCH_RELATIVE_DIRS}" "." "sources/apt" ++ [[ "${BUILD_DESKTOP}" == "yes" ]] && get_all_potential_paths "${DESKTOP_APPGROUPS_SEARCH_RELATIVE_DIRS}" "${DESKTOP_APPGROUPS_SELECTED}" "sources/apt" ++ ++ display_alert "Adding additional apt sources" "add_apt_sources()" "debug" ++ ++ for apt_sources_dirpath in ${potential_paths}; do ++ if [[ -d "${apt_sources_dirpath}" ]]; then ++ for apt_source_filepath in "${apt_sources_dirpath}/"*.source; do ++ apt_source_filepath=$(echo "${apt_source_filepath}" | sed -re 's/(^.*[^/])\.[^./]*$/\1/') ++ local new_apt_source ++ local apt_source_gpg_filepath ++ local apt_source_gpg_filename ++ local apt_source_filename ++ ++ new_apt_source="$(cat "${apt_source_filepath}.source")" ++ apt_source_gpg_filepath="${apt_source_filepath}.gpg" ++ apt_source_gpg_filename="$(basename "${apt_source_gpg_filepath}")" ++ apt_source_filename="$(basename "${apt_source_filepath}").list" ++ ++ display_alert "Adding APT Source" "${new_apt_source}" "info" ++ ++ # @TODO: rpardini, why do PPAs get apt-key and others get keyrings GPG? ++ ++ if [[ "${new_apt_source}" == ppa* ]]; then ++ chroot_sdcard add-apt-repository -y -n "${new_apt_source}" # -y -> Assume yes, -n -> no apt-get update ++ if [[ -f "${apt_source_gpg_filepath}" ]]; then ++ display_alert "Adding GPG Key" "via apt-key add (deprecated): ${apt_source_gpg_filename}" "warn" ++ run_host_command_logged cp -pv "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" ++ chroot_sdcard apt-key add "/tmp/${apt_source_gpg_filename}" ++ fi ++ else ++ # installation without software-common-properties, sources.list + key.gpg ++ echo "${new_apt_source}" > "${SDCARD}/etc/apt/sources.list.d/${apt_source_filename}" ++ if [[ -f "${apt_source_gpg_filepath}" ]]; then ++ display_alert "Adding GPG Key" "via keyrings: ${apt_source_gpg_filename}" "warn" ++ mkdir -p "${SDCARD}"/usr/share/keyrings/ ++ run_host_command_logged cp -pv "${apt_source_gpg_filepath}" "${SDCARD}"/usr/share/keyrings/ ++ fi ++ fi ++ ++ done ++ fi ++ done ++} +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 5e57eabc5..7d7fc87e9 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -162,7 +162,7 @@ function create_new_rootfs_cache() { + chroot_sdcard LC_ALL=C LANG=C setupcon --save --force + fi + +- # stage: create apt-get sources list ++ # stage: create apt-get sources list (basic Debian/Ubuntu apt sources, no external nor PPAS) + create_sources_list "$RELEASE" "$SDCARD/" + + # add armhf arhitecture to arm64, unless configured not to do so. +@@ -173,8 +173,13 @@ function create_new_rootfs_cache() { + # this should fix resolvconf installation failure in some cases + chroot_sdcard 'echo "resolvconf resolvconf/linkify-resolvconf boolean false" | debconf-set-selections' + +- # TODO change name of the function from "desktop" and move to appropriate location +- add_desktop_package_sources ++ # Add external / PPAs to apt sources; decides internally based on minimal/cli/desktop dir/file structure ++ add_apt_sources ++ ++ # uset asset logging for this; actually log contents of the files too ++ run_host_command_logged ls -l "${SDCARD}/usr/share/keyrings" ++ run_host_command_logged ls -l "${SDCARD}/etc/apt/sources.list.d" ++ run_host_command_logged cat "${SDCARD}/etc/apt/sources.list" + + # stage: update packages list + display_alert "Updating package list" "$RELEASE" "info" +diff --git a/lib/functions/rootfs/rootfs-desktop.sh b/lib/functions/rootfs/rootfs-desktop.sh +index 208119d4b..edcf9e619 100644 +--- a/lib/functions/rootfs/rootfs-desktop.sh ++++ b/lib/functions/rootfs/rootfs-desktop.sh +@@ -1,81 +1,3 @@ +-install_ppa_prerequisites() { +- +- # Myy : So... The whole idea is that, a good bunch of external sources +- # are PPA. +- # Adding PPA without add-apt-repository is poorly conveninent since +- # you need to reconstruct the URL by hand, and find the GPG key yourself. +- # add-apt-repository does that automatically, and in a way that allows you +- # to remove it cleanly through the same tool. +- +- # Myy : TODO Try to find a way to install this package only when +- # we encounter a PPA. +- chroot_sdcard_apt_get_install "software-properties-common" +- +-} +- +-add_apt_sources() { +- +- local potential_paths="" +- local sub_dirs_to_check=". " +- if [[ ! -z "${SELECTED_CONFIGURATION+x}" ]]; then +- sub_dirs_to_check+="config_${SELECTED_CONFIGURATION}" +- fi +- get_all_potential_paths "${DEBOOTSTRAP_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" +- get_all_potential_paths "${CLI_SEARCH_RELATIVE_DIRS}" "${sub_dirs_to_check}" "sources/apt" +- get_all_potential_paths "${DESKTOP_ENVIRONMENTS_SEARCH_RELATIVE_DIRS}" "." "sources/apt" +- get_all_potential_paths "${DESKTOP_APPGROUPS_SEARCH_RELATIVE_DIRS}" "${DESKTOP_APPGROUPS_SELECTED}" "sources/apt" +- +- display_alert "Adding additional apt sources" "add_apt_sources()" "debug" +- +- for apt_sources_dirpath in ${potential_paths}; do +- if [[ -d "${apt_sources_dirpath}" ]]; then +- for apt_source_filepath in "${apt_sources_dirpath}/"*.source; do +- apt_source_filepath=$(echo "${apt_source_filepath}" | sed -re 's/(^.*[^/])\.[^./]*$/\1/') +- local new_apt_source="$(cat "${apt_source_filepath}.source")" +- local apt_source_gpg_filepath="${apt_source_filepath}.gpg" +- +- # extract filenames +- local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" +- local apt_source_filename="$(basename ${apt_source_filepath}).list" +- +- display_alert "Adding APT Source" "${new_apt_source}" "info" +- +- if [[ "${new_apt_source}" == ppa* ]]; then +- chroot_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" +- # add list with apt-add +- # -y -> Assumes yes to all queries +- # -n -> Do not update package cache after adding +- if [[ -f "${apt_source_gpg_filepath}" ]]; then +- display_alert "Adding GPG Key ${apt_source_gpg_filepath}" +- cp "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" +- chroot_sdcard "apt-key add \"/tmp/${apt_source_gpg_filename}\"" +- echo "APT Key returned : $?" +- fi +- else +- # installation without software-common-properties, sources.list + key.gpg +- echo "${new_apt_source}" > "${SDCARD}/etc/apt/sources.list.d/${apt_source_filename}" +- if [[ -f "${apt_source_gpg_filepath}" ]]; then +- display_alert "Adding GPG Key" "${apt_source_gpg_filepath}" "info" +- # local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" +- mkdir -p "${SDCARD}"/usr/share/keyrings/ +- cp "${apt_source_gpg_filepath}" "${SDCARD}"/usr/share/keyrings/ +- fi +- +- fi +- +- done +- fi +- done +- +-} +- +-add_desktop_package_sources() { +- add_apt_sources +- run_host_command_logged ls -l "${SDCARD}/usr/share/keyrings" +- run_host_command_logged ls -l "${SDCARD}/etc/apt/sources.list.d" +- run_host_command_logged cat "${SDCARD}/etc/apt/sources.list" +-} +- + # a-kind-of-hook, called by install_distribution_agnostic() if it's a desktop build + desktop_postinstall() { + +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index a7cfb652b..5bad7883a 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -429,9 +429,18 @@ source "${SRC}"/lib/functions/main/rootfs-image.sh + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/rootfs/apt.sh +-# shellcheck source=lib/functions/rootfs/apt.sh +-source "${SRC}"/lib/functions/rootfs/apt.sh ++### lib/functions/rootfs/apt-install.sh ++# shellcheck source=lib/functions/rootfs/apt-install.sh ++source "${SRC}"/lib/functions/rootfs/apt-install.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/apt-sources.sh ++# shellcheck source=lib/functions/rootfs/apt-sources.sh ++source "${SRC}"/lib/functions/rootfs/apt-sources.sh + + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + +From 4876e0444f33ea1ce28cb340215638702ef98792 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 22:07:17 +0200 +Subject: [PATCH] armbian-next: 4.x can't build objtool in kernel-headers; + allow for handling that later + +- 4.x has a lot more obtuse dependencies +- introduce KERNEL_HAS_WORKING_HEADERS calculated based on KERNEL_MAJOR_MINOR +--- + extensions/nvidia.sh | 5 +++++ + extensions/zfs.sh | 5 +++++ + lib/functions/compilation/kernel-debs.sh | 7 ++++++- + lib/functions/main/config-prepare.sh | 8 ++++++-- + 4 files changed, 22 insertions(+), 3 deletions(-) + +diff --git a/extensions/nvidia.sh b/extensions/nvidia.sh +index 57e478c5c..801d61010 100644 +--- a/extensions/nvidia.sh ++++ b/extensions/nvidia.sh +@@ -1,10 +1,15 @@ + function extension_prepare_config__build_nvidia_kernel_module() { ++ if [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]]; then ++ display_alert "Kernel version has no working headers package" "skipping nVidia for kernel v${KERNEL_MAJOR_MINOR}" "warn" ++ return 0 ++ fi + export INSTALL_HEADERS="yes" + declare -g NVIDIA_DRIVER_VERSION="${NVIDIA_DRIVER_VERSION:-"510"}" + display_alert "Forcing INSTALL_HEADERS=yes; using nVidia driver version ${NVIDIA_DRIVER_VERSION}" "${EXTENSION}" "debug" + } + + function post_install_kernel_debs__build_nvidia_kernel_module() { ++ [[ "${INSTALL_HEADERS}" != "yes" ]] || [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]] && return 0 + display_alert "Install nVidia packages, build kernel module in chroot" "${EXTENSION}" "info" + # chroot_sdcard_apt_get_install() is in lib/logging/runners.sh which handles "running" of stuff nicely. + # chroot_sdcard_apt_get_install() -> chroot_sdcard_apt_get() -> chroot_sdcard() -> run_host_command_logged_raw() +diff --git a/extensions/zfs.sh b/extensions/zfs.sh +index 6705b4578..eb41afd28 100644 +--- a/extensions/zfs.sh ++++ b/extensions/zfs.sh +@@ -1,9 +1,14 @@ + function extension_prepare_config__build_zfs_kernel_module() { ++ if [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]]; then ++ display_alert "Kernel version has no working headers package" "skipping ZFS for kernel v${KERNEL_MAJOR_MINOR}" "warn" ++ return 0 ++ fi + export INSTALL_HEADERS="yes" + display_alert "Forcing INSTALL_HEADERS=yes; for use with ZFS" "${EXTENSION}" "debug" + } + + function post_install_kernel_debs__build_zfs_kernel_module() { ++ [[ "${INSTALL_HEADERS}" != "yes" ]] || [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]] && return 0 + display_alert "Install ZFS packages, will build kernel module in chroot" "${EXTENSION}" "info" + declare -agx if_error_find_files_sdcard=("/var/lib/dkms/zfs/*/build/*.log") + # See https://github.com/zfsonlinux/pkg-zfs/issues/69 for a bug with leaking env vars. +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index e3d3b57dc..e0788518d 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -58,7 +58,12 @@ function prepare_kernel_packaging_debs() { + create_kernel_deb "linux-dtb-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_dtb + fi + +- create_kernel_deb "linux-headers-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_headers ++ # Only recent kernels get linux-headers package; some tuning has to be done for 4.x ++ if [[ "${KERNEL_HAS_WORKING_HEADERS}" == "yes" ]]; then ++ create_kernel_deb "linux-headers-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_headers ++ else ++ display_alert "Skipping linux-headers package" "for ${KERNEL_MAJOR_MINOR} kernel version" "warn" ++ fi + } + + function create_kernel_deb() { +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 013b903d4..6c1570bcd 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -150,19 +150,23 @@ function prepare_and_config_main_build_single() { + if [[ "x${KERNEL_MAJOR_MINOR}x" == "xx" ]]; then + exit_with_error "BAD config, missing" "KERNEL_MAJOR_MINOR" "err" + fi ++ export KERNEL_HAS_WORKING_HEADERS="no" # assume the worst, and all surprises will be happy ones + # Parse/validate the the major, bail if no match +- if linux-version compare "${KERNEL_MAJOR_MINOR}" ge "5.4"; then # We support 5.x from 5.4; 5.10+ brings unified packaging. ++ if linux-version compare "${KERNEL_MAJOR_MINOR}" ge "5.4"; then # We support 5.x from 5.4 ++ export KERNEL_HAS_WORKING_HEADERS="yes" # We can build working headers for 5.x even when cross compiling. + export KERNEL_MAJOR=5 + export KERNEL_MAJOR_SHALLOW_TAG="v${KERNEL_MAJOR_MINOR}-rc1" + elif linux-version compare "${KERNEL_MAJOR_MINOR}" ge "4.4" && linux-version compare "${KERNEL_MAJOR_MINOR}" lt "5.0"; then +- export KERNEL_MAJOR=4 # We support 4.x from 4.4; all require custom packaging. ++ export KERNEL_MAJOR=4 # We support 4.x from 4.4 + export KERNEL_MAJOR_SHALLOW_TAG="v${KERNEL_MAJOR_MINOR}-rc1" + else ++ # If you think you can patch packaging to support this, you're probably right. Is _worth_ it though? + exit_with_error "Kernel series unsupported" "'${KERNEL_MAJOR_MINOR}' is unsupported, or bad config" + fi + + export LINUXSOURCEDIR="kernel/${ARCH}__${KERNEL_MAJOR_MINOR}__${LINUXFAMILY}" + else ++ export KERNEL_HAS_WORKING_HEADERS="yes" # I assume non-Armbian kernels have working headers, eg: Debian/Ubuntu generic do. + export ARMBIAN_WILL_BUILD_KERNEL=no + fi + + +From 6b5726444e6be8a935fe758664847184e7642840 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 21:48:22 +0200 +Subject: [PATCH] armbian-next: downgrade `error=misleading-indentation` to + warning + +- some 4.x kernels patches are really messy +- newer gcc's make that an error now +--- + lib/functions/compilation/kernel.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 579400490..d6dd30920 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -14,8 +14,8 @@ function run_kernel_make() { + "ARCH=${ARCHITECTURE}" # Key param. Everything depends on this. + "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family. Changing this causes recompiles + +- "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # added as prefix to every compiler invocation by make +- "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. ++ "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # added as prefix to every compiler invocation by make ++ "KCFLAGS=-fdiagnostics-color=always -Wno-error=misleading-indentation" # Force GCC colored messages, downgrade misleading indentation to warning + + "SOURCE_DATE_EPOCH=${kernel_base_revision_ts}" # https://reproducible-builds.org/docs/source-date-epoch/ and https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html + "KBUILD_BUILD_TIMESTAMP=${kernel_base_revision_date}" # https://www.kernel.org/doc/html/latest/kbuild/kbuild.html#kbuild-build-timestamp + +From 54cad4f827e14967d692ae4d14426394cc56b4ff Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 17:23:42 +0200 +Subject: [PATCH] armbian-next: *allow cross compilation*, even the so-called + "reverse cross-compile" (amd64 on arm64) + +--- + config/sources/amd64.conf | 6 +++--- + lib/functions/compilation/kernel.sh | 4 +--- + 2 files changed, 4 insertions(+), 6 deletions(-) + +diff --git a/config/sources/amd64.conf b/config/sources/amd64.conf +index cc1b4b256..8b208bab2 100644 +--- a/config/sources/amd64.conf ++++ b/config/sources/amd64.conf +@@ -13,9 +13,9 @@ export UBOOT_USE_GCC="none" # required by configuration.sh + [[ -z $KERNELSOURCE ]] && KERNELSOURCE=$MAINLINE_KERNEL_SOURCE + + if [[ "$(uname -m)" == "aarch64" ]]; then +- # Explicitly disallow "reverse cross-compile". Go ask @the-Going why ;-) +- display_error "Unsupported cross-compile" "aarch64 -> x86_64" "err" +- exit 39 ++ # Allow building amd64 on aarch64, but using system toolchain only ++ export KERNEL_COMPILER="x86_64-linux-gnu-" ++ export SKIP_EXTERNAL_TOOLCHAINS=yes + fi + + true # don't fail due to conditional above. +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 83596f603..579400490 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -190,12 +190,10 @@ function kernel_config() { + # if it matches we use the system compiler + if dpkg-architecture -e "${ARCH}"; then + display_alert "Native compilation" "target ${ARCH} on host $(dpkg --print-architecture)" +- elif [[ $(dpkg --print-architecture) == amd64 ]]; then ++ else + display_alert "Cross compilation" "target ${ARCH} on host $(dpkg --print-architecture)" + toolchain=$(find_toolchain "$KERNEL_COMPILER" "$KERNEL_USE_GCC") + [[ -z $toolchain ]] && exit_with_error "Could not find required toolchain" "${KERNEL_COMPILER}gcc $KERNEL_USE_GCC" +- else +- display_alert "Unhandled cross compilation combo" "target ${ARCH} on host $(dpkg --print-architecture) - headers might not work" "warn" + fi + + kernel_compiler_version="$(eval env PATH="${toolchain}:${PATH}" "${KERNEL_COMPILER}gcc" -dumpversion)" + +From c57535fbcab21c0cf7284e0cbcb614971e6d4bd7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 13:49:23 +0200 +Subject: [PATCH] armbian-next: add `zfs` extension, which installs headers and + builds ZFS via DKMS in chroot + +- similar to how `nvidia` extension does it +--- + extensions/zfs.sh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/extensions/zfs.sh b/extensions/zfs.sh +new file mode 100644 +index 000000000..6705b4578 +--- /dev/null ++++ b/extensions/zfs.sh +@@ -0,0 +1,11 @@ ++function extension_prepare_config__build_zfs_kernel_module() { ++ export INSTALL_HEADERS="yes" ++ display_alert "Forcing INSTALL_HEADERS=yes; for use with ZFS" "${EXTENSION}" "debug" ++} ++ ++function post_install_kernel_debs__build_zfs_kernel_module() { ++ display_alert "Install ZFS packages, will build kernel module in chroot" "${EXTENSION}" "info" ++ declare -agx if_error_find_files_sdcard=("/var/lib/dkms/zfs/*/build/*.log") ++ # See https://github.com/zfsonlinux/pkg-zfs/issues/69 for a bug with leaking env vars. ++ use_clean_environment="yes" chroot_sdcard_apt_get_install "zfs-dkms zfsutils-linux" ++} + +From 82756687f5930a55f413a3f7164b1fb9337bd2b0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 13:49:56 +0200 +Subject: [PATCH] armbian-next: x86: enable `nvidia` extension for all releases + (only desktop) + +--- + config/sources/families/uefi-x86.conf | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/config/sources/families/uefi-x86.conf b/config/sources/families/uefi-x86.conf +index 7a40a5b00..55923fd7b 100644 +--- a/config/sources/families/uefi-x86.conf ++++ b/config/sources/families/uefi-x86.conf +@@ -1,6 +1,5 @@ + # Important: LINUXFAMILY and ARCH are defined _before_ including the common family include +-[[ "$BUILD_DESKTOP" == yes && "$RELEASE" == jammy ]] && enable_extension "nvidia" +-export UEFI_GRUB_TERMINAL="gfxterm" ++[[ "$BUILD_DESKTOP" == yes ]] && enable_extension "nvidia" + export LINUXFAMILY="x86" + export ARCH="amd64" + source "${BASH_SOURCE%/*}/include/uefi_common.inc" + +From d4ce330682ba9563b1821ae08b8412e9149fec80 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 13:53:14 +0200 +Subject: [PATCH] armbian-next: `headers-debian-byteshift.patch` is dead; + long-live cross-compiled source-only kernel-headers + +- kernel-headers package now only includes _sources_ +- postinst does the compilation and preparation for DKMS compatibility +- `tools` dir is included now, which includes the byteshift utilities +- handle special scripts/module.lds case after 5.10 +- tested on a 6 combinations of `x86` / `arm64` / `armhf` (3x targets, 2x hosts) +- @TODO: we might be able to reduce the size of tools a bit (perf/tests/etc) +- @TODO: still missing ARCH vs ARCHITECTURE vs SRC_ARCH clarity elsewhere +--- + lib/functions/compilation/kernel-debs.sh | 108 +++++++++++++-------- + lib/functions/compilation/kernel.sh | 4 - + patch/misc/headers-debian-byteshift.patch | 156 ------------------------------ + 3 files changed, 67 insertions(+), 201 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index b8eb9d266..e3d3b57dc 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -3,26 +3,20 @@ + # We wanna produce Debian/Ubuntu compatible packages so we're able to use their standard tools, like + # `flash-kernel`, `u-boot-menu`, `grub2`, and others, so we gotta stick to their conventions. + +-# Headers are important. We wanna be compatible with `dkms` stuff from Ubuntu, like `nvidia-driver-xxx`. +-# This is affected by cross-compilation: Armbian usually builds arm64 on amd64, and the KBUILD tools +-# that would be included in such headers package will be the wrong arch for `dkms`ing on target arm64 machine. +- + # The main difference is that this is NOT invoked from KBUILD's Makefile, but instead + # directly by Armbian, with references to the dirs where KBUILD's + # `make install dtbs_install modules_install headers_install` have already successfully been run. + + # This will create a SET of packages. It should always create these: + # image package: vmlinuz and such, config, modules, and dtbs (if exist) in /usr/lib/xxx +-# libc header package: just the libc headers +-# linux-headers package: just the image headers. (what about the binaries? cross compilation?) ++# linux-headers package: just the kernel headers, for building out-of-tree modules, dkms, etc. + # linux-dtbs package: only dtbs, if they exist. in /boot/ + + # So this will handle + # - Creating .deb package skeleton dir (mktemp) + # - Moving/copying around of KBUILD installed stuff for Debian/Ubuntu/Armbian standard locations, in the correct packages +-# - Separating headers, between image and libc packages. + # - Fixing the symlinks to stuff so they fit a target system. +-# - building the .debs; ++# - building the .debs. + + is_enabled() { + grep -q "^$1=y" include/config/auto.conf +@@ -64,11 +58,7 @@ function prepare_kernel_packaging_debs() { + create_kernel_deb "linux-dtb-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_dtb + fi + +- if dpkg-architecture -e "${ARCH}"; then +- create_kernel_deb "linux-headers-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_headers +- else +- display_alert "Cross-compilation" "skip kernel-headers packaging" "warn" +- fi ++ create_kernel_deb "linux-headers-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_headers + } + + function create_kernel_deb() { +@@ -268,40 +258,33 @@ function kernel_package_callback_linux_headers() { + # how to get SRCARCH? only from the makefile itself. ARCH=amd64 then SRCARCH=x86. How to we know? @TODO + local SRC_ARCH="${ARCH}" + [[ "${SRC_ARCH}" == "amd64" ]] && SRC_ARCH="x86" ++ [[ "${SRC_ARCH}" == "armhf" ]] && SRC_ARCH="arm" + + # Create a list of files to include, path-relative to the kernel tree + local temp_file_list="${WORKDIR}/tmp_file_list_${kernel_version_family}.kernel.headers" + +- # Source stuff. No binaries. I think. ++ # Find the files we want to include in the package. Those will be later cleaned, etc. + ( + cd "${kernel_work_dir}" || exit 2 +- #echo "-- Sources: Makefiles and Kconfigs and perl" + find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl +- +- #echo "-- Sources: all arches include, include and scripts both files and symlinks " + find arch/*/include include scripts -type f -o -type l +- +- #echo "-- Sources: security include" + find security/*/include -type f +- +- #echo "-- Sources: arch ${SRC_ARCH} module lds or Kbuild platforms or Platform" +- find "arch/${SRC_ARCH}" -name module.lds -o -name Kbuild.platforms -o -name Platform +- +- #echo "-- Sources: All files somewhere for some reason" +- # shellcheck disable=SC2046 # I need to expand. Thanks. +- find $(find "arch/${SRC_ARCH}" -name include -o -name scripts -type d) -type f +- +- if is_enabled CONFIG_STACK_VALIDATION; then +- #echo "-- Binaries: objtool due to CONFIG_STACK_VALIDATION" +- find tools/objtool -type f -executable +- fi +- +- #echo "-- Binaries: Module.symvers and includes scripts FILES" +- find arch/${SRC_ARCH}/include Module.symvers include scripts -type f ++ [[ -d "arch/${SRC_ARCH}" ]] && { ++ find "arch/${SRC_ARCH}" -name module.lds -o -name Kbuild.platforms -o -name Platform ++ # shellcheck disable=SC2046 # I need to expand. Thanks. ++ find $(find "arch/${SRC_ARCH}" -name include -o -name scripts -type d) -type f ++ find arch/${SRC_ARCH}/include Module.symvers include scripts -type f ++ } ++ # Include the byteshift utilities shared between kernel proper and the build scripts/tools. ++ # This replaces 'headers-debian-byteshift.patch' which was used for years in Armbian. ++ #find tools/include/tools/be_byteshift.h tools/include/tools/le_byteshift.h -type f ++ #find tools/objtool -type f ++ #find tools/build -type f ++ find tools -type f # all tools. all of it? we might get away with a little less. eg: tools/perf and tools/testing ++ find arch/x86/lib/insn.c # required by objtool stuff... + + if is_enabled CONFIG_GCC_PLUGINS; then +- #echo "-- Binaries: gcc plugins due to CONFIG_GCC_PLUGINS" +- find scripts/gcc-plugins -name \*.so -o -name gcc-common.h ++ find scripts/gcc-plugins -name gcc-common.h # @TODO something else here too? + fi + ) > "${temp_file_list}" + +@@ -310,10 +293,21 @@ function kernel_package_callback_linux_headers() { + + # ${temp_file_list} is left at WORKDIR for later debugging, will be removed by WORKDIR cleanup trap + +- # @TODO: maybe split all binaries to a separate package at this stage; that way cross compile can still produce +- # @TODO: source-only headers, which can then be patched (byteshift?) and compiled client-side later ++ # Now, make the script dirs clean. ++ # This is run in our _target_ dir, not the source tree, so we're free to make clean as we wish without invalidating the next build's cache. ++ run_host_command_logged cd "${headers_target_dir}" "&&" make "ARCH=${SRC_ARCH}" "M=scripts" clean ++ run_host_command_logged cd "${headers_target_dir}/tools" "&&" make "ARCH=${SRC_ARCH}" clean + +- # @TODO: cat "${temp_file_list}" | grep -v -e "\.h$" -e ".c$" -e "Makefile$" -e "Kconfig$" -e "Kbuild$" -e "\.cocci$" | xargs file | grep -v -e "ASCII" -e "script text" ++ # Hack: after cleaning, copy over the scripts/module.lds file from the source tree. It will only exist on 5.10+ ++ # See https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1906131 ++ [[ -f "${kernel_work_dir}/scripts/module.lds" ]] && ++ run_host_command_logged cp -v "${kernel_work_dir}/scripts/module.lds" "${headers_target_dir}/scripts/module.lds" ++ ++ # Check that no binaries are included by now. Expensive... @TODO: remove after me make sure. ++ ( ++ cd "${headers_target_dir}" || exit 33 ++ find . -type f | grep -v -e "include/config/" -e "\.h$" -e ".c$" -e "Makefile$" -e "Kconfig$" -e "Kbuild$" -e "\.cocci$" | xargs file | grep -v -e "ASCII" -e "script text" -e "empty" -e "Unicode text" -e "symbolic link" -e "CSV text" -e "SAS 7+" || true ++ ) + + # Generate a control file + cat <<- CONTROL_FILE > "${package_DEBIAN_dir}/control" +@@ -323,12 +317,44 @@ function kernel_package_callback_linux_headers() { + Package: ${package_name} + Architecture: ${ARCH} + Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH +- Depends: make, gcc, libc6-dev, bison, flex, libssl-dev ++ Depends: make, gcc, libc6-dev, bison, flex, libssl-dev, libelf-dev + Description: Linux kernel headers for ${kernel_version_family} + This package provides kernel header files for ${kernel_version_family} + . + This is useful for DKMS and building of external modules. + CONTROL_FILE + +- # @TODO: preinst postinst? dependent on split, see todo above ++ # Make sure the target dir is clean/not-existing before installing. ++ kernel_package_hook_helper "preinst" <( ++ cat <<- EOT_PREINST ++ if [[ -d "/usr/src/linux-headers-${kernel_version_family}" ]]; then ++ echo "Cleaning pre-existing directory /usr/src/linux-headers-${kernel_version_family} ..." ++ rm -rf "/usr/src/linux-headers-${kernel_version_family}" ++ fi ++ EOT_PREINST ++ ) ++ ++ # Make sure the target dir is removed before removing the package; that way we don't leave eventual compilation artifacts over there. ++ kernel_package_hook_helper "prerm" <( ++ cat <<- EOT_PRERM ++ if [[ -d "/usr/src/linux-headers-${kernel_version_family}" ]]; then ++ echo "Cleaning directory /usr/src/linux-headers-${kernel_version_family} ..." ++ rm -rf "/usr/src/linux-headers-${kernel_version_family}" ++ fi ++ EOT_PRERM ++ ) ++ ++ kernel_package_hook_helper "postinst" <( ++ cat <<- EOT_POSTINST ++ cd "/usr/src/linux-headers-${kernel_version_family}" ++ NCPU=\$(grep -c 'processor' /proc/cpuinfo) ++ echo "Compiling kernel-headers tools (${kernel_version_family}) using \$NCPU CPUs - please wait ..." ++ yes "" | make ARCH="${SRC_ARCH}" oldconfig ++ make ARCH="${SRC_ARCH}" -j\$NCPU scripts ++ make ARCH="${SRC_ARCH}" -j\$NCPU M=scripts/mod/ ++ # make ARCH="${SRC_ARCH}" -j\$NCPU modules_prepare # depends on too much other stuff. ++ make ARCH="${SRC_ARCH}" -j\$NCPU tools/objtool ++ echo "Done compiling kernel-headers tools (${kernel_version_family})." ++ EOT_POSTINST ++ ) + } +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 118bdd752..83596f603 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -238,10 +238,6 @@ function kernel_config() { + cp -p "${SRC}"/packages/blobs/odroidxu4/*.bin "${kernel_work_dir}/firmware/edid" + fi + +- # hack for deb builder. To pack what's missing in headers pack. +- # @TODO: only for legacy builds? +- cp "${SRC}"/patch/misc/headers-debian-byteshift.patch /tmp # @TODO: ok, but why /tmp? It's leaking there. +- + display_alert "Kernel configuration" "${LINUXCONFIG}" "info" + + if [[ $KERNEL_CONFIGURE != yes ]]; then +diff --git a/patch/misc/headers-debian-byteshift.patch b/patch/misc/headers-debian-byteshift.patch +deleted file mode 100644 +index ef375ff66..000000000 +--- a/patch/misc/headers-debian-byteshift.patch ++++ /dev/null +@@ -1,156 +0,0 @@ +-Signed-off-by: Matt Fleming +-Link: http://lkml.kernel.org/r/1330436245-24875-2-git-send-email-matt@console-pimps.org +-Signed-off-by: H. Peter Anvin +-Signed-off-by: Greg Kroah-Hartman +- +---- +-tools/include/tools/be_byteshift.h | 70 +++++++++++++++++++++++++++++++++++++ +-tools/include/tools/le_byteshift.h | 70 +++++++++++++++++++++++++++++++++++++ +-2 files changed, 140 insertions(+) +- +---- /dev/null +-+++ b/tools/include/tools/be_byteshift.h +-@@ -0,0 +1,70 @@ +-+#ifndef _TOOLS_BE_BYTESHIFT_H +-+#define _TOOLS_BE_BYTESHIFT_H +-+ +-+#include +-+ +-+static inline __u16 __get_unaligned_be16(const __u8 *p) +-+{ +-+ return p[0] << 8 | p[1]; +-+} +-+ +-+static inline __u32 __get_unaligned_be32(const __u8 *p) +-+{ +-+ return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; +-+} +-+ +-+static inline __u64 __get_unaligned_be64(const __u8 *p) +-+{ +-+ return (__u64)__get_unaligned_be32(p) << 32 | +-+ __get_unaligned_be32(p + 4); +-+} +-+ +-+static inline void __put_unaligned_be16(__u16 val, __u8 *p) +-+{ +-+ *p++ = val >> 8; +-+ *p++ = val; +-+} +-+ +-+static inline void __put_unaligned_be32(__u32 val, __u8 *p) +-+{ +-+ __put_unaligned_be16(val >> 16, p); +-+ __put_unaligned_be16(val, p + 2); +-+} +-+ +-+static inline void __put_unaligned_be64(__u64 val, __u8 *p) +-+{ +-+ __put_unaligned_be32(val >> 32, p); +-+ __put_unaligned_be32(val, p + 4); +-+} +-+ +-+static inline __u16 get_unaligned_be16(const void *p) +-+{ +-+ return __get_unaligned_be16((const __u8 *)p); +-+} +-+ +-+static inline __u32 get_unaligned_be32(const void *p) +-+{ +-+ return __get_unaligned_be32((const __u8 *)p); +-+} +-+ +-+static inline __u64 get_unaligned_be64(const void *p) +-+{ +-+ return __get_unaligned_be64((const __u8 *)p); +-+} +-+ +-+static inline void put_unaligned_be16(__u16 val, void *p) +-+{ +-+ __put_unaligned_be16(val, p); +-+} +-+ +-+static inline void put_unaligned_be32(__u32 val, void *p) +-+{ +-+ __put_unaligned_be32(val, p); +-+} +-+ +-+static inline void put_unaligned_be64(__u64 val, void *p) +-+{ +-+ __put_unaligned_be64(val, p); +-+} +-+ +-+#endif /* _TOOLS_BE_BYTESHIFT_H */ +---- /dev/null +-+++ b/tools/include/tools/le_byteshift.h +-@@ -0,0 +1,70 @@ +-+#ifndef _TOOLS_LE_BYTESHIFT_H +-+#define _TOOLS_LE_BYTESHIFT_H +-+ +-+#include +-+ +-+static inline __u16 __get_unaligned_le16(const __u8 *p) +-+{ +-+ return p[0] | p[1] << 8; +-+} +-+ +-+static inline __u32 __get_unaligned_le32(const __u8 *p) +-+{ +-+ return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; +-+} +-+ +-+static inline __u64 __get_unaligned_le64(const __u8 *p) +-+{ +-+ return (__u64)__get_unaligned_le32(p + 4) << 32 | +-+ __get_unaligned_le32(p); +-+} +-+ +-+static inline void __put_unaligned_le16(__u16 val, __u8 *p) +-+{ +-+ *p++ = val; +-+ *p++ = val >> 8; +-+} +-+ +-+static inline void __put_unaligned_le32(__u32 val, __u8 *p) +-+{ +-+ __put_unaligned_le16(val >> 16, p + 2); +-+ __put_unaligned_le16(val, p); +-+} +-+ +-+static inline void __put_unaligned_le64(__u64 val, __u8 *p) +-+{ +-+ __put_unaligned_le32(val >> 32, p + 4); +-+ __put_unaligned_le32(val, p); +-+} +-+ +-+static inline __u16 get_unaligned_le16(const void *p) +-+{ +-+ return __get_unaligned_le16((const __u8 *)p); +-+} +-+ +-+static inline __u32 get_unaligned_le32(const void *p) +-+{ +-+ return __get_unaligned_le32((const __u8 *)p); +-+} +-+ +-+static inline __u64 get_unaligned_le64(const void *p) +-+{ +-+ return __get_unaligned_le64((const __u8 *)p); +-+} +-+ +-+static inline void put_unaligned_le16(__u16 val, void *p) +-+{ +-+ __put_unaligned_le16(val, p); +-+} +-+ +-+static inline void put_unaligned_le32(__u32 val, void *p) +-+{ +-+ __put_unaligned_le32(val, p); +-+} +-+ +-+static inline void put_unaligned_le64(__u64 val, void *p) +-+{ +-+ __put_unaligned_le64(val, p); +-+} +-+ +-+#endif /* _TOOLS_LE_BYTESHIFT_H */ + +From d797c800c30b6a86f105e511068e545f90b9c825 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 15 Apr 2022 13:37:13 +0200 +Subject: [PATCH] armbian-next: allow `use_clean_environment=yes` for + `chroot_sdcard_apt_get()` and descendants + +- this causes command to be run under `env -i`, for a clean environment +--- + lib/functions/logging/runners.sh | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index e550eba11..d59f6020d 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -16,7 +16,15 @@ function chroot_sdcard_apt_get() { + -o "Acquire::http::Proxy::localhost=\"DIRECT\"" + ) + apt_params+=(-o "Dpkg::Use-Pty=0") # Please be quiet +- chroot_sdcard DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" ++ ++ # Allow for clean-environment apt-get ++ local -a prelude_clean_env=() ++ if [[ "${use_clean_environment:-no}" == "yes" ]]; then ++ display_alert "Running with clean environment" "$*" "debug" ++ prelude_clean_env=("env" "-i") ++ fi ++ ++ chroot_sdcard "${prelude_clean_env[@]}" DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" + } + + # please, please, unify around this function. + +From 0caf73b8ee67c9f34b6e6d1fce8b86ed4021694c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 14 Apr 2022 09:58:15 +0200 +Subject: [PATCH] armbian-next: manual merge (16) of all changes between + revisions be9b5156a4bdcb3850fbe0e7ada0f4421acde174 and + 2a8e1ecac1c4fdbf986034be9d6c05a8f1b6e6fb + +- many `traps` ignored: we don't use them anymore +--- + config/sources/families/include/meson64_common.inc | 4 ++-- + config/sources/families/media.conf | 4 ++-- + config/sources/families/rk322x.conf | 6 ++--- + config/sources/families/rockchip.conf | 10 ++++---- + config/sources/families/sun50iw6.conf | 27 ++++------------------ + config/templates/Dockerfile | 7 +++--- + lib/functions/compilation/patch/kernel-drivers.sh | 2 +- + lib/functions/configuration/main-config.sh | 11 ++++----- + lib/functions/extras/buildpkg.sh | 13 ++++------- + lib/functions/general/downloads.sh | 7 +++--- + lib/functions/image/partitioning.sh | 6 ++--- + lib/functions/rootfs/distro-specific.sh | 22 ++++-------------- + 12 files changed, 39 insertions(+), 80 deletions(-) + +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index e3fc577e9..21c71e5bd 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -35,8 +35,8 @@ case $BRANCH in + ;; + + edge) +- export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. For mainline caching. +- KERNELBRANCH='branch:linux-5.15.y' ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. For mainline caching. ++ KERNELBRANCH='branch:linux-5.17.y' + KERNELPATCHDIR='meson64-edge' + ;; + +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index cf1a5603b..cd23586ce 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -40,8 +40,8 @@ case $BRANCH in + + edge) + #SKIP_BOOTSPLASH="yes" +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.16.y" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.17.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +diff --git a/config/sources/families/rk322x.conf b/config/sources/families/rk322x.conf +index 897a452db..d707d55c8 100644 +--- a/config/sources/families/rk322x.conf ++++ b/config/sources/families/rk322x.conf +@@ -3,7 +3,7 @@ BOOTENV_FILE='rk322x.txt' + OVERLAY_PREFIX='rk322x' + UBOOT_TARGET_MAP="all u-boot.itb;;u-boot-rk322x-with-spl.bin" + BOOTDELAY=0 +-BOOTBRANCH='tag:v2022.01' ++BOOTBRANCH='tag:v2022.04' + ARCH=armhf + SERIALCON=ttyS2 + +@@ -27,8 +27,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.16.y' ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.17.y' + + ;; + +diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf +index 0f123a848..a264c669f 100644 +--- a/config/sources/families/rockchip.conf ++++ b/config/sources/families/rockchip.conf +@@ -6,11 +6,9 @@ OVERLAY_PREFIX='rockchip' + UBOOT_TARGET_MAP=";;$SRC/packages/blobs/rockchip/rk3288_boot.bin u-boot-rockchip-with-spl.bin" + BOOTDELAY=1 + if [[ $BOARD == miqi ]]; then +- BOOTBRANCH='tag:v2017.11' +-elif [[ $BOARD == xt-q8l-v10 ]]; then +- BOOTBRANCH='tag:v2021.01' ++BOOTBRANCH='tag:v2017.11' + else +- BOOTBRANCH='tag:v2022.01' ++BOOTBRANCH='tag:v2022.04' + fi + + SERIALCON=ttyS2 +@@ -35,8 +33,8 @@ case $BRANCH in + + edge) + +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH='branch:linux-5.16.y' ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.17.y' + + ;; + +diff --git a/config/sources/families/sun50iw6.conf b/config/sources/families/sun50iw6.conf +index 3224dadb8..874e12e1f 100644 +--- a/config/sources/families/sun50iw6.conf ++++ b/config/sources/families/sun50iw6.conf +@@ -12,27 +12,20 @@ case $BRANCH in + if [[ ${BOARD} == orangepi3-lts ]]; then + + ASOUND_STATE='asound.state.sun50iw6-current' +- ++ + fi +- ;; ++ ;; + edge) + + if [[ ${BOARD} == orangepi3-lts ]]; then + + ASOUND_STATE='asound.state.sun50iw6-current' +- ++ + fi +- ;; ++ ;; + esac + +-family_tweaks_s() +-{ +- if [[ -f $SDCARD/lib/systemd/system/aw859a-bluetooth.service ]]; then +- +- # install and enable Bluetooth +- chroot $SDCARD /bin/bash -c "apt-get -y -qq install rfkill bluetooth bluez bluez-tools >/dev/null 2>&1" +- chroot $SDCARD /bin/bash -c "systemctl --no-reload enable aw859a-bluetooth.service >/dev/null 2>&1" +- fi ++family_tweaks_s() { + + if [[ $BUILD_DESKTOP == yes && $BOARD == orangepi3-lts ]]; then + +@@ -41,15 +34,5 @@ family_tweaks_s() + echo "load-module module-alsa-sink device=hw:1,0 sink_name=HDMI-Playback sink_properties=\"device.description='HDMI Audio'\"" >> ${SDCARD}/etc/pulse/default.pa + + fi +-} +- +-family_tweaks_bsp() +-{ +- if [[ ${BOARD} == orangepi3-lts ]]; then +- +- cp $SRC/packages/bsp/sunxi/aw859a-bluetooth.service $destination/lib/systemd/system/ +- +- fi + +- install -m 755 $SRC/packages/blobs/bt/hciattach/hciattach_opi_${ARCH} $destination/usr/bin/hciattach_opi + } +diff --git a/config/templates/Dockerfile b/config/templates/Dockerfile +index b9cfa9640..3666170d1 100644 +--- a/config/templates/Dockerfile ++++ b/config/templates/Dockerfile +@@ -1,7 +1,7 @@ + ARG BASE_IMAGE=ubuntu:jammy + FROM $BASE_IMAGE as armbian_builder +-ARG ARM_GCC_COMPILER='g++-11-arm-linux-gnueabihf' +-ENV ARM_GCC_COMPILER $ARM_GCC_COMPILER ++ARG CUSTOM_PACKAGES='g++-11-arm-linux-gnueabihf libssl3' ++ENV CUSTOM_PACKAGES $CUSTOM_PACKAGES + ARG DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get -y dist-upgrade && apt-get -y install \ + joe \ +@@ -23,7 +23,7 @@ RUN sh -c " \ + RUN apt-get update \ + && apt-get -y dist-upgrade \ + && apt-get install -y --no-install-recommends \ +- $ARM_GCC_COMPILER \ ++ $CUSTOM_PACKAGES \ + acl \ + aptly \ + aria2 \ +@@ -73,7 +73,6 @@ RUN apt-get update \ + libpython2.7-dev \ + libpython3-dev \ + libssl-dev \ +- libssl1.1 \ + libusb-1.0-0-dev \ + linux-base \ + libmpc-dev \ +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index f921591a7..25f78b90c 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -31,7 +31,7 @@ function prepare_extra_kernel_drivers() { + # + # Older versions have AUFS support with a patch + +- if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" le 5.17 && [ "$AUFS" == yes ]; then ++ if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" le 5.18 && [ "$AUFS" == yes ]; then + # @TODO: Fasthash for this whole block is only the git hash of revision we'd apply from Mr. Okajima + local aufs_tag # attach to specifics tag or branch + aufs_tag=$(echo "${version}" | cut -f 1-2 -d ".") +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index c1a2b03e6..44a23bb66 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -225,12 +225,6 @@ function do_main_configuration() { + + interactive_desktop_main_configuration + +- # dropbear needs to be configured differently # @TODO: rpardini: yes, and? are you a lost leftover comment from a previous era? +- [[ $CRYPTROOT_ENABLE == yes && $RELEASE == xenial ]] && exit_with_error "Encrypted rootfs is not supported in Xenial" +- [[ $RELEASE == stretch && $CAN_BUILD_STRETCH != yes ]] && exit_with_error "Building Debian Stretch images with selected kernel is not supported" +- [[ $RELEASE == bionic && $CAN_BUILD_STRETCH != yes ]] && exit_with_error "Building Ubuntu Bionic images with selected kernel is not supported" +- [[ $RELEASE == hirsute && $HOSTRELEASE == focal ]] && exit_with_error "Building Ubuntu Hirsute images requires Hirsute build host. Please upgrade your host or select a different target OS" +- + [[ -n $ATFSOURCE && -z $ATF_USE_GCC ]] && exit_with_error "Error in configuration: ATF_USE_GCC is unset" + [[ -z $UBOOT_USE_GCC ]] && exit_with_error "Error in configuration: UBOOT_USE_GCC is unset" + [[ -z $KERNEL_USE_GCC ]] && exit_with_error "Error in configuration: KERNEL_USE_GCC is unset" +@@ -242,7 +236,7 @@ function do_main_configuration() { + [[ -z $ATFPATCHDIR ]] && ATFPATCHDIR="atf-$LINUXFAMILY" + [[ -z $KERNELPATCHDIR ]] && KERNELPATCHDIR="$LINUXFAMILY-$BRANCH" + +- if [[ "$RELEASE" =~ ^(xenial|bionic|focal|hirsute|impish|jammy)$ ]]; then ++ if [[ "$RELEASE" =~ ^(focal|jammy)$ ]]; then + DISTRIBUTION="Ubuntu" + else + DISTRIBUTION="Debian" +@@ -346,6 +340,9 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + done + fi + ++ # Control aria2c's usage of ipv6. ++ [[ -z $DISABLE_IPV6 ]] && DISABLE_IPV6="true" ++ + # For (late) user override. + # Notice: it is too late to define hook functions or add extensions in lib.config, since the extension initialization already ran by now. + # in case the user tries to use them in lib.config, hopefully they'll be detected as "wishful hooking" and the user will be wrn'ed. +diff --git a/lib/functions/extras/buildpkg.sh b/lib/functions/extras/buildpkg.sh +index af92f1b84..09dd5d2e6 100644 +--- a/lib/functions/extras/buildpkg.sh ++++ b/lib/functions/extras/buildpkg.sh +@@ -28,25 +28,19 @@ create_chroot() { + qemu_binary['arm64']='qemu-aarch64-static' + apt_mirror['buster']="$DEBIAN_MIRROR" + apt_mirror['bullseye']="$DEBIAN_MIRROR" +- apt_mirror['bionic']="$UBUNTU_MIRROR" + apt_mirror['focal']="$UBUNTU_MIRROR" +- apt_mirror['hirsute']="$UBUNTU_MIRROR" +- apt_mirror['impish']="$UBUNTU_MIRROR" + apt_mirror['jammy']="$UBUNTU_MIRROR" + components['buster']='main,contrib' + components['bullseye']='main,contrib' + components['sid']='main,contrib' +- components['bionic']='main,universe,multiverse' + components['focal']='main,universe,multiverse' +- components['hirsute']='main,universe,multiverse' +- components['impish']='main,universe,multiverse' + components['jammy']='main,universe,multiverse' + display_alert "Creating build chroot" "$release/$arch" "info" + local includes="ccache,locales,git,ca-certificates,devscripts,libfile-fcntllock-perl,debhelper,rsync,python3,distcc,apt-utils" + + # perhaps a temporally workaround + case $release in +- buster | bullseye | focal | hirsute | sid) ++ bullseye | focal | jammy | sid) + includes=${includes}",perl-openssl-defaults,libnet-ssleay-perl" + ;; + esac +@@ -128,6 +122,7 @@ chroot_prepare_distccd() { + gcc_version['focal']='9.2' + gcc_version['hirsute']='10.2' + gcc_version['sid']='10.2' ++ gcc_version['jammy']='12' + gcc_type['armhf']='arm-linux-gnueabihf-' + gcc_type['arm64']='aarch64-linux-gnu-' + rm -f "${dest}"/cmdlist +@@ -161,8 +156,8 @@ chroot_build_packages() { + target_arch="${ARCH}" + else + # only make packages for recent releases. There are no changes on older +- target_release="bionic buster bullseye focal hirsute jammy sid" +- target_arch="armhf arm64" ++ target_release="bullseye focal jammy sid" ++ target_arch="armhf arm64 amd64" + fi + + for release in $target_release; do +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index 1ff476a74..e3df91fe8 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -28,6 +28,7 @@ function download_and_verify_internal() { + local filename=$2 + local localdir=$SRC/cache/${remotedir//_/} + local dirname=${filename//.tar.xz/} ++ [[ -z $DISABLE_IPV6 ]] && DISABLE_IPV6="true" + + local server=${ARMBIAN_MIRROR} + if [[ $DOWNLOAD_MIRROR == china ]]; then +@@ -73,7 +74,7 @@ function download_and_verify_internal() { + else + # download control file + local torrent=${server}$remotedir/${filename}.torrent +- run_host_command_logged aria2c --download-result=hide --disable-ipv6=true --summary-interval=0 --console-log-level=error --auto-file-renaming=false \ ++ run_host_command_logged aria2c --download-result=hide --disable-ipv6=${DISABLE_IPV6} --summary-interval=0 --console-log-level=error --auto-file-renaming=false \ + --continue=false --allow-overwrite=true --dir="${localdir}" ${server}${remotedir}/${filename}.asc $(webseed "$remotedir/${filename}.asc") -o "${filename}.asc" + [[ $? -ne 0 ]] && display_alert "Failed to download control file" "" "wrn" + fi +@@ -84,7 +85,7 @@ function download_and_verify_internal() { + local ariatorrent="--summary-interval=0 --auto-save-interval=0 --seed-time=0 --bt-stop-timeout=120 --console-log-level=error \ + --allow-overwrite=true --download-result=hide --rpc-save-upload-metadata=false --auto-file-renaming=false \ + --file-allocation=trunc --continue=true ${torrent} \ +- --dht-file-path=${SRC}/cache/.aria2/dht.dat --disable-ipv6=true --stderr --follow-torrent=mem --dir=$localdir" ++ --dht-file-path=${SRC}/cache/.aria2/dht.dat --disable-ipv6=${DISABLE_IPV6} --stderr --follow-torrent=mem --dir=$localdir" + + # exception. It throws error if dht.dat file does not exists. Error suppress needed only at first download. + if [[ -f "${SRC}"/cache/.aria2/dht.dat ]]; then +@@ -103,7 +104,7 @@ function download_and_verify_internal() { + if [[ ! $(timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} 2>&1 > /dev/null) ]]; then + display_alert "downloading from $(echo $server | cut -d'/' -f3 | cut -d':' -f1) using http(s) network" "$filename" + run_host_command_logged aria2c --download-result=hide --rpc-save-upload-metadata=false --console-log-level=error \ +- --dht-file-path="${SRC}"/cache/.aria2/dht.dat --disable-ipv6=true --summary-interval=0 --auto-file-renaming=false --dir="${localdir}" ${server}${remotedir}/${filename} $(webseed "${remotedir}/${filename}") -o "${filename}" ++ --dht-file-path="${SRC}"/cache/.aria2/dht.dat --disable-ipv6=${DISABLE_IPV6} --summary-interval=0 --auto-file-renaming=false --dir="${localdir}" ${server}${remotedir}/${filename} $(webseed "${remotedir}/${filename}") -o "${filename}" + # mark complete + [[ $? -eq 0 ]] && touch "${localdir}/${filename}.complete" && echo "" + +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 05b1492bc..76c26a22c 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -32,10 +32,8 @@ prepare_partitions() { + # add -N number of inodes to keep mount from running out + # create bigger number for desktop builds + if [[ $BUILD_DESKTOP == yes ]]; then local node_number=4096; else local node_number=1024; fi +- if [[ $HOSTRELEASE =~ bionic|buster|bullseye|cosmic|focal|hirsute|impish|jammy|sid ]]; then +- mkopts[ext4]="-q -m 2 -O ^64bit,^metadata_csum -N $((128 * ${node_number}))" +- elif [[ $HOSTRELEASE == xenial ]]; then +- mkopts[ext4]="-q -m 2 -N $((128 * ${node_number}))" ++ if [[ $HOSTRELEASE =~ buster|bullseye|focal|jammy|sid ]]; then ++ mkopts[ext4]="-q -m 2 -O ^64bit,^metadata_csum -N $((128 * node_number))" + fi + mkopts[fat]='-n BOOT' + mkopts[ext2]='-q' +diff --git a/lib/functions/rootfs/distro-specific.sh b/lib/functions/rootfs/distro-specific.sh +index 7c1676f40..3a0b1ec44 100644 +--- a/lib/functions/rootfs/distro-specific.sh ++++ b/lib/functions/rootfs/distro-specific.sh +@@ -2,19 +2,7 @@ install_distribution_specific() { + display_alert "Applying distribution specific tweaks for" "$RELEASE" "info" + + case $RELEASE in +- xenial) +- # remove legal info from Ubuntu +- [[ -f "${SDCARD}"/etc/legal ]] && rm "${SDCARD}"/etc/legal +- +- # ureadahead needs kernel tracing options that AFAIK are present only in mainline. disable +- chroot "${SDCARD}" /bin/bash -c \ +- "systemctl --no-reload mask ondemand.service ureadahead.service >/dev/null 2>&1" +- chroot "${SDCARD}" /bin/bash -c \ +- "systemctl --no-reload mask setserial.service etc-setserial.service >/dev/null 2>&1" +- +- ;; +- +- stretch | buster | sid) ++ buster | sid) + # remove doubled uname from motd + [[ -f "${SDCARD}"/etc/update-motd.d/10-uname ]] && rm "${SDCARD}"/etc/update-motd.d/10-uname + # rc.local is not existing but one might need it +@@ -31,7 +19,7 @@ install_distribution_specific() { + [[ $(grep -L "VERSION=" "${SDCARD}"/etc/os-release) ]] && echo 'VERSION="11 (bullseye)"' >> "${SDCARD}"/etc/os-release + ;; + +- bionic | focal | hirsute | impish | jammy) ++ focal | jammy) + # by using default lz4 initrd compression leads to corruption, go back to proven method + sed -i "s/^COMPRESS=.*/COMPRESS=gzip/" "${SDCARD}"/etc/initramfs-tools/initramfs.conf + +@@ -89,7 +77,7 @@ install_distribution_specific() { + + # create_sources_list + # +-# : buster|bullseye|bionic|focal|hirsute|impish|jammy|sid ++# : bullseye|focal|jammy|sid + # : path to root directory + # + create_sources_list() { +@@ -98,7 +86,7 @@ create_sources_list() { + [[ -z $basedir ]] && exit_with_error "No basedir passed to create_sources_list" + + case $release in +- stretch | buster) ++ buster) + cat <<- EOF > "${basedir}"/etc/apt/sources.list + deb http://${DEBIAN_MIRROR} $release main contrib non-free + #deb-src http://${DEBIAN_MIRROR} $release main contrib non-free +@@ -137,7 +125,7 @@ create_sources_list() { + EOF + ;; + +- xenial | bionic | focal | hirsute | impish | jammy) ++ focal | jammy) + cat <<- EOF > "${basedir}"/etc/apt/sources.list + deb http://${UBUNTU_MIRROR} $release main restricted universe multiverse + #deb-src http://${UBUNTU_MIRROR} $release main restricted universe multiverse + +From 71addbe3ffd4e9e8015125186d11fc53eac1da25 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 7 Apr 2022 15:56:19 +0200 +Subject: [PATCH] armbian-next: fix logging for apt sources/gpg keys + +--- + lib/functions/rootfs/rootfs-desktop.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/rootfs/rootfs-desktop.sh b/lib/functions/rootfs/rootfs-desktop.sh +index f8c4a12a2..208119d4b 100644 +--- a/lib/functions/rootfs/rootfs-desktop.sh ++++ b/lib/functions/rootfs/rootfs-desktop.sh +@@ -38,7 +38,7 @@ add_apt_sources() { + local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" + local apt_source_filename="$(basename ${apt_source_filepath}).list" + +- display_alert "Adding APT Source ${new_apt_source}" ++ display_alert "Adding APT Source" "${new_apt_source}" "info" + + if [[ "${new_apt_source}" == ppa* ]]; then + chroot_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" +@@ -55,7 +55,7 @@ add_apt_sources() { + # installation without software-common-properties, sources.list + key.gpg + echo "${new_apt_source}" > "${SDCARD}/etc/apt/sources.list.d/${apt_source_filename}" + if [[ -f "${apt_source_gpg_filepath}" ]]; then +- display_alert "Adding GPG Key ${apt_source_gpg_filepath}" ++ display_alert "Adding GPG Key" "${apt_source_gpg_filepath}" "info" + # local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" + mkdir -p "${SDCARD}"/usr/share/keyrings/ + cp "${apt_source_gpg_filepath}" "${SDCARD}"/usr/share/keyrings/ + +From 7ca67f8d2669568a654d0fcf11415b24434cfd0b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 7 Apr 2022 13:54:59 +0200 +Subject: [PATCH] armbian-next: don't leak `if_error_xxx` vars across runner + helper invocations; always clean then (even if no error) + +- also: fix wireguard-tools install, had a double parameter there +--- + lib/functions/logging/runners.sh | 11 +++++++++-- + lib/functions/rootfs/distro-agnostic.sh | 2 +- + 2 files changed, 10 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 61a9acc3f..e550eba11 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -158,9 +158,18 @@ function run_host_command_logged_raw() { + elif [[ -f "${CURRENT_LOGFILE}" ]]; then + echo "-->--> command run successfully after $((SECONDS - seconds_start)) seconds" >> "${CURRENT_LOGFILE}" + fi ++ ++ logging_clear_run_command_error_info # clear the error info vars, always, otherwise they'll leak into the next invocation. ++ + return ${exit_code} # exiting with the same error code as the original error + } + ++function logging_clear_run_command_error_info() { ++ # Unset those globals; they're only valid for the first invocation of a runner helper function after they're set. ++ unset if_error_detail_message ++ unset if_error_find_files_sdcard # remember, this is global. ++} ++ + function logging_enrich_run_command_error_info() { + declare -a found_files=() + +@@ -171,7 +180,6 @@ function logging_enrich_run_command_error_info() { + display_alert "Found if_error_find_files_sdcard files" "${sdcard_files[@]}" "debug" + found_files+=("${sdcard_files[@]}") # add to result + done +- unset if_error_find_files_sdcard # remember, this is global. + + display_alert "Error-related files found" "${found_files[*]}" "debug" + for found_file in "${found_files[@]}"; do +@@ -187,7 +195,6 @@ function logging_enrich_run_command_error_info() { + ### if_error_detail_message, array: messages to display if the command failed. + if [[ -n ${if_error_detail_message} ]]; then + display_alert "Error context msg" "${if_error_detail_message}" "err" +- unset if_error_detail_message + fi + } + +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index ed65ec5ac..238bdb9d0 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -392,7 +392,7 @@ function install_distribution_agnostic() { + + # install wireguard tools + if [[ $WIREGUARD == yes ]]; then +- install_deb_chroot "wireguard-tools --no-install-recommends" "remote" ++ install_deb_chroot "wireguard-tools" "remote" + fi + + # freeze armbian packages + +From a057b793478fde9b1e0015d52b711c0442d91789 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 7 Apr 2022 13:53:58 +0200 +Subject: [PATCH] bcm2711: rpi4b: add `pi-bluetooth` which provides working + Bluetooth + +--- + config/sources/families/bcm2711.conf | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 12ba2caae..a6bee376e 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -65,7 +65,7 @@ extension_prepare_config__prepare_rpi_flash_kernel() { + local usable_releases="focal|hirsute|impish|jammy" + + if [[ "$RELEASE" =~ ^(${usable_releases})$ ]]; then +- export FK__EXTRA_PACKAGES="rpi-eeprom linux-firmware linux-firmware-raspi2 libraspberrypi-bin cloud-initramfs-growroot" ++ export FK__EXTRA_PACKAGES="rpi-eeprom linux-firmware linux-firmware-raspi2 pi-bluetooth libraspberrypi-bin cloud-initramfs-growroot" + + if [[ "$RELEASE" =~ ^(hirsute|impish|jammy)$ ]]; then # Add raspi-config for those releases that have it; it might be useful. + export FK__EXTRA_PACKAGES="${FK__EXTRA_PACKAGES} raspi-config" + +From b0d907082d89474a04a790919fad6e27043bc474 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 7 Apr 2022 12:06:26 +0200 +Subject: [PATCH] armbian-next: fixes for (non-)logging when interactively + configuring kernel (`KERNEL_CONFIGURE=yes`) + +--- + lib/functions/compilation/kernel.sh | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 66d512de5..118bdd752 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -60,7 +60,14 @@ function compile_kernel() { + [[ $CREATE_PATCHES == yes ]] && userpatch_create "kernel" # create patch for manual source changes + local version + local toolchain +- LOG_SECTION="kernel_config" do_with_logging do_with_hooks kernel_config ++ ++ # Check if we're gonna do some interactive configuration; if so, don't run kernel_config under logging manager. ++ if [[ $KERNEL_CONFIGURE != yes ]]; then ++ LOG_SECTION="kernel_config" do_with_logging do_with_hooks kernel_config ++ else ++ LOG_SECTION="kernel_config_interactive" do_with_hooks kernel_config ++ fi ++ + LOG_SECTION="kernel_package_source" do_with_logging do_with_hooks kernel_package_source + + # @TODO: might be interesting to package kernel-headers at this stage. +@@ -240,28 +247,30 @@ function kernel_config() { + if [[ $KERNEL_CONFIGURE != yes ]]; then + run_kernel_make olddefconfig # @TODO: what is this? does it fuck up dates? + else +- display_alert "Starting kernel oldconfig+menuconfig" "${LINUXCONFIG}" "debug" ++ display_alert "Starting (interactive) kernel oldconfig" "${LINUXCONFIG}" "debug" + +- run_kernel_make oldconfig ++ run_kernel_make_dialog oldconfig + + # No logging for this. this is UI piece ++ display_alert "Starting (interactive) kernel ${KERNEL_MENUCONFIG:-menuconfig}" "${LINUXCONFIG}" "debug" + run_kernel_make_dialog "${KERNEL_MENUCONFIG:-menuconfig}" + + # Capture new date. Otherwise changes not detected by make. + kernel_config_mtime=$(get_file_modification_time ".config") + + # store kernel config in easily reachable place ++ mkdir -p "${DEST}"/config + display_alert "Exporting new kernel config" "$DEST/config/$LINUXCONFIG.config" "info" +- cp .config "${DEST}/config/${LINUXCONFIG}.config" ++ run_host_command_logged cp -pv .config "${DEST}/config/${LINUXCONFIG}.config" + + # store back into original LINUXCONFIG too, if it came from there, so it's pending commits when done. +- [[ "${COPY_CONFIG_BACK_TO}" != "" ]] && cp -v .config "${COPY_CONFIG_BACK_TO}" ++ [[ "${COPY_CONFIG_BACK_TO}" != "" ]] && run_host_command_logged cp -pv .config "${COPY_CONFIG_BACK_TO}" + + # export defconfig too if requested + if [[ $KERNEL_EXPORT_DEFCONFIG == yes ]]; then + run_kernel_make savedefconfig + +- [[ -f defconfig ]] && cp defconfig "${DEST}/config/${LINUXCONFIG}.defconfig" ++ [[ -f defconfig ]] && run_host_command_logged cp -pv defconfig "${DEST}/config/${LINUXCONFIG}.defconfig" + fi + fi + + +From e10cb5c51bd77b47ee06ac7c9aaaaa4485646f61 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 3 Apr 2022 11:28:18 +0200 +Subject: [PATCH] armbian-next: move `lz4` rootfs caches to `zstd`, + multithreaded + +--- + lib/functions/rootfs/create-cache.sh | 37 +++++++++++++++++++++--------------- + 1 file changed, 22 insertions(+), 15 deletions(-) + +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index e16d8613f..5e57eabc5 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -7,22 +7,25 @@ get_or_create_rootfs_cache_chroot_sdcard() { + fi + + # seek last cache, proceed to previous otherwise build it +- for ((n = 0; n < ${cycles}; n++)); do ++ for ((n = 0; n < cycles; n++)); do + + [[ -z ${FORCED_MONTH_OFFSET} ]] && FORCED_MONTH_OFFSET=${n} +- local packages_hash=$(get_package_list_hash "$(date -d "$D +${FORCED_MONTH_OFFSET} month" +"%Y-%m-module$ROOTFSCACHE_VERSION" | sed 's/^0*//')") ++ local packages_hash ++ packages_hash=$(get_package_list_hash "$(date -d "$D +${FORCED_MONTH_OFFSET} month" +"%Y-%m-module$ROOTFSCACHE_VERSION" | sed 's/^0*//')") ++ + local cache_type="cli" +- [[ ${BUILD_DESKTOP} == yes ]] && local cache_type="xfce-desktop" +- [[ -n ${DESKTOP_ENVIRONMENT} ]] && local cache_type="${DESKTOP_ENVIRONMENT}" +- [[ ${BUILD_MINIMAL} == yes ]] && local cache_type="minimal" +- local cache_name=${RELEASE}-${cache_type}-${ARCH}.$packages_hash.tar.lz4 ++ [[ ${BUILD_DESKTOP} == yes ]] && cache_type="xfce-desktop" ++ [[ -n ${DESKTOP_ENVIRONMENT} ]] && cache_type="${DESKTOP_ENVIRONMENT}" ++ [[ ${BUILD_MINIMAL} == yes ]] && cache_type="minimal" ++ ++ local cache_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash}.tar.zst + local cache_fname=${SRC}/cache/rootfs/${cache_name} +- local display_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash:0:3}...${packages_hash:29}.tar.lz4 ++ local display_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash:0:3}...${packages_hash:29}.tar.zst + + [[ "$ROOT_FS_CREATE_ONLY" == force ]] && break + + if [[ -f ${cache_fname} && -f ${cache_fname}.aria2 ]]; then +- rm ${cache_fname}* ++ rm "${cache_fname}"* + display_alert "Partially downloaded file. Re-start." + download_and_verify "_rootfs" "$cache_name" + fi +@@ -30,10 +33,14 @@ get_or_create_rootfs_cache_chroot_sdcard() { + display_alert "Checking local cache" "$display_name" "info" + + if [[ -f ${cache_fname} && -n "$ROOT_FS_CREATE_ONLY" ]]; then +- touch $cache_fname.current ++ touch "${cache_fname}.current" + display_alert "Checking cache integrity" "$display_name" "info" +- sudo lz4 -tqq ${cache_fname} +- [[ $? -ne 0 ]] && rm $cache_fname && exit_with_error "Cache $cache_fname is corrupted and was deleted. Please restart!" ++ ++ sudo zstd -tqq "${cache_fname}" || { ++ rm -f "${cache_fname}" ++ exit_with_error "Cache ${cache_fname} is corrupted and was deleted. Please restart!" ++ } ++ + # sign if signature is missing + if [[ -n "${GPG_PASS}" && "${SUDO_USER}" && ! -f ${cache_fname}.asc ]]; then + [[ -n ${SUDO_USER} ]] && sudo chown -R ${SUDO_USER}:${SUDO_USER} "${DEST}"/images/ +@@ -67,7 +74,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + + local date_diff=$((($(date +%s) - $(stat -c %Y $cache_fname)) / 86400)) + display_alert "Extracting $display_name" "$date_diff days old" "info" +- pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "extract_rootfs") $display_name" "$cache_fname" | lz4 -dc | tar xp --xattrs -C $SDCARD/ ++ pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "extract_rootfs") $display_name" "$cache_fname" | zstdmt -dc | tar xp --xattrs -C $SDCARD/ + [[ $? -ne 0 ]] && rm $cache_fname && exit_with_error "Cache $cache_fname is corrupted and was deleted. Restart." + rm $SDCARD/etc/resolv.conf + echo "nameserver $NAMESERVER" >> $SDCARD/etc/resolv.conf +@@ -78,7 +85,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + create_new_rootfs_cache + + # needed for backend to keep current only +- touch $cache_fname.current ++ touch "${cache_fname}.current" + + fi + +@@ -91,7 +98,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + exit + fi + +- mount_chroot "$SDCARD" ++ mount_chroot "${SDCARD}" + } + + function create_new_rootfs_cache() { +@@ -248,7 +255,7 @@ function create_new_rootfs_cache() { + umount_chroot "$SDCARD" + + tar cp --xattrs --directory=$SDCARD/ --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \ +- --exclude='./sys/*' --exclude='./home/*' --exclude='./root/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | lz4 -5 -c > "$cache_fname" ++ --exclude='./sys/*' --exclude='./home/*' --exclude='./root/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | zstdmt -5 -c > "${cache_fname}" + + # sign rootfs cache archive that it can be used for web cache once. Internal purposes + if [[ -n "${GPG_PASS}" && "${SUDO_USER}" ]]; then + +From 1b602cf8ebae2179b8590126751ce801c976cdfb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 3 Apr 2022 11:25:50 +0200 +Subject: [PATCH] armbian-next: customize.sh: error handling, do not mount + overlay if it doesn't exist + +--- + lib/functions/rootfs/customize.sh | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/rootfs/customize.sh b/lib/functions/rootfs/customize.sh +index 5405b814f..f517e46cb 100644 +--- a/lib/functions/rootfs/customize.sh ++++ b/lib/functions/rootfs/customize.sh +@@ -12,12 +12,17 @@ customize_image() { + cp "$USERPATCHES_PATH"/customize-image.sh "${SDCARD}"/tmp/customize-image.sh + chmod +x "${SDCARD}"/tmp/customize-image.sh + mkdir -p "${SDCARD}"/tmp/overlay ++ + # util-linux >= 2.27 required +- mount -o bind,ro "$USERPATCHES_PATH"/overlay "${SDCARD}"/tmp/overlay ++ [[ -d "${USERPATCHES_PATH}"/overlay ]] && mount -o bind,ro "${USERPATCHES_PATH}"/overlay "${SDCARD}"/tmp/overlay + display_alert "Calling image customization script" "customize-image.sh" "info" +- chroot "${SDCARD}" /bin/bash -c "/tmp/customize-image.sh $RELEASE $LINUXFAMILY $BOARD $BUILD_DESKTOP $ARCH" ++ ++ set +e # disable error control ++ chroot_sdcard /tmp/customize-image.sh "${RELEASE}" "$LINUXFAMILY" "$BOARD" "$BUILD_DESKTOP" "$ARCH" + CUSTOMIZE_IMAGE_RC=$? +- umount -i "${SDCARD}"/tmp/overlay > /dev/null 2>&1 ++ set -e # back to normal error control ++ ++ mountpoint -q "${SDCARD}"/tmp/overlay && umount "${SDCARD}"/tmp/overlay + mountpoint -q "${SDCARD}"/tmp/overlay || rm -r "${SDCARD}"/tmp/overlay + if [[ $CUSTOMIZE_IMAGE_RC != 0 ]]; then + exit_with_error "customize-image.sh exited with error (rc: $CUSTOMIZE_IMAGE_RC)" + +From 09a55387f126f1907945ee72060cdd42973a8d4b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 2 Apr 2022 21:15:55 +0200 +Subject: [PATCH] armbian-next: extra info for runners; + `if_error_detail_message` and `if_error_find_files_sdcard` globals + +- those are unset after running any command +- if error occur, message and/or found files will be included in log, for clarity +--- + extensions/nvidia.sh | 1 + + lib/functions/compilation/uboot.sh | 4 ++-- + lib/functions/logging/logging.sh | 3 ++- + lib/functions/logging/runners.sh | 38 ++++++++++++++++++++++++++++++++++-- + lib/functions/rootfs/apt.sh | 2 +- + lib/functions/rootfs/create-cache.sh | 6 +++--- + 6 files changed, 45 insertions(+), 9 deletions(-) + +diff --git a/extensions/nvidia.sh b/extensions/nvidia.sh +index e329a7458..57e478c5c 100644 +--- a/extensions/nvidia.sh ++++ b/extensions/nvidia.sh +@@ -9,5 +9,6 @@ function post_install_kernel_debs__build_nvidia_kernel_module() { + # chroot_sdcard_apt_get_install() is in lib/logging/runners.sh which handles "running" of stuff nicely. + # chroot_sdcard_apt_get_install() -> chroot_sdcard_apt_get() -> chroot_sdcard() -> run_host_command_logged_raw() + # it handles bash-specific quoting issues, apt proxies, logging, and errors. ++ declare -agx if_error_find_files_sdcard=("/var/lib/dkms/nvidia/*/build/make.log") + chroot_sdcard_apt_get_install "nvidia-dkms-${NVIDIA_DRIVER_VERSION}" "nvidia-driver-${NVIDIA_DRIVER_VERSION}" nvidia-settings + } +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index f6f8279ea..fd3ae385a 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -36,7 +36,7 @@ function compile_uboot_target() { + fi + + display_alert "${uboot_prefix}Preparing u-boot config" "${version} ${target_make}" "info" +- export MSG_IF_ERROR="${uboot_prefix}Failed to configure u-boot ${version} $BOOTCONFIG ${target_make}" ++ export if_error_detail_message="${uboot_prefix}Failed to configure u-boot ${version} $BOOTCONFIG ${target_make}" + run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ + make "$CTHREADS" "$BOOTCONFIG" "CROSS_COMPILE=\"$CCACHE $UBOOT_COMPILER\"" "KCFLAGS=-fdiagnostics-color=always" + +@@ -71,7 +71,7 @@ function compile_uboot_target() { + [[ -n $UBOOT_TOOLCHAIN2 ]] && cross_compile="ARMBIAN=foe" # empty parameter is not allowed + + display_alert "${uboot_prefix}Compiling u-boot" "${version} ${target_make}" "info" +- export MSG_IF_ERROR="${uboot_prefix}Failed to build u-boot ${version} ${target_make}" ++ export if_error_detail_message="${uboot_prefix}Failed to build u-boot ${version} ${target_make}" + run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" make "$target_make" "$CTHREADS" "${cross_compile}" "KCFLAGS=-fdiagnostics-color=always" + + if [[ $(type -t uboot_custom_postprocess) == function ]]; then +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 8e98b569a..66bcda39e 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -277,7 +277,6 @@ function logging_echo_prefix_for_pv() { + # Cleanup for logging. + function trap_handler_cleanup_logging() { + [[ ! -d "${LOGDIR}" ]] && return 0 +- display_alert "Cleaning up logs from LOGDIR" "${LOGDIR}" "debug" + + # Just delete LOGDIR if in CONFIG_DEFS_ONLY mode. + if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then +@@ -305,6 +304,8 @@ function trap_handler_cleanup_logging() { + done + fi + ++ display_alert "Preparing HTML log from" "${LOGDIR}" "debug" ++ + cat <<- HTML_HEADER > "${target_file}" + + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 1b07dc7a0..61a9acc3f 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -144,17 +144,51 @@ function run_host_command_logged_raw() { + exit_code=$? + set -e + +- if [[ $exit_code != 0 ]]; then ++ if [[ ${exit_code} != 0 ]]; then + if [[ -f "${CURRENT_LOGFILE}" ]]; then + echo "-->--> command failed with error code ${exit_code} after $((SECONDS - seconds_start)) seconds" >> "${CURRENT_LOGFILE}" + fi + # This is very specific; remove CURRENT_LOGFILE's value when calling display_alert here otherwise logged twice. + CURRENT_LOGFILE="" display_alert "cmd exited with code ${exit_code}" "$*" "wrn" + CURRENT_LOGFILE="" display_alert "stacktrace for failed command" "$(show_caller_full)" "wrn" ++ ++ # Obtain extra info about error, eg, log files produced, extra messages set by caller, etc. ++ logging_enrich_run_command_error_info ++ + elif [[ -f "${CURRENT_LOGFILE}" ]]; then + echo "-->--> command run successfully after $((SECONDS - seconds_start)) seconds" >> "${CURRENT_LOGFILE}" + fi +- return $exit_code ++ return ${exit_code} # exiting with the same error code as the original error ++} ++ ++function logging_enrich_run_command_error_info() { ++ declare -a found_files=() ++ ++ for path in "${if_error_find_files_sdcard[@]}"; do ++ declare -a sdcard_files ++ # shellcheck disable=SC2086 # I wanna expand, thank you... ++ mapfile -t sdcard_files < <(find ${SDCARD}/${path} -type f) ++ display_alert "Found if_error_find_files_sdcard files" "${sdcard_files[@]}" "debug" ++ found_files+=("${sdcard_files[@]}") # add to result ++ done ++ unset if_error_find_files_sdcard # remember, this is global. ++ ++ display_alert "Error-related files found" "${found_files[*]}" "debug" ++ for found_file in "${found_files[@]}"; do ++ # Log to asset, so it's available in the HTML log ++ LOG_ASSET="chroot_error_context__$(basename "${found_file}")" do_with_log_asset cat "${found_file}" ++ ++ display_alert "File contents for error context" "${found_file}" "err" ++ # shellcheck disable=SC2002 # cat is not useless, ccze _only_ takes stdin ++ cat "${found_file}" | ccze -A 1>&2 # to stderr ++ # @TODO: 3x repeated ccze invocation, lets refactor it later ++ done ++ ++ ### if_error_detail_message, array: messages to display if the command failed. ++ if [[ -n ${if_error_detail_message} ]]; then ++ display_alert "Error context msg" "${if_error_detail_message}" "err" ++ unset if_error_detail_message ++ fi + } + + # @TODO: logging: used by desktop.sh exclusively. let's unify? +diff --git a/lib/functions/rootfs/apt.sh b/lib/functions/rootfs/apt.sh +index 91f81ad95..e062d5284 100644 +--- a/lib/functions/rootfs/apt.sh ++++ b/lib/functions/rootfs/apt.sh +@@ -29,7 +29,7 @@ install_deb_chroot() { + [[ $BUILD_ALL == yes && ${variant} == remote ]] && chroot_sdcard_apt_get update + + # install in chroot via apt-get, not dpkg, so dependencies are also installed from repo if needed. +- export MSG_IF_ERROR="Installation of $name failed ${BOARD} ${RELEASE} ${BUILD_DESKTOP} ${LINUXFAMILY}" ++ export if_error_detail_message="Installation of $name failed ${BOARD} ${RELEASE} ${BUILD_DESKTOP} ${LINUXFAMILY}" + chroot_sdcard_apt_get --no-install-recommends install "${name}" + + # @TODO: mysterious. store installed/downloaded packages in deb storage. only used for u-boot deb. why? +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index c0fdeebaa..e16d8613f 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -124,7 +124,7 @@ function create_new_rootfs_cache() { + run_host_command_logged cp -pv /usr/share/keyrings/*-archive-keyring.gpg "${SDCARD}/usr/share/keyrings/" + + display_alert "Installing base system" "Stage 2/2" "info" +- export MSG_IF_ERROR="Debootstrap second stage failed ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" ++ export if_error_detail_message="Debootstrap second stage failed ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" + chroot_sdcard LC_ALL=C LANG=C /debootstrap/debootstrap --second-stage + [[ ! -f "${SDCARD}/bin/bash" ]] && exit_with_error "Debootstrap first stage did not produce /bin/bash" + +@@ -179,7 +179,7 @@ function create_new_rootfs_cache() { + + # stage: install additional packages + display_alert "Installing the main packages for" "Armbian" "info" +- export MSG_IF_ERROR="Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" ++ export if_error_detail_message="Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" + # First, try to download-only up to 3 times, to work around network/proxy problems. + do_with_retries 3 chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" + +@@ -199,11 +199,11 @@ function create_new_rootfs_cache() { + fi + + display_alert "Installing the desktop packages for" "Armbian" "info" +- MSG_IF_ERROR="Installation of Armbian desktop packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" + # Retry download-only 3 times first. + do_with_retries 3 chroot_sdcard_apt_get_install_download_only ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP + + # Then do the actual install. ++ export if_error_detail_message="Installation of Armbian desktop packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" + chroot_sdcard_apt_get install ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP + fi + + +From 4cbbde478c436b76c883d4ece3a74fc8d0aeb72d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 2 Apr 2022 16:01:19 +0200 +Subject: [PATCH] armbian-next: manual merge (15) of all changes between + revisions 0f7200c7932bb04a34601a25fe30dca0197fbc8b and + 101eaec90750f23cae3075d6b5329a33b2bf4685 + +--- + config/sources/families/rk35xx.conf | 4 ++-- + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/rootfs/create-cache.sh | 16 +++------------- + lib/functions/rootfs/rootfs-desktop.sh | 8 +++----- + 4 files changed, 9 insertions(+), 21 deletions(-) + +diff --git a/config/sources/families/rk35xx.conf b/config/sources/families/rk35xx.conf +index d0c5a293e..1a05d42d1 100644 +--- a/config/sources/families/rk35xx.conf ++++ b/config/sources/families/rk35xx.conf +@@ -25,8 +25,8 @@ case $BRANCH in + # temporary until kernel 5.16 is well supported for rockchip64 + # it has to be its own family too + edge) +- export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.16.y" ++ export KERNEL_MAJOR_MINOR="5.17" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.17.y" + KERNELPATCHDIR='rk35xx-'$BRANCH + SKIP_BOOTSPLASH="yes" + LINUXFAMILY=rk35xx +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 57561089a..c1a2b03e6 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=16 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=17 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote 2> /dev/null | grep origin)" 2> /dev/null) + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 3dc4feaaf..c0fdeebaa 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -166,6 +166,9 @@ function create_new_rootfs_cache() { + # this should fix resolvconf installation failure in some cases + chroot_sdcard 'echo "resolvconf resolvconf/linkify-resolvconf boolean false" | debconf-set-selections' + ++ # TODO change name of the function from "desktop" and move to appropriate location ++ add_desktop_package_sources ++ + # stage: update packages list + display_alert "Updating package list" "$RELEASE" "info" + do_with_retries 3 chroot_sdcard_apt_get update +@@ -174,12 +177,6 @@ function create_new_rootfs_cache() { + display_alert "Upgrading base packages" "Armbian" "info" + do_with_retries 3 chroot_sdcard_apt_get upgrade + +- # Myy: Dividing the desktop packages installation steps into multiple +- # ones. We first install the "ADDITIONAL_PACKAGES" in order to get +- # access to software-common-properties installation. +- # THEN we add the APT sources and install the Desktop packages. +- # TODO : Find a way to add APT sources WITHOUT software-common-properties +- + # stage: install additional packages + display_alert "Installing the main packages for" "Armbian" "info" + export MSG_IF_ERROR="Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" +@@ -190,13 +187,6 @@ function create_new_rootfs_cache() { + chroot_sdcard_apt_get_install "$PACKAGE_MAIN_LIST" + + if [[ $BUILD_DESKTOP == "yes" ]]; then +- # FIXME Myy : Are we keeping this only for Desktop users, +- # or should we extend this to CLI users too ? +- # There might be some clunky boards that require Debian packages from +- # specific repos... +- display_alert "Adding apt sources for Desktop packages" +- add_desktop_package_sources +- + local apt_desktop_install_flags="" + if [[ ! -z ${DESKTOP_APT_FLAGS_SELECTED+x} ]]; then + for flag in ${DESKTOP_APT_FLAGS_SELECTED}; do +diff --git a/lib/functions/rootfs/rootfs-desktop.sh b/lib/functions/rootfs/rootfs-desktop.sh +index 56b9cfc3d..f8c4a12a2 100644 +--- a/lib/functions/rootfs/rootfs-desktop.sh ++++ b/lib/functions/rootfs/rootfs-desktop.sh +@@ -25,7 +25,7 @@ add_apt_sources() { + get_all_potential_paths "${DESKTOP_ENVIRONMENTS_SEARCH_RELATIVE_DIRS}" "." "sources/apt" + get_all_potential_paths "${DESKTOP_APPGROUPS_SEARCH_RELATIVE_DIRS}" "${DESKTOP_APPGROUPS_SELECTED}" "sources/apt" + +- display_alert "ADDING ADDITIONAL APT SOURCES" ++ display_alert "Adding additional apt sources" "add_apt_sources()" "debug" + + for apt_sources_dirpath in ${potential_paths}; do + if [[ -d "${apt_sources_dirpath}" ]]; then +@@ -41,11 +41,10 @@ add_apt_sources() { + display_alert "Adding APT Source ${new_apt_source}" + + if [[ "${new_apt_source}" == ppa* ]]; then +- ++ chroot_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" + # add list with apt-add + # -y -> Assumes yes to all queries + # -n -> Do not update package cache after adding +- run_on_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" + if [[ -f "${apt_source_gpg_filepath}" ]]; then + display_alert "Adding GPG Key ${apt_source_gpg_filepath}" + cp "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" +@@ -53,7 +52,7 @@ add_apt_sources() { + echo "APT Key returned : $?" + fi + else +- # copy list if its not ppa ++ # installation without software-common-properties, sources.list + key.gpg + echo "${new_apt_source}" > "${SDCARD}/etc/apt/sources.list.d/${apt_source_filename}" + if [[ -f "${apt_source_gpg_filepath}" ]]; then + display_alert "Adding GPG Key ${apt_source_gpg_filepath}" +@@ -72,7 +71,6 @@ add_apt_sources() { + + add_desktop_package_sources() { + add_apt_sources +- chroot_sdcard_apt_get "update" + run_host_command_logged ls -l "${SDCARD}/usr/share/keyrings" + run_host_command_logged ls -l "${SDCARD}/etc/apt/sources.list.d" + run_host_command_logged cat "${SDCARD}/etc/apt/sources.list" + +From 0023bcce6aaed245b27c031156ba650acbafed3b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 1 Apr 2022 12:27:19 +0200 +Subject: [PATCH] armbian-next: better logging for `rsync` calls everywhere + +- make rsync verbose +--- + lib/functions/bsp/bsp-cli.sh | 4 ++-- + lib/functions/compilation/debs.sh | 6 +++--- + lib/functions/compilation/kernel.sh | 2 +- + lib/functions/compilation/uboot.sh | 2 +- + lib/functions/image/rootfs-to-image.sh | 14 ++++---------- + lib/functions/rootfs/apt.sh | 2 +- + 6 files changed, 12 insertions(+), 18 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index 5af25dd82..c52910403 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -252,7 +252,7 @@ create_board_package() { + #EOF + + # copy common files from a premade directory structure +- rsync -a ${SRC}/packages/bsp/common/* ${destination} ++ run_host_command_logged rsync -av ${SRC}/packages/bsp/common/* ${destination} + + # trigger uInitrd creation after installation, to apply + # /etc/initramfs/post-update.d/99-uboot +@@ -308,7 +308,7 @@ create_board_package() { + # create board DEB file + fakeroot_dpkg_deb_build "${destination}" "${destination}.deb" + mkdir -p "${DEB_STORAGE}/" +- rsync --remove-source-files -rq "${destination}.deb" "${DEB_STORAGE}/" 2>&1 ++ run_host_command_logged rsync --remove-source-files -r "${destination}.deb" "${DEB_STORAGE}/" + + display_alert "Done building BSP CLI package" "${destination}" "debug" + } +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index a48bd3058..2af1af793 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -43,7 +43,7 @@ compile_firmware() { + display_alert "Building firmware package" "armbian-firmware${FULL}_${REVISION}_all" "info" + fakeroot_dpkg_deb_build "armbian-firmware${FULL}_${REVISION}_all" + mv "armbian-firmware${FULL}_${REVISION}_all" "armbian-firmware${FULL}" +- rsync -rq "armbian-firmware${FULL}_${REVISION}_all.deb" "${DEB_STORAGE}/" ++ run_host_command_logged rsync -rq "armbian-firmware${FULL}_${REVISION}_all.deb" "${DEB_STORAGE}/" + + } + +@@ -117,7 +117,7 @@ compile_armbian-zsh() { + chmod 755 "${tmp_dir}/${armbian_zsh_dir}"/DEBIAN/postinst + + fakeroot_dpkg_deb_build "${tmp_dir}/${armbian_zsh_dir}" +- rsync --remove-source-files -rq "${tmp_dir}/${armbian_zsh_dir}.deb" "${DEB_STORAGE}/" ++ run_host_command_logged rsync --remove-source-files -r "${tmp_dir}/${armbian_zsh_dir}.deb" "${DEB_STORAGE}/" + + } + +@@ -169,7 +169,7 @@ compile_armbian-config() { + ln -sf /usr/sbin/softy "${tmp_dir}/${armbian_config_dir}"/usr/bin/softy + + fakeroot_dpkg_deb_build "${tmp_dir}/${armbian_config_dir}" +- rsync --remove-source-files -rq "${tmp_dir}/${armbian_config_dir}.deb" "${DEB_STORAGE}/" ++ run_host_command_logged rsync --remove-source-files -r "${tmp_dir}/${armbian_config_dir}.deb" "${DEB_STORAGE}/" + } + + compile_xilinx_bootgen() { +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 249336e00..66d512de5 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -79,7 +79,7 @@ function compile_kernel() { + display_alert "Done with" "kernel compile" "debug" + cd "${kernel_work_dir}/.." || exit + rm -f linux-firmware-image-*.deb # remove firmware image packages here - easier than patching ~40 packaging scripts at once +- rsync --remove-source-files -rq ./*.deb "${DEB_STORAGE}/" || exit_with_error "Failed moving kernel DEBs" ++ run_host_command_logged rsync --remove-source-files -r ./*.deb "${DEB_STORAGE}/" + return 0 + } + +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 05b8ea629..f6f8279ea 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -229,7 +229,7 @@ compile_uboot() { + + [[ ! -f $uboottempdir/${uboot_name}.deb ]] && exit_with_error "Building u-boot package failed" + +- rsync --remove-source-files -rq "$uboottempdir/${uboot_name}.deb" "${DEB_STORAGE}/" 2>&1 ++ run_host_command_logged rsync --remove-source-files -r "$uboottempdir/${uboot_name}.deb" "${DEB_STORAGE}/" + + display_alert "Built u-boot deb OK" "${uboot_name}.deb" "info" + return 0 # success +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 85dc86f9c..a8f0796cc 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -1,9 +1,3 @@ +-############################################################################# +- +-############################################################################# +- +-############################################################################# +- + # create_image + # + # finishes creation of image from cached rootfs +@@ -125,10 +119,10 @@ PRE_UMOUNT_FINAL_IMAGE + It is the last possible chance to modify `$CARD_DEVICE`. + POST_BUILD_IMAGE + +- # move artefacts from temporally directory to its final destination +- [[ -n $compression_type ]] && rm "${DESTIMG}/${version}.img" +- rsync -a --no-owner --no-group --remove-source-files "${DESTIMG}/${version}"* "${FINALDEST}" +- rm -rf --one-file-system "${DESTIMG}" ++ display_alert "Moving artefacts from temporary directory to its final destination" "${version}" "debug" ++ [[ -n $compression_type ]] && run_host_command_logged rm -v "${DESTIMG}/${version}.img" ++ run_host_command_logged rsync -av --no-owner --no-group --remove-source-files "${DESTIMG}/${version}"* "${FINALDEST}" ++ run_host_command_logged rm -rfv --one-file-system "${DESTIMG}" + + # write image to SD card + write_image_to_device "${FINALDEST}/${version}.img" "${CARD_DEVICE}" +diff --git a/lib/functions/rootfs/apt.sh b/lib/functions/rootfs/apt.sh +index 768636fc9..91f81ad95 100644 +--- a/lib/functions/rootfs/apt.sh ++++ b/lib/functions/rootfs/apt.sh +@@ -33,7 +33,7 @@ install_deb_chroot() { + chroot_sdcard_apt_get --no-install-recommends install "${name}" + + # @TODO: mysterious. store installed/downloaded packages in deb storage. only used for u-boot deb. why? +- [[ ${variant} == remote && ${transfer} == yes ]] && rsync -rq "${SDCARD}"/var/cache/apt/archives/*.deb "${DEB_STORAGE}"/ ++ [[ ${variant} == remote && ${transfer} == yes ]] && run_host_command_logged rsync -r "${SDCARD}"/var/cache/apt/archives/*.deb "${DEB_STORAGE}"/ + + # IMPORTANT! Do not use short-circuit above as last statement in a function, since it determines the result of the function. + return 0 + +From 5aa5cad33ed6ea11af0cb371c0f5a1ef3cce0309 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 1 Apr 2022 00:51:22 +0200 +Subject: [PATCH] armbian-next: downloads: skip download if no `ARMBIAN_MIRROR` + nor `DOWNLOAD_MIRROR`; less logs + +--- + lib/functions/general/downloads.sh | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index 6c5171f3c..1ff476a74 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -7,22 +7,18 @@ function webseed() { + # aria2 simply split chunks based on sources count not depending on download speed + # when selecting china mirrors, use only China mirror, others are very slow there + if [[ $DOWNLOAD_MIRROR == china ]]; then +- WEBSEED=( +- https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/ +- ) ++ WEBSEED=(https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/) + elif [[ $DOWNLOAD_MIRROR == bfsu ]]; then +- WEBSEED=( +- https://mirrors.bfsu.edu.cn/armbian-releases/ +- ) ++ WEBSEED=(https://mirrors.bfsu.edu.cn/armbian-releases/) + fi +- for toolchain in ${WEBSEED[@]}; do ++ for toolchain in "${WEBSEED[@]}"; do + text="${text} ${toolchain}${1}" + done + text="${text:1}" + echo "${text}" + } + +-# Non-error handled version @TODO: might be a terrible idea? ++# Terrible idea, this runs download_and_verify_internal() with error handling disabled. + function download_and_verify() { + download_and_verify_internal "${@}" || true + } +@@ -33,26 +29,30 @@ function download_and_verify_internal() { + local localdir=$SRC/cache/${remotedir//_/} + local dirname=${filename//.tar.xz/} + ++ local server=${ARMBIAN_MIRROR} + if [[ $DOWNLOAD_MIRROR == china ]]; then +- local server="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/" ++ server="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/" + elif [[ $DOWNLOAD_MIRROR == bfsu ]]; then +- local server="https://mirrors.bfsu.edu.cn/armbian-releases/" +- else +- local server=${ARMBIAN_MIRROR} ++ server="https://mirrors.bfsu.edu.cn/armbian-releases/" ++ fi ++ ++ if [[ "x${server}x" == "xx" ]]; then ++ display_alert "ARMBIAN_MIRROR is not set, nor valid DOWNLOAD_MIRROR" "not downloading '${filename}'" "debug" ++ return 0 + fi + + if [[ -f ${localdir}/${dirname}/.download-complete ]]; then +- return ++ return 0 + fi + + # switch to china mirror if US timeouts +- run_host_command_logged timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}" ++ timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}" + if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then + display_alert "Timeout from $server" "retrying" "info" + server="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/" + + # switch to another china mirror if tuna timeouts +- run_host_command_logged timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} ++ timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} + if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then + display_alert "Timeout from $server" "retrying" "info" + server="https://mirrors.bfsu.edu.cn/armbian-releases/" + +From fcc2cdc23237549cde54eee47b76776106c29ec0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 31 Mar 2022 20:02:17 +0200 +Subject: [PATCH] armbian-next: update rockchip.conf from master and use + runners + +--- + config/sources/families/rockchip.conf | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf +index 55f56e492..0f123a848 100644 +--- a/config/sources/families/rockchip.conf ++++ b/config/sources/families/rockchip.conf +@@ -10,7 +10,7 @@ if [[ $BOARD == miqi ]]; then + elif [[ $BOARD == xt-q8l-v10 ]]; then + BOOTBRANCH='tag:v2021.01' + else +- BOOTBRANCH='tag:v2018.11' ++ BOOTBRANCH='tag:v2022.01' + fi + + SERIALCON=ttyS2 +@@ -63,16 +63,17 @@ uboot_custom_postprocess() { + cat spl/u-boot-spl-dtb.bin >> u-boot-rockchip-with-spl.bin + dd if=u-boot-dtb.img of=u-boot-rockchip-with-spl.bin seek=$((0x200 - 0x40)) conv=notrunc + else +- tools/mkimage -n rk3288 -T rksd -d spl/u-boot-spl-dtb.bin u-boot-rockchip-with-spl.bin +- cat u-boot-dtb.bin >> u-boot-rockchip-with-spl.bin ++ tools/mkimage -n rk3288 -T rksd -d tpl/u-boot-tpl.bin u-boot-rockchip-with-spl.bin ++ cat spl/u-boot-spl-dtb.bin >> u-boot-rockchip-with-spl.bin ++ dd if=u-boot-dtb.img of=u-boot-rockchip-with-spl.bin seek=$((0x200 - 0x40)) conv=notrunc + fi + + } + + family_tweaks() { + if [[ $BOARD == tinkerboard ]]; then +- chroot $SDCARD /bin/bash -c "apt-get -y -qq install rfkill bluetooth bluez bluez-tools" 2>&1 +- chroot $SDCARD /bin/bash -c "systemctl --no-reload enable tinker-bluetooth.service" 2>&1 ++ chroot_sdcard_apt_get_install rfkill bluetooth bluez bluez-tools ++ [[ $BRANCH == legacy ]] && chroot_sdcard systemctl --no-reload enable tinker-bluetooth.service + if [[ -f "$SDCARD/etc/pulse/default.pa" ]]; then + sed -i -e "/#load-module module-alsa-sink/r $SRC/packages/bsp/rockchip/pulseaudio.txt" "$SDCARD/etc/pulse/default.pa" 2>&1 + else +@@ -99,10 +100,12 @@ family_tweaks_bsp() { + cp $SRC/packages/bsp/rockchip/70-gpio.rules $destination/etc/udev/rules.d + cp $SRC/packages/bsp/rockchip/71-i2c.rules $destination/etc/udev/rules.d + +- # Bluetooth +- install -m 755 $SRC/packages/bsp/rockchip/rtk_hciattach $destination/usr/bin +- install -m 755 $SRC/packages/bsp/rockchip/start_bt.sh $destination/usr/local/bin +- cp $SRC/packages/bsp/rockchip/tinker-bluetooth.service $destination/lib/systemd/system/ ++ # Tinkerboard Bluetooth (only legacy kernel, mainline uses serdev) ++ if [[ $BRANCH == legacy ]]; then ++ install -m 755 $SRC/packages/bsp/rockchip/rtk_hciattach $destination/usr/bin ++ install -m 755 $SRC/packages/bsp/rockchip/start_bt.sh $destination/usr/local/bin ++ cp $SRC/packages/bsp/rockchip/tinker-bluetooth.service $destination/lib/systemd/system/ ++ fi + + # Sound + cp $SRC/packages/bsp/rockchip/asound.conf $destination/etc/ + +From 0b7e6c6bb6a744d6b95038e9ab3b1ab7b1aa7027 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 31 Mar 2022 19:33:39 +0200 +Subject: [PATCH] armbian-next: update mvebu64.conf from master and use + functions + +--- + config/sources/families/mvebu64.conf | 57 +++++++++++++++++++++++++----------- + 1 file changed, 40 insertions(+), 17 deletions(-) + +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index 27c4e318a..bc79e1ec6 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -2,22 +2,27 @@ enable_extension "marvell-tools" + ARCH=arm64 + BOOTBRANCH='branch:v2022.01' + BOOTENV_FILE='mvebu64.txt' +-ATFSOURCE='https://github.com/MarvellEmbeddedProcessors/atf-marvell' ++ATFSOURCE='https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git' + ATFDIR='arm-trusted-firmware-espressobin' +-ATFBRANCH='branch:atf-v1.5-armada-18.12' ++ATFBRANCH='branch:master' + ATF_USE_GCC='> 7.2' +-ATF_COMPILER='aarch64-linux-gnu-' ++ ++if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]]; then ++ ATF_COMPILER='aarch64-linux-gnu-' ++else ++ ATF_COMPILER='aarch64-none-linux-gnu-' ++fi + + if [[ $BOARD = macchiatobin-doubleshot ]]; then + export SCP_BL2=$SRC/cache/sources/marvell-binaries/mrvl_scp_bl2.img + +- ATF_TARGET_MAP="DEBUG=1 USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr SECURE=0 PLAT=a80x0_mcbin;;build/a80x0_mcbin/debug/bl31.bin" ++ ATF_TARGET_MAP="USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr SECURE=0 PLAT=a80x0_mcbin;;build/a80x0_mcbin/release/bl31.bin" + UBOOT_TARGET_MAP="DEVICE_TREE=armada-8040-mcbin ;;flash-image.bin" + + BOOTSCRIPT="boot-macchiatobin-doubleshot.cmd:boot.cmd" + SERIALCON='ttyS0' + else +- ATF_TARGET_MAP="DEBUG=1 USE_COHERENT_MEM=0 LOG_LEVEL=20 SECURE=0 CLOCKSPRESET=CPU_800_DDR_800 DDR_TOPOLOGY=2 BOOTDEV=SPINOR PARTNUM=0 PLAT=a3700;;build/a3700/debug/bl31.bin" ++ ATF_TARGET_MAP="USE_COHERENT_MEM=0 LOG_LEVEL=20 SECURE=0 CLOCKSPRESET=CPU_800_DDR_800 DDR_TOPOLOGY=2 BOOTDEV=SPINOR PARTNUM=0 PLAT=a3700;;build/a3700/release/bl31.bin" + UBOOT_TARGET_MAP="DEVICE_TREE=armada-3720-espressobin ;;flash-image-*.bin" + + BOOTSCRIPT="boot-espressobin.cmd:boot.cmd" +@@ -65,7 +70,7 @@ write_uboot_platform() { + } + + family_tweaks() { +- chroot $SDCARD /bin/bash -c "apt-get -y -qq remove --auto-remove linux-sound-base alsa-base alsa-utils bluez>/dev/null 2>&1" ++ chroot_sdcard_apt_get remove --auto-remove linux-sound-base alsa-base alsa-utils bluez + [[ -f $SDCARD/etc/netplan/armbian-default.yaml ]] && sed -i "s/^ renderer.*/ renderer: networkd/" $SDCARD/etc/netplan/armbian-default.yaml + cp $SRC/packages/bsp/mvebu64/10* $SDCARD/etc/systemd/network/ + echo "#Marvell Espressobin Console" >> $SDCARD/etc/securetty +@@ -76,11 +81,13 @@ atf_custom_postprocess() { + # prepare compilers for postprocess + ubootdir="$SRC/cache/sources/$BOOTDIR/${BOOTBRANCH##*:}" + export ATF1=$toolchain/$ATF_COMPILER +- export ATF2=$(find_toolchain "arm-linux-gnueabi-" "> 7.0")/arm-linux-gnueabi- ++ if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]]; then ++ export TOOLCHAIN_NAME="arm-linux-gnueabi-" ++ else ++ export TOOLCHAIN_NAME="arm-none-eabi-" ++ fi ++ export ATF2=$(find_toolchain "$TOOLCHAIN_NAME" "> 10.0")/$TOOLCHAIN_NAME + export BL33=$ubootdir"/u-boot.bin" +- # copy extra DDR topology +- sed -i "s@^CUST | \[0-6\])@CUST | [0-7])@" $SRC/cache/sources/marvell-tools/script/buildtim.sh || true +- cp $SRC/packages/blobs/espressobin/DDR* $SRC/cache/sources/marvell-tools/tim/ddr/ + } + + uboot_custom_postprocess() { +@@ -88,18 +95,23 @@ uboot_custom_postprocess() { + rm $ubootdir/flash-image* + local atfdir="$SRC/cache/sources/$ATFDIR/${ATFBRANCH##*:}" + local ubootdir="$SRC/cache/sources/$BOOTDIR/${BOOTBRANCH##*:}" ++ local moxbootdir="$SRC/cache/sources/mox-boot" + cd $atfdir + + if [[ $BOARD = macchiatobin-doubleshot ]]; then +- make distclean >> $DEST/debug/compilation.log 2>&1 ++ run_host_command_logged make distclean + + FILENAME="flash-image.bin" + display_alert "Building $FILENAME" "" "info" + # http://wiki.macchiatobin.net/tiki-index.php?page=Build+from+source+-+Bootloader#Building_ATF +- make distclean >> $DEST/debug/compilation.log 2>&1 +- make USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr PLAT=a80x0_mcbin CROSS_COMPILE=$ATF1 BL33=$BL33 all fip $CTHREADS >> $DEST/debug/compilation.log 2>&1 +- cp build/a80x0_mcbin/release/flash-image.bin $ubootdir/$FILENAME ++ run_host_command_logged make distclean ++ run_host_command_logged make USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr PLAT=a80x0_mcbin CROSS_COMPILE=$ATF1 BL33=$BL33 all fip $CTHREADS ++ run_host_command_logged cp -pv build/a80x0_mcbin/release/flash-image.bin $ubootdir/$FILENAME + else ++ cd $moxbootdir ++ run_host_command_logged make CROSS_CM3=$ATF2 wtmi_app.bin ++ cd $atfdir ++ + clocks=(600_600 800_800 1000_800 1200_750) + topology=(512m_1cs_0 512m_2cs_0 1g_2cs_2 1g_1cs_4 2g_2cs_7 1g_1cs_5 2g_2cs_6) + for i in "${clocks[@]}"; do +@@ -109,9 +121,20 @@ uboot_custom_postprocess() { + DDR_TOPOLOGY="${j##*_}" + CLOCKSPRESET="CPU_${i%_*}_DDR_${i##*_}" + display_alert "Building $FILENAME" "" "info" +- make distclean >> $DEST/debug/compilation.log 2>&1 +- make MV_DDR_PATH=$SRC/cache/sources/marvell-ddr CROSS_COMPILE=$ATF1 DEBUG=1 USE_COHERENT_MEM=0 LOG_LEVEL=20 SECURE=0 CLOCKSPRESET=$CLOCKSPRESET DDR_TOPOLOGY=$DDR_TOPOLOGY BOOTDEV=SPINOR PARTNUM=0 PLAT=a3700 all fip BL33=$BL33 WTP=$SRC/cache/sources/marvell-tools $CTHREADS CROSS_CM3=$ATF2 >> $DEST/debug/compilation.log 2>&1 +- cp build/a3700/debug/flash-image.bin $ubootdir/$FILENAME ++ run_host_command_logged make distclean ++ run_host_command_logged make CROSS_COMPILE=$ATF1 \ ++ CROSS_CM3=$ATF2 \ ++ USE_COHERENT_MEM=0 \ ++ PLAT=a3700 \ ++ CLOCKSPRESET=$CLOCKSPRESET DDR_TOPOLOGY=$DDR_TOPOLOGY \ ++ MV_DDR_PATH=$SRC/cache/sources/marvell-ddr \ ++ WTP=$SRC/cache/sources/marvell-tools \ ++ CRYPTOPP_PATH=$SRC/cache/sources/cryptopp \ ++ BL33=$BL33 \ ++ WTMI_IMG=$moxbootdir/wtmi_app.bin \ ++ BOOTDEV=SPINOR PARTNUM=0 \ ++ LOG_LEVEL=20 all fip mrvl_flash $CTHREADS ++ run_host_command_logged cp -pv build/a3700/release/flash-image.bin $ubootdir/$FILENAME + done + done + fi + +From b1ded35c1baa90f16652299b433410fef216f8f7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 31 Mar 2022 19:23:33 +0200 +Subject: [PATCH] armbian-next: git: fix `fetch_from_repo` with actual + submodules usage + +--- + lib/functions/general/git.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 3af8a6b3e..baf7f54d2 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -195,7 +195,7 @@ fetch_from_repo() { + cd "${git_work_dir}" || exit + local surl sref + surl=$(git config -f .gitmodules --get "submodule.$i.url") +- sref=$(git config -f .gitmodules --get "submodule.$i.branch") ++ sref=$(git config -f .gitmodules --get "submodule.$i.branch" || true) + if [[ -n $sref ]]; then + sref="branch:$sref" + else + +From 8996fb16048de112e985c9f2a4d5f896623b1cd0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 31 Mar 2022 16:25:50 +0200 +Subject: [PATCH] armbian-next: `armbian-next`ify the `nvidia` extension after + rebase from master + +- driver version is configurable via `NVIDIA_DRIVER_VERSION` +- use runner function to log/error-handle/use apt cache/etc +--- + extensions/nvidia.sh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/extensions/nvidia.sh b/extensions/nvidia.sh +index 2e3c55487..e329a7458 100644 +--- a/extensions/nvidia.sh ++++ b/extensions/nvidia.sh +@@ -1,13 +1,13 @@ +-function pre_install_kernel_debs__build_nvidia_kernel_module() { +- ++function extension_prepare_config__build_nvidia_kernel_module() { + export INSTALL_HEADERS="yes" +- ++ declare -g NVIDIA_DRIVER_VERSION="${NVIDIA_DRIVER_VERSION:-"510"}" ++ display_alert "Forcing INSTALL_HEADERS=yes; using nVidia driver version ${NVIDIA_DRIVER_VERSION}" "${EXTENSION}" "debug" + } + + function post_install_kernel_debs__build_nvidia_kernel_module() { +- +- display_alert "Build kernel module" "${EXTENSION}" "info" +- chroot "${SDCARD}" /bin/bash -c "apt -y -qq install nvidia-dkms-510 nvidia-driver-510 nvidia-settings nvidia-common" >>"$DEST"/"${LOG_SUBPATH}"/install.log 2>&1 || { +- exit_with_error "${install_grub_cmdline} failed!" +- } ++ display_alert "Install nVidia packages, build kernel module in chroot" "${EXTENSION}" "info" ++ # chroot_sdcard_apt_get_install() is in lib/logging/runners.sh which handles "running" of stuff nicely. ++ # chroot_sdcard_apt_get_install() -> chroot_sdcard_apt_get() -> chroot_sdcard() -> run_host_command_logged_raw() ++ # it handles bash-specific quoting issues, apt proxies, logging, and errors. ++ chroot_sdcard_apt_get_install "nvidia-dkms-${NVIDIA_DRIVER_VERSION}" "nvidia-driver-${NVIDIA_DRIVER_VERSION}" nvidia-settings + } + +From d72e4b69754671ba464882cbca6b68c67e2c7c9a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 10 Mar 2022 00:00:39 +0100 +Subject: [PATCH] rpi4b: there's no legacy branch anymore, remove it from + KERNEL_TARGET + +--- + config/boards/rpi4b.wip | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/config/boards/rpi4b.wip b/config/boards/rpi4b.wip +index 3c1926821..7d184e007 100644 +--- a/config/boards/rpi4b.wip ++++ b/config/boards/rpi4b.wip +@@ -1,7 +1,7 @@ + # Broadcom BCM2711 quad core 1-8Gb RAM SoC USB3 GBE USB-C WiFi/BT + export BOARD_NAME="Raspberry Pi 4" + export BOARDFAMILY="bcm2711" +-export KERNEL_TARGET="legacy,current,edge" ++export KERNEL_TARGET="current,edge" + export FK__MACHINE_MODEL="Raspberry Pi 4 Model B" # flash kernel (FK) configuration + export ASOUND_STATE="asound.state.rpi" + + +From 1dbe3c33255a6947743bed2c3dd0ba067035208f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 9 Mar 2022 13:19:20 +0100 +Subject: [PATCH] armbian-next: `download_and_verify` non-error handled; + logging is messy [WiP] [HACK] + +--- + lib/functions/general/downloads.sh | 25 +++++++++++-------------- + 1 file changed, 11 insertions(+), 14 deletions(-) + +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index b51f0d9c4..6c5171f3c 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -22,7 +22,12 @@ function webseed() { + echo "${text}" + } + +-download_and_verify() { ++# Non-error handled version @TODO: might be a terrible idea? ++function download_and_verify() { ++ download_and_verify_internal "${@}" || true ++} ++ ++function download_and_verify_internal() { + local remotedir=$1 + local filename=$2 + local localdir=$SRC/cache/${remotedir//_/} +@@ -40,25 +45,20 @@ download_and_verify() { + return + fi + +- # allow errors here, too hackish to actually handle them +- set +e +- + # switch to china mirror if US timeouts +- timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}" 2>&1 > /dev/null || true ++ run_host_command_logged timeout 10 curl --head --fail --silent "${server}${remotedir}/${filename}" + if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then + display_alert "Timeout from $server" "retrying" "info" + server="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/" + + # switch to another china mirror if tuna timeouts +- timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} 2>&1 > /dev/null ++ run_host_command_logged timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} + if [[ $? -ne 7 && $? -ne 22 && $? -ne 0 ]]; then + display_alert "Timeout from $server" "retrying" "info" + server="https://mirrors.bfsu.edu.cn/armbian-releases/" + fi + fi + +- set -e # Back to normal +- + # check if file exists on remote server before running aria2 downloader + [[ ! $(timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename}) ]] && return + +@@ -73,7 +73,7 @@ download_and_verify() { + else + # download control file + local torrent=${server}$remotedir/${filename}.torrent +- aria2c --download-result=hide --disable-ipv6=true --summary-interval=0 --console-log-level=error --auto-file-renaming=false \ ++ run_host_command_logged aria2c --download-result=hide --disable-ipv6=true --summary-interval=0 --console-log-level=error --auto-file-renaming=false \ + --continue=false --allow-overwrite=true --dir="${localdir}" ${server}${remotedir}/${filename}.asc $(webseed "$remotedir/${filename}.asc") -o "${filename}.asc" + [[ $? -ne 0 ]] && display_alert "Failed to download control file" "" "wrn" + fi +@@ -102,7 +102,7 @@ download_and_verify() { + if [[ ! -f "${localdir}/${filename}.complete" ]]; then + if [[ ! $(timeout 10 curl --head --fail --silent ${server}${remotedir}/${filename} 2>&1 > /dev/null) ]]; then + display_alert "downloading from $(echo $server | cut -d'/' -f3 | cut -d':' -f1) using http(s) network" "$filename" +- aria2c --download-result=hide --rpc-save-upload-metadata=false --console-log-level=error \ ++ run_host_command_logged aria2c --download-result=hide --rpc-save-upload-metadata=false --console-log-level=error \ + --dht-file-path="${SRC}"/cache/.aria2/dht.dat --disable-ipv6=true --summary-interval=0 --auto-file-renaming=false --dir="${localdir}" ${server}${remotedir}/${filename} $(webseed "${remotedir}/${filename}") -o "${filename}" + # mark complete + [[ $? -eq 0 ]] && touch "${localdir}/${filename}.complete" && echo "" +@@ -141,10 +141,8 @@ download_and_verify() { + --recv-keys 9F0E78D5) + fi + +- gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --verify \ +- --trust-model always -q "${localdir}/${filename}.asc" ++ gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --verify --trust-model always -q "${localdir}/${filename}.asc" + [[ ${PIPESTATUS[0]} -eq 0 ]] && verified=true && display_alert "Verified" "PGP" "info" +- + else + md5sum -c --status "${localdir}/${filename}.asc" && verified=true && display_alert "Verified" "MD5" "info" + fi +@@ -160,6 +158,5 @@ download_and_verify() { + else + exit_with_error "verification failed" + fi +- + fi + } + +From 30ee27b4fd6d9b578ad19ca9b0b484809242d77f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Mar 2022 17:21:03 +0100 +Subject: [PATCH] armbian-next: logging: let ANSI colors pass to logfile; + CALLER_PID instead of BASHPID in subshell + +--- + lib/functions/logging/logging.sh | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index cac13b902..8e98b569a 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -209,8 +209,13 @@ function display_alert() { + + # Now, log to file. This will be colorized later by ccze and such, so remove any colors it might already have. + # See also the stuff done in runners.sh for logging exact command lines and runtimes. ++ # the "echo" runs in a subshell due to the "sed" pipe (! important !), so we store BASHPID (current subshell) outside the scope ++ # BASHPID is the current subshell; $$ is parent's?; $_ is the current bashopts ++ local CALLER_PID="${BASHPID}" + if [[ -f "${CURRENT_LOGFILE}" ]]; then +- echo -e "--> [${level_indicator} ] $(printf "%4s" "${SECONDS}"): $$ - ${BASHPID}: $-: ${level}: ${1} [ ${2} ]" | sed 's/\x1b\[[0-9;]*m//g' >> "${CURRENT_LOGFILE}" ++ # ANSI-less version ++ #echo -e "--> ${level_indicator} $(printf "%4s" "${SECONDS}"): $$ - ${CALLER_PID} - ${BASHPID}: $-: ${level}: ${1} [ ${2} ]" >> "${CURRENT_LOGFILE}" # | sed 's/\x1b\[[0-9;]*m//g' ++ echo -e "--> ${level_indicator} $(printf "%4s" "${SECONDS}"): $$ - ${CALLER_PID} - ${BASHPID}: $-: ${level}: ${1} [ ${2} ]" >> "${CURRENT_LOGFILE}" # | sed 's/\x1b\[[0-9;]*m//g' + fi + + if [[ ${skip_screen} -eq 1 ]]; then +@@ -224,7 +229,7 @@ function display_alert() { + + local pids_info="" + if [[ "${SHOW_PIDS}" == "yes" ]]; then +- pids_info="${tool_color}(${normal_color}$$ - ${BASHPID}${tool_color})" # BASHPID is the current subshell; $$ is parent's? ++ pids_info="${tool_color}(${normal_color}$$ - ${CALLER_PID}${tool_color})" # BASHPID is the current subshell (should be equal to CALLER_PID here); $$ is parent's? + fi + + local bashopts_info="" + +From a63ba98aefbb6ba7998ad8abedc5d239e1520191 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Mar 2022 17:20:17 +0100 +Subject: [PATCH] armbian-next: enable HTTPS CONNECT in Armbian-managed + apt-cacher-ng configuration + +- PPAs require it +--- + lib/functions/host/apt-cacher-ng.sh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/host/apt-cacher-ng.sh b/lib/functions/host/apt-cacher-ng.sh +index a917f6cb1..4801784c7 100644 +--- a/lib/functions/host/apt-cacher-ng.sh ++++ b/lib/functions/host/apt-cacher-ng.sh +@@ -35,8 +35,9 @@ function acng_configure_and_restart_acng() { + RedirMax: 15 + ReuseConnections: 1 + +- # Allow HTTPS CONNECT, although this is not ideal, since packages are not actually cached then. Disabled for now. +- # PassThroughPattern: .* ++ # Allow HTTPS CONNECT, although this is not ideal, since packages are not actually cached. ++ # Enabled, since PPA's require this. ++ PassThroughPattern: .* + ACNG_CONFIG + + # Ensure correct permissions on the directories + +From d3641a69a60266f3d7a75109fa6e396b20d85700 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 31 Mar 2022 13:41:53 +0200 +Subject: [PATCH] armbian-next: don't loop forever if we can't obtain + ARMBIAN_MIRROR from redirector + +- also, don't even try to do it if `SKIP_ARMBIAN_REPO=yes` +--- + lib/functions/configuration/main-config.sh | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index ba4fe5452..57561089a 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -328,10 +328,21 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + fi + + # don't use mirrors that throws garbage on 404 +- if [[ -z ${ARMBIAN_MIRROR} ]]; then ++ if [[ -z ${ARMBIAN_MIRROR} && "${SKIP_ARMBIAN_REPO}" != "yes" ]]; then ++ declare -i armbian_mirror_tries=1 + while true; do ++ display_alert "Obtaining Armbian mirror" "via https://redirect.armbian.com" "debug" + ARMBIAN_MIRROR=$(wget -SO- -T 1 -t 1 https://redirect.armbian.com 2>&1 | egrep -i "Location" | awk '{print $2}' | head -1) +- [[ ${ARMBIAN_MIRROR} != *armbian.hosthatch* ]] && break ++ if [[ ${ARMBIAN_MIRROR} != *armbian.hosthatch* ]]; then # @TODO: hosthatch is not good enough. Why? ++ display_alert "Obtained Armbian mirror OK" "${ARMBIAN_MIRROR}" "debug" ++ break ++ else ++ display_alert "Obtained Armbian mirror is invalid, retrying..." "${ARMBIAN_MIRROR}" "debug" ++ fi ++ armbian_mirror_tries=$((armbian_mirror_tries + 1)) ++ if [[ $armbian_mirror_tries -ge 5 ]]; then ++ exit_with_error "Unable to obtain ARMBIAN_MIRROR after ${armbian_mirror_tries} tries. Please set ARMBIAN_MIRROR to a valid mirror manually, or avoid the automatic mirror selection by setting SKIP_ARMBIAN_REPO=yes" ++ fi + done + fi + + +From 617e2ef1d6ff85e0bc6d5c24bc391a21e125f2aa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 31 Mar 2022 12:25:09 +0200 +Subject: [PATCH] armbian-next: manual merge (14) of all changes between + revisions 13469fd8a9eda4a53f87b7dfee0f431dbab8db54 and + 09e416e31cc01ece4533a65f02a470a4c21b90ea + +- also editorconfig and compile.sh (root) changes +--- + .editorconfig | 6 +++ + .../browsers/armbian/create_desktop_package.sh | 2 +- + .../mate/armbian/create_desktop_package.sh | 46 +++++++++---------- + .../browsers/armbian/create_desktop_package.sh | 2 +- + .../cinnamon/armbian/create_desktop_package.sh | 2 +- + .../lxde/armbian/create_desktop_package.sh | 46 +++++++++---------- + .../mate/armbian/create_desktop_package.sh | 46 +++++++++---------- + .../browsers/armbian/create_desktop_package.sh | 2 +- + .../budgie/armbian/create_desktop_package.sh | 2 +- + .../cinnamon/armbian/create_desktop_package.sh | 2 +- + .../deepin/armbian/create_desktop_package.sh | 2 +- + .../armbian/create_desktop_package.sh | 2 +- + .../gnome/armbian/create_desktop_package.sh | 2 +- + .../mate/armbian/create_desktop_package.sh | 2 +- + .../xfce/debian/armbian-bsp-desktop/prepare.sh | 1 - + .../browsers/armbian/create_desktop_package.sh | 2 +- + .../lxde/armbian/create_desktop_package.sh | 46 +++++++++---------- + .../mate/armbian/create_desktop_package.sh | 46 +++++++++---------- + .../xfce/armbian/create_desktop_package.sh | 2 +- + .../sources/families/include/rockchip64_common.inc | 4 +- + config/templates/Dockerfile | 10 +++-- + lib/functions/cli/utils-cli.sh | 6 ++- + lib/functions/compilation/patch/kernel-drivers.sh | 12 ++--- + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/host/prepare-host.sh | 2 +- + lib/functions/rootfs/distro-specific.sh | 32 ++++++++----- + lib/functions/rootfs/rootfs-desktop.sh | 52 +++++++++++++--------- + 27 files changed, 203 insertions(+), 178 deletions(-) + +diff --git a/.editorconfig b/.editorconfig +index f00e1c57a..fe455e4e2 100644 +--- a/.editorconfig ++++ b/.editorconfig +@@ -16,6 +16,12 @@ indent_style = space + indent_size = 4 + insert_final_newline = false + ++[*.json] ++indent_style = space ++indent_size = 4 ++trim_trailing_whitespace = true ++insert_final_newline = true ++ + # Custom Armbian formatting for bash sources and configuration + [*.{sh,inc,conf,eos,wip,tvb,csc}] + indent_style = tab +diff --git a/config/desktop/bullseye/appgroups/browsers/armbian/create_desktop_package.sh b/config/desktop/bullseye/appgroups/browsers/armbian/create_desktop_package.sh +index f3670e815..a1bc70a52 100644 +--- a/config/desktop/bullseye/appgroups/browsers/armbian/create_desktop_package.sh ++++ b/config/desktop/bullseye/appgroups/browsers/armbian/create_desktop_package.sh +@@ -1,4 +1,4 @@ + # install optimized browser configurations + cp "${SRC}"/packages/blobs/desktop/chromium.conf "${destination}"/etc/armbian +-cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian ++cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian + cp -R "${SRC}"/packages/blobs/desktop/chromium "${destination}"/etc/armbian +diff --git a/config/desktop/bullseye/environments/mate/armbian/create_desktop_package.sh b/config/desktop/bullseye/environments/mate/armbian/create_desktop_package.sh +index 6206b92e0..25186ea4e 100644 +--- a/config/desktop/bullseye/environments/mate/armbian/create_desktop_package.sh ++++ b/config/desktop/bullseye/environments/mate/armbian/create_desktop_package.sh +@@ -14,30 +14,30 @@ mkdir -p "${destination}"/usr/share/backgrounds/armbian/ + cp "${SRC}"/packages/blobs/desktop/wallpapers/armbian*.jpg "${destination}"/usr/share/backgrounds/armbian/ + + mkdir -p "${destination}"/usr/share/mate-background-properties +-cat <<- EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml +- +- +- +- +- Armbian light +- /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- +- Armbian dark +- /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- ++cat <<-EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml ++ ++ ++ ++ ++ Armbian light ++ /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ ++ Armbian dark ++ /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ + EOF + + mkdir -p "${destination}"/usr/share/glib-2.0/schemas +-cat <<- EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override +- [org.gnome.desktop.background] +- picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' +- show-desktop-icons=true ++cat <<-EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override ++[org.gnome.desktop.background] ++picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' ++show-desktop-icons=true + EOF +diff --git a/config/desktop/buster/appgroups/browsers/armbian/create_desktop_package.sh b/config/desktop/buster/appgroups/browsers/armbian/create_desktop_package.sh +index f3670e815..a1bc70a52 100644 +--- a/config/desktop/buster/appgroups/browsers/armbian/create_desktop_package.sh ++++ b/config/desktop/buster/appgroups/browsers/armbian/create_desktop_package.sh +@@ -1,4 +1,4 @@ + # install optimized browser configurations + cp "${SRC}"/packages/blobs/desktop/chromium.conf "${destination}"/etc/armbian +-cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian ++cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian + cp -R "${SRC}"/packages/blobs/desktop/chromium "${destination}"/etc/armbian +diff --git a/config/desktop/buster/environments/cinnamon/armbian/create_desktop_package.sh b/config/desktop/buster/environments/cinnamon/armbian/create_desktop_package.sh +index fe77b28a5..63b8cb05b 100755 +--- a/config/desktop/buster/environments/cinnamon/armbian/create_desktop_package.sh ++++ b/config/desktop/buster/environments/cinnamon/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + # generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/cinnamon-background-properties +-cat << EOF > "${destination}"/usr/share/cinnamon-background-properties/armbian.xml ++cat < "${destination}"/usr/share/cinnamon-background-properties/armbian.xml + + + +diff --git a/config/desktop/buster/environments/lxde/armbian/create_desktop_package.sh b/config/desktop/buster/environments/lxde/armbian/create_desktop_package.sh +index 6206b92e0..25186ea4e 100644 +--- a/config/desktop/buster/environments/lxde/armbian/create_desktop_package.sh ++++ b/config/desktop/buster/environments/lxde/armbian/create_desktop_package.sh +@@ -14,30 +14,30 @@ mkdir -p "${destination}"/usr/share/backgrounds/armbian/ + cp "${SRC}"/packages/blobs/desktop/wallpapers/armbian*.jpg "${destination}"/usr/share/backgrounds/armbian/ + + mkdir -p "${destination}"/usr/share/mate-background-properties +-cat <<- EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml +- +- +- +- +- Armbian light +- /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- +- Armbian dark +- /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- ++cat <<-EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml ++ ++ ++ ++ ++ Armbian light ++ /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ ++ Armbian dark ++ /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ + EOF + + mkdir -p "${destination}"/usr/share/glib-2.0/schemas +-cat <<- EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override +- [org.gnome.desktop.background] +- picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' +- show-desktop-icons=true ++cat <<-EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override ++[org.gnome.desktop.background] ++picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' ++show-desktop-icons=true + EOF +diff --git a/config/desktop/buster/environments/mate/armbian/create_desktop_package.sh b/config/desktop/buster/environments/mate/armbian/create_desktop_package.sh +index 6206b92e0..25186ea4e 100644 +--- a/config/desktop/buster/environments/mate/armbian/create_desktop_package.sh ++++ b/config/desktop/buster/environments/mate/armbian/create_desktop_package.sh +@@ -14,30 +14,30 @@ mkdir -p "${destination}"/usr/share/backgrounds/armbian/ + cp "${SRC}"/packages/blobs/desktop/wallpapers/armbian*.jpg "${destination}"/usr/share/backgrounds/armbian/ + + mkdir -p "${destination}"/usr/share/mate-background-properties +-cat <<- EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml +- +- +- +- +- Armbian light +- /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- +- Armbian dark +- /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- ++cat <<-EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml ++ ++ ++ ++ ++ Armbian light ++ /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ ++ Armbian dark ++ /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ + EOF + + mkdir -p "${destination}"/usr/share/glib-2.0/schemas +-cat <<- EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override +- [org.gnome.desktop.background] +- picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' +- show-desktop-icons=true ++cat <<-EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override ++[org.gnome.desktop.background] ++picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' ++show-desktop-icons=true + EOF +diff --git a/config/desktop/focal/appgroups/browsers/armbian/create_desktop_package.sh b/config/desktop/focal/appgroups/browsers/armbian/create_desktop_package.sh +index f3670e815..a1bc70a52 100644 +--- a/config/desktop/focal/appgroups/browsers/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/appgroups/browsers/armbian/create_desktop_package.sh +@@ -1,4 +1,4 @@ + # install optimized browser configurations + cp "${SRC}"/packages/blobs/desktop/chromium.conf "${destination}"/etc/armbian +-cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian ++cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian + cp -R "${SRC}"/packages/blobs/desktop/chromium "${destination}"/etc/armbian +diff --git a/config/desktop/focal/environments/budgie/armbian/create_desktop_package.sh b/config/desktop/focal/environments/budgie/armbian/create_desktop_package.sh +index ad93e7d6a..0f5216cfe 100755 +--- a/config/desktop/focal/environments/budgie/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/budgie/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + #generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/cinnamon-background-properties +-cat << EOF > "${destination}"/usr/share/cinnamon-background-properties/armbian.xml ++cat < "${destination}"/usr/share/cinnamon-background-properties/armbian.xml + + + +diff --git a/config/desktop/focal/environments/cinnamon/armbian/create_desktop_package.sh b/config/desktop/focal/environments/cinnamon/armbian/create_desktop_package.sh +index fe77b28a5..63b8cb05b 100755 +--- a/config/desktop/focal/environments/cinnamon/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/cinnamon/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + # generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/cinnamon-background-properties +-cat << EOF > "${destination}"/usr/share/cinnamon-background-properties/armbian.xml ++cat < "${destination}"/usr/share/cinnamon-background-properties/armbian.xml + + + +diff --git a/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh b/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh +index 78f4d23be..aea442e71 100755 +--- a/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + #generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/deepin-background-properties +-cat << EOF > "${destination}"/usr/share/deepin-background-properties/armbian.xml ++cat < "${destination}"/usr/share/deepin-background-properties/armbian.xml + + + +diff --git a/config/desktop/focal/environments/enlightenment/armbian/create_desktop_package.sh b/config/desktop/focal/environments/enlightenment/armbian/create_desktop_package.sh +index 1f1ede5e5..f1bdc7146 100755 +--- a/config/desktop/focal/environments/enlightenment/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/enlightenment/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + #generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/enlightenment-background-properties +-cat << EOF > "${destination}"/usr/share/enlightenment-background-properties/armbian.xml ++cat < "${destination}"/usr/share/enlightenment-background-properties/armbian.xml + + + +diff --git a/config/desktop/focal/environments/gnome/armbian/create_desktop_package.sh b/config/desktop/focal/environments/gnome/armbian/create_desktop_package.sh +index d23a7109c..019868334 100755 +--- a/config/desktop/focal/environments/gnome/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/gnome/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + #generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/gnome-background-properties +-cat << EOF > "${destination}"/usr/share/gnome-background-properties/armbian.xml ++cat < "${destination}"/usr/share/gnome-background-properties/armbian.xml + + + +diff --git a/config/desktop/focal/environments/mate/armbian/create_desktop_package.sh b/config/desktop/focal/environments/mate/armbian/create_desktop_package.sh +index ce88f653a..ccd978837 100755 +--- a/config/desktop/focal/environments/mate/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/mate/armbian/create_desktop_package.sh +@@ -23,7 +23,7 @@ cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/ + + #generate wallpaper list for background changer + mkdir -p "${destination}"/usr/share/mate-background-properties +-cat << EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml ++cat < "${destination}"/usr/share/mate-background-properties/armbian.xml + + + +diff --git a/config/desktop/focal/environments/xfce/debian/armbian-bsp-desktop/prepare.sh b/config/desktop/focal/environments/xfce/debian/armbian-bsp-desktop/prepare.sh +index 8b1378917..e69de29bb 100644 +--- a/config/desktop/focal/environments/xfce/debian/armbian-bsp-desktop/prepare.sh ++++ b/config/desktop/focal/environments/xfce/debian/armbian-bsp-desktop/prepare.sh +@@ -1 +0,0 @@ +- +diff --git a/config/desktop/sid/appgroups/browsers/armbian/create_desktop_package.sh b/config/desktop/sid/appgroups/browsers/armbian/create_desktop_package.sh +index f3670e815..a1bc70a52 100644 +--- a/config/desktop/sid/appgroups/browsers/armbian/create_desktop_package.sh ++++ b/config/desktop/sid/appgroups/browsers/armbian/create_desktop_package.sh +@@ -1,4 +1,4 @@ + # install optimized browser configurations + cp "${SRC}"/packages/blobs/desktop/chromium.conf "${destination}"/etc/armbian +-cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian ++cp "${SRC}"/packages/blobs/desktop/firefox.conf "${destination}"/etc/armbian + cp -R "${SRC}"/packages/blobs/desktop/chromium "${destination}"/etc/armbian +diff --git a/config/desktop/sid/environments/lxde/armbian/create_desktop_package.sh b/config/desktop/sid/environments/lxde/armbian/create_desktop_package.sh +index 6206b92e0..25186ea4e 100644 +--- a/config/desktop/sid/environments/lxde/armbian/create_desktop_package.sh ++++ b/config/desktop/sid/environments/lxde/armbian/create_desktop_package.sh +@@ -14,30 +14,30 @@ mkdir -p "${destination}"/usr/share/backgrounds/armbian/ + cp "${SRC}"/packages/blobs/desktop/wallpapers/armbian*.jpg "${destination}"/usr/share/backgrounds/armbian/ + + mkdir -p "${destination}"/usr/share/mate-background-properties +-cat <<- EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml +- +- +- +- +- Armbian light +- /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- +- Armbian dark +- /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- ++cat <<-EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml ++ ++ ++ ++ ++ Armbian light ++ /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ ++ Armbian dark ++ /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ + EOF + + mkdir -p "${destination}"/usr/share/glib-2.0/schemas +-cat <<- EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override +- [org.gnome.desktop.background] +- picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' +- show-desktop-icons=true ++cat <<-EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override ++[org.gnome.desktop.background] ++picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' ++show-desktop-icons=true + EOF +diff --git a/config/desktop/sid/environments/mate/armbian/create_desktop_package.sh b/config/desktop/sid/environments/mate/armbian/create_desktop_package.sh +index 6206b92e0..25186ea4e 100644 +--- a/config/desktop/sid/environments/mate/armbian/create_desktop_package.sh ++++ b/config/desktop/sid/environments/mate/armbian/create_desktop_package.sh +@@ -14,30 +14,30 @@ mkdir -p "${destination}"/usr/share/backgrounds/armbian/ + cp "${SRC}"/packages/blobs/desktop/wallpapers/armbian*.jpg "${destination}"/usr/share/backgrounds/armbian/ + + mkdir -p "${destination}"/usr/share/mate-background-properties +-cat <<- EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml +- +- +- +- +- Armbian light +- /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- +- Armbian dark +- /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg +- zoom +- #ffffff +- #000000 +- +- ++cat <<-EOF > "${destination}"/usr/share/mate-background-properties/armbian.xml ++ ++ ++ ++ ++ Armbian light ++ /usr/share/backgrounds/armbian/armbian18-Dre0x-Minum-light-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ ++ Armbian dark ++ /usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg ++ zoom ++ #ffffff ++ #000000 ++ ++ + EOF + + mkdir -p "${destination}"/usr/share/glib-2.0/schemas +-cat <<- EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override +- [org.gnome.desktop.background] +- picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' +- show-desktop-icons=true ++cat <<-EOF > "${destination}"/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override ++[org.gnome.desktop.background] ++picture-uri='file:///usr/share/backgrounds/armbian/armbian03-Dre0x-Minum-dark-3840x2160.jpg' ++show-desktop-icons=true + EOF +diff --git a/config/desktop/sid/environments/xfce/armbian/create_desktop_package.sh b/config/desktop/sid/environments/xfce/armbian/create_desktop_package.sh +index 3d2f0723d..2da78a2a9 100644 +--- a/config/desktop/sid/environments/xfce/armbian/create_desktop_package.sh ++++ b/config/desktop/sid/environments/xfce/armbian/create_desktop_package.sh +@@ -7,7 +7,7 @@ cp -R "${SRC}"/packages/blobs/desktop/skel/. "${destination}"/etc/skel + + # using different icon pack. Workaround due to this bug https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=867779 + sed -i 's//g' \ +- "${destination}"/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml ++"${destination}"/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml + + # install dedicated startup icons + mkdir -p "${destination}"/usr/share/pixmaps/armbian "${destination}"/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/ +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index eb5ab78b2..cd9541c3b 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -16,7 +16,7 @@ PACKAGE_LIST_FAMILY="ethtool" + + RKBIN_DIR="$SRC/cache/sources/rkbin-tools" + +-BOOT_SOC=$(expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*') ++BOOT_SOC=${BOOT_SOC:=$(expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*')} + + CPUMIN=${CPUMIN:="408000"} + +@@ -69,7 +69,7 @@ elif [[ $BOOT_SOC == rk3568 ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" + DDR_BLOB='rk35/rk3568_ddr_1560MHz_v1.10.bin' +- BL31_BLOB='rk35/rk3568_bl31_v1.29.elf' ++ BL31_BLOB='rk35/rk3568_bl31_v1.28.elf' + + elif [[ $BOARD == rockpi-s ]]; then + +diff --git a/config/templates/Dockerfile b/config/templates/Dockerfile +index 9a56ca2e9..b9cfa9640 100644 +--- a/config/templates/Dockerfile ++++ b/config/templates/Dockerfile +@@ -1,4 +1,7 @@ +-FROM ubuntu:rolling ++ARG BASE_IMAGE=ubuntu:jammy ++FROM $BASE_IMAGE as armbian_builder ++ARG ARM_GCC_COMPILER='g++-11-arm-linux-gnueabihf' ++ENV ARM_GCC_COMPILER $ARM_GCC_COMPILER + ARG DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get -y dist-upgrade && apt-get -y install \ + joe \ +@@ -20,6 +23,7 @@ RUN sh -c " \ + RUN apt-get update \ + && apt-get -y dist-upgrade \ + && apt-get install -y --no-install-recommends \ ++ $ARM_GCC_COMPILER \ + acl \ + aptly \ + aria2 \ +@@ -47,14 +51,11 @@ RUN apt-get update \ + fakeroot \ + fdisk \ + flex \ +- g++-arm-linux-gnueabihf \ + gawk \ + gcc-aarch64-linux-gnu \ + gcc-arm-linux-gnueabihf \ + gcc-arm-linux-gnueabi \ + gcc-arm-none-eabi \ +- gcc-aarch64-linux-gnu \ +- g++-aarch64-linux-gnu \ + gdisk \ + git \ + imagemagick \ +@@ -72,6 +73,7 @@ RUN apt-get update \ + libpython2.7-dev \ + libpython3-dev \ + libssl-dev \ ++ libssl1.1 \ + libusb-1.0-0-dev \ + linux-base \ + libmpc-dev \ +diff --git a/lib/functions/cli/utils-cli.sh b/lib/functions/cli/utils-cli.sh +index d9f6a571c..a48de5d3a 100644 +--- a/lib/functions/cli/utils-cli.sh ++++ b/lib/functions/cli/utils-cli.sh +@@ -111,7 +111,7 @@ function prepare_userpatches() { + mkdir -p "${SRC}"/userpatches + + # Create example configs if none found in userpatches +- if ! ls "${SRC}"/userpatches/{config-example.conf,config-docker.conf,config-vagrant.conf} 1> /dev/null 2>&1; then ++ if ! ls "${SRC}"/userpatches/{config-default.conf,config-docker.conf,config-vagrant.conf} 1> /dev/null 2>&1; then + + # Migrate old configs + if ls "${SRC}"/*.conf 1> /dev/null 2>&1; then +@@ -126,6 +126,10 @@ function prepare_userpatches() { + # Create example config + if [[ ! -f "${SRC}"/userpatches/config-example.conf ]]; then + cp "${SRC}"/config/templates/config-example.conf "${SRC}"/userpatches/config-example.conf || exit 1 ++ fi ++ ++ # Link default config to example config ++ if [[ ! -f "${SRC}"/userpatches/config-default.conf ]]; then + ln -fs config-example.conf "${SRC}"/userpatches/config-default.conf || exit 1 + fi + +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 0f9d54bfe..f921591a7 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -305,12 +305,8 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8811cu\/Kconfig"' \ + "$kerneldir/drivers/net/wireless/Kconfig" + +- # add support for K5.11+ +- process_patch_file "${SRC}/patch/misc/wireless-rtl8811cu.patch" "applying" +- +- # add support for K5.12+ +- process_patch_file "${SRC}/patch/misc/wireless-realtek-8811cu-5.12.patch" "applying" +- process_patch_file "${SRC}/patch/misc/wireless-realtek-8811cu-xxx.patch" "applying" ++ # add support for K5.17+ ++ process_patch_file "${SRC}/patch/misc/wireless-realtek-8811cu-5.17.patch" "applying" + + fi + +@@ -547,8 +543,8 @@ function prepare_extra_kernel_drivers() { + sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8822bs\/Kconfig"' \ + $kerneldir/drivers/net/wireless/Kconfig + +- # add support for K5.11+ +- process_patch_file "${SRC}/patch/misc/wireless-rtl8822bs.patch" "applying" ++ # add support for K5.11+ ++ process_patch_file "${SRC}/patch/misc/wireless-rtl8822bs.patch" "applying" + + fi + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 6edde8258..ba4fe5452 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=15 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=16 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote 2> /dev/null | grep origin)" 2> /dev/null) + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) +diff --git a/lib/functions/host/prepare-host.sh b/lib/functions/host/prepare-host.sh +index cc7d1d48f..bae3b3e7c 100644 +--- a/lib/functions/host/prepare-host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -73,7 +73,7 @@ prepare_host() { + # + # NO_HOST_RELEASE_CHECK overrides the check for a supported host system + # Disable host OS check at your own risk. Any issues reported with unsupported releases will be closed without discussion +- if [[ -z $HOSTRELEASE || "buster bullseye focal impish hirsute debbie tricia ulyana ulyssa uma" != *"$HOSTRELEASE"* ]]; then ++ if [[ -z $HOSTRELEASE || "buster bullseye focal impish hirsute jammy debbie tricia ulyana ulyssa uma una" != *"$HOSTRELEASE"* ]]; then + if [[ $NO_HOST_RELEASE_CHECK == yes ]]; then + display_alert "You are running on an unsupported system" "${HOSTRELEASE:-(unknown)}" "wrn" + display_alert "Do not report any errors, warnings or other issues encountered beyond this point" "" "wrn" +diff --git a/lib/functions/rootfs/distro-specific.sh b/lib/functions/rootfs/distro-specific.sh +index 4770af4bc..7c1676f40 100644 +--- a/lib/functions/rootfs/distro-specific.sh ++++ b/lib/functions/rootfs/distro-specific.sh +@@ -154,17 +154,33 @@ create_sources_list() { + ;; + esac + ++ display_alert "Adding Armbian repository and authentication key" "/etc/apt/sources.list.d/armbian.list" "info" ++ ++ # apt-key add is getting deprecated ++ APT_VERSION=$(chroot "${basedir}" /bin/bash -c "apt --version | cut -d\" \" -f2") ++ if linux-version compare "${APT_VERSION}" ge 2.4.1; then ++ # add armbian key ++ mkdir -p "${basedir}"/usr/share/keyrings ++ # change to binary form ++ gpg --dearmor < "${SRC}"/config/armbian.key > "${basedir}"/usr/share/keyrings/armbian.gpg ++ SIGNED_BY="[signed-by=/usr/share/keyrings/armbian.gpg] " ++ else ++ # use old method for compatibility reasons ++ cp "${SRC}"/config/armbian.key "${basedir}" ++ chroot "${basedir}" /bin/bash -c "cat armbian.key | apt-key add - > /dev/null 2>&1" ++ fi ++ + # stage: add armbian repository and install key + if [[ $DOWNLOAD_MIRROR == "china" ]]; then +- echo "deb https://mirrors.tuna.tsinghua.edu.cn/armbian $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list ++ echo "deb ${SIGNED_BY}https://mirrors.tuna.tsinghua.edu.cn/armbian $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list + elif [[ $DOWNLOAD_MIRROR == "bfsu" ]]; then +- echo "deb http://mirrors.bfsu.edu.cn/armbian $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list ++ echo "deb ${SIGNED_BY}http://mirrors.bfsu.edu.cn/armbian $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list + else +- echo "deb http://"$([[ $BETA == yes ]] && echo "beta" || echo "apt")".armbian.com $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list ++ echo "deb ${SIGNED_BY}http://"$([[ $BETA == yes ]] && echo "beta" || echo "apt")".armbian.com $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list + fi + + # replace local package server if defined. Suitable for development +- [[ -n $LOCAL_MIRROR ]] && echo "deb http://$LOCAL_MIRROR $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list ++ [[ -n $LOCAL_MIRROR ]] && echo "deb ${SIGNED_BY}http://$LOCAL_MIRROR $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" > "${basedir}"/etc/apt/sources.list.d/armbian.list + + # disable repo if SKIP_ARMBIAN_REPO=yes + if [[ "${SKIP_ARMBIAN_REPO}" == "yes" ]]; then +@@ -172,12 +188,4 @@ create_sources_list() { + mv "${SDCARD}"/etc/apt/sources.list.d/armbian.list "${SDCARD}"/etc/apt/sources.list.d/armbian.list.disabled + fi + +- display_alert "Adding Armbian repository and authentication key" "/etc/apt/sources.list.d/armbian.list" "info" +- cp "${SRC}"/config/armbian.key "${basedir}" +- chroot "${basedir}" /bin/bash -c "cat armbian.key | apt-key add - > /dev/null 2>&1" +- rm "${basedir}"/armbian.key + } +-#-------------------------------------------------------------------------------------------------------------------------------- +-# Create kernel boot logo from packages/blobs/splash/logo.png and packages/blobs/splash/spinner.gif (animated) +-# and place to the file /lib/firmware/bootsplash +-#-------------------------------------------------------------------------------------------------------------------------------- +diff --git a/lib/functions/rootfs/rootfs-desktop.sh b/lib/functions/rootfs/rootfs-desktop.sh +index b0785949a..56b9cfc3d 100644 +--- a/lib/functions/rootfs/rootfs-desktop.sh ++++ b/lib/functions/rootfs/rootfs-desktop.sh +@@ -30,31 +30,40 @@ add_apt_sources() { + for apt_sources_dirpath in ${potential_paths}; do + if [[ -d "${apt_sources_dirpath}" ]]; then + for apt_source_filepath in "${apt_sources_dirpath}/"*.source; do +- local new_apt_source="$(cat "${apt_source_filepath}")" +- display_alert "Adding APT Source ${new_apt_source}" +- # -y -> Assumes yes to all queries +- # -n -> Do not update package cache after adding +- chroot_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" +- display_alert "Return code : $?" ++ apt_source_filepath=$(echo "${apt_source_filepath}" | sed -re 's/(^.*[^/])\.[^./]*$/\1/') ++ local new_apt_source="$(cat "${apt_source_filepath}.source")" ++ local apt_source_gpg_filepath="${apt_source_filepath}.gpg" + +- # temporally exception for jammy +- [[ $RELEASE == "jammy" ]] && find "${SDCARD}/etc/apt/sources.list.d/." -type f \( -name "*.list" ! -name "armbian.list" \) -print0 | xargs -0 sed -i 's/jammy/hirsute/g' ++ # extract filenames ++ local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" ++ local apt_source_filename="$(basename ${apt_source_filepath}).list" + +- local apt_source_gpg_filepath="${apt_source_filepath}.gpg" ++ display_alert "Adding APT Source ${new_apt_source}" ++ ++ if [[ "${new_apt_source}" == ppa* ]]; then ++ ++ # add list with apt-add ++ # -y -> Assumes yes to all queries ++ # -n -> Do not update package cache after adding ++ run_on_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" ++ if [[ -f "${apt_source_gpg_filepath}" ]]; then ++ display_alert "Adding GPG Key ${apt_source_gpg_filepath}" ++ cp "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" ++ chroot_sdcard "apt-key add \"/tmp/${apt_source_gpg_filename}\"" ++ echo "APT Key returned : $?" ++ fi ++ else ++ # copy list if its not ppa ++ echo "${new_apt_source}" > "${SDCARD}/etc/apt/sources.list.d/${apt_source_filename}" ++ if [[ -f "${apt_source_gpg_filepath}" ]]; then ++ display_alert "Adding GPG Key ${apt_source_gpg_filepath}" ++ # local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" ++ mkdir -p "${SDCARD}"/usr/share/keyrings/ ++ cp "${apt_source_gpg_filepath}" "${SDCARD}"/usr/share/keyrings/ ++ fi + +- # PPA provide GPG keys automatically, it seems. +- # But other repositories (Docker for example) require the +- # user to import GPG keys manually +- # Myy : FIXME We need some automatic Git warnings when someone +- # add a GPG key, since trusting the wrong keys could lead to +- # serious issues. +- if [[ -f "${apt_source_gpg_filepath}" ]]; then +- display_alert "Adding GPG Key ${apt_source_gpg_filepath}" +- local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" +- cp "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" +- chroot_sdcard "apt-key add \"/tmp/${apt_source_gpg_filename}\"" +- echo "APT Key returned : $?" + fi ++ + done + fi + done +@@ -64,6 +73,7 @@ add_apt_sources() { + add_desktop_package_sources() { + add_apt_sources + chroot_sdcard_apt_get "update" ++ run_host_command_logged ls -l "${SDCARD}/usr/share/keyrings" + run_host_command_logged ls -l "${SDCARD}/etc/apt/sources.list.d" + run_host_command_logged cat "${SDCARD}/etc/apt/sources.list" + } + +From d2d2fa9315f74ec155f209096fe55ead120491c6 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 18 Mar 2022 02:17:01 +0100 +Subject: [PATCH] armbian-next: *much* improved logging to HTML; log archiving; + consistency + +- keep only current logfile +- log to LOGFILE also if SHOW_LOG=yes +- log cmd runtime and success/error directly in runner +--- + lib/functions/cli/cli-entrypoint.sh | 3 ++ + lib/functions/logging/logging.sh | 78 ++++++++++++++++++++++++++----------- + lib/functions/logging/runners.sh | 19 ++++----- + 3 files changed, 67 insertions(+), 33 deletions(-) + +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 5b905062f..4cd37537d 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -1,4 +1,7 @@ + function cli_entrypoint() { ++ # array, readonly, global, for future reference, "exported" to shutup shellcheck ++ declare -rg -x -a ARMBIAN_ORIGINAL_ARGV=("${@}") ++ + if [[ "${ARMBIAN_ENABLE_CALL_TRACING}" == "yes" ]]; then + set -T # inherit return/debug traps + mkdir -p "${SRC}"/output/debug +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 296b46ddb..cac13b902 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -47,7 +47,7 @@ function start_logging_section() { + export CURRENT_LOGGING_SECTION=${LOG_SECTION:-early} # default to "early", should be overwritten soon enough + export CURRENT_LOGGING_SECTION_START=${SECONDS} + export CURRENT_LOGGING_DIR="${LOGDIR}" # set in cli-entrypoint.sh +- export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${CURRENT_LOGGING_SECTION}.log" ++ export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.000.${CURRENT_LOGGING_SECTION}.log" + mkdir -p "${CURRENT_LOGGING_DIR}" + touch "${CURRENT_LOGFILE}" # Touch it, make sure it's writable. + +@@ -94,10 +94,8 @@ function do_with_logging() { + # Also terrible: don't hold a reference to cwd by changing to SRC always + exec 3> >( + cd "${SRC}" || exit 2 +- #grep --line-buffered -v "^$" | \ +- # @TODO: tee to CURRENT_LOGFILE. @TODO this is essential. if this does not work whole thing comes down +- +- sed -u -e "${prefix_sed_cmd}" ++ # First, log to file, then add prefix via sed for what goes to screen. ++ tee -a "${CURRENT_LOGFILE}" | sed -u -e "${prefix_sed_cmd}" + ) + "$@" >&3 + exec 3>&- # close the file descriptor, lest sed keeps running forever. +@@ -115,24 +113,21 @@ function do_with_logging() { + function do_with_log_asset() { + # @TODO: check that CURRENT_LOGGING_COUNTER is set, otherwise crazy? + local ASSET_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${LOG_ASSET}" +- display_alert "Logging to asset" "${CURRENT_LOGGING_COUNTER}.0.${LOG_ASSET}" "debug" ++ display_alert "Logging to asset" "${CURRENT_LOGGING_COUNTER}.${LOG_ASSET}" "debug" + "$@" >> "${ASSET_LOGFILE}" + } + + function display_alert() { +- # We'll be writing to stderr (" >&2"), so also write the message to the generic logfile, for context. +- if [[ -f "${CURRENT_LOGFILE}" ]]; then +- echo -e "--> A: [" "$@" "]" | sed 's/\x1b\[[0-9;]*m//g' >> "${CURRENT_LOGFILE}" +- fi +- +- # If asked, avoid any fancy ANSI escapes completely. ++ # If asked, avoid any fancy ANSI escapes completely. For python-driven log collection. Formatting could be improved. ++ # If used, also does not write to logfile even if it exists. + if [[ "${ANSI_COLOR}" == "none" ]]; then + echo -e "${@}" | sed 's/\x1b\[[0-9;]*m//g' >&2 + return 0 + fi + +- local message="$1" level="$3" # params ++ local message="${1}" level="${3}" # params + local level_indicator="" inline_logs_color="" extra="" ci_log="" # this log ++ local skip_screen=0 # setting to 1 will write to logfile only + case "${level}" in + err | error) + level_indicator="💥" +@@ -159,7 +154,7 @@ function display_alert() { + + cleanup | trap) + if [[ "${SHOW_TRAPS}" != "yes" ]]; then # enable debug for many, many debugging msgs +- return 0 ++ skip_screen=1 + fi + level_indicator="🧽" + inline_logs_color="\e[1;33m" +@@ -167,7 +162,7 @@ function display_alert() { + + debug | deprecation) + if [[ "${SHOW_DEBUG}" != "yes" ]]; then # enable debug for many, many debugging msgs +- return 0 ++ skip_screen=1 + fi + level_indicator="🐛" + inline_logs_color="\e[1;33m" +@@ -175,7 +170,7 @@ function display_alert() { + + group) + if [[ "${SHOW_DEBUG}" != "yes" && "${SHOW_GROUPS}" != "yes" ]]; then # show when debugging, or when specifically requested +- return 0 ++ skip_screen=1 + fi + level_indicator="🦋" + inline_logs_color="\e[1;34m" # blue; 36 would be cyan +@@ -183,7 +178,7 @@ function display_alert() { + + command) + if [[ "${SHOW_COMMAND}" != "yes" ]]; then # enable to log all calls to external cmds +- return 0 ++ skip_screen=1 + fi + level_indicator="🐸" + inline_logs_color="\e[0;36m" # a dim cyan +@@ -191,7 +186,7 @@ function display_alert() { + + timestamp | fasthash) + if [[ "${SHOW_FASTHASH}" != "yes" ]]; then # timestamp-related debugging messages, very very verbose +- return 0 ++ skip_screen=1 + fi + level_indicator="🐜" + inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. +@@ -199,18 +194,29 @@ function display_alert() { + + git) + if [[ "${SHOW_GIT}" != "yes" ]]; then # git-related debugging messages, very very verbose +- return 0 ++ skip_screen=1 + fi + level_indicator="🔖" + inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. + ;; + + *) ++ level="${level:-other}" # for file logging. + level_indicator="🌿" + inline_logs_color="\e[1;37m" + ;; + esac + ++ # Now, log to file. This will be colorized later by ccze and such, so remove any colors it might already have. ++ # See also the stuff done in runners.sh for logging exact command lines and runtimes. ++ if [[ -f "${CURRENT_LOGFILE}" ]]; then ++ echo -e "--> [${level_indicator} ] $(printf "%4s" "${SECONDS}"): $$ - ${BASHPID}: $-: ${level}: ${1} [ ${2} ]" | sed 's/\x1b\[[0-9;]*m//g' >> "${CURRENT_LOGFILE}" ++ fi ++ ++ if [[ ${skip_screen} -eq 1 ]]; then ++ return 0 ++ fi ++ + local timing_info="" + if [[ "${SHOW_TIMING}" == "yes" ]]; then + timing_info="${tool_color}(${normal_color}$(printf "%3s" "${SECONDS}")${tool_color})" # SECONDS is bash builtin for seconds since start of script. +@@ -279,16 +285,44 @@ function trap_handler_cleanup_logging() { + mkdir -p "${target_path}" + local target_file="${target_path}/armbian-logs-${ARMBIAN_BUILD_UUID}.html" + ++ # Before writing new logfile, compress and move existing ones to archive folder. Unless running under CI. ++ if [[ "${CI}" != "true" ]]; then ++ declare -a existing_log_files_array ++ mapfile -t existing_log_files_array < <(find "${target_path}" -maxdepth 1 -type f -name "armbian-logs-*.html") ++ declare one_old_logfile old_logfile_fn target_archive_path="${target_path}"/archive ++ for one_old_logfile in "${existing_log_files_array[@]}"; do ++ old_logfile_fn="$(basename "${one_old_logfile}")" ++ display_alert "Archiving old logfile" "${old_logfile_fn}" "debug" ++ mkdir -p "${target_archive_path}" ++ # shellcheck disable=SC2002 # my cat is not useless. a bit whiny. not useless. ++ zstdmt --quiet "${one_old_logfile}" -o "${target_archive_path}/${old_logfile_fn}.zst" ++ rm -f "${one_old_logfile}" ++ done ++ fi ++ + cat <<- HTML_HEADER > "${target_file}" + + + Armbian logs for ${ARMBIAN_BUILD_UUID} + + + ++

Armbian build at $(LC_ALL=C LANG=C date) on $(hostname || true)

++

${ARMBIAN_ORIGINAL_ARGV[@]@Q}

++
++ ++ $(git --git-dir="${SRC}/.git" log -1 --color --format=short --decorate | ansi2html --no-wrap --no-header) ++
++ ++ $(git -c color.status=always --work-tree="${SRC}" --git-dir="${SRC}/.git" status | ansi2html --no-wrap --no-header) ++
++ ++ $(git --work-tree="${SRC}" --git-dir="${SRC}/.git" diff -u --color | ansi2html --no-wrap --no-header) ++
++ + HTML_HEADER + + # Find and sort the files there, store in array one per logfile +@@ -301,13 +335,13 @@ function trap_handler_cleanup_logging() { + cat <<- HTML_ONE_LOGFILE_WITH_CCZE >> "${target_file}" +

${logfile_base}

+
+- $(cat "${logfile_full}" | ccze -o nolookups --raw-ansi | ansi2html --no-wrap --no-header) ++ $(ccze -o nolookups --raw-ansi < "${logfile_full}" | ansi2html --no-wrap --no-header) +
+
+ HTML_ONE_LOGFILE_WITH_CCZE + else + cat <<- HTML_ONE_LOGFILE_NO_CCZE >> "${target_file}" +-

${logfile_base}

++

${logfile_base}

+
$(cat "${logfile_full}")
+ HTML_ONE_LOGFILE_NO_CCZE + fi +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 42610621d..1b07dc7a0 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -134,28 +134,25 @@ function run_host_command_dialog() { + # do NOT use directly, it does NOT expand the way it should (through bash) + function run_host_command_logged_raw() { + # Log the command to the current logfile, so it has context of what was run. +- if [[ -f "${CURRENT_LOGFILE}" ]]; then +- echo " " >> "${CURRENT_LOGFILE}" # blank line for reader's benefit +- echo "-->" "$*" " <- at $(date --utc)" >> "${CURRENT_LOGFILE}" +- fi + display_alert "Command debug" "$*" "command" # A special 'command' level. + +- # uncomment when desperate to understand what's going on +- # echo "cmd about to run" "$@" >&2 +- + # In this case I wanna KNOW exactly what failed, thus disable errexit, then re-enable immediately after running. + set +e + local exit_code=666 +- "$@" 2>&1 # redirect stderr to stdout. $* is NOT $@! ++ local seconds_start=${SECONDS} # Bash has a builtin SECONDS that is seconds since start of script ++ "$@" 2>&1 # redirect stderr to stdout. $* is NOT $@! + exit_code=$? + set -e +- if [[ -f "${CURRENT_LOGFILE}" ]]; then +- echo "--> cmd exited with code ${exit_code} at $(date --utc)" >> "${CURRENT_LOGFILE}" +- fi ++ + if [[ $exit_code != 0 ]]; then ++ if [[ -f "${CURRENT_LOGFILE}" ]]; then ++ echo "-->--> command failed with error code ${exit_code} after $((SECONDS - seconds_start)) seconds" >> "${CURRENT_LOGFILE}" ++ fi + # This is very specific; remove CURRENT_LOGFILE's value when calling display_alert here otherwise logged twice. + CURRENT_LOGFILE="" display_alert "cmd exited with code ${exit_code}" "$*" "wrn" + CURRENT_LOGFILE="" display_alert "stacktrace for failed command" "$(show_caller_full)" "wrn" ++ elif [[ -f "${CURRENT_LOGFILE}" ]]; then ++ echo "-->--> command run successfully after $((SECONDS - seconds_start)) seconds" >> "${CURRENT_LOGFILE}" + fi + return $exit_code + } + +From 1b160ce366c31c724346f52a7f7bfa79036a6acf Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 18 Mar 2022 00:34:46 +0100 +Subject: [PATCH] armbian-next: *breaking change* use `MemAvailable` (not + including swap) and up requirements for tmpfs + +- of course add debugging logs +- rename vars +- should really only use this if we've really a lot of completely free RAM to spare +- otherwise OOM killer comes knocking +- or swapping to disk, that is counter-productive +--- + lib/functions/main/rootfs-image.sh | 31 +++++++++++++++---------------- + 1 file changed, 15 insertions(+), 16 deletions(-) + +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 02d04797d..86ad03594 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -27,25 +27,24 @@ function build_rootfs_and_image() { + fi + + # stage: verify tmpfs configuration and mount +- # CLI needs ~1.5GiB, desktop - ~3.5GiB +- # calculate and set tmpfs mount to use 9/10 of available RAM+SWAP +- # @TODO: this does not make sense; swap should not be considered. Actually, only free + cached memory should be considered! +- local phymem=$(((($(awk '/MemTotal/ {print $2}' /proc/meminfo) + $(awk '/SwapTotal/ {print $2}' /proc/meminfo))) / 1024 * 9 / 10)) # MiB +- local tmpfs_max_size=1500 # MiB +- if [[ $BUILD_DESKTOP == yes ]]; then +- tmpfs_max_size=3500 +- fi +- +- if [[ $FORCE_USE_RAMDISK == no ]]; then +- local use_tmpfs=no +- elif [[ $FORCE_USE_RAMDISK == yes || $phymem -gt $tmpfs_max_size ]]; then +- local use_tmpfs=yes ++ # CLI needs ~2GiB, desktop ~5GiB ++ # vs 60% of available RAM (free + buffers + magic) ++ local available_physical_memory_mib=$(($(awk '/MemAvailable/ {print $2}' /proc/meminfo) * 6 / 1024 / 10)) # MiB ++ local tmpfs_estimated_size=2000 # MiB ++ [[ $BUILD_DESKTOP == yes ]] && tmpfs_estimated_size=5000 # MiB ++ ++ local use_tmpfs=no # by default ++ if [[ ${FORCE_USE_RAMDISK} == no ]]; then # do not use, even if it fits ++ : ++ elif [[ ${FORCE_USE_RAMDISK} == yes || ${available_physical_memory_mib} -gt ${tmpfs_estimated_size} ]]; then # use, either force or fits ++ use_tmpfs=yes ++ display_alert "Using tmpfs for rootfs" "RAM available: ${available_physical_memory_mib}MiB > ${tmpfs_estimated_size}MiB estimated" "debug" ++ else ++ display_alert "Not using tmpfs for rootfs" "RAM available: ${available_physical_memory_mib}MiB < ${tmpfs_estimated_size}MiB estimated" "debug" + fi +- [[ -n $FORCE_TMPFS_SIZE ]] && phymem=$FORCE_TMPFS_SIZE + + if [[ $use_tmpfs == yes ]]; then +- display_alert "Using tmpfs for rootfs" "${phymem}M" "debug" +- mount -t tmpfs -o "size=${phymem}M" tmpfs "${SDCARD}" ++ mount -t tmpfs tmpfs "${SDCARD}" # do not specify size; we've calculated above that it should fit, and Linux will try its best if it doesn't. + fi + + # stage: prepare basic rootfs: unpack cache or create from scratch + +From 04a11cc78f5681dd41e3764ce644c53e7032156b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Mar 2022 22:46:05 +0100 +Subject: [PATCH] armbian-next: *breaking change* `DEB_COMPRESS=none` by + default if not running in CI/GHA + +--- + lib/functions/configuration/main-config.sh | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 6d2f404b1..6edde8258 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -24,7 +24,6 @@ function do_main_configuration() { + [[ -z $ROOTPWD ]] && ROOTPWD="1234" # Must be changed @first login + [[ -z $MAINTAINER ]] && MAINTAINER="Igor Pecovnik" # deb signature + [[ -z $MAINTAINERMAIL ]] && MAINTAINERMAIL="igor.pecovnik@****l.com" # deb signature +- [[ -z $DEB_COMPRESS ]] && DEB_COMPRESS="xz" # compress .debs with XZ by default. Use 'none' for faster/larger builds + export SKIP_EXTERNAL_TOOLCHAINS="${SKIP_EXTERNAL_TOOLCHAINS:-yes}" # don't use any external toolchains, by default. + TZDATA=$(cat /etc/timezone) # Timezone for target is taken from host or defined here. + USEALLCORES=yes # Use all CPU cores for compiling +@@ -39,6 +38,13 @@ function do_main_configuration() { + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) + ROOTFS_CACHE_MAX=200 # max number of rootfs cache, older ones will be cleaned up + ++ # .deb compression. xz is standard, but is slow, so if avoided by default if not running in CI. one day, zstd. ++ if [[ -z ${DEB_COMPRESS} ]]; then ++ DEB_COMPRESS="none" # none is very fast bug produces big artifacts. ++ [[ "${CI}" == "true" ]] && DEB_COMPRESS="xz" # xz is small and slow ++ fi ++ display_alert ".deb compression" "DEB_COMPRESS=${DEB_COMPRESS}" "debug" ++ + if [[ $BETA == yes ]]; then + DEB_STORAGE=$DEST/debs-beta + REPO_STORAGE=$DEST/repository-beta + +From 667a8de92b5075c05d2ca67761a13c93b8e8b99d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Mar 2022 22:21:45 +0100 +Subject: [PATCH] armbian-next: *breaking change* `CLEAN_LEVEL=make` is no + more; new `make-kernel`, `make-atf`, `make-uboot` + +- allows individual control of what to clean +- this effectively disables `make clean` by default +- rebuilds work and timestamping works for patching, so no reason to clean everytime by default. +--- + config/templates/config-example.conf | 20 ++++++++++++-------- + lib/functions/compilation/atf.sh | 14 +++++++------- + lib/functions/compilation/kernel.sh | 8 +++++--- + lib/functions/compilation/uboot.sh | 30 +++++++++++++++--------------- + lib/functions/general/cleaning.sh | 25 +++++++++++++++---------- + lib/functions/main/default-build.sh | 7 +++---- + 6 files changed, 57 insertions(+), 47 deletions(-) + +diff --git a/config/templates/config-example.conf b/config/templates/config-example.conf +index b75e4b44b..e07496dc8 100644 +--- a/config/templates/config-example.conf ++++ b/config/templates/config-example.conf +@@ -1,13 +1,17 @@ + # Read build script documentation https://docs.armbian.com/Developer-Guide_Build-Options/ + # for detailed explanation of these options and for additional options not listed here + +-KERNEL_ONLY="" # leave empty to select each time, set to "yes" or "no" to skip dialog prompt +-KERNEL_CONFIGURE="" # leave empty to select each time, set to "yes" or "no" to skip dialog prompt +-CLEAN_LEVEL="make,debs,oldcache" # comma-separated list of clean targets: "make" = make clean for selected kernel and u-boot, +-# "debs" = delete packages in "./output/debs" for current branch and family, +-# "alldebs" = delete all packages in "./output/debs", "images" = delete "./output/images", +-# "cache" = delete "./output/cache", "sources" = delete "./sources" +-# "oldcache" = remove old cached rootfs except for the newest 8 files ++KERNEL_ONLY="" # leave empty to select each time, set to "yes" or "no" to skip dialog prompt ++KERNEL_CONFIGURE="" # leave empty to select each time, set to "yes" or "no" to skip dialog prompt ++CLEAN_LEVEL="debs,oldcache" # comma-separated list of clean targets: ++: # "make-atf" = make clean for ATF, if it is built. ++: # "make-uboot" = make clean for uboot, if it is built. ++: # "make-kernel" = make clean for kernel, if it is built. very slow. ++: # *important*: "make" by itself has disabled, since Armbian knows how to handle Make timestamping now. ++: # "debs" = delete packages in "./output/debs" for current branch and family. causes rebuilds, hopefully cached. ++: # "alldebs" = delete all packages in "./output/debs", "images" = delete "./output/images", ++: # "cache" = delete "./output/cache", "sources" = delete "./sources" ++: # "oldcache" = remove old cached rootfs except for the newest 8 files + + REPOSITORY_INSTALL="" # comma-separated list of core modules which will be installed from repository + # "u-boot", "kernel", "bsp", "armbian-config", "armbian-firmware" +@@ -20,5 +24,5 @@ EXTERNAL_NEW="prebuilt" # compile and install or install prebuilt additional pac + INSTALL_HEADERS="" # install kernel headers package + LIB_TAG="master" # change to "branchname" to use any branch currently available. + USE_TORRENT="no" # use torrent network for faster toolchain and cache download +-DOWNLOAD_MIRROR="" # set to "china" to use mirrors.tuna.tsinghua.edu.cn ++DOWNLOAD_MIRROR="" # set to "china" to use chinese mirrors + CARD_DEVICE="" # device name /dev/sdx of your SD card to burn directly to the card when done +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index b241b5dfa..ff11d7ba8 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -4,19 +4,19 @@ compile_atf() { + fetch_from_repo "$ATFSOURCE" "$ATFDIR" "$ATFBRANCH" "yes" + fi + +- if [[ $CLEAN_LEVEL == *make* ]]; then +- display_alert "Cleaning" "$ATFSOURCEDIR" "info" ++ if [[ $CLEAN_LEVEL == *make-atf* ]]; then ++ display_alert "Cleaning ATF tree - CLEAN_LEVEL contains 'make-atf'" "$ATFSOURCEDIR" "info" + ( +- cd "${SRC}/cache/sources/${ATFSOURCEDIR}" +- make distclean 2>&1 ++ cd "${SRC}/cache/sources/${ATFSOURCEDIR}" || exit_with_error "crazy about ${ATFSOURCEDIR}" ++ run_host_command_logged make distclean + ) ++ else ++ display_alert "Not cleaning ATF tree, use CLEAN_LEVEL=make-atf if needed" "CLEAN_LEVEL=${CLEAN_LEVEL}" "debug" + fi + ++ local atfdir="$SRC/cache/sources/$ATFSOURCEDIR" + if [[ $USE_OVERLAYFS == yes ]]; then +- local atfdir + atfdir=$(overlayfs_wrapper "wrap" "$SRC/cache/sources/$ATFSOURCEDIR" "atf_${LINUXFAMILY}_${BRANCH}") +- else +- local atfdir="$SRC/cache/sources/$ATFSOURCEDIR" + fi + cd "$atfdir" || exit + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 571bde957..249336e00 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -106,13 +106,15 @@ function kernel_prepare_git() { + } + + function kernel_maybe_clean() { +- if [[ $CLEAN_LEVEL == *make* ]]; then +- display_alert "Cleaning" "$LINUXSOURCEDIR" "info" ++ if [[ $CLEAN_LEVEL == *make-kernel* ]]; then ++ display_alert "Cleaning Kernel tree - CLEAN_LEVEL contains 'make-kernel'" "$LINUXSOURCEDIR" "info" + ( + cd "${kernel_work_dir}" +- make ARCH="${ARCHITECTURE}" clean > /dev/null 2>&1 ++ run_host_command_logged make ARCH="${ARCHITECTURE}" clean + ) + fasthash_debug "post make clean" ++ else ++ display_alert "Not cleaning Kernel tree; use CLEAN_LEVEL=make-kernel if needed" "CLEAN_LEVEL=${CLEAN_LEVEL}" "debug" + fi + } + +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 33415c2e2..05b8ea629 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -1,3 +1,15 @@ ++function maybe_make_clean_uboot() { ++ if [[ $CLEAN_LEVEL == *make-uboot* ]]; then ++ display_alert "${uboot_prefix}Cleaning u-boot tree - CLEAN_LEVEL contains 'make-uboot'" "${BOOTSOURCEDIR}" "info" ++ ( ++ cd "${SRC}/cache/sources/${BOOTSOURCEDIR}" || exit_with_error "crazy about ${BOOTSOURCEDIR}" ++ run_host_command_logged make clean ++ ) ++ else ++ display_alert "${uboot_prefix}Not cleaning u-boot tree, use CLEAN_LEVEL=make-uboot if needed" "CLEAN_LEVEL=${CLEAN_LEVEL}" "debug" ++ fi ++} ++ + # this receives version target uboot_name uboottempdir uboot_target_counter toolchain as variables. + function compile_uboot_target() { + local uboot_prefix="{u-boot:${uboot_target_counter}} " +@@ -9,15 +21,9 @@ function compile_uboot_target() { + + # needed for multiple targets and for calling compile_uboot directly + display_alert "${uboot_prefix} Checking out to clean sources" "{$BOOTSOURCEDIR} for ${target_make}" +- git checkout -f -q HEAD ++ git checkout -f -q HEAD # @TODO: this assumes way too much. should call the wrapper again, not directly + +- if [[ $CLEAN_LEVEL == *make* ]]; then +- display_alert "${uboot_prefix}Cleaning" "${BOOTSOURCEDIR}" "info" +- ( +- cd "${SRC}/cache/sources/${BOOTSOURCEDIR}" +- make clean 2>&1 +- ) +- fi ++ maybe_make_clean_uboot + + advanced_patch "u-boot" "$BOOTPATCHDIR" "$BOARD" "$target_patchdir" "$BRANCH" "${LINUXFAMILY}-${BOARD}-${BRANCH}" + +@@ -102,13 +108,7 @@ compile_uboot() { + fi + + # not optimal, but extra cleaning before overlayfs_wrapper should keep sources directory clean +- if [[ $CLEAN_LEVEL == *make* ]]; then +- display_alert "Cleaning" "$BOOTSOURCEDIR" "info" +- ( +- cd "${SRC}/cache/sources/${BOOTSOURCEDIR}" +- make clean > /dev/null 2>&1 +- ) +- fi ++ maybe_make_clean_uboot + + if [[ $USE_OVERLAYFS == yes ]]; then + local ubootdir +diff --git a/lib/functions/general/cleaning.sh b/lib/functions/general/cleaning.sh +index 4e67b5d52..72a6f4b1f 100644 +--- a/lib/functions/general/cleaning.sh ++++ b/lib/functions/general/cleaning.sh +@@ -1,16 +1,21 @@ + # cleaning + # ++ + # target: what to clean +-# "make" - "make clean" for selected kernel and u-boot +-# "debs" - delete output/debs for board&branch ++# "make-atf" = make clean for ATF, if it is built. ++# "make-uboot" = make clean for uboot, if it is built. ++# "make-kernel" = make clean for kernel, if it is built. very slow. ++# *important*: "make" by itself has disabled, since Armbian knows how to handle Make timestamping now. ++ ++# "debs" = delete packages in "./output/debs" for current branch and family. causes rebuilds, hopefully cached. + # "ubootdebs" - delete output/debs for uboot&board&branch +-# "alldebs" - delete output/debs +-# "cache" - delete output/cache +-# "oldcache" - remove old output/cache +-# "images" - delete output/images +-# "sources" - delete output/sources +-# +-cleaning() { ++# "alldebs" = delete all packages in "./output/debs" ++# "images" = delete "./output/images" ++# "cache" = delete "./output/cache" ++# "sources" = delete "./sources" ++# "oldcache" = remove old cached rootfs except for the newest 8 files ++ ++general_cleaning() { + case $1 in + debs) # delete ${DEB_STORAGE} for current branch and family + if [[ -d "${DEB_STORAGE}" ]]; then +@@ -55,7 +60,7 @@ cleaning() { + [[ -d "${DEST}"/images ]] && display_alert "Cleaning" "output/images" "info" && rm -rf "${DEST}"/images/* + ;; + +- sources) # delete output/sources and output/buildpkg ++ sources) # delete cache/sources and output/buildpkg + [[ -d "${SRC}"/cache/sources ]] && display_alert "Cleaning" "sources" "info" && rm -rf "${SRC}"/cache/sources/* "${DEST}"/buildpkg/* + ;; + +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index aae266091..8f051610f 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -45,10 +45,9 @@ function main_default_build_single() { + LOG_SECTION="fetch_and_build_host_tools" do_with_logging fetch_and_build_host_tools + fi + +- for option in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do +- if [[ $option != sources ]]; then +- LOG_SECTION="cleaning" do_with_logging cleaning "$option" +- #fasthash_debug "main_cleaning_armbian" ++ for cleaning_fragment in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do ++ if [[ $cleaning_fragment != sources ]] && [[ $cleaning_fragment != make* ]]; then ++ LOG_SECTION="cleaning_${cleaning_fragment}" do_with_logging general_cleaning "${cleaning_fragment}" + fi + done + fi + +From 39999ad4efc4854213d0b2164d999071684ec1ea Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Mar 2022 21:16:21 +0100 +Subject: [PATCH] armbian-next: refactor `prepare_host`, give `apt-cacher-ng` + some much needed attention + +- library dir for host-related stuff, pull it out of "general" finally +--- + lib/functions/host/apt-cacher-ng.sh | 74 +++++++++ + lib/functions/host/basic-deps.sh | 30 ++++ + lib/functions/host/external-toolchains.sh | 54 ++++++ + lib/functions/host/host-utils.sh | 65 ++++++++ + .../{general/host.sh => host/prepare-host.sh} | 185 +++------------------ + lib/functions/logging/runners.sh | 3 +- + lib/functions/rootfs/create-cache.sh | 24 ++- + lib/library-functions.sh | 48 +++++- + 8 files changed, 303 insertions(+), 180 deletions(-) + +diff --git a/lib/functions/host/apt-cacher-ng.sh b/lib/functions/host/apt-cacher-ng.sh +new file mode 100644 +index 000000000..a917f6cb1 +--- /dev/null ++++ b/lib/functions/host/apt-cacher-ng.sh +@@ -0,0 +1,74 @@ ++# Management of apt-cacher-ng aka acng ++ ++function acng_configure_and_restart_acng() { ++ [[ $NO_APT_CACHER == yes ]] && return 0 # don't if told not to. NO_something=yes is very confusing, but kept for historical reasons ++ [[ "${APT_PROXY_ADDR:-localhost:3142}" != "localhost:3142" ]] && return 0 # also not if acng not local to builder machine ++ ++ display_alert "Preparing acng configuration" "apt-cacher-ng" "info" ++ ++ run_host_command_logged systemctl stop apt-cacher-ng || true # ignore errors, it might already be stopped. ++ ++ [[ ! -f /etc/apt-cacher-ng/acng.conf.orig.pre.armbian ]] && cp /etc/apt-cacher-ng/acng.conf /etc/apt-cacher-ng/acng.conf.orig.pre.armbian ++ ++ cat <<- ACNG_CONFIG > /etc/apt-cacher-ng/acng.conf ++ CacheDir: ${APT_CACHER_NG_CACHE_DIR:-/var/cache/apt-cacher-ng} ++ LogDir: /var/log/apt-cacher-ng ++ SupportDir: /usr/lib/apt-cacher-ng ++ LocalDirs: acng-doc /usr/share/doc/apt-cacher-ng ++ ReportPage: acng-report.html ++ ExThreshold: 4 ++ ++ # Remapping is disabled, many times we hit broken mirrors due to this. ++ #Remap-debrep: file:deb_mirror*.gz /debian ; file:backends_debian # Debian Archives ++ #Remap-uburep: file:ubuntu_mirrors /ubuntu ; file:backends_ubuntu # Ubuntu Archives ++ ++ # Turn debug logging and verbosity ++ Debug: 7 ++ VerboseLog: 1 ++ ++ # Connections tuning. ++ MaxStandbyConThreads: 10 ++ DlMaxRetries: 50 ++ NetworkTimeout: 60 ++ FastTimeout: 20 ++ ConnectProto: v4 v6 ++ RedirMax: 15 ++ ReuseConnections: 1 ++ ++ # Allow HTTPS CONNECT, although this is not ideal, since packages are not actually cached then. Disabled for now. ++ # PassThroughPattern: .* ++ ACNG_CONFIG ++ ++ # Ensure correct permissions on the directories ++ mkdir -p "${APT_CACHER_NG_CACHE_DIR:-/var/cache/apt-cacher-ng}" /var/log/apt-cacher-ng ++ chown apt-cacher-ng:apt-cacher-ng "${APT_CACHER_NG_CACHE_DIR:-/var/cache/apt-cacher-ng}" /var/log/apt-cacher-ng ++ ++ if [[ "${APT_CACHER_NG_CLEAR_LOGS}" == "yes" ]]; then ++ display_alert "Clearing acng logs" "apt-cacher-ng logs cleaning" "debug" ++ run_host_command_logged rm -rfv /var/log/apt-cacher-ng/* ++ fi ++ ++ run_host_command_logged systemctl start apt-cacher-ng ++ run_host_command_logged systemctl status apt-cacher-ng ++} ++ ++function acng_check_status_or_restart() { ++ [[ $NO_APT_CACHER != yes ]] && return 0 # don't if told not to ++ [[ "${APT_PROXY_ADDR:-localhost:3142}" != "localhost:3142" ]] && return 0 # also not if acng not local to builder machine ++ ++ if ! systemctl -q is-active apt-cacher-ng.service; then ++ display_alert "ACNG systemd service is not active" "restarting apt-cacher-ng" "warn" ++ acng_configure_and_restart_acng ++ fi ++ ++ if ! wget -q --timeout=10 --output-document=/dev/null http://localhost:3142/acng-report.html; then ++ display_alert "ACNG is not correctly listening for requests" "restarting apt-cacher-ng" "warn" ++ acng_configure_and_restart_acng ++ if ! wget -q --timeout=10 --output-document=/dev/null http://localhost:3142/acng-report.html; then ++ exit_with_error "ACNG is not correctly listening for requests" "apt-cacher-ng NOT WORKING" ++ fi ++ fi ++ ++ display_alert "apt-cacher-ng running correctly" "apt-cacher-ng OK" "debug" ++ ++} +diff --git a/lib/functions/host/basic-deps.sh b/lib/functions/host/basic-deps.sh +new file mode 100644 +index 000000000..fff94fbad +--- /dev/null ++++ b/lib/functions/host/basic-deps.sh +@@ -0,0 +1,30 @@ ++# prepare_host_basic ++# ++# * installs only basic packages ++# ++prepare_host_basic() { ++ ++ # command:package1 package2 ... ++ # list of commands that are neeeded:packages where this command is ++ local check_pack install_pack ++ local checklist=( ++ "dialog:dialog" ++ "fuser:psmisc" ++ "getfacl:acl" ++ "uuid:uuid uuid-runtime" ++ "curl:curl" ++ "gpg:gnupg" ++ "gawk:gawk" ++ ) ++ ++ for check_pack in "${checklist[@]}"; do ++ if ! which ${check_pack%:*} > /dev/null; then local install_pack+=${check_pack#*:}" "; fi ++ done ++ ++ if [[ -n $install_pack ]]; then ++ display_alert "Installing basic packages" "$install_pack" ++ # @TODO: wait, why sudo? we should already be sudo'ed when this executes. ++ sudo bash -c "apt-get -qq update && apt-get install -qq -y --no-install-recommends $install_pack" ++ fi ++ ++} +diff --git a/lib/functions/host/external-toolchains.sh b/lib/functions/host/external-toolchains.sh +new file mode 100644 +index 000000000..f2db2d6ea +--- /dev/null ++++ b/lib/functions/host/external-toolchains.sh +@@ -0,0 +1,54 @@ ++# This is mostly deprecated, since SKIP_EXTERNAL_TOOLCHAINS=yes by default. ++ ++function download_external_toolchains() { ++ # build aarch64 ++ if [[ $(dpkg --print-architecture) == amd64 ]]; then ++ if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" != "yes" ]]; then ++ ++ # bind mount toolchain if defined ++ if [[ -d "${ARMBIAN_CACHE_TOOLCHAIN_PATH}" ]]; then ++ mountpoint -q "${SRC}"/cache/toolchain && umount -l "${SRC}"/cache/toolchain ++ mount --bind "${ARMBIAN_CACHE_TOOLCHAIN_PATH}" "${SRC}"/cache/toolchain ++ fi ++ ++ display_alert "Checking for external GCC compilers" "" "info" ++ # download external Linaro compiler and missing special dependencies since they are needed for certain sources ++ ++ local toolchains=( ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz" ++ "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" ++ ) ++ ++ USE_TORRENT_STATUS=${USE_TORRENT} ++ USE_TORRENT="no" ++ for toolchain in ${toolchains[@]}; do ++ download_and_verify "_toolchain" "${toolchain##*/}" ++ done ++ USE_TORRENT=${USE_TORRENT_STATUS} ++ ++ rm -rf "${SRC}"/cache/toolchain/*.tar.xz* ++ local existing_dirs=($(ls -1 "${SRC}"/cache/toolchain)) ++ for dir in ${existing_dirs[@]}; do ++ local found=no ++ for toolchain in ${toolchains[@]}; do ++ local filename=${toolchain##*/} ++ local dirname=${filename//.tar.xz/} ++ [[ $dir == $dirname ]] && found=yes ++ done ++ if [[ $found == no ]]; then ++ display_alert "Removing obsolete toolchain" "$dir" ++ rm -rf "${SRC}/cache/toolchain/${dir}" ++ fi ++ done ++ else ++ display_alert "Ignoring toolchains" "SKIP_EXTERNAL_TOOLCHAINS: ${SKIP_EXTERNAL_TOOLCHAINS}" "info" ++ fi ++ fi ++} +diff --git a/lib/functions/host/host-utils.sh b/lib/functions/host/host-utils.sh +new file mode 100644 +index 000000000..20b11e49c +--- /dev/null ++++ b/lib/functions/host/host-utils.sh +@@ -0,0 +1,65 @@ ++function fetch_and_build_host_tools() { ++ call_extension_method "fetch_sources_tools" <<- 'FETCH_SOURCES_TOOLS' ++ *fetch host-side sources needed for tools and build* ++ Run early to fetch_from_repo or otherwise obtain sources for needed tools. ++ FETCH_SOURCES_TOOLS ++ ++ call_extension_method "build_host_tools" <<- 'BUILD_HOST_TOOLS' ++ *build needed tools for the build, host-side* ++ After sources are fetched, build host-side tools needed for the build. ++ BUILD_HOST_TOOLS ++ ++} ++ ++# wait_for_package_manager ++# ++# * installation will break if we try to install when package manager is running ++# ++wait_for_package_manager() { ++ # exit if package manager is running in the back ++ while true; do ++ if [[ "$( ++ fuser /var/lib/dpkg/lock 2> /dev/null ++ echo $? ++ )" != 1 && "$( ++ fuser /var/lib/dpkg/lock-frontend 2> /dev/null ++ echo $? ++ )" != 1 ]]; then ++ display_alert "Package manager is running in the background." "Please wait! Retrying in 30 sec" "wrn" ++ sleep 30 ++ else ++ break ++ fi ++ done ++} ++ ++# Install the whitespace-delimited packages listed in the first parameter, in the host (not chroot). ++# It handles correctly the case where all wanted packages are already installed, and in that case does nothing. ++# If packages are to be installed, it does an apt-get update first. ++function install_host_side_packages() { ++ declare wanted_packages_string ++ declare -a currently_installed_packages missing_packages ++ wanted_packages_string=${*} ++ missing_packages=() ++ # shellcheck disable=SC2207 # I wanna split, thanks. ++ currently_installed_packages=($(dpkg-query --show --showformat='${Package} ')) ++ for PKG_TO_INSTALL in ${wanted_packages_string}; do ++ # shellcheck disable=SC2076 # I wanna match literally, thanks. ++ if [[ ! " ${currently_installed_packages[*]} " =~ " ${PKG_TO_INSTALL} " ]]; then ++ display_alert "Should install package" "${PKG_TO_INSTALL}" ++ missing_packages+=("${PKG_TO_INSTALL}") ++ fi ++ done ++ ++ if [[ ${#missing_packages[@]} -gt 0 ]]; then ++ display_alert "Updating apt host-side for installing packages" "${#missing_packages[@]} packages" "info" ++ host_apt_get update ++ display_alert "Installing host-side packages" "${missing_packages[*]}" "info" ++ host_apt_get_install "${missing_packages[@]}" ++ else ++ display_alert "All host-side dependencies/packages already installed." "Skipping host-hide install" "debug" ++ fi ++ ++ unset currently_installed_packages ++ return 0 ++} +diff --git a/lib/functions/general/host.sh b/lib/functions/host/prepare-host.sh +similarity index 56% +rename from lib/functions/general/host.sh +rename to lib/functions/host/prepare-host.sh +index 925e0d3aa..cc7d1d48f 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/host/prepare-host.sh +@@ -1,33 +1,3 @@ +-# prepare_host_basic +-# +-# * installs only basic packages +-# +-prepare_host_basic() { +- +- # command:package1 package2 ... +- # list of commands that are neeeded:packages where this command is +- local check_pack install_pack +- local checklist=( +- "dialog:dialog" +- "fuser:psmisc" +- "getfacl:acl" +- "uuid:uuid uuid-runtime" +- "curl:curl" +- "gpg:gnupg" +- "gawk:gawk" +- ) +- +- for check_pack in "${checklist[@]}"; do +- if ! which ${check_pack%:*} > /dev/null; then local install_pack+=${check_pack#*:}" "; fi +- done +- +- if [[ -n $install_pack ]]; then +- display_alert "Installing basic packages" "$install_pack" +- sudo bash -c "apt-get -qq update && apt-get install -qq -y --no-install-recommends $install_pack" +- fi +- +-} +- + # prepare_host + # + # * checks and installs necessary packages +@@ -139,10 +109,11 @@ prepare_host() { + # Skip verification if you are working offline + if ! $offline; then + +- # warning: apt-cacher-ng will fail if installed and used both on host and in +- # container/chroot environment with shared network ++ # warning: apt-cacher-ng will fail if installed and used both on host and in container/chroot environment with shared network + # set NO_APT_CACHER=yes to prevent installation errors in such case +- if [[ $NO_APT_CACHER != yes ]]; then host_dependencies+=("apt-cacher-ng"); fi ++ if [[ $NO_APT_CACHER != yes ]]; then ++ host_dependencies+=("apt-cacher-ng") ++ fi + + export EXTRA_BUILD_DEPS="" + call_extension_method "add_host_dependencies" <<- 'ADD_HOST_DEPENDENCIES' +@@ -150,17 +121,20 @@ prepare_host() { + you can add packages to install, space separated, to ${EXTRA_BUILD_DEPS} here. + ADD_HOST_DEPENDENCIES + +- # shellcheck disable=SC2206 # I wanna expand. later will convert to proper array +- if [ -n "${EXTRA_BUILD_DEPS}" ]; then host_dependencies+=(${EXTRA_BUILD_DEPS}); fi ++ if [ -n "${EXTRA_BUILD_DEPS}" ]; then ++ # shellcheck disable=SC2206 # I wanna expand. @TODO: later will convert to proper array ++ host_dependencies+=(${EXTRA_BUILD_DEPS}) ++ fi + + display_alert "Installing build dependencies" +- # don't prompt for apt cacher selection ++ ++ # don't prompt for apt cacher selection. this is to skip the prompt only, since we'll manage acng config later. + sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections + + # This handles the wanted list in $host_dependencies, updates apt only if needed + install_host_side_packages "${host_dependencies[@]}" + +- update-ccache-symlinks ++ run_host_command_logged update-ccache-symlinks + + export FINAL_HOST_DEPS="${host_dependencies[*]}" + call_extension_method "host_dependencies_ready" <<- 'HOST_DEPENDENCIES_READY' +@@ -170,13 +144,16 @@ prepare_host() { + are installed at this point. The system clock has not yet been synced. + HOST_DEPENDENCIES_READY + ++ # Manage apt-cacher-ng ++ acng_configure_and_restart_acng ++ + # sync clock + if [[ $SYNC_CLOCK != no ]]; then + display_alert "Syncing clock" "host" "info" +- ntpdate -s "${NTP_SERVER:-pool.ntp.org}" ++ run_host_command_logged ntpdate "${NTP_SERVER:-pool.ntp.org}" + fi + +- # create directory structure ++ # create directory structure # @TODO: this should be close to DEST, otherwise super-confusing + mkdir -p "${SRC}"/{cache,output} "${USERPATCHES_PATH}" + if [[ -n $SUDO_USER ]]; then + chgrp --quiet sudo cache output "${USERPATCHES_PATH}" +@@ -189,56 +166,8 @@ prepare_host() { + # @TODO: original: mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp + mkdir -p "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp + +- # build aarch64 +- if [[ $(dpkg --print-architecture) == amd64 ]]; then +- if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" != "yes" ]]; then +- +- # bind mount toolchain if defined +- if [[ -d "${ARMBIAN_CACHE_TOOLCHAIN_PATH}" ]]; then +- mountpoint -q "${SRC}"/cache/toolchain && umount -l "${SRC}"/cache/toolchain +- mount --bind "${ARMBIAN_CACHE_TOOLCHAIN_PATH}" "${SRC}"/cache/toolchain +- fi +- +- display_alert "Checking for external GCC compilers" "" "info" +- # download external Linaro compiler and missing special dependencies since they are needed for certain sources +- +- local toolchains=( +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz" +- "${ARMBIAN_MIRROR}/_toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" +- ) +- +- USE_TORRENT_STATUS=${USE_TORRENT} +- USE_TORRENT="no" +- for toolchain in ${toolchains[@]}; do +- download_and_verify "_toolchain" "${toolchain##*/}" +- done +- USE_TORRENT=${USE_TORRENT_STATUS} +- +- rm -rf "${SRC}"/cache/toolchain/*.tar.xz* +- local existing_dirs=($(ls -1 "${SRC}"/cache/toolchain)) +- for dir in ${existing_dirs[@]}; do +- local found=no +- for toolchain in ${toolchains[@]}; do +- local filename=${toolchain##*/} +- local dirname=${filename//.tar.xz/} +- [[ $dir == $dirname ]] && found=yes +- done +- if [[ $found == no ]]; then +- display_alert "Removing obsolete toolchain" "$dir" +- rm -rf "${SRC}/cache/toolchain/${dir}" +- fi +- done +- else +- display_alert "Ignoring toolchains" "SKIP_EXTERNAL_TOOLCHAINS: ${SKIP_EXTERNAL_TOOLCHAINS}" "info" +- fi +- fi ++ # Mostly deprecated. ++ download_external_toolchains + + fi # check offline + +@@ -252,8 +181,9 @@ prepare_host() { + fi + fi + +- [[ ! -f "${USERPATCHES_PATH}"/customize-image.sh ]] && cp "${SRC}"/config/templates/customize-image.sh.template "${USERPATCHES_PATH}"/customize-image.sh ++ [[ ! -f "${USERPATCHES_PATH}"/customize-image.sh ]] && run_host_command_logged cp -pv "${SRC}"/config/templates/customize-image.sh.template "${USERPATCHES_PATH}"/customize-image.sh + ++ # @TODO: what is this, and why? + if [[ ! -f "${USERPATCHES_PATH}"/README ]]; then + rm -f "${USERPATCHES_PATH}"/readme.txt + echo 'Please read documentation about customizing build configuration' > "${USERPATCHES_PATH}"/README +@@ -263,78 +193,13 @@ prepare_host() { + find "${SRC}"/patch -maxdepth 2 -type d ! -name . | sed "s%/.*patch%/$USERPATCHES_PATH%" | xargs mkdir -p + fi + +- # check free space (basic) +- local freespace=$(findmnt --target "${SRC}" -n -o AVAIL -b 2> /dev/null) # in bytes +- if [[ -n $freespace && $(($freespace / 1073741824)) -lt 10 ]]; then +- display_alert "Low free space left" "$(($freespace / 1073741824)) GiB" "wrn" ++ # check free space (basic) @TODO probably useful to refactor and implement in multiple spots. ++ local free_space_bytes ++ free_space_bytes=$(findmnt --target "${SRC}" -n -o AVAIL -b 2> /dev/null) # in bytes ++ if [[ -n $free_space_bytes && $((free_space_bytes / 1073741824)) -lt 10 ]]; then ++ display_alert "Low free space left" "$((free_space_bytes / 1073741824)) GiB" "wrn" + # pause here since dialog-based menu will hide this message otherwise + echo -e "Press \e[0;33m\x1B[0m to abort compilation, \e[0;33m\x1B[0m to ignore and continue" + read # @TODO: this fails if stdin is not a tty, or just hangs + fi + } +- +-# wait_for_package_manager +-# +-# * installation will break if we try to install when package manager is running +-# +-wait_for_package_manager() { +- # exit if package manager is running in the back +- while true; do +- if [[ "$( +- fuser /var/lib/dpkg/lock 2> /dev/null +- echo $? +- )" != 1 && "$( +- fuser /var/lib/dpkg/lock-frontend 2> /dev/null +- echo $? +- )" != 1 ]]; then +- display_alert "Package manager is running in the background." "Please wait! Retrying in 30 sec" "wrn" +- sleep 30 +- else +- break +- fi +- done +-} +- +-function fetch_and_build_host_tools() { +- call_extension_method "fetch_sources_tools" <<- 'FETCH_SOURCES_TOOLS' +- *fetch host-side sources needed for tools and build* +- Run early to fetch_from_repo or otherwise obtain sources for needed tools. +- FETCH_SOURCES_TOOLS +- +- call_extension_method "build_host_tools" <<- 'BUILD_HOST_TOOLS' +- *build needed tools for the build, host-side* +- After sources are fetched, build host-side tools needed for the build. +- BUILD_HOST_TOOLS +- +-} +- +-# Install the whitespace-delimited packages listed in the first parameter, in the host (not chroot). +-# It handles correctly the case where all wanted packages are already installed, and in that case does nothing. +-# If packages are to be installed, it does an apt-get update first. +-function install_host_side_packages() { +- declare wanted_packages_string +- declare -a currently_installed_packages missing_packages +- wanted_packages_string=${*} +- missing_packages=() +- # shellcheck disable=SC2207 # I wanna split, thanks. +- currently_installed_packages=($(dpkg-query --show --showformat='${Package} ')) +- for PKG_TO_INSTALL in ${wanted_packages_string}; do +- # shellcheck disable=SC2076 # I wanna match literally, thanks. +- if [[ ! " ${currently_installed_packages[*]} " =~ " ${PKG_TO_INSTALL} " ]]; then +- display_alert "Should install package" "${PKG_TO_INSTALL}" +- missing_packages+=("${PKG_TO_INSTALL}") +- fi +- done +- +- if [[ ${#missing_packages[@]} -gt 0 ]]; then +- display_alert "Updating apt host-side for installing packages" "${#missing_packages[@]} packages" "info" +- host_apt_get update +- display_alert "Installing host-side packages" "${missing_packages[*]}" "info" +- host_apt_get_install "${missing_packages[@]}" +- else +- display_alert "All host-side dependencies/packages already installed." "Skipping host-hide install" "debug" +- fi +- +- unset currently_installed_packages +- return 0 +-} +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index d4070c268..42610621d 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -8,13 +8,14 @@ function chroot_sdcard_apt_get_install_download_only() { + } + + function chroot_sdcard_apt_get() { ++ acng_check_status_or_restart # make sure apt-cacher-ng is running OK. ++ + local -a apt_params=("-${APT_OPTS:-y}") + [[ $NO_APT_CACHER != yes ]] && apt_params+=( + -o "Acquire::http::Proxy=\"http://${APT_PROXY_ADDR:-localhost:3142}\"" + -o "Acquire::http::Proxy::localhost=\"DIRECT\"" + ) + apt_params+=(-o "Dpkg::Use-Pty=0") # Please be quiet +- # IMPORTANT: this function returns the exit code of last statement, in this case chroot (which gets its result from bash which calls apt-get) + chroot_sdcard DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" + } + +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 9f526d9b9..3dc4feaaf 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -92,17 +92,14 @@ get_or_create_rootfs_cache_chroot_sdcard() { + fi + + mount_chroot "$SDCARD" +-} ############################################################################# ++} + + function create_new_rootfs_cache() { +- # @TODO: unify / remove this. distribuitions has the good stuff. +- # stage: debootstrap base system ++ # this is different between debootstrap and regular apt-get; here we use acng as a prefix to the real repo ++ local debootstrap_apt_mirror="http://${APT_MIRROR}" + if [[ $NO_APT_CACHER != yes ]]; then +- # apt-cacher-ng apt-get proxy parameter +- local apt_extra="-o Acquire::http::Proxy=\"http://${APT_PROXY_ADDR:-localhost:3142}\"" +- local apt_mirror="http://${APT_PROXY_ADDR:-localhost:3142}/$APT_MIRROR" +- else +- local apt_mirror="http://$APT_MIRROR" ++ local debootstrap_apt_mirror="http://${APT_PROXY_ADDR:-localhost:3142}/${APT_MIRROR}" ++ acng_check_status_or_restart + fi + + display_alert "Installing base system" "Stage 1/2" "info" +@@ -113,17 +110,18 @@ function create_new_rootfs_cache() { + ${PACKAGE_LIST_EXCLUDE:+ --exclude="${PACKAGE_LIST_EXCLUDE// /,}"} # exclude some + "--arch=${ARCH}" # the arch + "--components=${DEBOOTSTRAP_COMPONENTS}" # from aggregation? +- "--foreign" "${RELEASE}" "${SDCARD}/" "${apt_mirror}" # path and mirror ++ "--foreign" "${RELEASE}" "${SDCARD}/" "${debootstrap_apt_mirror}" # path and mirror + ) +- debootstrap "${deboostrap_arguments[@]}" 2>&1 || { # invoke debootstrap, stderr to stdout. ++ ++ run_host_command_logged debootstrap "${deboostrap_arguments[@]}" || { + exit_with_error "Debootstrap first stage failed" "${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" + } +- [[ ! -f $SDCARD/debootstrap/debootstrap ]] && exit_with_error "Debootstrap first stage did not produce marker file" ++ [[ ! -f ${SDCARD}/debootstrap/debootstrap ]] && exit_with_error "Debootstrap first stage did not produce marker file" + +- cp "/usr/bin/$QEMU_BINARY" "$SDCARD/usr/bin/" # @TODO: who cleans this up later? ++ run_host_command_logged cp -pv "/usr/bin/$QEMU_BINARY" "$SDCARD/usr/bin/" # @TODO: who cleans this up later? + + mkdir -p "${SDCARD}/usr/share/keyrings/" +- cp /usr/share/keyrings/*-archive-keyring.gpg "${SDCARD}/usr/share/keyrings/" ++ run_host_command_logged cp -pv /usr/share/keyrings/*-archive-keyring.gpg "${SDCARD}/usr/share/keyrings/" + + display_alert "Installing base system" "Stage 2/2" "info" + export MSG_IF_ERROR="Debootstrap second stage failed ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index fc06a5e35..a7cfb652b 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -240,18 +240,54 @@ source "${SRC}"/lib/functions/general/git.sh + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/host.sh +-# shellcheck source=lib/functions/general/host.sh +-source "${SRC}"/lib/functions/general/host.sh ++### lib/functions/general/repo.sh ++# shellcheck source=lib/functions/general/repo.sh ++source "${SRC}"/lib/functions/general/repo.sh + + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/repo.sh +-# shellcheck source=lib/functions/general/repo.sh +-source "${SRC}"/lib/functions/general/repo.sh ++### lib/functions/host/apt-cacher-ng.sh ++# shellcheck source=lib/functions/host/apt-cacher-ng.sh ++source "${SRC}"/lib/functions/host/apt-cacher-ng.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/host/basic-deps.sh ++# shellcheck source=lib/functions/host/basic-deps.sh ++source "${SRC}"/lib/functions/host/basic-deps.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/host/external-toolchains.sh ++# shellcheck source=lib/functions/host/external-toolchains.sh ++source "${SRC}"/lib/functions/host/external-toolchains.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/host/host-utils.sh ++# shellcheck source=lib/functions/host/host-utils.sh ++source "${SRC}"/lib/functions/host/host-utils.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/host/prepare-host.sh ++# shellcheck source=lib/functions/host/prepare-host.sh ++source "${SRC}"/lib/functions/host/prepare-host.sh + + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + +From 2c4ee50aabed7ad126f7ca80b870077672371a5d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 9 Mar 2022 13:20:25 +0100 +Subject: [PATCH] armbian-next: hostdeps: all toolchains via + `crossbuild-essential-arm64`/`armhf`/`amd64` + +- trying to sort out hostdeps for Jammy [WiP] +--- + lib/functions/general/host.sh | 41 +++++++++++++++++++++-------------------- + 1 file changed, 21 insertions(+), 20 deletions(-) + +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index aefa2d236..925e0d3aa 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -58,20 +58,30 @@ prepare_host() { + # packages list for host + # NOTE: please sync any changes here with the Dockerfile and Vagrantfile + declare -a host_dependencies=( +- acl aptly aria2 bc binfmt-support bison btrfs-progs +- build-essential ca-certificates ccache cpio cryptsetup curl ++ # big bag of stuff from before ++ acl aptly bc binfmt-support bison btrfs-progs ++ build-essential ca-certificates ccache cpio cryptsetup + debian-archive-keyring debian-keyring debootstrap device-tree-compiler + dialog dirmngr dosfstools dwarves f2fs-tools fakeroot flex gawk +- gcc-arm-linux-gnueabihf +- gcc-arm-linux-gnueabi gcc-arm-none-eabi +- gdisk gnupg1 gpg imagemagick jq kmod libbison-dev +- libc6-dev-armhf-cross libelf-dev libfdt-dev libfile-fcntllock-perl +- libfl-dev liblz4-tool libncurses-dev libpython2.7-dev libssl-dev +- libusb-1.0-0-dev linux-base locales lzop ncurses-base ncurses-term +- nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz pbzip2 ++ gnupg gpg imagemagick jq kmod libbison-dev ++ libelf-dev libfdt-dev libfile-fcntllock-perl ++ libfl-dev liblz4-tool libncurses-dev libssl-dev ++ libusb-1.0-0-dev linux-base locales ncurses-base ncurses-term ++ ntpdate patchutils + pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig +- systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip +- zlib1g-dev file ccze colorized-logs tree ++ systemd-container u-boot-tools udev uuid-dev whiptail ++ zlib1g-dev ++ ++ # non-mess below? ++ file ccze colorized-logs tree # logging utilities ++ unzip zip p7zip-full pigz pixz pbzip2 lzop # compressors et al ++ parted gdisk # partition tools ++ aria2 curl wget # downloaders et al ++ ++ # toolchains. NEW: using metapackages, allow us to have same list of all arches; brings both C and C++ compilers ++ crossbuild-essential-armhf ++ crossbuild-essential-arm64 ++ crossbuild-essential-amd64 + ) + + if [[ $(dpkg --print-architecture) == amd64 ]]; then +@@ -86,15 +96,6 @@ prepare_host() { + exit_with_error "Running this tool on non x86_64 or arm64 build host is not supported" + fi + +- # Add support for Ubuntu 20.04, 21.04 and Mint 20.x +- if [[ $HOSTRELEASE =~ ^(focal|impish|hirsute|ulyana|ulyssa|bullseye|uma)$ ]]; then +- host_dependencies+=(python2 python3) +- ln -fs /usr/bin/python2.7 /usr/bin/python2 +- ln -fs /usr/bin/python2.7 /usr/bin/python +- else +- host_dependencies+=("python" "libpython-dev") +- fi +- + display_alert "Build host OS release" "${HOSTRELEASE:-(unknown)}" "info" + + # Ubuntu 21.04.x (Hirsute) x86_64 is the only fully supported host OS release + +From c8a9f3aca890ed098b160bd060f11042d21ee711 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Mar 2022 16:19:49 +0100 +Subject: [PATCH] armbian-next: remove `eatmydata` usage, leftover from failed + tries to make git faster + +--- + lib/functions/general/git.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 2e51752bd..3af8a6b3e 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -8,7 +8,7 @@ improved_git() { + local delay=10 + local count=0 + while [ $count -lt $retries ]; do +- run_host_command_logged_raw eatmydata "$real_git" --no-pager "$@" && return 0 # this gobbles up errors, but returns if OK, so everything after is error ++ run_host_command_logged_raw "$real_git" --no-pager "$@" && return 0 # this gobbles up errors, but returns if OK, so everything after is error + count=$((count + 1)) + display_alert "improved_git try $count failed, retrying in ${delay} seconds" "git $*" "warn" + sleep $delay +@@ -19,7 +19,7 @@ improved_git() { + + # Not improved, just regular, but logged "correctly". + regular_git() { +- run_host_command_logged_raw eatmydata -- git --no-pager "$@" ++ run_host_command_logged_raw git --no-pager "$@" + } + + # avoid repeating myself too much + +From 5d4c5aa9320ab317f540415ddb5403538630bcfb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Mar 2022 03:13:29 +0100 +Subject: [PATCH] armbian-next: fix git origin check, recreate working copy if + origin does not match + +- fix cold bundle https download progress reporting +--- + lib/functions/general/git.sh | 30 +++++++++++++++++++++--------- + 1 file changed, 21 insertions(+), 9 deletions(-) + +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 8194e4758..2e51752bd 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -84,20 +84,32 @@ fetch_from_repo() { + + display_alert "Git working dir" "${git_work_dir}" "git" + +- # "Sanity check" since we only support one "origin" +- if [[ "$(git rev-parse --git-dir)" == ".git" && "$url" != *"$(git remote get-url origin | sed 's/^.*@//' | sed 's/^.*\/\///')" ]]; then +- exit_with_error "Remote URL does not match. Stopping!" "${git_work_dir} $dir $ref_name" "warn" ++ local expected_origin_url actual_origin_url ++ expected_origin_url="$(echo -n "${url}" | sed 's/^.*@//' | sed 's/^.*\/\///')" ++ ++ # Make sure the origin matches what is expected. If it doesn't, clean up and start again. ++ if [[ "$(git rev-parse --git-dir)" == ".git" ]]; then ++ actual_origin_url="$(git config remote.origin.url | sed 's/^.*@//' | sed 's/^.*\/\///')" ++ if [[ "${expected_origin_url}" != "${actual_origin_url}" ]]; then ++ display_alert "Remote git URL does not match, deleting working copy" "${git_work_dir} expected: '${expected_origin_url}' actual: '${actual_origin_url}'" "warn" ++ cd "${SRC}" || exit 3 # free up cwd ++ run_host_command_logged rm -rf "${git_work_dir}" # delete the dir ++ mkdir -p "${git_work_dir}" || exit_with_error "No path or no write permission" "${git_work_dir}" # recreate ++ cd "${git_work_dir}" || exit #reset cwd ++ fi + fi + + local do_warmup_remote="no" do_cold_bundle="no" do_add_origin="no" + + if [[ "$(git rev-parse --git-dir)" != ".git" ]]; then ++ # Dir is not a git working copy. Make it so. + display_alert "Creating local copy" "$dir $ref_name" + regular_git init -q --initial-branch="armbian_unused_initial_branch" . + offline=false # Force online, we'll need to fetch. + do_add_origin="yes" # Just created the repo, it needs an origin later. + do_warmup_remote="yes" # Just created the repo, mark it as ready to receive the warm remote if exists. + do_cold_bundle="yes" # Just created the repo, mark it as ready to receive a cold bundle if that is available. ++ # @TODO: possibly hang a cleanup handler here: if this fails, ${git_work_dir} should be removed. + fi + + local changed=false +@@ -166,7 +178,7 @@ fetch_from_repo() { + display_alert "Cleaning git dir" "$(git status -s 2> /dev/null | wc -l) files" # working directory is not clean, show it + + #fasthash_debug "before git checkout of $dir $ref_name" # fasthash interested in this +- regular_git checkout -f -q "${checkout_from}" # Return the files that are tracked by git to the initial state. ++ regular_git checkout -f -q "${checkout_from}" # Return the files that are tracked by git to the initial state. + + #fasthash_debug "before git clean of $dir $ref_name" + regular_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. +@@ -212,9 +224,9 @@ function git_fetch_from_bundle_file() { + + function download_git_bundle_from_http() { + local bundle_file="${1}" bundle_url="${2}" +- if [[ ! -f "${git_cold_bundle_cache_file}" ]]; then # Download the bundle file if it does not exist. +- display_alert "Downloading Git cold bundle via HTTP" "${bundle_url}" "info" # This gonna take a while. And waste bandwidth +- run_host_command_logged wget --continue --progress=giga --output-document="${bundle_file}" "${bundle_url}" ++ if [[ ! -f "${git_cold_bundle_cache_file}" ]]; then # Download the bundle file if it does not exist. ++ display_alert "Downloading Git cold bundle via HTTP" "${bundle_url}" "info" # This gonna take a while. And waste bandwidth ++ run_host_command_logged wget --continue --progress=dot:giga --output-document="${bundle_file}" "${bundle_url}" + else + display_alert "Cold bundle file exists, using it" "${bundle_file}" "git" + fi +@@ -295,7 +307,7 @@ function git_handle_cold_and_warm_bundle_remotes() { + regular_git remote add "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_URL}" # Add the remote to the warmup source + has_git_warm_remote=1 # mark as done. Will export the bundle! + +- improved_git_fetch --no-tags "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_BRANCH}" # Fetch the remote branch, but no tags ++ improved_git_fetch --no-tags "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_BRANCH}" # Fetch the remote branch, but no tags + display_alert "After warm bundle, working copy size" "$(du -h -s | awk '{print $1}')" "git" # Show size after bundle pull + + # Checkout that to a branch. We wanna have a local reference to what has been fetched. +@@ -304,7 +316,7 @@ function git_handle_cold_and_warm_bundle_remotes() { + regular_git branch "${git_warm_branch_name}" FETCH_HEAD || true + + improved_git_fetch "${GIT_WARM_REMOTE_NAME}" "'refs/tags/${GIT_WARM_REMOTE_FETCH_TAGS}:refs/tags/${GIT_WARM_REMOTE_FETCH_TAGS}'" || true # Fetch the remote branch, but no tags +- display_alert "After warm bundle tags, working copy size" "$(du -h -s | awk '{print $1}')" "git" # Show size after bundle pull ++ display_alert "After warm bundle tags, working copy size" "$(du -h -s | awk '{print $1}')" "git" # Show size after bundle pull + + # Lookup the tag (at the warm remote directly) to find the rev to shallow to. + if [[ "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" != "" ]]; then + +From 625031cd5797295e14494d7d2c986c7de9b6e15d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 15 Mar 2022 14:10:32 +0100 +Subject: [PATCH] armbian-next: finally consolidating logs into output/logs; + colorized HTML logs + +--- + lib/functions/cli/cli-entrypoint.sh | 3 +- + lib/functions/configuration/main-config.sh | 6 +-- + lib/functions/general/host.sh | 2 +- + lib/functions/logging/logging.sh | 60 +++++++++++++++++++++++++++++- + 4 files changed, 65 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 706d9a83a..5b905062f 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -91,7 +91,8 @@ function cli_entrypoint() { + export DESTIMG="${SRC}/.tmp/image-${ARMBIAN_BUILD_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept (not the final destination) + export LOGDIR="${SRC}/.tmp/logs-${ARMBIAN_BUILD_UUID}" # Will be initialized very soon, literally, below. + +- LOG_SECTION=entrypoint start_logging_section # This creates LOGDIR. Hopefully. ++ LOG_SECTION=entrypoint start_logging_section # This creates LOGDIR. ++ add_cleanup_handler trap_handler_cleanup_logging # cleanup handler for logs; it rolls it up from LOGDIR into DEST/logs + + # Source the extensions manager library at this point, before sourcing the config. + # This allows early calls to enable_extension(), but initialization proper is done later. +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 86a02b15e..6d2f404b1 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -50,10 +50,10 @@ function do_main_configuration() { + fi + + # image artefact destination with or without subfolder +- FINALDEST=$DEST/images ++ FINALDEST="${DEST}/images" + if [[ -n "${MAKE_FOLDERS}" ]]; then +- FINALDEST=$DEST/images/"${BOARD}"/"${MAKE_FOLDERS}" +- install -d ${FINALDEST} ++ FINALDEST="${DEST}"/images/"${BOARD}"/"${MAKE_FOLDERS}" ++ install -d "${FINALDEST}" + fi + + # TODO: fixed name can't be used for parallel image building +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 6053248b5..aefa2d236 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -71,7 +71,7 @@ prepare_host() { + nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz pbzip2 + pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig + systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip +- zlib1g-dev file ccze tree ++ zlib1g-dev file ccze colorized-logs tree + ) + + if [[ $(dpkg --print-architecture) == amd64 ]]; then +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 11db45e61..296b46ddb 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -27,7 +27,7 @@ function logging_error_show_log() { + + if [[ -f /usr/bin/ccze ]]; then # use 'ccze' to colorize the log, making errors a lot more obvious. + # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. +- cat "${logfile_to_show}" | grep -v -e "^$" | /usr/bin/ccze -A | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! ++ cat "${logfile_to_show}" | grep -v -e "^$" | /usr/bin/ccze -o nolookups -A | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! + else + # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. + cat "${logfile_to_show}" | grep -v -e "^$" | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! +@@ -262,3 +262,61 @@ function logging_echo_prefix_for_pv() { + return 0 + + } ++ ++# Cleanup for logging. ++function trap_handler_cleanup_logging() { ++ [[ ! -d "${LOGDIR}" ]] && return 0 ++ display_alert "Cleaning up logs from LOGDIR" "${LOGDIR}" "debug" ++ ++ # Just delete LOGDIR if in CONFIG_DEFS_ONLY mode. ++ if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then ++ display_alert "Discarding logs" "CONFIG_DEFS_ONLY=${CONFIG_DEFS_ONLY}" "debug" ++ rm -rf --one-file-system "${LOGDIR}" ++ return 0 ++ fi ++ ++ local target_path="${DEST}/logs" ++ mkdir -p "${target_path}" ++ local target_file="${target_path}/armbian-logs-${ARMBIAN_BUILD_UUID}.html" ++ ++ cat <<- HTML_HEADER > "${target_file}" ++ ++ ++ Armbian logs for ${ARMBIAN_BUILD_UUID} ++ ++ ++ ++ HTML_HEADER ++ ++ # Find and sort the files there, store in array one per logfile ++ declare -a logfiles_array ++ mapfile -t logfiles_array < <(find "${LOGDIR}" -type f | LC_ALL=C sort -h) ++ ++ for logfile_full in "${logfiles_array[@]}"; do ++ local logfile_base="$(basename "${logfile_full}")" ++ if [[ -f /usr/bin/ccze ]] && [[ -f /usr/bin/ansi2html ]]; then ++ cat <<- HTML_ONE_LOGFILE_WITH_CCZE >> "${target_file}" ++

${logfile_base}

++
++ $(cat "${logfile_full}" | ccze -o nolookups --raw-ansi | ansi2html --no-wrap --no-header) ++
++
++ HTML_ONE_LOGFILE_WITH_CCZE ++ else ++ cat <<- HTML_ONE_LOGFILE_NO_CCZE >> "${target_file}" ++

${logfile_base}

++
$(cat "${logfile_full}")
++ HTML_ONE_LOGFILE_NO_CCZE ++ fi ++ done ++ ++ cat <<- HTML_FOOTER >> "${target_file}" ++ ++ HTML_FOOTER ++ ++ rm -rf --one-file-system "${LOGDIR}" ++ display_alert "Build log file" "${target_file}" ++} + +From 58e643c14a0b527d25856938bfc219835984e83d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 15 Mar 2022 11:30:55 +0100 +Subject: [PATCH] armbian-next: introduce `do_with_retries()` and use it for + apt remote operations during image build + +--- + lib/functions/logging/runners.sh | 15 +++++++++++++++ + lib/functions/rootfs/create-cache.sh | 13 +++++++++---- + 2 files changed, 24 insertions(+), 4 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index a0f396cc7..d4070c268 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -163,3 +163,18 @@ function run_host_command_logged_raw() { + run_on_sdcard() { + chroot_sdcard "${@}" + } ++ ++# Auto retries the number of times passed on first argument to run all the other arguments. ++function do_with_retries() { ++ local retries="${1}" ++ shift ++ local counter=0 ++ while [[ $counter -lt $retries ]]; do ++ counter=$((counter + 1)) ++ "$@" && return 0 # execute and return 0 if success; if not, let it loop; ++ display_alert "Command failed, retrying in 5s" "$*" "warn" ++ sleep 5 ++ done ++ display_alert "Command failed ${counter} times, giving up" "$*" "warn" ++ return 1 ++} +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index b833ae3c8..9f526d9b9 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -170,11 +170,11 @@ function create_new_rootfs_cache() { + + # stage: update packages list + display_alert "Updating package list" "$RELEASE" "info" +- chroot_sdcard_apt_get update ++ do_with_retries 3 chroot_sdcard_apt_get update + + # stage: upgrade base packages from xxx-updates and xxx-backports repository branches + display_alert "Upgrading base packages" "Armbian" "info" +- chroot_sdcard_apt_get upgrade ++ do_with_retries 3 chroot_sdcard_apt_get upgrade + + # Myy: Dividing the desktop packages installation steps into multiple + # ones. We first install the "ADDITIONAL_PACKAGES" in order to get +@@ -186,8 +186,9 @@ function create_new_rootfs_cache() { + display_alert "Installing the main packages for" "Armbian" "info" + export MSG_IF_ERROR="Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" + # First, try to download-only up to 3 times, to work around network/proxy problems. +- chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" || chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" || chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" +- # Now do the install. ++ do_with_retries 3 chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" ++ ++ # Now do the install, all packages should have been downloaded by now + chroot_sdcard_apt_get_install "$PACKAGE_MAIN_LIST" + + if [[ $BUILD_DESKTOP == "yes" ]]; then +@@ -211,6 +212,10 @@ function create_new_rootfs_cache() { + + display_alert "Installing the desktop packages for" "Armbian" "info" + MSG_IF_ERROR="Installation of Armbian desktop packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" ++ # Retry download-only 3 times first. ++ do_with_retries 3 chroot_sdcard_apt_get_install_download_only ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP ++ ++ # Then do the actual install. + chroot_sdcard_apt_get install ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP + fi + + +From ff3ccab39db2e364feb16b583c973d6d305c69d5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 7 Mar 2022 09:42:57 +0100 +Subject: [PATCH] armbian-next: another round of logging tuning/fixes; log + assets; git logging + +- introduce `do_with_log_asset()` and `LOG_ASSET=xxx` +- separate "git" logging level +- add `trap_handler_cleanup_destimg()` to cleanup DESTIMG +--- + lib/functions/cli/cli-entrypoint.sh | 2 +- + lib/functions/compilation/kernel-debs.sh | 32 +++++++++-------- + lib/functions/compilation/patch/fasthash.sh | 8 ++--- + lib/functions/configuration/main-config.sh | 4 +-- + lib/functions/general/git.sh | 55 ++++++++++++++--------------- + lib/functions/image/initrd.sh | 2 +- + lib/functions/image/rootfs-to-image.sh | 27 ++++++++++---- + lib/functions/logging/logging.sh | 29 +++++++++++---- + lib/functions/main/default-build.sh | 2 +- + lib/functions/main/rootfs-image.sh | 4 +-- + lib/functions/rootfs/distro-agnostic.sh | 1 + + 11 files changed, 99 insertions(+), 67 deletions(-) + +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 3b8c1ad7d..706d9a83a 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -88,7 +88,7 @@ function cli_entrypoint() { + export SDCARD="${SRC}/.tmp/rootfs-${ARMBIAN_BUILD_UUID}" # SDCARD (which is NOT an sdcard, but will be, maybe, one day) is where we work the rootfs before final imaging. "rootfs" stage. + export MOUNT="${SRC}/.tmp/mount-${ARMBIAN_BUILD_UUID}" # MOUNT ("mounted on the loop") is the mounted root on final image (via loop). "image" stage + export EXTENSION_MANAGER_TMP_DIR="${SRC}/.tmp/extensions-${ARMBIAN_BUILD_UUID}" # EXTENSION_MANAGER_TMP_DIR used to store extension-composed functions +- export DESTIMG="${SRC}/.tmp/image-${ARMBIAN_BUILD_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept ++ export DESTIMG="${SRC}/.tmp/image-${ARMBIAN_BUILD_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept (not the final destination) + export LOGDIR="${SRC}/.tmp/logs-${ARMBIAN_BUILD_UUID}" # Will be initialized very soon, literally, below. + + LOG_SECTION=entrypoint start_logging_section # This creates LOGDIR. Hopefully. +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index 9d1b813d3..b8eb9d266 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -51,10 +51,10 @@ function prepare_kernel_packaging_debs() { + #display_alert "Kernel install dir" "incoming from KBUILD make" "debug" + #run_host_command_logged tree -C --du -h "${kernel_dest_install_dir}" "| grep --line-buffered -v -e '\.ko' -e '\.h' " + +- display_alert "tmp_kernel_install_dirs INSTALL_PATH:" "${tmp_kernel_install_dirs[INSTALL_PATH]}" "debug" +- display_alert "tmp_kernel_install_dirs INSTALL_MOD_PATH:" "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}" "debug" +- display_alert "tmp_kernel_install_dirs INSTALL_HDR_PATH:" "${tmp_kernel_install_dirs[INSTALL_HDR_PATH]}" "debug" +- display_alert "tmp_kernel_install_dirs INSTALL_DTBS_PATH:" "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "debug" ++ # display_alert "tmp_kernel_install_dirs INSTALL_PATH:" "${tmp_kernel_install_dirs[INSTALL_PATH]}" "debug" ++ # display_alert "tmp_kernel_install_dirs INSTALL_MOD_PATH:" "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}" "debug" ++ # display_alert "tmp_kernel_install_dirs INSTALL_HDR_PATH:" "${tmp_kernel_install_dirs[INSTALL_HDR_PATH]}" "debug" ++ # display_alert "tmp_kernel_install_dirs INSTALL_DTBS_PATH:" "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "debug" + + # package the linux-image (image, modules, dtbs (if present)) + create_kernel_deb "linux-image-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_image +@@ -77,8 +77,8 @@ function create_kernel_deb() { + declare callback_function="${3}" + + declare package_directory +- package_directory=$(mktemp -d "${WORKDIR}/${package_name}.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. +- display_alert "package_directory" "${package_directory}" "debug" ++ package_directory=$(mktemp -d "${WORKDIR}/${package_name}.XXXXXXXXX") # explicitly created in WORKDIR, so is protected by that cleanup trap already ++ #display_alert "package_directory" "${package_directory}" "debug" + + declare package_DEBIAN_dir="${package_directory}/DEBIAN" # DEBIAN dir + mkdir -p "${package_DEBIAN_dir}" # maintainer scripts et al +@@ -105,7 +105,7 @@ function create_kernel_deb() { + COPYRIGHT + + # Run the callback. +- display_alert "Running callback" "callback: ${callback_function}" "debug" ++ # display_alert "Running callback" "callback: ${callback_function}" "debug" + "${callback_function}" "${@}" + + run_host_command_logged chown -R root:root "${package_directory}" # Fix ownership and permissions +@@ -116,7 +116,7 @@ function create_kernel_deb() { + cd "${package_directory}" || exit_with_error "major failure 774 for ${package_name}" + + # create md5sums file +- sh -c "cd '${package_directory}'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums" ++ # sh -c "cd '${package_directory}'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums" + + declare unpacked_size + unpacked_size="$(du -h -s "${package_directory}" | awk '{print $1}')" +@@ -135,23 +135,25 @@ function kernel_package_hook_helper() { + + cat >> "${package_DEBIAN_dir}/${script}" <<- EOT + #!/bin/bash +- echo "Armbian ${package_name} for ${kernel_version_family}: ${script} starting." ++ echo "Armbian '${package_name}' for '${kernel_version_family}': '${script}' starting." + set -e # Error control + set -x # Debugging + + $(cat "${contents}") + +- echo "Armbian ${package_name} for ${kernel_version_family}: ${script} finishing." ++ set +x # Disable debugging ++ echo "Armbian '${package_name}' for '${kernel_version_family}': '${script}' finishing." + true + EOT + chmod 775 "${package_DEBIAN_dir}/${script}" + +- display_alert "Hook debug" "${script} for ${package_name}" "debug" +- run_host_command_logged cat "${package_DEBIAN_dir}/${script}" ++ # produce log asset for script ++ LOG_ASSET="deb-${package_name}-${script}.sh" do_with_log_asset run_host_command_logged cat "${package_DEBIAN_dir}/${script}" ++ + } + + function kernel_package_callback_linux_image() { +- display_alert "package_directory" "${package_directory}" "debug" ++ display_alert "linux-image deb packaging" "${package_directory}" "debug" + + declare installed_image_path="boot/vmlinuz-${kernel_version_family}" # using old mkdebian terminology here. + declare image_name="Image" # for arm64. or, "zImage" for arm, or "vmlinuz" for others. Why? See where u-boot puts them. +@@ -217,7 +219,7 @@ function kernel_package_callback_linux_image() { + } + + function kernel_package_callback_linux_dtb() { +- display_alert "package_directory" "${package_directory}" "debug" ++ display_alert "linux-dtb packaging" "${package_directory}" "debug" + + mkdir -p "${package_directory}/boot/" + run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "${package_directory}/boot/dtb-${kernel_version_family}" +@@ -251,7 +253,7 @@ function kernel_package_callback_linux_dtb() { + } + + function kernel_package_callback_linux_headers() { +- display_alert "package_directory for headers" "${package_directory}" "debug" ++ display_alert "linux-headers packaging" "${package_directory}" "debug" + + # targets. + local headers_target_dir="${package_directory}/usr/src/linux-headers-${kernel_version_family}" # headers/tools etc +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index 0e74b1c79..771837b89 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -34,13 +34,13 @@ function finish_fasthash() { + } + + function fasthash_debug() { +- if [[ "${SHOW_FASTHASH}" != "yes" ]]; then # enable debug for many, many debugging msgs ++ if [[ "${SHOW_FASTHASH}" != "yes" ]]; then + return 0 + fi + display_alert "fasthash_debug" "$*" "fasthash" +- find . -type f -printf '%T@ %p\n' | +- grep -v -e "\.ko" -e "\.o" -e "\.cmd" -e "\.mod" -e "\.a" -e "\.tmp" -e "\.dtb" -e ".scr" -e "\.\/debian" | +- sort -n | tail -n 10 1>&2 ++ run_host_command_logged find . -type f -printf "'%T@ %p\\n'" "|" \ ++ grep -v -e "\.ko" -e "\.o" -e "\.cmd" -e "\.mod" -e "\.a" -e "\.tmp" -e "\.dtb" -e ".scr" -e "\.\/debian" "|" \ ++ sort -n "|" tail -n 10 + } + + function get_file_modification_time() { # @TODO: This is almost always called from a subshell. No use throwing errors? +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index bea0c0efa..86a02b15e 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -417,7 +417,7 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + display_alert "Done with main-config.sh" "do_main_configuration" "debug" + } + +-# This is called by main_default_build_single(), which is logged correctly. so just output to stdout here. ++# This is called by main_default_build_single() but declared here for 'convenience' + function write_config_summary_output_file() { + local debug_dpkg_arch debug_uname debug_virt debug_src_mount debug_src_perms debug_src_temp_perms + debug_dpkg_arch="$(dpkg --print-architecture)" +@@ -428,7 +428,7 @@ function write_config_summary_output_file() { + debug_src_temp_perms="$(getfacl -p "${SRC}"/.tmp 2> /dev/null)" + + display_alert "Writing build config summary to" "debug log" "debug" +- run_host_command_logged cat <<- EOF ++ LOG_ASSET="build.summary.txt" do_with_log_asset run_host_command_logged cat <<- EOF + ## BUILD SCRIPT ENVIRONMENT + + Repository: $REPOSITORY_URL +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 85dd4470f..8194e4758 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -41,7 +41,7 @@ function improved_git_fetch() { + # : "yes" to create subdirectory for tag or branch name + # + fetch_from_repo() { +- display_alert "fetch_from_repo" "$*" "debug" ++ display_alert "fetch_from_repo" "$*" "git" + local url=$1 + local dir=$2 + local ref=$3 +@@ -74,7 +74,7 @@ fetch_from_repo() { + + # if GIT_FIXED_WORKDIR has something, ignore above logic and use that directly. + if [[ "${GIT_FIXED_WORKDIR}" != "" ]]; then +- display_alert "GIT_FIXED_WORKDIR is set to" "${GIT_FIXED_WORKDIR}" "debug" ++ display_alert "GIT_FIXED_WORKDIR is set to" "${GIT_FIXED_WORKDIR}" "git" + git_work_dir="${SRC}/cache/sources/${GIT_FIXED_WORKDIR}" + fi + +@@ -82,7 +82,7 @@ fetch_from_repo() { + + cd "${git_work_dir}" || exit + +- display_alert "Git working dir" "${git_work_dir}" "debug" ++ display_alert "Git working dir" "${git_work_dir}" "git" + + # "Sanity check" since we only support one "origin" + if [[ "$(git rev-parse --git-dir)" == ".git" && "$url" != *"$(git remote get-url origin | sed 's/^.*@//' | sed 's/^.*\/\///')" ]]; then +@@ -134,7 +134,7 @@ fetch_from_repo() { + ;; + esac + +- display_alert "Git local_hash vs remote_hash" "${local_hash} vs ${remote_hash}" "debug" ++ display_alert "Git local_hash vs remote_hash" "${local_hash} vs ${remote_hash}" "git" + + fi # offline + +@@ -154,21 +154,21 @@ fetch_from_repo() { + tag) improved_git_fetch --no-tags origin tags/"${ref_name}" ;; + head) improved_git_fetch --no-tags origin HEAD ;; + esac +- display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size again ++ display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "git" + checkout_from="FETCH_HEAD" + fi + + # should be declared in outside scope, so can be read. + checked_out_revision_mtime="$(git log --date='format:%Y%m%d%H%M%S' --format='format:%ad' -1 "${checkout_from}")" + checked_out_revision_ts="$(git log -1 --pretty=%ct "${checkout_from}")" +- display_alert "checked_out_revision_mtime set!" "${checked_out_revision_mtime} - ${checked_out_revision_ts}" "debug" ++ display_alert "checked_out_revision_mtime set!" "${checked_out_revision_mtime} - ${checked_out_revision_ts}" "git" + + display_alert "Cleaning git dir" "$(git status -s 2> /dev/null | wc -l) files" # working directory is not clean, show it + +- fasthash_debug "before git checkout of $dir $ref_name" # fasthash interested in this ++ #fasthash_debug "before git checkout of $dir $ref_name" # fasthash interested in this + regular_git checkout -f -q "${checkout_from}" # Return the files that are tracked by git to the initial state. + +- fasthash_debug "before git clean of $dir $ref_name" ++ #fasthash_debug "before git clean of $dir $ref_name" + regular_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. + + # set the checkout date on all the versioned files. +@@ -194,8 +194,8 @@ fetch_from_repo() { + done + fi + +- display_alert "Final working copy size" "$(du -h -s | awk '{print $1}')" "debug" +- fasthash_debug "at the end of fetch_from_repo $dir $ref_name" ++ display_alert "Final working copy size" "$(du -h -s | awk '{print $1}')" "git" ++ #fasthash_debug "at the end of fetch_from_repo $dir $ref_name" + } + + function git_fetch_from_bundle_file() { +@@ -203,20 +203,20 @@ function git_fetch_from_bundle_file() { + regular_git bundle verify "${bundle_file}" # Make sure bundle is valid. + regular_git remote add "${remote_name}" "${bundle_file}" # Add the remote pointing to the cold bundle file + if [[ -f "${shallow_file}" ]]; then +- display_alert "Bundle is shallow" "${shallow_file}" "debug" ++ display_alert "Bundle is shallow" "${shallow_file}" "git" + cp -p "${shallow_file}" ".git/shallow" + fi + improved_git_fetch --tags "${remote_name}" # Fetch it! (including tags!) +- display_alert "Bundle fetch '${remote_name}' completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" ++ display_alert "Bundle fetch '${remote_name}' completed, working copy size" "$(du -h -s | awk '{print $1}')" "git" + } + + function download_git_bundle_from_http() { + local bundle_file="${1}" bundle_url="${2}" + if [[ ! -f "${git_cold_bundle_cache_file}" ]]; then # Download the bundle file if it does not exist. +- display_alert "Downloading cold bundle from remote server" "${bundle_url}" "debug" # This gonna take a while. And waste bandwidth +- run_host_command_logged wget --continue --output-document="${bundle_file}" "${bundle_url}" # @TODO: progress giga? ++ display_alert "Downloading Git cold bundle via HTTP" "${bundle_url}" "info" # This gonna take a while. And waste bandwidth ++ run_host_command_logged wget --continue --progress=giga --output-document="${bundle_file}" "${bundle_url}" + else +- display_alert "Cold bundle file exists, using it" "${bundle_file}" "debug" ++ display_alert "Cold bundle file exists, using it" "${bundle_file}" "git" + fi + } + +@@ -254,13 +254,13 @@ function git_handle_cold_and_warm_bundle_remotes() { + git_warm_remote_bundle_file="${git_warm_remote_bundle_cache_dir}/${GIT_WARM_REMOTE_BUNDLE}${git_warm_remote_bundle_extra_fn}.gitbundle" # final filename of bundle + git_warm_remote_bundle_file_shallowfile="${git_warm_remote_bundle_file}.shallow" # it can be there's a shallow revision + if [[ -f "${git_warm_remote_bundle_file}" ]]; then +- display_alert "Fetching from Warm git bundle, wait" "${GIT_WARM_REMOTE_BUNDLE}" "info" # This is gonna take a long while... ++ display_alert "Fetching from warm git bundle, wait" "${GIT_WARM_REMOTE_BUNDLE}" "info" # This is gonna take a long while... + git_fetch_from_bundle_file "${git_warm_remote_bundle_file}" "${GIT_WARM_REMOTE_NAME}" "${git_warm_remote_bundle_file_shallowfile}" + do_cold_bundle="no" # Skip the cold bundle, below. + do_warmup_remote="no" # Skip the warm bundle creation, below, too. + has_git_warm_remote=1 # mark warm remote as added. + else +- display_alert "Could not find warm bundle file" "${git_warm_remote_bundle_file}" "debug" ++ display_alert "Could not find warm bundle file" "${git_warm_remote_bundle_file}" "git" + fi + fi + fi +@@ -272,7 +272,6 @@ function git_handle_cold_and_warm_bundle_remotes() { + # - do nothing else with this, it'll be used internally by git to avoid a huge fetch later. + # - but, after this, the wanted branch will be fetched. signal has_git_cold_remote=1 for later. + if [[ "${GIT_COLD_BUNDLE_URL}" != "" ]]; then +- display_alert "There's a " "${GIT_COLD_BUNDLE_URL} -- ${git_cold_bundle_id} -- file: ${git_cold_bundle_cache_file}" "debug" # @TODO: remove + local git_cold_bundle_id git_cold_bundle_cache_dir git_cold_bundle_cache_file git_cold_bundle_remote_name + git_cold_bundle_cache_dir="${SRC}/cache/gitbundles/cold" # calculate the id, dir and name of local file and remote + git_cold_bundle_id="$(echo -n "${GIT_COLD_BUNDLE_URL}" | md5sum | awk '{print $1}')" # md5 of the URL. +@@ -292,12 +291,12 @@ function git_handle_cold_and_warm_bundle_remotes() { + if [[ "${do_warmup_remote}" == "yes" ]]; then + if [[ "${GIT_WARM_REMOTE_NAME}" != "" ]] && [[ "${GIT_WARM_REMOTE_URL}" != "" ]] && [[ "${GIT_WARM_REMOTE_BRANCH}" != "" ]]; then + +- display_alert "Using Warmup Remote before origin fetch" "${GIT_WARM_REMOTE_NAME} - ${GIT_WARM_REMOTE_BRANCH}" "debug" ++ display_alert "Using Warmup Remote before origin fetch" "${GIT_WARM_REMOTE_NAME} - ${GIT_WARM_REMOTE_BRANCH}" "git" + regular_git remote add "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_URL}" # Add the remote to the warmup source + has_git_warm_remote=1 # mark as done. Will export the bundle! + + improved_git_fetch --no-tags "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_BRANCH}" # Fetch the remote branch, but no tags +- display_alert "After warm bundle, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ display_alert "After warm bundle, working copy size" "$(du -h -s | awk '{print $1}')" "git" # Show size after bundle pull + + # Checkout that to a branch. We wanna have a local reference to what has been fetched. + # @TODO: could be a param instead of FETCH_HEAD; would drop commits after that rev +@@ -305,18 +304,18 @@ function git_handle_cold_and_warm_bundle_remotes() { + regular_git branch "${git_warm_branch_name}" FETCH_HEAD || true + + improved_git_fetch "${GIT_WARM_REMOTE_NAME}" "'refs/tags/${GIT_WARM_REMOTE_FETCH_TAGS}:refs/tags/${GIT_WARM_REMOTE_FETCH_TAGS}'" || true # Fetch the remote branch, but no tags +- display_alert "After warm bundle tags, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ display_alert "After warm bundle tags, working copy size" "$(du -h -s | awk '{print $1}')" "git" # Show size after bundle pull + + # Lookup the tag (at the warm remote directly) to find the rev to shallow to. + if [[ "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" != "" ]]; then +- display_alert "GIT_WARM_REMOTE_SHALLOW_AT_TAG" "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" "debug" ++ display_alert "GIT_WARM_REMOTE_SHALLOW_AT_TAG" "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" "git" + GIT_WARM_REMOTE_SHALLOW_AT_DATE="$(git tag --list --format="%(creatordate)" "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}")" +- display_alert "GIT_WARM_REMOTE_SHALLOW_AT_TAG ${GIT_WARM_REMOTE_SHALLOW_AT_TAG} resulted in GIT_WARM_REMOTE_SHALLOW_AT_DATE" "Date: ${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" "debug" ++ display_alert "GIT_WARM_REMOTE_SHALLOW_AT_TAG ${GIT_WARM_REMOTE_SHALLOW_AT_TAG} resulted in GIT_WARM_REMOTE_SHALLOW_AT_DATE" "Date: ${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" "git" + fi + + # At this stage, we might wanna make the local copy shallow and re-pack it. + if [[ "${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" != "" ]]; then +- display_alert "Making working copy shallow" "before date ${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" "debug" ++ display_alert "Making working copy shallow" "before date ${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" "info" + + # 'git clone' is the only consistent, usable thing we can do to do this. + # it does require a temporary dir, though. use one. +@@ -329,7 +328,7 @@ function git_handle_cold_and_warm_bundle_remotes() { + --tags --shallow-since="${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" \ + "file://${git_work_dir}" "${temp_git_dir}" + +- display_alert "After shallow clone, temp_git_dir" "$(du -h -s "${temp_git_dir}" | awk '{print $1}')" "debug" # Show size after shallow ++ display_alert "After shallow clone, temp_git_dir" "$(du -h -s "${temp_git_dir}" | awk '{print $1}')" "git" # Show size after shallow + + # Get rid of original, replace with new. Move cwd so no warnings are produced. + cd "${SRC}" || exit_with_error "Failed to move cwd away so we can remove" "${git_work_dir}" +@@ -342,18 +341,18 @@ function git_handle_cold_and_warm_bundle_remotes() { + has_git_cold_remote=0 + has_git_warm_remote=0 + +- display_alert "After shallow, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after shallow ++ display_alert "After shallow, working copy size" "$(du -h -s | awk '{print $1}')" "git" # Show size after shallow + fi + + # Now git working copy has a precious state we might wanna preserve (export the bundle). + if [[ "${GIT_WARM_REMOTE_BUNDLE}" != "" ]]; then + mkdir -p "${git_warm_remote_bundle_cache_dir}" +- display_alert "Exporting warm remote bundle" "${git_warm_remote_bundle_file}" "debug" ++ display_alert "Exporting warm remote bundle" "${git_warm_remote_bundle_file}" "info" + regular_git bundle create "${git_warm_remote_bundle_file}" --all + + rm -f "${git_warm_remote_bundle_file_shallowfile}" # not shallow at first... + if [[ -f ".git/shallow" ]]; then +- display_alert "Exported bundle is shallow" "Will copy to ${git_warm_remote_bundle_file_shallowfile}" "debug" ++ display_alert "Exported bundle is shallow" "Will copy to ${git_warm_remote_bundle_file_shallowfile}" "git" + cp -p ".git/shallow" "${git_warm_remote_bundle_file_shallowfile}" + fi + +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index de431cbbc..feb4143c8 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -23,7 +23,7 @@ update_initramfs() { + cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ + mount_chroot "$chroot_target/" + +- local logging_filter="2>&1 | grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary ' -e 'Adding module ' " ++ local logging_filter="2>&1 | grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary ' -e 'Adding module ' -e 'Adding firmware ' " + chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" "${logging_filter}" || { + exit_with_error "Updating initramfs FAILED" + } +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index d38a14ad1..85dc86f9c 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -10,9 +10,13 @@ + # + create_image_from_sdcard_rootfs() { + # create DESTIMG, hooks might put stuff there early. +- mkdir -p $DESTIMG ++ mkdir -p "${DESTIMG}" ++ ++ # add a cleanup trap hook do make sure we don't leak it if stuff fails ++ add_cleanup_handler trap_handler_cleanup_destimg + + # stage: create file name ++ # @TODO: rpardini: determine the image file name produced. a bit late in the game, since it uses VER which is from the kernel package. + local version="${VENDOR}_${REVISION}_${BOARD^}_${RELEASE}_${BRANCH}_${VER/-$LINUXFAMILY/}${DESKTOP_ENVIRONMENT:+_$DESKTOP_ENVIRONMENT}" + [[ $BUILD_DESKTOP == yes ]] && version=${version}_desktop + [[ $BUILD_MINIMAL == yes ]] && version=${version}_minimal +@@ -66,11 +70,11 @@ create_image_from_sdcard_rootfs() { + # stage: write u-boot, unless the deb is not there, which would happen if BOOTCONFIG=none + # exception: if we use the one from repository, install version which was downloaded from repo + if [[ -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]] || [[ -n $UBOOT_REPO_VERSION ]]; then +- write_uboot_to_loop_image $LOOP ++ write_uboot_to_loop_image "${LOOP}" + fi + + # fix wrong / permissions +- chmod 755 $MOUNT ++ chmod 755 "${MOUNT}" + + call_extension_method "pre_umount_final_image" "config_pre_umount_final_image" << 'PRE_UMOUNT_FINAL_IMAGE' + *allow config to hack into the image before the unmount* +@@ -95,10 +99,13 @@ PRE_UMOUNT_FINAL_IMAGE + losetup -d "${LOOP}" + unset LOOP # unset so cleanup handler does not try it again + +- # Don't delete $DESTIMG here, extensions might have put nice things there already. ++ # We're done with ${MOUNT} by now, remove it. + rm -rf --one-file-system "${MOUNT}" ++ unset MOUNT + + mkdir -p "${DESTIMG}" ++ # @TODO: misterious cwd, who sets it? ++ + mv "${SDCARD}.raw" "${DESTIMG}/${version}.img" + + # custom post_build_image_modify hook to run before fingerprinting and compression +@@ -119,11 +126,17 @@ PRE_UMOUNT_FINAL_IMAGE + POST_BUILD_IMAGE + + # move artefacts from temporally directory to its final destination +- [[ -n $compression_type ]] && rm $DESTIMG/${version}.img +- rsync -a --no-owner --no-group --remove-source-files $DESTIMG/${version}* ${FINALDEST} +- rm -rf --one-file-system $DESTIMG ++ [[ -n $compression_type ]] && rm "${DESTIMG}/${version}.img" ++ rsync -a --no-owner --no-group --remove-source-files "${DESTIMG}/${version}"* "${FINALDEST}" ++ rm -rf --one-file-system "${DESTIMG}" + + # write image to SD card + write_image_to_device "${FINALDEST}/${version}.img" "${CARD_DEVICE}" + + } ++ ++function trap_handler_cleanup_destimg() { ++ [[ ! -d "${DESTIMG}" ]] && return 0 ++ display_alert "Cleaning up temporary DESTIMG" "${DESTIMG}" "debug" ++ rm -rf --one-file-system "${DESTIMG}" ++} +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 2ead6b949..11db45e61 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -87,7 +87,7 @@ function do_with_logging() { + + if [[ "${SHOW_LOG}" == "yes" ]]; then + local prefix_sed_contents +- prefix_sed_contents="$(logging_echo_prefix_for_pv "tool") $(echo -n -e "${tool_color}")" ++ prefix_sed_contents="$(logging_echo_prefix_for_pv "tool") $(echo -n -e "${tool_color}")" # spaces are significant + local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" + + # This is sick. Create a 3rd file descriptor sending it to sed. https://unix.stackexchange.com/questions/174849/redirecting-stdout-to-terminal-and-file-without-using-a-pipe +@@ -95,7 +95,8 @@ function do_with_logging() { + exec 3> >( + cd "${SRC}" || exit 2 + #grep --line-buffered -v "^$" | \ +- # @TODO: tee to CURRENT_LOGFILE. ++ # @TODO: tee to CURRENT_LOGFILE. @TODO this is essential. if this does not work whole thing comes down ++ + sed -u -e "${prefix_sed_cmd}" + ) + "$@" >&3 +@@ -110,6 +111,14 @@ function do_with_logging() { + return 0 + } + ++# This takes LOG_ASSET, which can and should include an extension. ++function do_with_log_asset() { ++ # @TODO: check that CURRENT_LOGGING_COUNTER is set, otherwise crazy? ++ local ASSET_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${LOG_ASSET}" ++ display_alert "Logging to asset" "${CURRENT_LOGGING_COUNTER}.0.${LOG_ASSET}" "debug" ++ "$@" >> "${ASSET_LOGFILE}" ++} ++ + function display_alert() { + # We'll be writing to stderr (" >&2"), so also write the message to the generic logfile, for context. + if [[ -f "${CURRENT_LOGFILE}" ]]; then +@@ -138,7 +147,7 @@ function display_alert() { + ;; + + ext) +- level_indicator="✅" ++ level_indicator="✨" # or ✅ ? + inline_logs_color="\e[1;32m" + ci_log="notice" + ;; +@@ -160,7 +169,7 @@ function display_alert() { + if [[ "${SHOW_DEBUG}" != "yes" ]]; then # enable debug for many, many debugging msgs + return 0 + fi +- level_indicator="✨" ++ level_indicator="🐛" + inline_logs_color="\e[1;33m" + ;; + +@@ -177,14 +186,22 @@ function display_alert() { + return 0 + fi + level_indicator="🐸" +- inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. ++ inline_logs_color="\e[0;36m" # a dim cyan + ;; + + timestamp | fasthash) + if [[ "${SHOW_FASTHASH}" != "yes" ]]; then # timestamp-related debugging messages, very very verbose + return 0 + fi +- level_indicator="⏱" ++ level_indicator="🐜" ++ inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. ++ ;; ++ ++ git) ++ if [[ "${SHOW_GIT}" != "yes" ]]; then # git-related debugging messages, very very verbose ++ return 0 ++ fi ++ level_indicator="🔖" + inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. + ;; + +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 5933d9a27..aae266091 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -13,7 +13,7 @@ function main_default_build_single() { + + start=$(date +%s) + +- ### Write config summary to its own logging section. ++ ### Write config summary + LOG_SECTION="config_summary" do_with_logging write_config_summary_output_file + + # Check and install dependencies, directory structure and settings +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index bca09eca0..02d04797d 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -109,8 +109,8 @@ function build_rootfs_and_image() { + } + + function list_installed_packages() { +- display_alert "Recording list of installed packages" "debug log" "debug" +- chroot_sdcard dpkg --get-selections "| grep -v deinstall | awk '{print \$1}' | cut -f1 -d':' | column -c 80" ++ display_alert "Recording list of installed packages" "asset log" "debug" ++ LOG_ASSET="installed_packages.txt" do_with_log_asset chroot_sdcard dpkg --get-selections "| grep -v deinstall | awk '{print \$1}' | cut -f1 -d':'" + } + + function trap_handler_cleanup_rootfs_and_image() { +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 4f363a696..ed65ec5ac 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -422,6 +422,7 @@ function install_distribution_agnostic() { + FAMILY_TWEAKS + + # enable additional services, if they exist. ++ display_alert "Enabling Armbian services" "systemd" "info" + [[ -f "${SDCARD}"/lib/systemd/system/armbian-firstrun.service ]] && chroot_sdcard systemctl --no-reload enable armbian-firstrun.service + [[ -f "${SDCARD}"/lib/systemd/system/armbian-firstrun-config.service ]] && chroot_sdcard systemctl --no-reload enable armbian-firstrun-config.service + [[ -f "${SDCARD}"/lib/systemd/system/armbian-zram-config.service ]] && chroot_sdcard systemctl --no-reload enable armbian-zram-config.service + +From fb943e2aa891513456e76a07a32351f04d2b1fe2 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 14 Mar 2022 18:51:39 +0100 +Subject: [PATCH] armbian-next: kernel: use parallel compressors; reproducible + kernel builds + +- also remove leftover mkdebian/builddeb parameters in make invocation +- add pbzip2 to hostdeps +--- + lib/functions/compilation/kernel.sh | 37 +++++++++++++++++++++++-------------- + lib/functions/general/host.sh | 2 +- + 2 files changed, 24 insertions(+), 15 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 3922030ee..571bde957 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -6,6 +6,7 @@ function run_kernel_make() { + "CCACHE_BASEDIR=\"$(pwd)\"" # Base directory for ccache, for cache reuse + "PATH=\"${toolchain}:${PATH}\"" # Insert the toolchain first into the PATH. + "DPKG_COLORS=always" # Use colors for dpkg ++ "XZ_OPT='--threads=0'" # Use parallel XZ compression + ) + + common_make_params_quoted=( +@@ -13,15 +14,15 @@ function run_kernel_make() { + "ARCH=${ARCHITECTURE}" # Key param. Everything depends on this. + "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family. Changing this causes recompiles + +- "BRANCH=${BRANCH}" # For mkdebian/builddep packaging only +- "KBUILD_DEBARCH=${ARCH}" # For mkdebian/builddep packaging only +- "KDEB_PKGVERSION=${REVISION}" # For mkdebian/builddep packaging only +- "KDEB_COMPRESS=${DEB_COMPRESS}" # For mkdebian/builddep packaging only +- "DEBFULLNAME=${MAINTAINER}" # For mkdebian/builddep packaging only +- "DEBEMAIL=${MAINTAINERMAIL}" # For mkdebian/builddep packaging only +- + "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # added as prefix to every compiler invocation by make + "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. ++ ++ "SOURCE_DATE_EPOCH=${kernel_base_revision_ts}" # https://reproducible-builds.org/docs/source-date-epoch/ and https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html ++ "KBUILD_BUILD_TIMESTAMP=${kernel_base_revision_date}" # https://www.kernel.org/doc/html/latest/kbuild/kbuild.html#kbuild-build-timestamp ++ "KBUILD_BUILD_USER=armbian-build" # https://www.kernel.org/doc/html/latest/kbuild/kbuild.html#kbuild-build-user-kbuild-build-host ++ "KBUILD_BUILD_HOST=armbian-bm" # https://www.kernel.org/doc/html/latest/kbuild/kbuild.html#kbuild-build-user-kbuild-build-host ++ ++ "KGZIP=pigz" "KBZIP2=pbzip2" # Parallel compression, use explicit parallel compressors https://lore.kernel.org/lkml/20200901151002.988547791@linuxfoundation.org/ + ) + + # last statement, so it passes the result to calling function. +@@ -43,9 +44,15 @@ function run_kernel_make_long_running() { + function compile_kernel() { + local kernel_work_dir="${SRC}/cache/sources/${LINUXSOURCEDIR}" + display_alert "Kernel build starting" "${LINUXSOURCEDIR}" "info" +- declare checked_out_revision_mtime="" # set by fetch_from_repo ++ declare checked_out_revision_mtime="" checked_out_revision_ts="" # set by fetch_from_repo + LOG_SECTION="kernel_prepare_git" do_with_logging do_with_hooks kernel_prepare_git ++ ++ # Capture date variables set by fetch_from_repo; it's the date of the last kernel revision ++ declare kernel_base_revision_date + declare kernel_base_revision_mtime="${checked_out_revision_mtime}" ++ declare kernel_base_revision_ts="${checked_out_revision_ts}" ++ kernel_base_revision_date="$(LC_ALL=C date -d "@${kernel_base_revision_ts}")" ++ + LOG_SECTION="kernel_maybe_clean" do_with_logging do_with_hooks kernel_maybe_clean + local version hash pre_patch_version + LOG_SECTION="kernel_prepare_patching" do_with_logging do_with_hooks kernel_prepare_patching +@@ -315,6 +322,8 @@ function kernel_package_source() { + } + + function kernel_build_and_package() { ++ local ts=${SECONDS} ++ + cd "${kernel_work_dir}" + + local -a build_targets=("all") # "All" builds the vmlinux/Image/Image.gz default for the ${ARCH} +@@ -323,12 +332,12 @@ function kernel_build_and_package() { + + # define dict with vars passed and target directories + declare -A kernel_install_dirs=( +- ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` +- ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` +- ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/libc_headers" # Used by `make headers_install` ++ ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` ++ ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` ++ #["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/libc_headers" # Used by `make headers_install` - disabled, only used for libc headers + ) + +- build_targets+=(install modules_install headers_install) ++ build_targets+=(install modules_install) # headers_install disabled, only used for libc headers + if [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]]; then + display_alert "Kernel build will produce DTBs!" "DTBs YES" "debug" + build_targets+=("dtbs_install") +@@ -342,7 +351,6 @@ function kernel_build_and_package() { + local dir="${kernel_install_dirs["${dir_key}"]}" + local value="${dir_key}=${dir}" + mkdir -p "${dir}" +- display_alert "Adding kernel packaging param" "${value}" "debug" + install_make_params_quoted+=("${value}") + done + +@@ -354,5 +362,6 @@ function kernel_build_and_package() { + + cd "${kernel_work_dir}" + prepare_kernel_packaging_debs "${kernel_work_dir}" "${kernel_dest_install_dir}" "${version}" kernel_install_dirs +- display_alert "Package building done" "${LINUXCONFIG}" "info" ++ ++ display_alert "Kernel built and packaged in" "$((SECONDS - ts)) seconds - ${version}-${LINUXFAMILY}" "info" + } +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index c2eb63578..6053248b5 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -68,7 +68,7 @@ prepare_host() { + libc6-dev-armhf-cross libelf-dev libfdt-dev libfile-fcntllock-perl + libfl-dev liblz4-tool libncurses-dev libpython2.7-dev libssl-dev + libusb-1.0-0-dev linux-base locales lzop ncurses-base ncurses-term +- nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz ++ nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz pbzip2 + pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig + systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip + zlib1g-dev file ccze tree + +From fcba106dae815e6d90fea84cc538239030fde9ac Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 14 Mar 2022 18:50:13 +0100 +Subject: [PATCH] armbian-next: tuning logging for timestamp/fasthash related + stuff which is very verbose + +- idea is to not completely overwhelm `SHOW_DEBUG=yes` case +- make patching quieter and use file instead of stdin +- set checked_out_revision_ts during git checkout (timestamp version of _mtime) +- timestamp | fasthash logging level (via `SHOW_FASTHASH=yes`) +--- + lib/functions/compilation/patch/fasthash.sh | 14 +++++++------- + lib/functions/compilation/patch/patching.sh | 7 +++---- + lib/functions/general/git.sh | 3 ++- + lib/functions/logging/logging.sh | 8 ++++++++ + 4 files changed, 20 insertions(+), 12 deletions(-) + +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index 8158ab477..0e74b1c79 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -5,7 +5,7 @@ function report_fashtash_should_execute() { + } + + function mark_fasthash_done() { +- display_alert "mark_fasthash_done" "$*" "debug" ++ display_alert "mark_fasthash_done" "$*" "fasthash" + return 0 + } + +@@ -13,23 +13,23 @@ function report_fasthash() { + local type="${1}" + local obj="${2}" + local desc="${3}" +- display_alert "report_fasthash" "${type}: ${desc}" "debug" ++ display_alert "report_fasthash" "${type}: ${desc}" "fasthash" + return 0 + } + + function initialize_fasthash() { +- display_alert "initialize_fasthash" "$*" "debug" ++ display_alert "initialize_fasthash" "$*" "fasthash" + return 0 + declare -a fast_hash_list=() # @TODO: declaring here won't do it any good, this is a shared var + } + + function fasthash_branch() { +- display_alert "fasthash_branch" "$*" "debug" ++ display_alert "fasthash_branch" "$*" "fasthash" + return 0 + } + + function finish_fasthash() { +- display_alert "finish_fasthash" "$*" "debug" ++ display_alert "finish_fasthash" "$*" "fasthash" + return 0 + } + +@@ -37,7 +37,7 @@ function fasthash_debug() { + if [[ "${SHOW_FASTHASH}" != "yes" ]]; then # enable debug for many, many debugging msgs + return 0 + fi +- display_alert "fasthash_debug" "$*" "debug" ++ display_alert "fasthash_debug" "$*" "fasthash" + find . -type f -printf '%T@ %p\n' | + grep -v -e "\.ko" -e "\.o" -e "\.cmd" -e "\.mod" -e "\.a" -e "\.tmp" -e "\.dtb" -e ".scr" -e "\.\/debian" | + sort -n | tail -n 10 1>&2 +@@ -61,7 +61,7 @@ function set_files_modification_time() { + local -i mtime="${1}" + local formatted_mtime + shift +- display_alert "Setting date ${mtime}" "${*} (no newer check)" "debug" ++ display_alert "Setting date ${mtime}" "${*} (no newer check)" "timestamp" + formatted_mtime="${mtime:0:12}.${mtime:12}" + touch --no-create -m -t "${formatted_mtime}" "${@}" + } +diff --git a/lib/functions/compilation/patch/patching.sh b/lib/functions/compilation/patch/patching.sh +index df253d969..3b7762707 100644 +--- a/lib/functions/compilation/patch/patching.sh ++++ b/lib/functions/compilation/patch/patching.sh +@@ -94,7 +94,7 @@ process_patch_file() { + # shellcheck disable=SC2154 # patch_minimum_target_mtime can be declared in outer scope + if [[ "${patch_minimum_target_mtime}" != "" ]]; then + if [[ ${patch_date} -lt ${patch_minimum_target_mtime} ]]; then +- display_alert "Patch before minimum date" "${patch_date} -lt ${patch_minimum_target_mtime}" "debug" ++ display_alert "Patch before minimum date" "${patch_date} -lt ${patch_minimum_target_mtime}" "timestamp" + patch_date=${patch_minimum_target_mtime} + fi + fi +@@ -108,10 +108,9 @@ process_patch_file() { + + # @TODO: try patching with `git am` first, so git contains the patch commit info/msg. -- For future git-based hashing. + # shellcheck disable=SC2015 # noted, thanks. I need to handle exit code here. +- patch --batch -p1 -N < "${patch}" && { +- # Fix the dates. ++ patch --batch -p1 -N --input="${patch}" --quiet --reject-file=- && { # "-" discards rejects ++ # Fix the dates on the patched files + set_files_modification_time "${patch_date}" "${patched_files[@]}" +- + display_alert "* $status ${relative_patch}" "" "info" + } || { + display_alert "* $status ${relative_patch}" "failed" "wrn" +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index f096a39ac..85dd4470f 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -160,7 +160,8 @@ fetch_from_repo() { + + # should be declared in outside scope, so can be read. + checked_out_revision_mtime="$(git log --date='format:%Y%m%d%H%M%S' --format='format:%ad' -1 "${checkout_from}")" +- display_alert "checked_out_revision_mtime set!" "${checked_out_revision_mtime}" "debug" ++ checked_out_revision_ts="$(git log -1 --pretty=%ct "${checkout_from}")" ++ display_alert "checked_out_revision_mtime set!" "${checked_out_revision_mtime} - ${checked_out_revision_ts}" "debug" + + display_alert "Cleaning git dir" "$(git status -s 2> /dev/null | wc -l) files" # working directory is not clean, show it + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 519cb5031..2ead6b949 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -180,6 +180,14 @@ function display_alert() { + inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. + ;; + ++ timestamp | fasthash) ++ if [[ "${SHOW_FASTHASH}" != "yes" ]]; then # timestamp-related debugging messages, very very verbose ++ return 0 ++ fi ++ level_indicator="⏱" ++ inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. ++ ;; ++ + *) + level_indicator="🌿" + inline_logs_color="\e[1;37m" + +From dab49a9133741fce7b40bdeff1e6cccf6becc180 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 14 Mar 2022 15:02:20 +0100 +Subject: [PATCH] armbian-next: completely remove + mkdebian/builddeb/general-packaging kernel packaging stuff + +--- + lib/functions/compilation/kernel.sh | 126 +------ + lib/functions/compilation/patch/kernel-pkg.sh | 95 ----- + lib/library-functions.sh | 9 - + packages/armbian/builddeb | 398 --------------------- + packages/armbian/mkdebian | 257 ------------- + patch/misc/general-packaging-4.14.y.patch | 213 ----------- + patch/misc/general-packaging-4.19.y-rk35xx.patch | 236 ------------ + patch/misc/general-packaging-4.19.y.patch | 249 ------------- + patch/misc/general-packaging-4.4.y-rk3399.patch | 216 ----------- + .../misc/general-packaging-4.4.y-rockchip64.patch | 216 ----------- + patch/misc/general-packaging-4.4.y.patch | 230 ------------ + patch/misc/general-packaging-4.9.y.patch | 199 ----------- + patch/misc/general-packaging-5.10.y.patch | 367 ------------------- + patch/misc/general-packaging-5.3.y.patch | 262 -------------- + patch/misc/general-packaging-5.6.y.patch | 263 -------------- + patch/misc/general-packaging-5.8-9.y.patch | 265 -------------- + 16 files changed, 12 insertions(+), 3589 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index b77739827..3922030ee 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -11,17 +11,17 @@ function run_kernel_make() { + common_make_params_quoted=( + "$CTHREADS" # Parallel compile, "-j X" for X cpus + "ARCH=${ARCHITECTURE}" # Key param. Everything depends on this. +- "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family.? ++ "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family. Changing this causes recompiles + +- "BRANCH=${BRANCH}" # For mkdebian/builddep packaging only +- "KBUILD_DEBARCH=${ARCH}" # For mkdebian/builddep packaging only +- "KDEB_PKGVERSION=${REVISION}" # For mkdebian/builddep packaging only +- "KDEB_COMPRESS=${DEB_COMPRESS}" # For mkdebian/builddep packaging only +- "DEBFULLNAME=${MAINTAINER}" # For mkdebian/builddep packaging only +- "DEBEMAIL=${MAINTAINERMAIL}" # For mkdebian/builddep packaging only +- "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # For mkdebian/builddep packaging only ++ "BRANCH=${BRANCH}" # For mkdebian/builddep packaging only ++ "KBUILD_DEBARCH=${ARCH}" # For mkdebian/builddep packaging only ++ "KDEB_PKGVERSION=${REVISION}" # For mkdebian/builddep packaging only ++ "KDEB_COMPRESS=${DEB_COMPRESS}" # For mkdebian/builddep packaging only ++ "DEBFULLNAME=${MAINTAINER}" # For mkdebian/builddep packaging only ++ "DEBEMAIL=${MAINTAINERMAIL}" # For mkdebian/builddep packaging only + +- "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. ++ "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # added as prefix to every compiler invocation by make ++ "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. + ) + + # last statement, so it passes the result to calling function. +@@ -48,7 +48,6 @@ function compile_kernel() { + declare kernel_base_revision_mtime="${checked_out_revision_mtime}" + LOG_SECTION="kernel_maybe_clean" do_with_logging do_with_hooks kernel_maybe_clean + local version hash pre_patch_version +- local kernel_packaging_target + LOG_SECTION="kernel_prepare_patching" do_with_logging do_with_hooks kernel_prepare_patching + LOG_SECTION="kernel_patching" do_with_logging do_with_hooks kernel_patching + [[ $CREATE_PATCHES == yes ]] && userpatch_create "kernel" # create patch for manual source changes +@@ -68,14 +67,7 @@ function compile_kernel() { + # @TODO: some users/maintainers do a lot of their work on "DTS/DTB only changes", which do require the kernel tree + # @TODO: but the only testable artifacts are the .dtb themselves. Allow for a `DTB_ONLY=yes` might be useful. + +- if [[ "a" == "b" ]]; then +- # Do it individually +- LOG_SECTION="kernel_make_headers_dtbs_image_modules" do_with_logging do_with_hooks kernel_make_headers_dtbs_image_modules +- LOG_SECTION="kernel_package" do_with_logging do_with_hooks kernel_package +- else +- # Do it all together +- LOG_SECTION="kernel_build_and_package" do_with_logging do_with_hooks kernel_build_and_package +- fi ++ LOG_SECTION="kernel_build_and_package" do_with_logging do_with_hooks kernel_build_and_package + + display_alert "Done with" "kernel compile" "debug" + cd "${kernel_work_dir}/.." || exit +@@ -118,8 +110,7 @@ function kernel_maybe_clean() { + } + + function kernel_prepare_patching() { +- +- if [[ $USE_OVERLAYFS == yes ]]; then ++ if [[ $USE_OVERLAYFS == yes ]]; then # @TODO: when is this set to yes? + display_alert "Using overlayfs_wrapper" "kernel_${LINUXFAMILY}_${BRANCH}" "debug" + kernel_work_dir=$(overlayfs_wrapper "wrap" "$SRC/cache/sources/$LINUXSOURCEDIR" "kernel_${LINUXFAMILY}_${BRANCH}") + fi +@@ -133,12 +124,6 @@ function kernel_prepare_patching() { + pre_patch_version="${version}" + display_alert "Pre-patch kernel version" "${pre_patch_version}" "debug" + +- # different packaging for 4.3+ +- kernel_packaging_target="deb-pkg" +- if linux-version compare "${version}" ge 4.3; then +- kernel_packaging_target="bindeb-pkg" +- fi +- + # read kernel git hash + hash=$(git --git-dir="$kernel_work_dir"/.git rev-parse HEAD) + } +@@ -163,10 +148,6 @@ function kernel_patching() { + apply_patch_series "${kernel_work_dir}" "${series_conf}" # applies a series of patches, read from a file. calls process_patch_file + fi + +- # mostly local-based packaging fixes. +- fasthash_branch "packaging-patches" +- apply_kernel_patches_for_packaging "${kernel_work_dir}" "${version}" # calls process_patch_file and other stuff. +- + # applies a humongous amount of patches coming from github repos. + # it's mostly conditional, and very complex. + # @TODO: re-enable after finishing converting it with fasthash magic +@@ -333,89 +314,6 @@ function kernel_package_source() { + display_alert "$(basename "${sources_pkg_dir}.deb" ".deb") packaged" "$((SECONDS - ts)) seconds, ${tarball_size} tarball, ${package_size} .deb" "info" + } + +-function kernel_make_headers_dtbs_image_modules() { +- local -a build_targets=("headers") +- [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]] && build_targets+=("dtbs") +- build_targets+=("${KERNEL_IMAGE_TYPE}" modules) +- +- display_alert "Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" +- fasthash_debug "pre-compile" +- make_filter="| grep --line-buffered -v -e 'CC' -e 'LD' -e 'AR'" run_kernel_make_long_running "${build_targets[@]}" +- fasthash_debug "post-compile" +- +- if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then +- display_alert "DOUBLE Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" +- fasthash_debug "pre-double-compile" +- run_kernel_make_long_running "${build_targets[@]}" +- fasthash_debug "post-double-compile" +- fi +- +- # Check for built kernel image file file; can override default with KERNEL_IMAGE_TYPE_PATH +- local check_built_kernel_file="${kernel_work_dir}/${KERNEL_IMAGE_TYPE_PATH:-"arch/${ARCHITECTURE}/boot/${KERNEL_IMAGE_TYPE}"}" +- if [[ ! -f "${check_built_kernel_file}" ]]; then +- exit_with_error "Kernel was not built" "${check_built_kernel_file}" +- fi +-} +- +-function kernel_package() { +- cd "${kernel_work_dir}" +- +- declare kernel_dest_install_dir +- kernel_dest_install_dir=$(mktemp -d "${WORKDIR}/kernel.temp.install.target.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. +- +- # define dict with vars passed and target directories +- declare -A kernel_install_dirs=( +- ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` +- ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` +- ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/libc_headers" # Used by `make headers_install` +- ) +- +- local -a prepackage_targets=(install modules_install headers_install) +- if [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]]; then +- display_alert "Kernel build will produce DTBs!" "DTBs YES" "debug" +- prepackage_targets+=("dtbs_install") +- kernel_install_dirs+=(["INSTALL_DTBS_PATH"]="${kernel_dest_install_dir}/dtbs") # Used by `make dtbs_install` +- fi +- +- display_alert "Packaging Kernel" "${LINUXCONFIG} $kernel_packaging_target at ${kernel_dest_install_dir}" "info" +- +- # loop over the keys above, get the value, create param value in array; also mkdir the dir +- declare -a install_make_params_quoted +- local dir_key +- for dir_key in "${!kernel_install_dirs[@]}"; do +- local dir="${kernel_install_dirs["${dir_key}"]}" +- local value="${dir_key}=${dir}" +- mkdir -p "${dir}" +- display_alert "Adding kernel packaging param" "${value}" "debug" +- install_make_params_quoted+=("${value}") +- done +- +- # See https://www.kernel.org/doc/Documentation/kbuild/headers_install.txt +- # Prepare for packaging, using the exact same options as original compile. +- display_alert "Installing kernel headers and modules for packaging" "${LINUXCONFIG} ${prepackage_targets[*]}" "info" +- fasthash_debug "pre-prepackage" +- make_filter="| grep --line-buffered -v -e 'INSTALL' -e 'SIGN' -e 'XZ'" run_kernel_make_long_running "${install_make_params_quoted[@]@Q}" "${prepackage_targets[@]}" +- fasthash_debug "post-prepackage" +- +- cd "${kernel_work_dir}" +- prepare_kernel_packaging_debs "${kernel_work_dir}" "${kernel_dest_install_dir}" "${version}" kernel_install_dirs +- +- ### # produce deb packages: image, headers, firmware, dtb +- ### # This mostly only does +- ### fasthash_debug "pre-packaging" +- ### run_kernel_make_long_running "${install_make_params_quoted[@]@Q}" $kernel_packaging_target +- ### fasthash_debug "post-packaging" +- ### +- ### if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then +- ### display_alert "DOUBLE Packaging Kernel, Headers and DTBs" "${LINUXCONFIG} $kernel_packaging_target" "info" +- ### fasthash_debug "pre-double-packaging" +- ### run_kernel_make_long_running $kernel_packaging_target +- ### fasthash_debug "post-double-packaging" +- ### fi +- +- display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" +-} +- + function kernel_build_and_package() { + cd "${kernel_work_dir}" + +@@ -456,5 +354,5 @@ function kernel_build_and_package() { + + cd "${kernel_work_dir}" + prepare_kernel_packaging_debs "${kernel_work_dir}" "${kernel_dest_install_dir}" "${version}" kernel_install_dirs +- display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" ++ display_alert "Package building done" "${LINUXCONFIG}" "info" + } +diff --git a/lib/functions/compilation/patch/kernel-pkg.sh b/lib/functions/compilation/patch/kernel-pkg.sh +deleted file mode 100644 +index 51e163b1e..000000000 +--- a/lib/functions/compilation/patch/kernel-pkg.sh ++++ /dev/null +@@ -1,95 +0,0 @@ +-function apply_kernel_patches_for_packaging() { +- local kerneldir="${1}" +- local version="${2}" +- # Packaging patch for modern kernels should be one for all. +- # Currently we have it per kernel family since we can't have one +- # Maintaining one from central location starting with 5.3+ +- # Temporally set for new "default->legacy,next->current" family naming +- +- if linux-version compare "${version}" ge 5.10; then +- display_alert "NOT using old packaging mkdebian etc" "skipping mkdebian patching" "warn" +- return 0 # Not anymore for new packaging. +- +- # This case is special: it does not use process_patch_file. fasthash manually. +- local builddeb="packages/armbian/builddeb" +- local mkdebian="packages/armbian/mkdebian" +- local kernel_package_dir="${kerneldir}/scripts/package" +- if report_fashtash_should_execute text "$(cat "${SRC}/${builddeb}" "${SRC}/${mkdebian}")" "armbian builddeb and mkdebian replace"; then +- # Read mtime, then sed, then restore it +- local arm64_makefile="${kerneldir}/arch/arm64/Makefile" arm64_makefile_mtime +- arm64_makefile_mtime="$(get_file_modification_time "${arm64_makefile}")" +- # shellcheck disable=SC2016 # this should be a .patch? +- sed -i -e 's/^KBUILD_IMAGE := \$(boot)\/Image\.gz$/KBUILD_IMAGE := \$(boot)\/Image/' "${arm64_makefile}" +- set_files_modification_time "${arm64_makefile_mtime}" "${arm64_makefile}" +- +- # cp with -p to preserve the original dates +- cp -pv "${SRC}/${builddeb}" "${kernel_package_dir}/builddeb" +- cp -pv "${SRC}/${mkdebian}" "${kernel_package_dir}/mkdebian" +- +- chmod 755 "${kernel_package_dir}/builddeb" "${kernel_package_dir}/mkdebian" +- mark_fasthash_done # will do git commit, associate fasthash to real hash. +- fi +- +- elif linux-version compare "${version}" ge 5.8.17 && +- linux-version compare "${version}" le 5.9 || +- linux-version compare "${version}" ge 5.9.2; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-5.8-9.y.patch" "applying" +- elif linux-version compare "${version}" ge 5.6; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-5.6.y.patch" "applying" +- elif linux-version compare "${version}" ge 5.3; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-5.3.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == sunxi* || "$LINUXFAMILY" == meson64 || +- "$LINUXFAMILY" == mvebu64 || "$LINUXFAMILY" == mt7623 || "$LINUXFAMILY" == mvebu ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == rk35xx ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y-rk35xx.patch" "applying" +- fi +- +- if [[ "${version}" == "4.14."* ]] && [[ "$LINUXFAMILY" == s5p6818 || "$LINUXFAMILY" == mvebu64 || +- "$LINUXFAMILY" == imx7d || "$LINUXFAMILY" == odroidxu4 || "$LINUXFAMILY" == mvebu ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.14.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.4."* || "${version}" == "4.9."* ]] && +- [[ "$LINUXFAMILY" == rockpis || "$LINUXFAMILY" == rk3399 ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rk3399.patch" "applying" +- fi +- +- if [[ "${version}" == "4.4."* ]] && +- [[ "$LINUXFAMILY" == rockchip64 || "$LINUXFAMILY" == station* ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rockchip64.patch" "applying" +- fi +- +- if [[ "${version}" == "4.4."* ]] && [[ "$LINUXFAMILY" == rockchip || "$LINUXFAMILY" == rk322x ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.9."* ]] && [[ "$LINUXFAMILY" == meson64 || "$LINUXFAMILY" == odroidc4 ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.9.y.patch" "applying" +- fi +- +-} +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index dc62374e0..fc06a5e35 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -109,15 +109,6 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/patch/kernel-drivers.sh + source "${SRC}"/lib/functions/compilation/patch/kernel-drivers.sh + +-# no errors tolerated. invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/patch/kernel-pkg.sh +-# shellcheck source=lib/functions/compilation/patch/kernel-pkg.sh +-source "${SRC}"/lib/functions/compilation/patch/kernel-pkg.sh +- + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +deleted file mode 100755 +index 0163d401a..000000000 +--- a/packages/armbian/builddeb ++++ /dev/null +@@ -1,398 +0,0 @@ +-#!/bin/sh +-# +-# builddeb 1.3 +-# Copyright 2003 Wichert Akkerman +-# +-# Simple script to generate a deb package for a Linux kernel. All the +-# complexity of what to do with a kernel after it is installed or removed +-# is left to other scripts and packages: they can install scripts in the +-# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location +-# specified in KDEB_HOOKDIR) that will be called on package install and +-# removal. +-# +-# armbian/bulddeb 0.1 +-# Copyright 2021 Leonid Gasheev (The-going <48602507+The-going@users.noreply.github.com>) +-# +-# In order to make a choice, it is enough for us to check the value +-# of the variable in the kernel configuration file and Debian's own variables. +-# +-# Uncomment the next line to see all the current values. +-# echo "$(dpkg-architecture -l)" >&2 +- +-set -e +- +-is_enabled() { +- grep -q "^$1=y" include/config/auto.conf +-} +- +-if_enabled_echo() { +- if is_enabled "$1"; then +- echo -n "$2" +- elif [ $# -ge 3 ]; then +- echo -n "$3" +- fi +-} +- +-is_native() { +- dpkg-architecture -qDEB_BUILD_ARCH | grep -q "$(dpkg-architecture -qDEB_HOST_ARCH)" +-} +- +-is_build_on_amd64() { +- dpkg-architecture -qDEB_BUILD_ARCH | grep -q amd64 +-} +- +-create_package() { +- local pname="$1" pdir="$2" +- local dpkg_deb_opts +- +- mkdir -m 755 -p "$pdir/DEBIAN" +- mkdir -p "$pdir/usr/share/doc/$pname" +- cp debian/copyright "$pdir/usr/share/doc/$pname/" +- cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" +- gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" +- sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ +- | xargs -r0 md5sum > DEBIAN/md5sums" +- +- # Fix ownership and permissions +- if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then +- dpkg_deb_opts="--root-owner-group" +- else +- chown -R root:root "$pdir" +- fi +- chmod -R go-w "$pdir" +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- # in case we build in a setuid/setgid directory +- chmod -R ug-s "$pdir" +- +- # Create preinstall and post install script to remove dtb +- if [ "$3" = "dtb" ]; then +- +- cat >> $pdir/DEBIAN/preinst <<- EOT +- rm -rf /boot/dtb +- rm -rf /boot/dtb-$version +- exit 0 +- EOT +- +- cat >> $pdir/DEBIAN/postinst <<- EOT +- cd /boot +- ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb +- exit 0 +- EOT +- +- chmod 775 $pdir/DEBIAN/preinst +- chmod 775 $pdir/DEBIAN/postinst +- fi +- +- # Create postinst prerm script for headers +- if [ "$3" = "headers" ]; then +- +- # Set the time for all files to the current time. +- # And build them for the current architecture. +- cat >> $pdir/DEBIAN/postinst <<- EOT +- cd /usr/src/linux-headers-$version +- echo "Compiling headers - please wait ..." +- NCPU=\$(grep -c 'processor' /proc/cpuinfo) +- find -type f -exec touch {} + +- yes "" | make oldconfig >/dev/null +- make -j\$NCPU -s scripts >/dev/null +- make -j\$NCPU -s M=scripts/mod/ >/dev/null +- exit 0 +- EOT +- +- # After the configuration and compilation processes, new files +- # appear that the package manager does not know anything about. +- # Just clear all the files in the target directory. +- cat >> $pdir/DEBIAN/prerm <<- EOT +- rm -rf /usr/src/linux-headers-$version +- exit 0 +- EOT +- +- chmod 775 $pdir/DEBIAN/postinst +- chmod 775 $pdir/DEBIAN/prerm +- fi +- +- # Create the package +- dpkg-gencontrol -p$pname -P"$pdir" +- dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +-} +- +-deploy_kernel_headers() { +- pdir=$1 +- +- rm -rf $pdir +- +- destdir=$pdir/usr/src/linux-headers-$version +- mkdir -p $destdir +- +- ( +- cd $srctree +- find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl +- find arch/*/include include scripts -type f -o -type l +- find security/*/include -type f +- find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform +- find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f +- ) > debian/hdrsrcfiles +- +- { +- if is_enabled CONFIG_STACK_VALIDATION; then +- # echo tools/objtool/objtool +- find tools/objtool -type f -executable +- fi +- +- find arch/$SRCARCH/include Module.symvers include scripts -type f +- +- if is_enabled CONFIG_GCC_PLUGINS; then +- find scripts/gcc-plugins -name \*.so -o -name gcc-common.h +- fi +- } > debian/hdrobjfiles +- +- if is_native; then +- echo "info: Build native: Skip headers-debian-byteshift.patch" >&2 +- elif is_build_on_amd64; then +- ( +- cd $destdir +- patch -p1 < /tmp/headers-debian-byteshift.patch +- ) +- fi +- +- tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir +- tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir +- rm -f debian/hdrsrcfiles debian/hdrobjfiles +- +- # copy .config manually to be where it's expected to be +- cp $KCONFIG_CONFIG $destdir/.config +- +- mkdir -p $pdir/lib/modules/$version/ +- ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build +-} +- +-deploy_libc_headers() { +- pdir=$1 +- +- rm -rf $pdir +- +- $MAKE -f $srctree/Makefile headers +- $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr +- +- # move asm headers to /usr/include//asm to match the structure +- # used by Debian-based distros (to support multi-arch) +- host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) +- mkdir $pdir/usr/include/$host_arch +- mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ +-} +- +-version=$KERNELRELEASE +-tmpdir="debian/tmp" +-kernel_headers_dir="debian/hdrtmp" +-libc_headers_dir="debian/headertmp" +-dbg_dir="debian/dbgtmp" +-dtb_dir="debian/dtbtmp" +-packagename=linux-image-"$BRANCH$LOCALVERSION" +-kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-libc_headers_packagename=linux-libc-dev +-dbg_packagename=$packagename-dbg +- +-if [ "$ARCH" = "um" ]; then +- packagename=user-mode-linux-$version +-fi +- +-# Not all arches have the same installed path in debian +-# XXX: have each arch Makefile export a variable of the canonical image install +-# path instead +-case $ARCH in +- ++aarch64|arm64) +- image_name=Image +- installed_image_path="boot/vmlinuz-$version" +- ;; +- arm*) +- image_name=zImage +- installed_image_path="boot/vmlinuz-$version" +- ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +- parisc|mips|powerpc) +- installed_image_path="boot/vmlinux-$version" +- ;; +- *) +- image_name=vmlinuz +- installed_image_path="boot/vmlinuz-$version" +- ;; +-esac +- +-BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) +- +-# Setup the directory structure +-rm -rf "$tmpdir" "$dbg_dir" "$dtb_dir" debian/files +-mkdir -m 755 -p "$tmpdir/DEBIAN" +-mkdir -p "$tmpdir/lib" "$tmpdir/boot" +-mkdir -m 755 -p "$dtb_dir/DEBIAN" +-mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +-mkdir -m 755 -p "$kernel_headers_dir/lib/modules/$version/" +-mkdir -m 755 -p "$libc_headers_dir/DEBIAN" +- +-# Install the kernel +-if [ "$ARCH" = "um" ]; then +- mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" +- $MAKE linux +- cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" +- cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" +- gzip "$tmpdir/usr/share/doc/$packagename/config" +-else +- cp System.map "$tmpdir/boot/System.map-$version" +- cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" +-fi +-cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" +- +-if is_enabled CONFIG_OF_EARLY_FLATTREE; then +- # Only some architectures with OF support have this target +- if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then +- $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/linux-image-$version" dtbs_install +- fi +-fi +- +-if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG; then +- #mkdir -p "$tmpdir/boot/dtb" +- INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-fi +- +-if is_enabled CONFIG_MODULES; then +- INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install +- rm -f "$tmpdir/lib/modules/$version/build" +- rm -f "$tmpdir/lib/modules/$version/source" +- +- if [ "$ARCH" = "um" ]; then +- mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" +- rmdir "$tmpdir/lib/modules/$version" +- fi +- +- if [ -n "$BUILD_DEBUG" ]; then +- for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do +- module=lib/modules/$module +- mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) +- # only keep debug symbols in the debug file +- $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module +- # strip original module from debug symbols +- $OBJCOPY --strip-debug $tmpdir/$module +- # then add a link to those +- $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module +- done +- +- # resign stripped modules +- if is_enabled CONFIG_MODULE_SIG_ALL; then +- INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign +- fi +- fi +-fi +- +-# Install the maintainer scripts +-# Note: hook scripts under /etc/kernel are also executed by official Debian +-# kernel packages, as well as kernel packages built using make-kpkg. +-# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and +-# so do we; recent versions of dracut and initramfs-tools will obey this. +-debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +-for script in postinst postrm preinst prerm; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat <<- EOF > "$tmpdir/DEBIAN/$script" +- #!/bin/bash +- +- set -e +- +- # Pass maintainer script parameters to hook scripts +- export DEB_MAINT_PARAMS="\$*" +- +- # Tell initramfs builder whether it's wanted +- export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) +- +- test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d +- exit 0 +- EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +-done +- +-## +-## Create sym link to kernel image +-## +-sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-cat >> $tmpdir/DEBIAN/postinst <<- EOT +- ln -sf $(basename $installed_image_path) /boot/$image_name 2> /dev/null || mv /$installed_image_path /boot/$image_name +- touch /boot/.next +- exit 0 +-EOT +- +-## +-## FAT install workaround +-## +-sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-cat >> $tmpdir/DEBIAN/preinst <<- EOT +- # exit if we are running chroot +- if [ "\$(stat -c %d:%i /)" != "\$(stat -c %d:%i /proc/1/root/.)" ]; then exit 0; fi +- +- check_boot_dev (){ +- boot_device=\$(mountpoint -d /boot) +- +- for file in /dev/* ; do +- CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file)) +- if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then +- boot_partition=\$file +- break +- fi +- done +- +- bootfstype=\$(blkid -s TYPE -o value \$boot_partition) +- if [ "\$bootfstype" = "vfat" ]; then +- rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/$image_name /boot/uImage +- fi +- } +- mountpoint -q /boot && check_boot_dev +- exit 0 +-EOT +- +-create_package "$packagename" "$tmpdir" +- +-if [ "$ARCH" != "um" ]; then +- +- if [ "$(cat debian/arch)" != "amd64" ]; then # No DTB for amd64 target +- create_package "$dtb_packagename" "$dtb_dir" "dtb" +- fi +- +- deploy_libc_headers $libc_headers_dir +- create_package $libc_headers_packagename $libc_headers_dir +- +- if is_enabled CONFIG_MODULES; then +- if is_native; then +- # echo "Skip scripts folder cleaning" >&2 +- # echo "Skip creating postinst prerm scripts for headers" >&2 +- deploy_kernel_headers $kernel_headers_dir +- create_package $kernel_headers_packagename $kernel_headers_dir +- else +- # Clean up the executables that are left over from +- # cross-compilation for a different host architecture. +- ( +- cd $srctree +- make M=scripts clean +- ) +- deploy_kernel_headers $kernel_headers_dir +- create_package $kernel_headers_packagename $kernel_headers_dir "headers" +- fi +- fi +- +-fi +- +-if [ -n "$BUILD_DEBUG" ]; then +- # Build debug package +- # Different tools want the image in different locations +- # perf +- mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ +- cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ +- # systemtap +- mkdir -p $dbg_dir/usr/lib/debug/boot/ +- ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version +- # kdump-tools +- ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version +- create_package "$dbg_packagename" "$dbg_dir" +-fi +- +-exit 0 +diff --git a/packages/armbian/mkdebian b/packages/armbian/mkdebian +deleted file mode 100755 +index 003195372..000000000 +--- a/packages/armbian/mkdebian ++++ /dev/null +@@ -1,257 +0,0 @@ +-#!/bin/sh +-# +-# Copyright 2003 Wichert Akkerman +-# +-# Simple script to generate a debian/ directory for a Linux kernel. +- +-set -e +- +-is_enabled() { +- grep -q "^$1=y" include/config/auto.conf +-} +- +-if_enabled_echo() { +- if is_enabled "$1"; then +- echo -n "$2" +- elif [ $# -ge 3 ]; then +- echo -n "$3" +- fi +-} +- +-set_debarch() { +- if [ -n "$KBUILD_DEBARCH" ] ; then +- debarch="$KBUILD_DEBARCH" +- return +- fi +- +- # Attempt to find the correct Debian architecture +- case "$UTS_MACHINE" in +- i386|ia64|alpha|m68k|riscv*) +- debarch="$UTS_MACHINE" ;; +- x86_64) +- debarch=amd64 ;; +- sparc*) +- debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;; +- s390*) +- debarch=s390x ;; +- ppc*) +- if is_enabled CONFIG_64BIT; then +- debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) +- else +- debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) +- fi +- ;; +- parisc*) +- debarch=hppa ;; +- mips*) +- if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then +- debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el +- elif is_enabled CONFIG_CPU_MIPSR6; then +- debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 +- else +- debarch=mips +- fi +- ;; +- aarch64|arm64) +- debarch=arm64 ;; +- arm*) +- if is_enabled CONFIG_AEABI; then +- debarch=arm$(if_enabled_echo CONFIG_VFP hf el) +- else +- debarch=arm +- fi +- ;; +- openrisc) +- debarch=or1k ;; +- sh) +- if is_enabled CONFIG_CPU_SH3; then +- debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) +- elif is_enabled CONFIG_CPU_SH4; then +- debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) +- fi +- ;; +- esac +- if [ -z "$debarch" ]; then +- debarch=$(dpkg-architecture -qDEB_HOST_ARCH) +- echo "" >&2 +- echo "** ** ** WARNING ** ** **" >&2 +- echo "" >&2 +- echo "Your architecture doesn't have its equivalent" >&2 +- echo "Debian userspace architecture defined!" >&2 +- echo "Falling back to the current host architecture ($debarch)." >&2 +- echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 +- echo "" >&2 +- fi +-} +- +-# Some variables and settings used throughout the script +-KDEB_SOURCENAME=linux-$KERNELRELEASE +-version=$KERNELRELEASE +-if [ -n "$KDEB_PKGVERSION" ]; then +- packageversion=$KDEB_PKGVERSION +- revision=${packageversion##*-} +-else +- revision=$(cat .version 2>/dev/null||echo 1) +- packageversion=$version-$revision +-fi +-sourcename=$KDEB_SOURCENAME +-packagename=linux-image-"$BRANCH$LOCALVERSION" +-kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-libc_headers_packagename=linux-libc-dev +-dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-dbg_packagename=$packagename-dbg +- +-if [ "$ARCH" = "um" ] ; then +- packagename=user-mode-linux-$version +-fi +- +-debarch= +-set_debarch +- +-email=${DEBEMAIL-$EMAIL} +- +-# use email string directly if it contains +-if echo $email | grep -q '<.*>'; then +- maintainer=$email +-else +- # or construct the maintainer string +- user=${KBUILD_BUILD_USER-$(id -nu)} +- name=${DEBFULLNAME-$user} +- if [ -z "$email" ]; then +- buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)} +- email="$user@$buildhost" +- fi +- maintainer="$name <$email>" +-fi +- +-# Try to determine distribution +-if [ -n "$KDEB_CHANGELOG_DIST" ]; then +- distribution=$KDEB_CHANGELOG_DIST +-# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog +-elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then +- : # nothing to do in this case +-else +- distribution="unstable" +- echo >&2 "Using default distribution of 'unstable' in the changelog" +- echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" +-fi +- +-mkdir -p debian/source/ +-echo "1.0" > debian/source/format +- +-echo $debarch > debian/arch +-extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)" +-extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)" +- +-# Generate a simple changelog template +-cat < debian/changelog +-$sourcename ($packageversion) $distribution; urgency=low +- +- * Armbian built Linux kernel. $BRANCH +- +- -- $maintainer $(date -R) +-EOF +- +-# Generate copyright file +-cat < debian/copyright +-This is a packacked armbian patches version of the Linux kernel. +- +-The sources may be found at most Linux archive sites, including: +-https://www.kernel.org/pub/linux/kernel +- +-Copyright: 1991 - 2018 Linus Torvalds and others. +- +-The git repository for mainline kernel development is at: +-git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; version 2 dated June, 1991. +- +-On Debian GNU/Linux systems, the complete text of the GNU General Public +-License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. +-EOF +- +-# Generate a control file +-cat < debian/control +-Source: $sourcename +-Section: kernel +-Priority: optional +-Maintainer: $maintainer +-Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends +-Homepage: https://www.kernel.org/ +- +-Package: $packagename +-Architecture: $debarch +-Provides: linux-image, linux-image-armbian, armbian-$BRANCH +-Description: Linux kernel, armbian version $version $BRANCH +- This package contains the Linux kernel, modules and corresponding other +- files, version: $version. +- +-Package: $libc_headers_packagename +-Section: devel +-Provides: linux-kernel-headers +-Conflicts: linux-kernel-headers +-Replaces: linux-kernel-headers +-Architecture: $debarch +-Description: Armbian Linux support headers for userspace development +- This package provides userspaces headers from the Linux kernel. These headers +- are used by the installed headers for GNU glibc and other system libraries. +-Multi-Arch: same +- +-Package: $dtb_packagename +-Architecture: $debarch +-Provides: linux-dtb, linux-dtb-armbian, armbian-$BRANCH +-Description: Armbian Linux DTB, version $version $BRANCH +- This package contains device blobs from the Linux kernel, version $version +-EOF +- +-if is_enabled CONFIG_MODULES; then +-cat <> debian/control +- +-Package: $kernel_headers_packagename +-Section: devel +-Architecture: $debarch +-Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH +-Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +-Description: Linux kernel headers for $version on $debarch $BRANCH +- This package provides kernel header files for $version on $debarch +- . +- This is useful for people who need to build external modules +-EOF +-fi +- +-if is_enabled CONFIG_DEBUG_INFO; then +-cat <> debian/control +- +-Package: $dbg_packagename +-Section: debug +-Architecture: $debarch +-Description: Linux kernel debugging symbols for $version +- This package will come in handy if you need to debug the kernel. It provides +- all the necessary debug symbols for the kernel and its modules. +-EOF +-fi +- +-cat < debian/rules +-#!$(command -v $MAKE) -f +- +-srctree ?= . +- +-build: +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ +- KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile +- +-binary-arch: +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ +- KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg +- +-clean: +- rm -rf debian/*tmp debian/files +- \$(MAKE) clean +- +-binary: binary-arch +-EOF +-chmod +x debian/rules +- +-exit 0 +diff --git a/patch/misc/general-packaging-4.14.y.patch b/patch/misc/general-packaging-4.14.y.patch +deleted file mode 100644 +index 6a1eea7f7..000000000 +--- a/patch/misc/general-packaging-4.14.y.patch ++++ /dev/null +@@ -1,213 +0,0 @@ +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index 8c4bc5a2c..30bc0cffb 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -114,7 +114,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- KBUILD_DTBS := dtbs +- +- all: Image.gz $(KBUILD_DTBS) +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -29,6 +29,27 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "exit 0" >> $pdir/DEBIAN/preinst +-+ chmod 775 $pdir/DEBIAN/preinst +-+ # +-+ echo "if [ -d /boot/dtb-$version.old ]; then rm -rf /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/postinst +-+ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinstall script for headers +-+ if [[ "$1" == *headers* ]]; then +-+ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; find -type f -exec touch {} +;yes "" | make oldconfig >/dev/null;make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null; make -s M=scripts/mod/ >/dev/null" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +- # Create the package +- dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -52,7 +73,9 @@ set_debarch() { +- mips*) +- debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; +- aarch64|arm64) +-- debarch=arm64 ;; +-+ debarch=arm64 +-+ image_name=Image +-+ ;; +- arm*) +- if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then +- if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then +-@@ -63,6 +86,7 @@ set_debarch() { +- else +- debarch=arm +- fi +-+ image_name=zImage +- ;; +- *) +- debarch=$(dpkg --print-architecture) +-@@ -95,12 +119,15 @@ tmpdir="$objtree/debian/tmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +- forcearch= +-+image_name= +- set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-@@ -124,7 +151,9 @@ esac +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$kernel_headers_dir/lib/modules/$version/" +-@@ -177,6 +206,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -196,7 +230,7 @@ fi +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -212,6 +246,44 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null || mv /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Try to determine maintainer and email values +- if [ -n "$DEBEMAIL" ]; then +- email=$DEBEMAIL +-@@ -314,6 +395,7 @@ fi +- # Build kernel header package +- (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +- if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then +-@@ -325,16 +407,20 @@ if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then +- fi +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd $destdir; make M=scripts clean) +-+ +- cat <> debian/control +- +- Package: $kernel_headers_packagename +- Architecture: any +-+Depends: make, gcc, libc6-dev, libssl-dev +- Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} +- This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} +- . +-@@ -343,6 +429,16 @@ EOF +- +- cat <> debian/control +- +-+Package: $dtb_packagename +-+Architecture: any +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version. +-+EOF +-+ +-+create_package "$dtb_packagename" "$dtb_dir" +-+ +-+cat <> debian/control +-+ +- Package: $libc_headers_packagename +- Section: devel +- Provides: $libc_headers_packagename +-@@ -354,7 +450,7 @@ EOF +- +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+# create_package "$libc_headers_packagename" "$libc_headers_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +diff --git a/patch/misc/general-packaging-4.19.y-rk35xx.patch b/patch/misc/general-packaging-4.19.y-rk35xx.patch +deleted file mode 100644 +index f94b1a110..000000000 +--- a/patch/misc/general-packaging-4.19.y-rk35xx.patch ++++ /dev/null +@@ -1,236 +0,0 @@ +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index 5b3908880..7a0869261 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -126,7 +126,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- KBUILD_DTBS := dtbs +- +- all: Image.gz $(KBUILD_DTBS) +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 4c2b84132..1d51c17cd 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -29,6 +29,44 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ +-+ cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinst prerm scripts for headers +-+ if [[ "$1" == *headers* ]]; then +-+ +-+cat >> $pdir/DEBIAN/postinst << EOT +-+cd /usr/src/linux-headers-$version +-+echo "Compiling headers - please wait ..." +-+find -type f -exec touch {} + +-+make -s scripts >/dev/null +-+make -s M=scripts/mod/ >/dev/null +-+exit 0 +-+EOT +-+ +-+cat >> $pdir/DEBIAN/prerm << EOT +-+cd /usr/src/linux-headers-$version +-+rm -rf scripts .config.old +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm +-+ fi +-+ +- # Create the package +- dpkg-gencontrol -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -39,9 +77,11 @@ tmpdir="$objtree/debian/tmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- +- if [ "$ARCH" = "um" ] ; then +-@@ -52,6 +92,15 @@ fi +- # XXX: have each arch Makefile export a variable of the canonical image install +- # path instead +- case $ARCH in +-+aarch64|arm64) +-+ image_name=Image +-+ installed_image_path="boot/vmlinuz-$version" +-+ +-+ ;; +-+arm*) +-+ image_name=zImage +-+ installed_image_path="boot/vmlinuz-$version" +-+ ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +-@@ -65,7 +114,9 @@ esac +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$kernel_headers_dir/lib/modules/$version/" +-@@ -118,6 +169,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -137,7 +193,7 @@ fi +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -153,10 +209,50 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null || mv /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+ +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Build kernel header package +- (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/*/include tools/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find security/selinux/include tools/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +- if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then +-@@ -168,15 +264,19 @@ if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then +- fi +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd $destdir; make M=scripts clean) +-+ +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+ # create_package "$libc_headers_packagename" "$libc_headers_dir" +-+ create_package "$dtb_packagename" "$dtb_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +-diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian +-index edcad61fe..8a49f4329 100755 +---- a/scripts/package/mkdebian +-+++ b/scripts/package/mkdebian +-@@ -94,10 +94,12 @@ else +- packageversion=$version-$revision +- fi +- sourcename=$KDEB_SOURCENAME +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +-+image_name= +- set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-@@ -181,6 +183,7 @@ Description: Linux kernel, version $version +- +- Package: $kernel_headers_packagename +- Architecture: $debarch +-+Depends: make, gcc, libc6-dev, flex, bison, libssl-dev +- Description: Linux kernel headers for $version on $debarch +- This package provides kernel header files for $version on $debarch +- . +-@@ -200,6 +203,11 @@ Architecture: $debarch +- Description: Linux kernel debugging symbols for $version +- This package will come in handy if you need to debug the kernel. It provides +- all the necessary debug symbols for the kernel and its modules. +-+ +-+Package: $dtb_packagename +-+Architecture: $debarch +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version +- EOF +- +- cat < debian/rules +diff --git a/patch/misc/general-packaging-4.19.y.patch b/patch/misc/general-packaging-4.19.y.patch +deleted file mode 100644 +index 0c58947f5..000000000 +--- a/patch/misc/general-packaging-4.19.y.patch ++++ /dev/null +@@ -1,249 +0,0 @@ +-From 2b73935784b88ef50fc4be16254a4962b5f70383 Mon Sep 17 00:00:00 2001 +-From: The-going <48602507+The-going@users.noreply.github.com> +-Date: Tue, 10 Mar 2020 16:44:18 +0300 +-Subject: [PATCH] general packaging 4.19.y +- +---- +- arch/arm64/Makefile | 2 +- +- scripts/package/builddeb | 121 ++++++++++++++++++++++++++++++++++++++++++++--- +- scripts/package/mkdebian | 12 ++++- +- 3 files changed, 126 insertions(+), 9 deletions(-) +- +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index 9a5e28141211..851e646169ba 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -113,7 +113,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- KBUILD_DTBS := dtbs +- +- all: Image.gz $(KBUILD_DTBS) +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 0b31f4f1f92c..f6b96d8507f4 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -29,6 +29,44 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ +-+ cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinst prerm scripts for headers +-+ if [[ "$1" == *headers* ]]; then +-+ +-+cat >> $pdir/DEBIAN/postinst << EOT +-+cd /usr/src/linux-headers-$version +-+echo "Compiling headers - please wait ..." +-+find -type f -exec touch {} + +-+make -s scripts >/dev/null +-+make -s M=scripts/mod/ >/dev/null +-+exit 0 +-+EOT +-+ +-+cat >> $pdir/DEBIAN/prerm << EOT +-+cd /usr/src/linux-headers-$version +-+rm -rf scripts .config.old +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm +-+ fi +-+ +- # Create the package +- dpkg-gencontrol -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -39,9 +77,11 @@ tmpdir="$objtree/debian/tmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- +- if [ "$ARCH" = "um" ] ; then +-@@ -52,6 +92,15 @@ fi +- # XXX: have each arch Makefile export a variable of the canonical image install +- # path instead +- case $ARCH in +-+aarch64|arm64) +-+ image_name=Image +-+ installed_image_path="boot/vmlinuz-$version" +-+ +-+ ;; +-+arm*) +-+ image_name=zImage +-+ installed_image_path="boot/vmlinuz-$version" +-+ ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +-@@ -65,7 +114,9 @@ esac +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$kernel_headers_dir/lib/modules/$version/" +-@@ -118,6 +169,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -137,7 +193,7 @@ fi +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -153,9 +209,49 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null || mv /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+ +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Build kernel header package +- (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +- if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then +-@@ -167,15 +272,19 @@ if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then +- fi +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd $destdir; make M=scripts clean) +-+ +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+ # create_package "$libc_headers_packagename" "$libc_headers_dir" +-+ create_package "$dtb_packagename" "$dtb_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +-diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian +-index edcad61fe3cd..8a49f432921f 100755 +---- a/scripts/package/mkdebian +-+++ b/scripts/package/mkdebian +-@@ -94,10 +94,12 @@ else +- packageversion=$version-$revision +- fi +- sourcename=$KDEB_SOURCENAME +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +-+image_name= +- set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-@@ -181,6 +183,7 @@ Description: Linux kernel, version $version +- +- Package: $kernel_headers_packagename +- Architecture: $debarch +-+Depends: make, gcc, libc6-dev, flex, bison, libssl-dev +- Description: Linux kernel headers for $version on $debarch +- This package provides kernel header files for $version on $debarch +- . +-@@ -200,6 +203,11 @@ Architecture: $debarch +- Description: Linux kernel debugging symbols for $version +- This package will come in handy if you need to debug the kernel. It provides +- all the necessary debug symbols for the kernel and its modules. +-+ +-+Package: $dtb_packagename +-+Architecture: $debarch +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version +- EOF +- +- cat < debian/rules +--- +-2.16.4 +- +diff --git a/patch/misc/general-packaging-4.4.y-rk3399.patch b/patch/misc/general-packaging-4.4.y-rk3399.patch +deleted file mode 100644 +index bb0c925e7..000000000 +--- a/patch/misc/general-packaging-4.4.y-rk3399.patch ++++ /dev/null +@@ -1,216 +0,0 @@ +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 6c3b038e..f4166fbe 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -27,6 +27,28 @@ create_package() { +- chown -R root:root "$pdir" +- chmod -R go-w "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /dtb ]; then mv /dtb /dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "exit 0" >> $pdir/DEBIAN/preinst +-+ chmod 775 $pdir/DEBIAN/preinst +-+ # +-+ echo "if [ -d /boot/dtb-$version.old ]; then rm -rf /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/postinst +-+ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinstall script for headers +-+ if [[ "$1" == *headers* ]]; then +-+ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; find -type f -exec touch {} +;yes "" | make oldconfig >/dev/null;make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null; make -s M=scripts/mod/ >/dev/null" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +- # Create the package +- dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -93,11 +115,13 @@ tmpdir="$objtree/debian/tmp" +- fwdir="$objtree/debian/fwtmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +-+dtb_dir="$objtree/debian/dtbtmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--fwpackagename=linux-firmware-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+fwpackagename=linux-firmware-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +- forcearch= +-@@ -114,7 +138,7 @@ case $ARCH in +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +--parisc|mips|powerpc) +-+parisc|mips|powerpc|arm64) +- installed_image_path="boot/vmlinux-$version" +- ;; +- *) +-@@ -124,7 +148,9 @@ esac +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$fwdir/lib/firmware/$version/" +-@@ -143,9 +169,10 @@ else +- fi +- # Not all arches include the boot path in KBUILD_IMAGE +- if [ -e $KBUILD_IMAGE ]; then +-- cp $KBUILD_IMAGE "$tmpdir/$installed_image_path" +-+#Forcing KBUILD_MAGE reference to Image instead of zImage.. Armbian LINUX_KERNEL_TYPE=Image not being honored +-+ cp Image "$tmpdir/$installed_image_path" +- else +-- cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path" +-+ cp arch/$ARCH/boot/Image "$tmpdir/$installed_image_path" +- fi +- +- if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then +-@@ -183,6 +210,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -195,7 +227,7 @@ fi +- # so do we; recent versions of dracut and initramfs-tools will obey this. +- debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then +-- want_initrd=Yes +-+ want_initrd=Yes +- else +- want_initrd=No +- fi +-@@ -207,9 +239,11 @@ for script in postinst postrm preinst prerm ; do +- set -e +- +- # Pass maintainer script parameters to hook scripts +-+ +- export DEB_MAINT_PARAMS="\$*" +- +- # Tell initramfs builder whether it's wanted +-+ +- export INITRD=$want_initrd +- +- test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d +-@@ -218,6 +252,44 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null 2>&1 || mv /$installed_image_path /boot/Image +-+touch /boot/.next +-+exit 0 +-+EOT +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Try to determine maintainer and email values +- if [ -n "$DEBEMAIL" ]; then +- email=$DEBEMAIL +-@@ -328,17 +412,26 @@ fi +- (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+######################## headers patch +-+ZACNI=$(pwd) +-+cd $destdir +-+patch -p1 < /tmp/headers-debian-byteshift.patch +-+cd $ZACNI +-+######################## headers patch +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd "$destdir"; make M=scripts clean) +-+ +- cat <> debian/control +- +- Package: $kernel_headers_packagename +--Provides: linux-headers, linux-headers-2.6 +-+Provides: $kernel_headers_packagename +- Architecture: any +-+Depends: make, gcc, libc6-dev, libssl-dev +- Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} +- This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} +- . +-@@ -363,6 +456,16 @@ fi +- +- cat <> debian/control +- +-+Package: $dtb_packagename +-+Architecture: any +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version. +-+EOF +-+ +-+create_package "$dtb_packagename" "$dtb_dir" +-+ +-+cat <> debian/control +-+ +- Package: $libc_headers_packagename +- Section: devel +- Provides: $libc_headers_packagename +-@@ -374,7 +477,7 @@ EOF +- +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+# create_package "$libc_headers_packagename" "$libc_headers_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +diff --git a/patch/misc/general-packaging-4.4.y-rockchip64.patch b/patch/misc/general-packaging-4.4.y-rockchip64.patch +deleted file mode 100644 +index c5bfe253c..000000000 +--- a/patch/misc/general-packaging-4.4.y-rockchip64.patch ++++ /dev/null +@@ -1,216 +0,0 @@ +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 6c3b038e..f4166fbe 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -27,6 +27,28 @@ create_package() { +- chown -R root:root "$pdir" +- chmod -R go-w "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /dtb ]; then mv /dtb /dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "exit 0" >> $pdir/DEBIAN/preinst +-+ chmod 775 $pdir/DEBIAN/preinst +-+ # +-+ echo "if [ -d /boot/dtb-$version.old ]; then rm -rf /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/postinst +-+ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinstall script for headers +-+ if [[ "$1" == *headers* ]]; then +-+ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; find -type f -exec touch {} +;yes "" | make oldconfig >/dev/null;make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null; make -s M=scripts/mod/ >/dev/null" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +- # Create the package +- dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -93,11 +115,13 @@ tmpdir="$objtree/debian/tmp" +- fwdir="$objtree/debian/fwtmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +-+dtb_dir="$objtree/debian/dtbtmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--fwpackagename=linux-firmware-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+fwpackagename=linux-firmware-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +- forcearch= +-@@ -114,7 +138,7 @@ case $ARCH in +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +--parisc|mips|powerpc) +-+parisc|mips|powerpc|arm64) +- installed_image_path="boot/vmlinux-$version" +- ;; +- *) +-@@ -124,7 +148,9 @@ esac +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$fwdir/lib/firmware/$version/" +-@@ -143,9 +169,10 @@ else +- fi +- # Not all arches include the boot path in KBUILD_IMAGE +- if [ -e $KBUILD_IMAGE ]; then +-- cp $KBUILD_IMAGE "$tmpdir/$installed_image_path" +-+#Forcing KBUILD_MAGE reference to Image instead of zImage.. Armbian LINUX_KERNEL_TYPE=Image not being honored +-+ cp Image "$tmpdir/$installed_image_path" +- else +-- cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path" +-+ cp arch/$ARCH/boot/Image "$tmpdir/$installed_image_path" +- fi +- +- if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then +-@@ -183,6 +210,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -195,7 +227,7 @@ fi +- # so do we; recent versions of dracut and initramfs-tools will obey this. +- debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then +-- want_initrd=Yes +-+ want_initrd=Yes +- else +- want_initrd=No +- fi +-@@ -207,9 +239,11 @@ for script in postinst postrm preinst prerm ; do +- set -e +- +- # Pass maintainer script parameters to hook scripts +-+ +- export DEB_MAINT_PARAMS="\$*" +- +- # Tell initramfs builder whether it's wanted +-+ +- export INITRD=$want_initrd +- +- test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d +-@@ -218,6 +252,44 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null 2>&1 || mv /$installed_image_path /boot/Image +-+touch /boot/.next +-+exit 0 +-+EOT +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Try to determine maintainer and email values +- if [ -n "$DEBEMAIL" ]; then +- email=$DEBEMAIL +-@@ -328,17 +412,26 @@ fi +- (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+######################## headers patch +-+ZACNI=$(pwd) +-+cd $destdir +-+patch -p1 < /tmp/headers-debian-byteshift.patch +-+cd $ZACNI +-+######################## headers patch +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd "$destdir"; make M=scripts clean) +-+ +- cat <> debian/control +- +- Package: $kernel_headers_packagename +--Provides: linux-headers, linux-headers-rockchip, linux-headers-rockchip-4.4 +-+Provides: $kernel_headers_packagename +- Architecture: any +-+Depends: make, gcc, libc6-dev, libssl-dev +- Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} +- This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} +- . +-@@ -363,6 +456,16 @@ fi +- +- cat <> debian/control +- +-+Package: $dtb_packagename +-+Architecture: any +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version. +-+EOF +-+ +-+create_package "$dtb_packagename" "$dtb_dir" +-+ +-+cat <> debian/control +-+ +- Package: $libc_headers_packagename +- Section: devel +- Provides: $libc_headers_packagename +-@@ -374,7 +477,7 @@ EOF +- +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+# create_package "$libc_headers_packagename" "$libc_headers_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +diff --git a/patch/misc/general-packaging-4.4.y.patch b/patch/misc/general-packaging-4.4.y.patch +deleted file mode 100644 +index f6d351a7e..000000000 +--- a/patch/misc/general-packaging-4.4.y.patch ++++ /dev/null +@@ -1,230 +0,0 @@ +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 6c3b038e..977a0624 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -27,6 +27,28 @@ +- chown -R root:root "$pdir" +- chmod -R go-w "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /dtb ]; then mv /dtb /dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "exit 0" >> $pdir/DEBIAN/preinst +-+ chmod 775 $pdir/DEBIAN/preinst +-+ # +-+ echo "if [ -d /boot/dtb-$version.old ]; then rm -rf /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/postinst +-+ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinstall script for headers +-+ if [[ "$1" == *headers* ]]; then +-+ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; find -type f -exec touch {} +;yes "" | make oldconfig >/dev/null;make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null; make -s M=scripts/mod/ >/dev/null" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +- # Create the package +- dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -50,8 +72,11 @@ +- mips*) +- debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; +- arm64) +-- debarch=arm64 ;; +-+ debarch=arm64 +-+ image_name=Image +-+ ;; +- arm*) +-+ image_name=zImage +- if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then +- if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then +- debarch=armhf +-@@ -93,11 +118,13 @@ +- fwdir="$objtree/debian/fwtmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +-+dtb_dir="$objtree/debian/dtbtmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--fwpackagename=linux-firmware-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+fwpackagename=linux-firmware-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +- forcearch= +-@@ -124,7 +151,9 @@ +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$fwdir/lib/firmware/$version/" +-@@ -183,6 +212,11 @@ +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -195,21 +229,23 @@ +- # so do we; recent versions of dracut and initramfs-tools will obey this. +- debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then +-- want_initrd=Yes +-+ want_initrd=Yes +- else +- want_initrd=No +- fi +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +- # Pass maintainer script parameters to hook scripts +-+ +- export DEB_MAINT_PARAMS="\$*" +- +- # Tell initramfs builder whether it's wanted +-+ +- export INITRD=$want_initrd +- +- test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d +-@@ -218,6 +254,44 @@ +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null 2>&1 || mv /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Try to determine maintainer and email values +- if [ -n "$DEBEMAIL" ]; then +- email=$DEBEMAIL +-@@ -293,7 +376,7 @@ +- cat <> debian/control +- +- Package: $packagename +--Provides: linux-image, linux-image-2.6, linux-modules-$version +-+Provides: $packagename +- Architecture: any +- Description: User Mode Linux kernel, version $version +- User-mode Linux is a port of the Linux kernel to its own system call +-@@ -310,7 +393,7 @@ +- cat <> debian/control +- +- Package: $packagename +--Provides: linux-image, linux-image-2.6, linux-modules-$version +-+Provides: $packagename +- Suggests: $fwpackagename +- Architecture: any +- Description: Linux kernel, version $version +-@@ -328,17 +411,26 @@ +- (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+######################## headers patch +-+ZACNI=$(pwd) +-+cd $destdir +-+patch -p1 < /tmp/headers-debian-byteshift.patch +-+cd $ZACNI +-+######################## headers patch +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd "$destdir"; make M=scripts clean) +-+ +- cat <> debian/control +- +- Package: $kernel_headers_packagename +--Provides: linux-headers, linux-headers-2.6 +-+Provides: $kernel_headers_packagename +- Architecture: any +-+Depends: make, gcc, libc6-dev, libssl-dev +- Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} +- This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} +- . +-@@ -363,6 +457,16 @@ +- +- cat <> debian/control +- +-+Package: $dtb_packagename +-+Architecture: any +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version. +-+EOF +-+ +-+create_package "$dtb_packagename" "$dtb_dir" +-+ +-+cat <> debian/control +-+ +- Package: $libc_headers_packagename +- Section: devel +- Provides: linux-kernel-headers +-@@ -374,7 +478,7 @@ +- +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+# create_package "$libc_headers_packagename" "$libc_headers_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +diff --git a/patch/misc/general-packaging-4.9.y.patch b/patch/misc/general-packaging-4.9.y.patch +deleted file mode 100644 +index 1db057cc1..000000000 +--- a/patch/misc/general-packaging-4.9.y.patch ++++ /dev/null +@@ -1,199 +0,0 @@ +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 0a2a7372..87edac65 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -29,6 +29,28 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [[ "$1" == *dtb* ]]; then +-+ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /dtb ]; then mv /dtb /dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst +-+ echo "exit 0" >> $pdir/DEBIAN/preinst +-+ chmod 775 $pdir/DEBIAN/preinst +-+ # +-+ echo "if [ -d /boot/dtb-$version.old ]; then rm -rf /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/postinst +-+ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinstall script for headers +-+ if [[ "$1" == *headers* ]]; then +-+ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; find -type f -exec touch {} +;yes "" | make oldconfig >/dev/null;make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null; make -s M=scripts/mod/ >/dev/null" >> $pdir/DEBIAN/postinst +-+ echo "exit 0" >> $pdir/DEBIAN/postinst +-+ chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +- # Create the package +- dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" +- dpkg --build "$pdir" .. +-@@ -95,11 +117,13 @@ tmpdir="$objtree/debian/tmp" +- fwdir="$objtree/debian/fwtmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +-+dtb_dir="$objtree/debian/dtbtmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--fwpackagename=linux-firmware-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+fwpackagename=linux-firmware-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- debarch= +- forcearch= +-@@ -126,7 +150,9 @@ esac +- BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$fwdir/lib/firmware/$version/" +-@@ -185,6 +211,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE headers_check KBUILD_SRC= +- $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -197,21 +228,23 @@ fi +- # so do we; recent versions of dracut and initramfs-tools will obey this. +- debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then +-- want_initrd=Yes +-+ want_initrd=Yes +- else +- want_initrd=No +- fi +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +- # Pass maintainer script parameters to hook scripts +-+ +- export DEB_MAINT_PARAMS="\$*" +- +- # Tell initramfs builder whether it's wanted +-+ +- export INITRD=$want_initrd +- +- test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d +-@@ -220,6 +253,44 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null 2>&1 || mv /$installed_image_path /boot/zImage +-+touch /boot/.next +-+exit 0 +-+EOT +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Try to determine maintainer and email values +- if [ -n "$DEBEMAIL" ]; then +- email=$DEBEMAIL +-@@ -337,17 +417,26 @@ if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then +- fi +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+######################## headers patch +-+ZACNI=$(pwd) +-+cd $destdir +-+patch -p1 < /tmp/headers-debian-byteshift.patch +-+cd $ZACNI +-+######################## headers patch +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd "$destdir"; make M=scripts clean) +-+ +- cat <> debian/control +- +- Package: $kernel_headers_packagename +--Provides: linux-headers, linux-headers-2.6 +-+Provides: $kernel_headers_packagename +- Architecture: any +-+Depends: make, gcc, libc6-dev, libssl-dev +- Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} +- This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} +- . +-@@ -372,6 +461,16 @@ fi +- +- cat <> debian/control +- +-+Package: $dtb_packagename +-+Architecture: any +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version. +-+EOF +-+ +-+create_package "$dtb_packagename" "$dtb_dir" +-+ +-+cat <> debian/control +-+ +- Package: $libc_headers_packagename +- Section: devel +- Provides: $libc_headers_packagename +-@@ -383,7 +482,7 @@ EOF +- +- if [ "$ARCH" != "um" ]; then +- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+# create_package "$libc_headers_packagename" "$libc_headers_dir" +- fi +- +- create_package "$packagename" "$tmpdir" +diff --git a/patch/misc/general-packaging-5.10.y.patch b/patch/misc/general-packaging-5.10.y.patch +deleted file mode 100644 +index 67f8d3595..000000000 +--- a/patch/misc/general-packaging-5.10.y.patch ++++ /dev/null +@@ -1,367 +0,0 @@ +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index 5858d6e44..e81b8a6fc 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -142,7 +142,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- +- all: Image.gz +- +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 1b11f8993..c21d931ea 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -26,31 +26,62 @@ +- +- create_package() { +- local pname="$1" pdir="$2" +-- local dpkg_deb_opts +- +- mkdir -m 755 -p "$pdir/DEBIAN" +- mkdir -p "$pdir/usr/share/doc/$pname" +- cp debian/copyright "$pdir/usr/share/doc/$pname/" +- cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" +-- gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian" +-+ gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" +- sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ +- | xargs -r0 md5sum > DEBIAN/md5sums" +- +- # Fix ownership and permissions +-- if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then +-- dpkg_deb_opts="--root-owner-group" +-- else +-- chown -R root:root "$pdir" +-- fi +-+ chown -R root:root "$pdir" +- chmod -R go-w "$pdir" +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +-- # in case we build in a setuid/setgid directory +-- chmod -R ug-s "$pdir" +-+ +-+ # Create preinstall and post install script to remove dtb +-+ if [ "$3" = "dtb" ]; then +-+ +-+ cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinst prerm scripts for headers +-+ if [ "$3" = "headers" ]; then +-+ +-+cat >> $pdir/DEBIAN/postinst << EOT +-+cd /usr/src/linux-headers-$version +-+echo "Compiling headers - please wait ..." +-+find -type f -exec touch {} + +-+yes "" | make oldconfig >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s M=scripts/mod/ >/dev/null +-+exit 0 +-+EOT +-+ +-+cat >> $pdir/DEBIAN/prerm << EOT +-+cd /usr/src/linux-headers-$version +-+rm -rf scripts .config.old +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm +-+ fi +- +- # Create the package +- dpkg-gencontrol -p$pname -P"$pdir" +-- dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +-+ dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +- } +- +- deploy_kernel_headers () { +-@@ -62,7 +92,7 @@ +- cd $srctree +- find . arch/$SRCARCH -maxdepth 1 -name Makefile\* +- find include scripts -type f -o -type l +-- find arch/$SRCARCH -name Kbuild.platforms -o -name Platform +-+ find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform +- find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f +- ) > debian/hdrsrcfiles +- +-@@ -107,9 +137,15 @@ +- } +- +- version=$KERNELRELEASE +--tmpdir=debian/linux-image +--dbg_dir=debian/linux-image-dbg +--packagename=linux-image-$version +-+tmpdir="$objtree/debian/tmp" +-+kernel_headers_dir="$objtree/debian/hdrtmp" +-+libc_headers_dir="$objtree/debian/headertmp" +-+dbg_dir="$objtree/debian/dbgtmp" +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- +- if [ "$ARCH" = "um" ] ; then +-@@ -120,6 +156,15 @@ +- # XXX: have each arch Makefile export a variable of the canonical image install +- # path instead +- case $ARCH in +-+aarch64|arm64) +-+ image_name=Image +-+ installed_image_path="boot/vmlinuz-$version" +-+ +-+ ;; +-+arm*) +-+ image_name=zImage +-+ installed_image_path="boot/vmlinuz-$version" +-+ ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +-@@ -133,13 +178,17 @@ +- BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$dbg_dir" debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +-+mkdir -p "$kernel_headers_dir/lib/modules/$version/" +- +--# Install the kernel +-+# Build and install the kernel +- if [ "$ARCH" = "um" ] ; then +- mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" +-+ $MAKE linux +- cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" +- cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" +- gzip "$tmpdir/usr/share/doc/$packagename/config" +-@@ -183,6 +232,21 @@ +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +-+if [ "$ARCH" != "um" ]; then +-+ $MAKE -f $srctree/Makefile headers +-+ $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" +-+ # move asm headers to /usr/include//asm to match the structure +-+ # used by Debian-based distros (to support multi-arch) +-+ host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) +-+ mkdir $libc_headers_dir/usr/include/$host_arch +-+ mv $libc_headers_dir/usr/include/asm $libc_headers_dir/usr/include/$host_arch/ +-+fi +-+ +- # Install the maintainer scripts +- # Note: hook scripts under /etc/kernel are also executed by official Debian +- # kernel packages, as well as kernel packages built using make-kpkg. +-@@ -192,7 +256,7 @@ +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -208,14 +272,73 @@ +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +--if [ "$ARCH" != "um" ]; then +-- if is_enabled CONFIG_MODULES; then +-- deploy_kernel_headers debian/linux-headers +-- create_package linux-headers-$version debian/linux-headers +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null || cp /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+ +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +-+# Build kernel header package +-+(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +-+ldstemp=$(mktemp);cp scripts/module.lds $ldstemp +-+(cd $objtree; make M=scripts clean;) +-+if is_enabled CONFIG_STACK_VALIDATION; then +-+ (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles" +-+fi +-+(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +-+if is_enabled CONFIG_GCC_PLUGINS; then +-+ (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" +-+fi +-+destdir=$kernel_headers_dir/usr/src/linux-headers-$version +-+mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +-+(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +-+(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +-+(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +-+mv ${ldstemp} $destdir/scripts/module.lds +-+ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +-+rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-- deploy_libc_headers debian/linux-libc-dev +-- create_package linux-libc-dev debian/linux-libc-dev +-+if [ "$ARCH" != "um" ]; then +-+ create_package "$kernel_headers_packagename" "$kernel_headers_dir" "headers" +-+ create_package "$dtb_packagename" "$dtb_dir" "dtb" +- fi +- +- create_package "$packagename" "$tmpdir" +-diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian +-index 60a2a63a5..7c6197efa 100755 +---- a/scripts/package/mkdebian +-+++ b/scripts/package/mkdebian +-@@ -94,16 +94,18 @@ else +- packageversion=$version-$revision +- fi +- sourcename=$KDEB_SOURCENAME +-+packagename=linux-image-$BRANCH$LOCALVERSION +-+kernel_headers_packagename=linux-headers-$BRANCH$LOCALVERSION +-+dtb_packagename=linux-dtb-$BRANCH$LOCALVERSION +-+dbg_packagename=$packagename-dbg +-+debarch= +-+image_name= +-+set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-- packagename=user-mode-linux +--else +-- packagename=linux-image +-+ packagename=user-mode-linux-$version +- fi +- +--debarch= +--set_debarch +-- +- email=${DEBEMAIL-$EMAIL} +- +- # use email string directly if it contains +-@@ -174,16 +176,28 @@ Source: $sourcename +- Section: kernel +- Priority: optional +- Maintainer: $maintainer +--Rules-Requires-Root: no +- Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends +- Homepage: https://www.kernel.org/ +- +--Package: $packagename-$version +-+Package: $packagename +- Architecture: $debarch +- Description: Linux kernel, version $version +- This package contains the Linux kernel, modules and corresponding other +- files, version: $version. +- +-+Package: $dtb_packagename +-+Architecture: $debarch +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version +-+ +-+Package: $kernel_headers_packagename +-+Architecture: $debarch +-+Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +-+Description: Linux kernel headers for $version on $debarch +-+ This package provides kernel header files for $version on $debarch +-+ . +-+ This is useful for people who need to build external modules +-+ +- Package: linux-libc-dev +- Section: devel +- Provides: linux-kernel-headers +-@@ -194,22 +208,10 @@ Description: Linux support headers for userspace development +- Multi-Arch: same +- EOF +- +--if is_enabled CONFIG_MODULES; then +--cat <> debian/control +-- +--Package: linux-headers-$version +--Architecture: $debarch +--Description: Linux kernel headers for $version on $debarch +-- This package provides kernel header files for $version on $debarch +-- . +-- This is useful for people who need to build external modules +--EOF +--fi +-- +- if is_enabled CONFIG_DEBUG_INFO; then +- cat <> debian/control +- +--Package: linux-image-$version-dbg +-+Package: $dbg_packagename +- Section: debug +- Architecture: $debarch +- Description: Linux kernel debugging symbols for $version +-@@ -223,15 +225,11 @@ cat < debian/rules +- +- srctree ?= . +- +--build-indep: +--build-arch: +-+build: +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ +- KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile +- +--build: build-arch +-- +--binary-indep: +--binary-arch: build-arch +-+binary-arch: +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ +- KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg +- +diff --git a/patch/misc/general-packaging-5.3.y.patch b/patch/misc/general-packaging-5.3.y.patch +deleted file mode 100644 +index 97c8f3c6d..000000000 +--- a/patch/misc/general-packaging-5.3.y.patch ++++ /dev/null +@@ -1,262 +0,0 @@ +-From 87395a5fca108473ae5b4124fe1611d0493701ac Mon Sep 17 00:00:00 2001 +-From: The-going <48602507+The-going@users.noreply.github.com> +-Date: Tue, 10 Mar 2020 17:16:41 +0300 +-Subject: [PATCH] general packaging 5.3.y +- +---- +- arch/arm64/Makefile | 2 +- +- scripts/package/builddeb | 116 ++++++++++++++++++++++++++++++++++++--- +- scripts/package/mkdebian | 15 ++++- +- 3 files changed, 121 insertions(+), 12 deletions(-) +- +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index d227cf87c..2ccca81a1 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -133,7 +133,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- +- all: Image.gz +- +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index c4c580f54..3d10f513d 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -41,9 +41,47 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [ "$3" = "dtb" ]; then +-+ +-+ cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinst prerm scripts for headers +-+ if [ "$3" = "headers" ]; then +-+ +-+cat >> $pdir/DEBIAN/postinst << EOT +-+cd /usr/src/linux-headers-$version +-+echo "Compiling headers - please wait ..." +-+find -type f -exec touch {} + +-+yes "" | make oldconfig >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s M=scripts/mod/ >/dev/null +-+exit 0 +-+EOT +-+ +-+cat >> $pdir/DEBIAN/prerm << EOT +-+cd /usr/src/linux-headers-$version +-+rm -rf scripts .config.old +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm +-+ fi +-+ +- # Create the package +- dpkg-gencontrol -p$pname -P"$pdir" +-- dpkg --build "$pdir" .. +-+ dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +- } +- +- version=$KERNELRELEASE +-@@ -51,9 +89,11 @@ tmpdir="$objtree/debian/tmp" +- kernel_headers_dir="$objtree/debian/hdrtmp" +- libc_headers_dir="$objtree/debian/headertmp" +- dbg_dir="$objtree/debian/dbgtmp" +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +--libc_headers_packagename=linux-libc-dev +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- +- if [ "$ARCH" = "um" ] ; then +-@@ -64,6 +104,15 @@ fi +- # XXX: have each arch Makefile export a variable of the canonical image install +- # path instead +- case $ARCH in +-+aarch64|arm64) +-+ image_name=Image +-+ installed_image_path="boot/vmlinuz-$version" +-+ +-+ ;; +-+arm*) +-+ image_name=zImage +-+ installed_image_path="boot/vmlinuz-$version" +-+ ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +-@@ -77,7 +126,9 @@ esac +- BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +- mkdir -p "$kernel_headers_dir/lib/modules/$version/" +-@@ -129,6 +180,11 @@ if is_enabled CONFIG_MODULES; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +- if [ "$ARCH" != "um" ]; then +- $MAKE -f $srctree/Makefile headers +- $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" +-@@ -148,7 +204,7 @@ debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -164,9 +220,49 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst <> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +- # Build kernel header package +- (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +- (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +- if is_enabled CONFIG_STACK_VALIDATION; then +-@@ -178,15 +274,19 @@ if is_enabled CONFIG_GCC_PLUGINS; then +- fi +- destdir=$kernel_headers_dir/usr/src/linux-headers-$version +- mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +- (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +- (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +- ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +- rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +- +-+(cd $destdir; make M=scripts clean) +-+ +- if [ "$ARCH" != "um" ]; then +-- create_package "$kernel_headers_packagename" "$kernel_headers_dir" +-- create_package "$libc_headers_packagename" "$libc_headers_dir" +-+ create_package "$kernel_headers_packagename" "$kernel_headers_dir" "headers" +-+#UNCOMENT create_package "$libc_headers_packagename" "$libc_headers_dir" +-+ create_package "$dtb_packagename" "$dtb_dir" "dtb" +- fi +- +- create_package "$packagename" "$tmpdir" +-diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian +-index 357dc56bc..602e709bc 100755 +---- a/scripts/package/mkdebian +-+++ b/scripts/package/mkdebian +-@@ -94,10 +94,13 @@ else +- packageversion=$version-$revision +- fi +- sourcename=$KDEB_SOURCENAME +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +-+packagename=linux-image-$BRANCH$LOCALVERSION +-+kernel_headers_packagename=linux-headers-$BRANCH$LOCALVERSION +-+libc_headers_packagename=linux-libc-dev-$BRANCH$LOCALVERSION +-+dtb_packagename=linux-dtb-$BRANCH$LOCALVERSION +- dbg_packagename=$packagename-dbg +- debarch= +-+image_name= +- set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-@@ -185,12 +188,13 @@ Description: Linux kernel, version $version +- +- Package: $kernel_headers_packagename +- Architecture: $debarch +-+Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +- Description: Linux kernel headers for $version on $debarch +- This package provides kernel header files for $version on $debarch +- . +- This is useful for people who need to build external modules +- +--Package: linux-libc-dev +-+Package: $libc_headers_packagename +- Section: devel +- Provides: linux-kernel-headers +- Architecture: $debarch +-@@ -205,6 +209,11 @@ Architecture: $debarch +- Description: Linux kernel debugging symbols for $version +- This package will come in handy if you need to debug the kernel. It provides +- all the necessary debug symbols for the kernel and its modules. +-+ +-+Package: $dtb_packagename +-+Architecture: $debarch +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version +- EOF +- +- cat < debian/rules +--- +-2.34.1 +- +diff --git a/patch/misc/general-packaging-5.6.y.patch b/patch/misc/general-packaging-5.6.y.patch +deleted file mode 100644 +index b1350ee43..000000000 +--- a/patch/misc/general-packaging-5.6.y.patch ++++ /dev/null +@@ -1,263 +0,0 @@ +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index 5858d6e44..e81b8a6fc 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -142,7 +142,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- +- all: Image.gz +- +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 6df3c9f..d33e1f3 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -41,9 +41,47 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [ "$3" = "dtb" ]; then +-+ +-+ cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinst prerm scripts for headers +-+ if [ "$3" = "headers" ]; then +-+ +-+cat >> $pdir/DEBIAN/postinst << EOT +-+cd /usr/src/linux-headers-$version +-+echo "Compiling headers - please wait ..." +-+yes "" | make oldconfig >/dev/null +-+find -type f -exec touch {} + +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s M=scripts/mod/ >/dev/null +-+exit 0 +-+EOT +-+ +-+cat >> $pdir/DEBIAN/prerm << EOT +-+cd /usr/src/linux-headers-$version +-+rm -rf scripts .config.old +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm +-+ fi +-+ +- # Create the package +-- dpkg-gencontrol -p$pname -P"$pdir" +-- dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +-+ dpkg-gencontrol -p$pname -P"$pdir" +-+ dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +- } +- +- deploy_kernel_headers () { +-@@ -100,9 +122,15 @@ deploy_libc_headers () { +- } +- +- version=$KERNELRELEASE +--tmpdir=debian/linux-image +--dbg_dir=debian/linux-image-dbg +--packagename=linux-image-$version +-+tmpdir="$objtree/debian/tmp" +-+kernel_headers_dir="$objtree/debian/hdrtmp" +-+libc_headers_dir="$objtree/debian/headertmp" +-+dbg_dir="$objtree/debian/dbgtmp" +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- +- if [ "$ARCH" = "um" ] ; then +-@@ -113,6 +141,15 @@ fi +- # XXX: have each arch Makefile export a variable of the canonical image install +- # path instead +- case $ARCH in +-+aarch64|arm64) +-+ image_name=Image +-+ installed_image_path="boot/vmlinuz-$version" +-+ +-+ ;; +-+arm*) +-+ image_name=zImage +-+ installed_image_path="boot/vmlinuz-$version" +-+ ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +-@@ -126,13 +163,17 @@ esac +- BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$dbg_dir" debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +-+mkdir -p "$kernel_headers_dir/lib/modules/$version/" +- +--# Install the kernel +-+# Build and install the kernel +- if [ "$ARCH" = "um" ] ; then +- mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" +-+ $MAKE linux +- cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" +- cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" +- gzip "$tmpdir/usr/share/doc/$packagename/config" +-@@ -176,6 +217,21 @@ if is_enabled CONFIG_MODULES; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +-+if [ "$ARCH" != "um" ]; then +-+ $MAKE -f $srctree/Makefile headers +-+ $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" +-+ # move asm headers to /usr/include//asm to match the structure +-+ # used by Debian-based distros (to support multi-arch) +-+ host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) +-+ mkdir $libc_headers_dir/usr/include/$host_arch +-+ mv $libc_headers_dir/usr/include/asm $libc_headers_dir/usr/include/$host_arch/ +-+fi +-+ +- # Install the maintainer scripts +- # Note: hook scripts under /etc/kernel are also executed by official Debian +- # kernel packages, as well as kernel packages built using make-kpkg. +-@@ -185,7 +241,7 @@ debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -201,12 +257,72 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +--if [ "$ARCH" != "um" ]; then +-- deploy_kernel_headers debian/linux-headers +-- create_package linux-headers-$version debian/linux-headers +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null || mv /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+ +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +-+# Build kernel header package +-+(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +-+if is_enabled CONFIG_STACK_VALIDATION; then +-+ (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles" +-+fi +-+(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +-+if is_enabled CONFIG_GCC_PLUGINS; then +-+ (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" +-+fi +-+destdir=$kernel_headers_dir/usr/src/linux-headers-$version +-+mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +-+(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +-+(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +-+(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +-+ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +-+rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +-+ +-+(cd $destdir; make M=scripts clean) +-+ +-+if [ "$ARCH" != "um" ]; then +-+ create_package "$kernel_headers_packagename" "$kernel_headers_dir" "headers" +-+ create_package "$dtb_packagename" "$dtb_dir" "dtb" +- fi +- +- create_package "$packagename" "$tmpdir" +---- a/scripts/package/mkdebian +-+++ b/scripts/package/mkdebian +-@@ -94,10 +94,12 @@ else +- packageversion=$version-$revision +- fi +- sourcename=$KDEB_SOURCENAME +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +-+packagename=linux-image-$BRANCH$LOCALVERSION +-+kernel_headers_packagename=linux-headers-$BRANCH$LOCALVERSION +-+dtb_packagename=linux-dtb-$BRANCH$LOCALVERSION +- dbg_packagename=$packagename-dbg +- debarch= +-+image_name= +- set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-@@ -183,8 +185,14 @@ Description: Linux kernel, version $version +- This package contains the Linux kernel, modules and corresponding other +- files, version: $version. +- +-+Package: $dtb_packagename +-+Architecture: $debarch +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version +-+ +- Package: $kernel_headers_packagename +- Architecture: $debarch +-+Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +- Description: Linux kernel headers for $version on $debarch +- This package provides kernel header files for $version on $debarch +- . +diff --git a/patch/misc/general-packaging-5.8-9.y.patch b/patch/misc/general-packaging-5.8-9.y.patch +deleted file mode 100644 +index 0ed5ed3ee..000000000 +--- a/patch/misc/general-packaging-5.8-9.y.patch ++++ /dev/null +@@ -1,265 +0,0 @@ +-diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +-index 5858d6e44..e81b8a6fc 100644 +---- a/arch/arm64/Makefile +-+++ b/arch/arm64/Makefile +-@@ -142,7 +142,7 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a +- +- # Default target when executing plain make +- boot := arch/arm64/boot +--KBUILD_IMAGE := $(boot)/Image.gz +-+KBUILD_IMAGE := $(boot)/Image +- +- all: Image.gz +- +-diff --git a/scripts/package/builddeb b/scripts/package/builddeb +-index 6df3c9f..d33e1f3 100755 +---- a/scripts/package/builddeb +-+++ b/scripts/package/builddeb +-@@ -41,9 +41,47 @@ create_package() { +- # in case we are in a restrictive umask environment like 0077 +- chmod -R a+rX "$pdir" +- +-+ # Create preinstall and post install script to remove dtb +-+ if [ "$3" = "dtb" ]; then +-+ +-+ cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb +-+exit 0 +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst +-+ fi +-+ +-+ # Create postinst prerm scripts for headers +-+ if [ "$3" = "headers" ]; then +-+ +-+cat >> $pdir/DEBIAN/postinst << EOT +-+cd /usr/src/linux-headers-$version +-+echo "Compiling headers - please wait ..." +-+find -type f -exec touch {} + +-+yes "" | make oldconfig >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts >/dev/null +-+make -j\$(grep -c 'processor' /proc/cpuinfo) -s M=scripts/mod/ >/dev/null +-+exit 0 +-+EOT +-+ +-+cat >> $pdir/DEBIAN/prerm << EOT +-+cd /usr/src/linux-headers-$version +-+rm -rf scripts .config.old +-+EOT +-+ +-+ chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm +-+ fi +-+ +- # Create the package +-- dpkg-gencontrol -p$pname -P"$pdir" +-- dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +-+ dpkg-gencontrol -p$pname -P"$pdir" +-+ dpkg-deb --build "$pdir" .. +- } +- +- deploy_kernel_headers () { +-@@ -100,9 +122,15 @@ deploy_libc_headers () { +- } +- +- version=$KERNELRELEASE +--tmpdir=debian/linux-image +--dbg_dir=debian/linux-image-dbg +--packagename=linux-image-$version +-+tmpdir="$objtree/debian/tmp" +-+kernel_headers_dir="$objtree/debian/hdrtmp" +-+libc_headers_dir="$objtree/debian/headertmp" +-+dbg_dir="$objtree/debian/dbgtmp" +-+dtb_dir="$objtree/debian/dtbtmp" +-+packagename=linux-image-"$BRANCH$LOCALVERSION" +-+kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-+dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +-+libc_headers_packagename=linux-libc-dev-"$BRANCH$LOCALVERSION" +- dbg_packagename=$packagename-dbg +- +- if [ "$ARCH" = "um" ] ; then +-@@ -113,6 +141,15 @@ fi +- # XXX: have each arch Makefile export a variable of the canonical image install +- # path instead +- case $ARCH in +-+aarch64|arm64) +-+ image_name=Image +-+ installed_image_path="boot/vmlinuz-$version" +-+ +-+ ;; +-+arm*) +-+ image_name=zImage +-+ installed_image_path="boot/vmlinuz-$version" +-+ ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +-@@ -126,13 +163,17 @@ esac +- BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) +- +- # Setup the directory structure +--rm -rf "$tmpdir" "$dbg_dir" debian/files +-+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files +-+mkdir -m 755 -p "$dtb_dir/DEBIAN" +-+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +- mkdir -m 755 -p "$tmpdir/DEBIAN" +- mkdir -p "$tmpdir/lib" "$tmpdir/boot" +-+mkdir -p "$kernel_headers_dir/lib/modules/$version/" +- +--# Install the kernel +-+# Build and install the kernel +- if [ "$ARCH" = "um" ] ; then +- mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" +-+ $MAKE linux +- cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" +- cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" +- gzip "$tmpdir/usr/share/doc/$packagename/config" +-@@ -176,6 +217,21 @@ if is_enabled CONFIG_MODULES; then +- fi +- fi +- +-+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +-+ #mkdir -p "$tmpdir/boot/dtb" +-+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-+fi +-+ +-+if [ "$ARCH" != "um" ]; then +-+ $MAKE -f $srctree/Makefile headers +-+ $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" +-+ # move asm headers to /usr/include//asm to match the structure +-+ # used by Debian-based distros (to support multi-arch) +-+ host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) +-+ mkdir $libc_headers_dir/usr/include/$host_arch +-+ mv $libc_headers_dir/usr/include/asm $libc_headers_dir/usr/include/$host_arch/ +-+fi +-+ +- # Install the maintainer scripts +- # Note: hook scripts under /etc/kernel are also executed by official Debian +- # kernel packages, as well as kernel packages built using make-kpkg. +-@@ -185,7 +241,7 @@ debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +- for script in postinst postrm preinst prerm ; do +- mkdir -p "$tmpdir$debhookdir/$script.d" +- cat < "$tmpdir/DEBIAN/$script" +--#!/bin/sh +-+#!/bin/bash +- +- set -e +- +-@@ -201,14 +257,72 @@ EOF +- chmod 755 "$tmpdir/DEBIAN/$script" +- done +- +--if [ "$ARCH" != "um" ]; then +-- if is_enabled CONFIG_MODULES; then +-- deploy_kernel_headers debian/linux-headers +-- create_package linux-headers-$version debian/linux-headers +-- fi +-+## +-+## Create sym link to kernel image +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +-+cat >> $tmpdir/DEBIAN/postinst < /dev/null || mv /$installed_image_path /boot/$image_name +-+touch /boot/.next +-+exit 0 +-+EOT +-+ +-+## +-+## FAT install workaround +-+## +-+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +-+cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst +-+ +-+# Build kernel header package +-+(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find security/*/include -type f) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +-+(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +-+if is_enabled CONFIG_STACK_VALIDATION; then +-+ (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles" +-+fi +-+(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +-+if is_enabled CONFIG_GCC_PLUGINS; then +-+ (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" +-+fi +-+destdir=$kernel_headers_dir/usr/src/linux-headers-$version +-+mkdir -p "$destdir" +-+(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch) +-+(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +-+(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +-+(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +-+ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +-+rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +-+ +-+(cd $destdir; make M=scripts clean) +-+ +-+if [ "$ARCH" != "um" ]; then +-+ create_package "$kernel_headers_packagename" "$kernel_headers_dir" "headers" +-+ create_package "$dtb_packagename" "$dtb_dir" "dtb" +- fi +- +- create_package "$packagename" "$tmpdir" +---- a/scripts/package/mkdebian +-+++ b/scripts/package/mkdebian +-@@ -94,10 +94,12 @@ else +- packageversion=$version-$revision +- fi +- sourcename=$KDEB_SOURCENAME +--packagename=linux-image-$version +--kernel_headers_packagename=linux-headers-$version +-+packagename=linux-image-$BRANCH$LOCALVERSION +-+kernel_headers_packagename=linux-headers-$BRANCH$LOCALVERSION +-+dtb_packagename=linux-dtb-$BRANCH$LOCALVERSION +- dbg_packagename=$packagename-dbg +- debarch= +-+image_name= +- set_debarch +- +- if [ "$ARCH" = "um" ] ; then +-@@ -183,8 +185,14 @@ Description: Linux kernel, version $version +- This package contains the Linux kernel, modules and corresponding other +- files, version: $version. +- +-+Package: $dtb_packagename +-+Architecture: $debarch +-+Description: Linux DTB, version $version +-+ This package contains device blobs from the Linux kernel, version $version +-+ +- Package: $kernel_headers_packagename +- Architecture: $debarch +-+Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +- Description: Linux kernel headers for $version on $debarch +- This package provides kernel header files for $version on $debarch +- . + +From 134bb92d95726ae56da8734bc9c39552c4821e4c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 9 Mar 2022 23:43:39 +0100 +Subject: [PATCH] armbian-next: manual merge (12) of all changes between + revisions 34d4be6b7b346507af58133125cef0bc8ff5aef1 and + 5fe0f36aa832ac64d1db05adc4eb09a4df4b5509 + +--- + config/sources/families/rk35xx.conf | 2 ++ + lib/functions/configuration/main-config.sh | 8 ++++---- + lib/functions/general/git.sh | 2 +- + 3 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/config/sources/families/rk35xx.conf b/config/sources/families/rk35xx.conf +index 3744e6e5f..d0c5a293e 100644 +--- a/config/sources/families/rk35xx.conf ++++ b/config/sources/families/rk35xx.conf +@@ -23,11 +23,13 @@ case $BRANCH in + ;; + + # temporary until kernel 5.16 is well supported for rockchip64 ++ # it has to be its own family too + edge) + export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='rk35xx-'$BRANCH + SKIP_BOOTSPLASH="yes" ++ LINUXFAMILY=rk35xx + LINUXCONFIG='linux-rk35xx-'$BRANCH + + ;; +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 5bf904f58..bea0c0efa 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -85,7 +85,7 @@ function do_main_configuration() { + china) + [[ -z $USE_MAINLINE_GOOGLE_MIRROR ]] && [[ -z $MAINLINE_MIRROR ]] && MAINLINE_MIRROR=tuna + [[ -z $USE_GITHUB_UBOOT_MIRROR ]] && [[ -z $UBOOT_MIRROR ]] && UBOOT_MIRROR=gitee +- [[ -z $GITHUB_MIRROR ]] && GITHUB_MIRROR=cnpmjs ++ [[ -z $GITHUB_MIRROR ]] && GITHUB_MIRROR=gitclone + [[ -z $DOWNLOAD_MIRROR ]] && DOWNLOAD_MIRROR=china + ;; + *) ;; +@@ -139,13 +139,13 @@ function do_main_configuration() { + + case $GITHUB_MIRROR in + fastgit) +- GITHUB_SOURCE='https://hub.fastgit.xyz/' ++ GITHUB_SOURCE='https://hub.fastgit.xyz' + ;; + gitclone) +- GITHUB_SOURCE='https://gitclone.com/github.com/' ++ GITHUB_SOURCE='https://gitclone.com/github.com' + ;; + *) +- GITHUB_SOURCE='https://github.com/' ++ GITHUB_SOURCE='https://github.com' + ;; + esac + +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 8330b3fe4..f096a39ac 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -49,7 +49,7 @@ fetch_from_repo() { + local git_work_dir + + # Set GitHub mirror before anything else touches $url +- url=${url//'https://github.com/'/$GITHUB_SOURCE} ++ url=${url//'https://github.com/'/$GITHUB_SOURCE'/'} + + # The 'offline' variable must always be set to 'true' or 'false' + local offline=false + +From 6058f580ae03c4c197ea60789128edca73046758 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 9 Mar 2022 18:41:30 +0100 +Subject: [PATCH] armbian-next: introduce `PRESERVE_WORKDIR=yes` for heavy + debugging + +--- + lib/functions/main/default-build.sh | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 2e40456c0..5933d9a27 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -185,7 +185,11 @@ function trap_handler_cleanup_workdir() { + display_alert "Cleanup WORKDIR: $WORKDIR" "trap_handler_cleanup_workdir" "cleanup" + unset TMPDIR + if [[ -d "${WORKDIR}" ]]; then +- display_alert "Cleaning up WORKDIR" "$(du -h -s "$WORKDIR")" "debug" +- rm -rf "${WORKDIR}" ++ 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 + } + +From 87c808d5d398dc51a1fabe97b732d94d3094b8b9 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 9 Mar 2022 14:39:21 +0100 +Subject: [PATCH] armbian-next: packaging linux-headers again + +- do NOT use any output from `make headers_install` - that's for libc headers +- grabs "headers" (and binary tools) directly from the kernel build tree, not install target +- does not produce headers if cross compiling, for now +- produces kernel-headers package for the architecture on which it was built +- doing a single make invocation with build and install for packaging + - using 'make all' in place of vmlinuz/bzImage/image/zImage +--- + lib/functions/compilation/kernel-debs.sh | 99 ++++++++++++++++++++++++++++++-- + lib/functions/compilation/kernel.sh | 82 ++++++++++++++++++++++++-- + 2 files changed, 169 insertions(+), 12 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index f02bb4dde..9d1b813d3 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -48,8 +48,8 @@ function prepare_kernel_packaging_debs() { + declare package_version="${REVISION}" + + # show incoming tree +- display_alert "Kernel install dir" "incoming from KBUILD make" "debug" +- run_host_command_logged tree -C --du -h "${kernel_dest_install_dir}" "| grep --line-buffered -v -e '\.ko' -e '\.h' " ++ #display_alert "Kernel install dir" "incoming from KBUILD make" "debug" ++ #run_host_command_logged tree -C --du -h "${kernel_dest_install_dir}" "| grep --line-buffered -v -e '\.ko' -e '\.h' " + + display_alert "tmp_kernel_install_dirs INSTALL_PATH:" "${tmp_kernel_install_dirs[INSTALL_PATH]}" "debug" + display_alert "tmp_kernel_install_dirs INSTALL_MOD_PATH:" "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}" "debug" +@@ -64,8 +64,11 @@ function prepare_kernel_packaging_debs() { + create_kernel_deb "linux-dtb-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_dtb + fi + +- # @TODO: package headers. probably in 3 phases: common per-version (libc headers), common per-arch (arch-specific, with binary tools), and kernel specific (kernel-headers, no tools) +- ++ if dpkg-architecture -e "${ARCH}"; then ++ create_kernel_deb "linux-headers-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_headers ++ else ++ display_alert "Cross-compilation" "skip kernel-headers packaging" "warn" ++ fi + } + + function create_kernel_deb() { +@@ -120,8 +123,8 @@ function create_kernel_deb() { + display_alert "Unpacked ${package_name} tree" "${unpacked_size}" "debug" + + # Show it +- display_alert "Package dir" "for package ${package_name}" "debug" +- run_host_command_logged tree -C -h -d --du "${package_directory}" ++ #display_alert "Package dir" "for package ${package_name}" "debug" ++ #run_host_command_logged tree -C -h -d --du "${package_directory}" + + run_host_command_logged dpkg-deb ${DEB_COMPRESS:+-Z$DEB_COMPRESS} --build "${package_directory}" "${deb_output_dir}" # not KDEB compress, we're not under a Makefile + } +@@ -156,6 +159,9 @@ function kernel_package_callback_linux_image() { + run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_PATH]}" "${package_directory}/" # /boot stuff + run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}/lib" "${package_directory}/" # so "lib" stuff sits at the root + ++ # Clean up symlinks in lib/modules/${kernel_version_family}/build and lib/modules/${kernel_version_family}/source; will be in the headers package ++ run_host_command_logged rm -v -f "${package_directory}/lib/modules/${kernel_version_family}/build" "${package_directory}/lib/modules/${kernel_version_family}/source" ++ + if [[ -d "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" ]]; then + # /usr/lib/linux-image-${kernel_version_family} is wanted by flash-kernel + # /lib/firmware/${kernel_version_family}/device-tree/ would also be acceptable +@@ -243,3 +249,84 @@ function kernel_package_callback_linux_dtb() { + ) + + } ++ ++function kernel_package_callback_linux_headers() { ++ display_alert "package_directory for headers" "${package_directory}" "debug" ++ ++ # targets. ++ local headers_target_dir="${package_directory}/usr/src/linux-headers-${kernel_version_family}" # headers/tools etc ++ local modules_target_dir="${package_directory}/lib/modules/${kernel_version_family}" # symlink to above later ++ ++ mkdir -p "${headers_target_dir}" "${modules_target_dir}" # create both dirs ++ run_host_command_logged ln -v -s "/usr/src/linux-headers-${kernel_version_family}" "${modules_target_dir}/build" # Symlink in modules so builds find the headers ++ run_host_command_logged cp -vp "${kernel_work_dir}"/.config "${headers_target_dir}"/.config # copy .config manually to be where it's expected to be ++ ++ # gather stuff from the linux source tree: ${kernel_work_dir} (NOT the make install destination) ++ # those can be source files or object (binary/compiled) stuff ++ # how to get SRCARCH? only from the makefile itself. ARCH=amd64 then SRCARCH=x86. How to we know? @TODO ++ local SRC_ARCH="${ARCH}" ++ [[ "${SRC_ARCH}" == "amd64" ]] && SRC_ARCH="x86" ++ ++ # Create a list of files to include, path-relative to the kernel tree ++ local temp_file_list="${WORKDIR}/tmp_file_list_${kernel_version_family}.kernel.headers" ++ ++ # Source stuff. No binaries. I think. ++ ( ++ cd "${kernel_work_dir}" || exit 2 ++ #echo "-- Sources: Makefiles and Kconfigs and perl" ++ find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl ++ ++ #echo "-- Sources: all arches include, include and scripts both files and symlinks " ++ find arch/*/include include scripts -type f -o -type l ++ ++ #echo "-- Sources: security include" ++ find security/*/include -type f ++ ++ #echo "-- Sources: arch ${SRC_ARCH} module lds or Kbuild platforms or Platform" ++ find "arch/${SRC_ARCH}" -name module.lds -o -name Kbuild.platforms -o -name Platform ++ ++ #echo "-- Sources: All files somewhere for some reason" ++ # shellcheck disable=SC2046 # I need to expand. Thanks. ++ find $(find "arch/${SRC_ARCH}" -name include -o -name scripts -type d) -type f ++ ++ if is_enabled CONFIG_STACK_VALIDATION; then ++ #echo "-- Binaries: objtool due to CONFIG_STACK_VALIDATION" ++ find tools/objtool -type f -executable ++ fi ++ ++ #echo "-- Binaries: Module.symvers and includes scripts FILES" ++ find arch/${SRC_ARCH}/include Module.symvers include scripts -type f ++ ++ if is_enabled CONFIG_GCC_PLUGINS; then ++ #echo "-- Binaries: gcc plugins due to CONFIG_GCC_PLUGINS" ++ find scripts/gcc-plugins -name \*.so -o -name gcc-common.h ++ fi ++ ) > "${temp_file_list}" ++ ++ # Now include/copy those, using tar as intermediary. Just like builddeb does it. ++ tar -c -f - -C "${kernel_work_dir}" -T "${temp_file_list}" | tar -xf - -C "${headers_target_dir}" ++ ++ # ${temp_file_list} is left at WORKDIR for later debugging, will be removed by WORKDIR cleanup trap ++ ++ # @TODO: maybe split all binaries to a separate package at this stage; that way cross compile can still produce ++ # @TODO: source-only headers, which can then be patched (byteshift?) and compiled client-side later ++ ++ # @TODO: cat "${temp_file_list}" | grep -v -e "\.h$" -e ".c$" -e "Makefile$" -e "Kconfig$" -e "Kbuild$" -e "\.cocci$" | xargs file | grep -v -e "ASCII" -e "script text" ++ ++ # Generate a control file ++ cat <<- CONTROL_FILE > "${package_DEBIAN_dir}/control" ++ Version: ${package_version} ++ Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> ++ Section: devel ++ Package: ${package_name} ++ Architecture: ${ARCH} ++ Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH ++ Depends: make, gcc, libc6-dev, bison, flex, libssl-dev ++ Description: Linux kernel headers for ${kernel_version_family} ++ This package provides kernel header files for ${kernel_version_family} ++ . ++ This is useful for DKMS and building of external modules. ++ CONTROL_FILE ++ ++ # @TODO: preinst postinst? dependent on split, see todo above ++} +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 3a167b17a..b77739827 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -56,12 +56,30 @@ function compile_kernel() { + local toolchain + LOG_SECTION="kernel_config" do_with_logging do_with_hooks kernel_config + LOG_SECTION="kernel_package_source" do_with_logging do_with_hooks kernel_package_source +- LOG_SECTION="kernel_make_headers_dtbs_image_modules" do_with_logging do_with_hooks kernel_make_headers_dtbs_image_modules +- LOG_SECTION="kernel_package" do_with_logging do_with_hooks kernel_package ++ ++ # @TODO: might be interesting to package kernel-headers at this stage. ++ # @TODO: would allow us to have a "HEADERS_ONLY=yes" that can prepare arm64 headers on arm64 without building the whole kernel ++ # @TODO: also it makes sense, logically, to package headers after configuration, since that's all what's needed; it's the same ++ # @TODO: stage at which `dkms` would run (a configured, tool-built, kernel tree). ++ ++ # @TODO: might also be interesting to do the same for DTBs. ++ # @TODO: those get packaged twice (once in linux-dtb and once in linux-image) ++ # @TODO: but for the u-boot bootloader, only the linux-dtb is what matters. ++ # @TODO: some users/maintainers do a lot of their work on "DTS/DTB only changes", which do require the kernel tree ++ # @TODO: but the only testable artifacts are the .dtb themselves. Allow for a `DTB_ONLY=yes` might be useful. ++ ++ if [[ "a" == "b" ]]; then ++ # Do it individually ++ LOG_SECTION="kernel_make_headers_dtbs_image_modules" do_with_logging do_with_hooks kernel_make_headers_dtbs_image_modules ++ LOG_SECTION="kernel_package" do_with_logging do_with_hooks kernel_package ++ else ++ # Do it all together ++ LOG_SECTION="kernel_build_and_package" do_with_logging do_with_hooks kernel_build_and_package ++ fi ++ + display_alert "Done with" "kernel compile" "debug" + cd "${kernel_work_dir}/.." || exit + rm -f linux-firmware-image-*.deb # remove firmware image packages here - easier than patching ~40 packaging scripts at once +- #run_host_command_logged dpkg-deb --contents ./*.deb || true + rsync --remove-source-files -rq ./*.deb "${DEB_STORAGE}/" || exit_with_error "Failed moving kernel DEBs" + return 0 + } +@@ -188,6 +206,7 @@ function kernel_config() { + + # copy kernel config + local COPY_CONFIG_BACK_TO="" ++ + if [[ $KERNEL_KEEP_CONFIG == yes && -f "${DEST}"/config/$LINUXCONFIG.config ]]; then + display_alert "Using previous kernel config" "${DEST}/config/$LINUXCONFIG.config" "info" + cp -p "${DEST}/config/${LINUXCONFIG}.config" .config +@@ -223,6 +242,7 @@ function kernel_config() { + fi + + # hack for deb builder. To pack what's missing in headers pack. ++ # @TODO: only for legacy builds? + cp "${SRC}"/patch/misc/headers-debian-byteshift.patch /tmp # @TODO: ok, but why /tmp? It's leaking there. + + display_alert "Kernel configuration" "${LINUXCONFIG}" "info" +@@ -255,6 +275,13 @@ function kernel_config() { + fi + fi + ++ call_extension_method "custom_kernel_config_post_defconfig" <<- 'CUSTOM_KERNEL_CONFIG_POST_DEFCONFIG' ++ *Kernel .config is in place, already processed by Armbian* ++ Called after ${LINUXCONFIG}.config is put in place (.config). ++ After all olddefconfig any Kconfig make is called. ++ A good place to customize the .config last-minute. ++ CUSTOM_KERNEL_CONFIG_POST_DEFCONFIG ++ + # Restore the date of .config. Above delta is a pure function, theoretically. + set_files_modification_time "${kernel_config_mtime}" ".config" + } +@@ -338,9 +365,9 @@ function kernel_package() { + + # define dict with vars passed and target directories + declare -A kernel_install_dirs=( +- ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` +- ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` +- ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/headers" # Used by `make headers_install` ++ ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` ++ ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` ++ ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/libc_headers" # Used by `make headers_install` + ) + + local -a prepackage_targets=(install modules_install headers_install) +@@ -388,3 +415,46 @@ function kernel_package() { + + display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" + } ++ ++function kernel_build_and_package() { ++ cd "${kernel_work_dir}" ++ ++ local -a build_targets=("all") # "All" builds the vmlinux/Image/Image.gz default for the ${ARCH} ++ declare kernel_dest_install_dir ++ kernel_dest_install_dir=$(mktemp -d "${WORKDIR}/kernel.temp.install.target.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. ++ ++ # define dict with vars passed and target directories ++ declare -A kernel_install_dirs=( ++ ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` ++ ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` ++ ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/libc_headers" # Used by `make headers_install` ++ ) ++ ++ build_targets+=(install modules_install headers_install) ++ if [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]]; then ++ display_alert "Kernel build will produce DTBs!" "DTBs YES" "debug" ++ build_targets+=("dtbs_install") ++ kernel_install_dirs+=(["INSTALL_DTBS_PATH"]="${kernel_dest_install_dir}/dtbs") # Used by `make dtbs_install` ++ fi ++ ++ # loop over the keys above, get the value, create param value in array; also mkdir the dir ++ declare -a install_make_params_quoted ++ local dir_key ++ for dir_key in "${!kernel_install_dirs[@]}"; do ++ local dir="${kernel_install_dirs["${dir_key}"]}" ++ local value="${dir_key}=${dir}" ++ mkdir -p "${dir}" ++ display_alert "Adding kernel packaging param" "${value}" "debug" ++ install_make_params_quoted+=("${value}") ++ done ++ ++ display_alert "Building kernel" "${LINUXCONFIG} ${build_targets[*]}" "info" ++ fasthash_debug "build" ++ make_filter="| grep --line-buffered -v -e 'CC' -e 'LD' -e 'AR' -e 'INSTALL' -e 'SIGN' -e 'XZ' " \ ++ run_kernel_make_long_running "${install_make_params_quoted[@]@Q}" "${build_targets[@]}" ++ fasthash_debug "build" ++ ++ cd "${kernel_work_dir}" ++ prepare_kernel_packaging_debs "${kernel_work_dir}" "${kernel_dest_install_dir}" "${version}" kernel_install_dirs ++ display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" ++} + +From 8cfda3dcc398e3abb11f05f76509b4a165e402d3 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 9 Mar 2022 13:20:05 +0100 +Subject: [PATCH] armbian-next: apt download-only retried 3 times before + installing main packages + +--- + lib/functions/logging/runners.sh | 4 ++++ + lib/functions/rootfs/create-cache.sh | 3 +++ + 2 files changed, 7 insertions(+) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 0d0c887ed..a0f396cc7 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -3,6 +3,10 @@ function chroot_sdcard_apt_get_install() { + chroot_sdcard_apt_get --no-install-recommends install "$@" + } + ++function chroot_sdcard_apt_get_install_download_only() { ++ chroot_sdcard_apt_get --no-install-recommends --download-only install "$@" ++} ++ + function chroot_sdcard_apt_get() { + local -a apt_params=("-${APT_OPTS:-y}") + [[ $NO_APT_CACHER != yes ]] && apt_params+=( +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index eec9f2fa3..b833ae3c8 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -185,6 +185,9 @@ function create_new_rootfs_cache() { + # stage: install additional packages + display_alert "Installing the main packages for" "Armbian" "info" + export MSG_IF_ERROR="Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" ++ # First, try to download-only up to 3 times, to work around network/proxy problems. ++ chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" || chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" || chroot_sdcard_apt_get_install_download_only "$PACKAGE_MAIN_LIST" ++ # Now do the install. + chroot_sdcard_apt_get_install "$PACKAGE_MAIN_LIST" + + if [[ $BUILD_DESKTOP == "yes" ]]; then + +From 4b82345a588df2d9214b1ace097599ad42ee3463 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 8 Mar 2022 12:56:04 +0100 +Subject: [PATCH] armbian-next: fix `VER=` read from kernel-image package, also + add `linux` default + +--- + lib/functions/compilation/kernel-debs.sh | 1 + + lib/functions/rootfs/distro-agnostic.sh | 3 +++ + 2 files changed, 4 insertions(+) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index fe16d37af..f02bb4dde 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -169,6 +169,7 @@ function kernel_package_callback_linux_image() { + cat <<- CONTROL_FILE > "${package_DEBIAN_dir}/control" + Package: ${package_name} + Version: ${package_version} ++ Source: linux-${kernel_version} + Architecture: ${ARCH} + Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> + Section: kernel +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index a22338da3..4f363a696 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -292,6 +292,9 @@ function install_distribution_agnostic() { + It is not too late to `unset KERNELSOURCE` here and avoid kernel install. + PRE_INSTALL_KERNEL_DEBS + ++ # default VER, will be parsed from Kernel version in the installed deb package. ++ VER="linux" ++ + # install kernel + [[ -n $KERNELSOURCE ]] && { + if [[ "${REPOSITORY_INSTALL}" != *kernel* ]]; then + +From 5d2a41313f02fd2e651c911984ae6b6f803154c7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 7 Mar 2022 10:24:52 +0100 +Subject: [PATCH] armbian-next: some logging for atf compilation + +--- + lib/functions/compilation/atf.sh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index 7f20028da..b241b5dfa 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -54,11 +54,8 @@ compile_atf() { + + # ENABLE_BACKTRACE="0" has been added to workaround a regression in ATF. + # Check: https://github.com/armbian/build/issues/1157 +- CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ +- make ENABLE_BACKTRACE="0" $target_make $CTHREADS \ +- CROSS_COMPILE="$CCACHE $ATF_COMPILER" 2>&1 || { # HANDLED SHORTCIRCUIT: direct command invocation; @TODO: replace with runner +- exit_with_error "ATF compilation failed" +- } ++ run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ ++ make ENABLE_BACKTRACE="0" $target_make "${CTHREADS}" "CROSS_COMPILE='$CCACHE $ATF_COMPILER'" + + [[ $(type -t atf_custom_postprocess) == function ]] && atf_custom_postprocess 2>&1 + + +From 779e9978e01f5d1706d85acc3f0182046cebcfbd Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 7 Mar 2022 10:09:29 +0100 +Subject: [PATCH] armbian-next: rewrite hostdeps as array, add armhf toolchains + +--- + lib/functions/general/host.sh | 59 +++++++++++++++++++++---------------------- + 1 file changed, 29 insertions(+), 30 deletions(-) + +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 818541c6c..c2eb63578 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -57,44 +57,42 @@ prepare_host() { + + # packages list for host + # NOTE: please sync any changes here with the Dockerfile and Vagrantfile +- +- local hostdeps="acl aptly aria2 bc binfmt-support bison btrfs-progs \ +- build-essential ca-certificates ccache cpio cryptsetup curl \ +- debian-archive-keyring debian-keyring debootstrap device-tree-compiler \ +- dialog dirmngr dosfstools dwarves f2fs-tools fakeroot flex gawk \ +- gcc-arm-linux-gnueabihf gdisk gnupg1 gpg imagemagick jq kmod libbison-dev \ +- libc6-dev-armhf-cross libelf-dev libfdt-dev libfile-fcntllock-perl \ +- libfl-dev liblz4-tool libncurses-dev libpython2.7-dev libssl-dev \ +- libusb-1.0-0-dev linux-base locales lzop ncurses-base ncurses-term \ +- nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz \ +- pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig \ +- systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip \ +- zlib1g-dev file ccze" ++ declare -a host_dependencies=( ++ acl aptly aria2 bc binfmt-support bison btrfs-progs ++ build-essential ca-certificates ccache cpio cryptsetup curl ++ debian-archive-keyring debian-keyring debootstrap device-tree-compiler ++ dialog dirmngr dosfstools dwarves f2fs-tools fakeroot flex gawk ++ gcc-arm-linux-gnueabihf ++ gcc-arm-linux-gnueabi gcc-arm-none-eabi ++ gdisk gnupg1 gpg imagemagick jq kmod libbison-dev ++ libc6-dev-armhf-cross libelf-dev libfdt-dev libfile-fcntllock-perl ++ libfl-dev liblz4-tool libncurses-dev libpython2.7-dev libssl-dev ++ libusb-1.0-0-dev linux-base locales lzop ncurses-base ncurses-term ++ nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz ++ pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig ++ systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip ++ zlib1g-dev file ccze tree ++ ) + + if [[ $(dpkg --print-architecture) == amd64 ]]; then +- +- hostdeps+=" distcc lib32ncurses-dev lib32stdc++6 libc6-i386" +- grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 +- ++ : ++ #host_dependencies+=(distcc lib32ncurses-dev lib32stdc++6 libc6-i386) ++ #grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 # @TODO: WHY?! don't do this! we don't want 32-bit x86 ever + elif [[ $(dpkg --print-architecture) == arm64 ]]; then +- +- hostdeps+=" gcc-arm-linux-gnueabi gcc-arm-none-eabi libc6 libc6-amd64-cross qemu" +- ++ host_dependencies+=(libc6 libc6-amd64-cross qemu) # What? + else +- + display_alert "Please read documentation to set up proper compilation environment" + display_alert "https://www.armbian.com/using-armbian-tools/" +- exit_with_error "Running this tool on non x86_64 build host is not supported" +- ++ exit_with_error "Running this tool on non x86_64 or arm64 build host is not supported" + fi + + # Add support for Ubuntu 20.04, 21.04 and Mint 20.x + if [[ $HOSTRELEASE =~ ^(focal|impish|hirsute|ulyana|ulyssa|bullseye|uma)$ ]]; then +- hostdeps+=" python2 python3" ++ host_dependencies+=(python2 python3) + ln -fs /usr/bin/python2.7 /usr/bin/python2 + ln -fs /usr/bin/python2.7 /usr/bin/python + else +- hostdeps+=" python libpython-dev" ++ host_dependencies+=("python" "libpython-dev") + fi + + display_alert "Build host OS release" "${HOSTRELEASE:-(unknown)}" "info" +@@ -143,7 +141,7 @@ prepare_host() { + # warning: apt-cacher-ng will fail if installed and used both on host and in + # container/chroot environment with shared network + # set NO_APT_CACHER=yes to prevent installation errors in such case +- if [[ $NO_APT_CACHER != yes ]]; then hostdeps+=" apt-cacher-ng"; fi ++ if [[ $NO_APT_CACHER != yes ]]; then host_dependencies+=("apt-cacher-ng"); fi + + export EXTRA_BUILD_DEPS="" + call_extension_method "add_host_dependencies" <<- 'ADD_HOST_DEPENDENCIES' +@@ -151,18 +149,19 @@ prepare_host() { + you can add packages to install, space separated, to ${EXTRA_BUILD_DEPS} here. + ADD_HOST_DEPENDENCIES + +- if [ -n "${EXTRA_BUILD_DEPS}" ]; then hostdeps+=" ${EXTRA_BUILD_DEPS}"; fi ++ # shellcheck disable=SC2206 # I wanna expand. later will convert to proper array ++ if [ -n "${EXTRA_BUILD_DEPS}" ]; then host_dependencies+=(${EXTRA_BUILD_DEPS}); fi + + display_alert "Installing build dependencies" + # don't prompt for apt cacher selection + sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections + +- # This handles the wanted list in $hostdeps, updates apt only if needed +- install_host_side_packages "$hostdeps" ++ # This handles the wanted list in $host_dependencies, updates apt only if needed ++ install_host_side_packages "${host_dependencies[@]}" + + update-ccache-symlinks + +- export FINAL_HOST_DEPS="$hostdeps ${EXTRA_BUILD_DEPS}" ++ export FINAL_HOST_DEPS="${host_dependencies[*]}" + call_extension_method "host_dependencies_ready" <<- 'HOST_DEPENDENCIES_READY' + *run after all host dependencies are installed* + At this point we can read `${FINAL_HOST_DEPS}`, but changing won't have any effect. + +From 3a8770b0a1e28eaa7009964d6ebc3ba494de8010 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 7 Mar 2022 06:20:17 +0100 +Subject: [PATCH] armbian-next: distro-agnostic: cleanups + +--- + lib/functions/rootfs/distro-agnostic.sh | 15 ++++----------- + 1 file changed, 4 insertions(+), 11 deletions(-) + +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 4188a6a48..a22338da3 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -435,15 +435,7 @@ function install_distribution_agnostic() { + echo "deb https://beta.armbian.com $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" \ + > "${SDCARD}"/etc/apt/sources.list.d/armbian.list + +- # Cosmetic fix [FAILED] Failed to start Set console font and keymap at first boot +- [[ -f "${SDCARD}"/etc/console-setup/cached_setup_font.sh ]] && +- sed -i "s/^printf '.*/printf '\\\033\%\%G'/g" "${SDCARD}"/etc/console-setup/cached_setup_font.sh +- [[ -f "${SDCARD}"/etc/console-setup/cached_setup_terminal.sh ]] && +- sed -i "s/^printf '.*/printf '\\\033\%\%G'/g" "${SDCARD}"/etc/console-setup/cached_setup_terminal.sh +- [[ -f "${SDCARD}"/etc/console-setup/cached_setup_keyboard.sh ]] && +- sed -i "s/-u/-x'/g" "${SDCARD}"/etc/console-setup/cached_setup_keyboard.sh +- +- # fix for https://bugs.launchpad.net/ubuntu/+source/blueman/+bug/1542723 ++ # fix for https://bugs.launchpad.net/ubuntu/+source/blueman/+bug/1542723 @TODO: from ubuntu 15. maybe gone? + chroot "${SDCARD}" /bin/bash -c "chown root:messagebus /usr/lib/dbus-1.0/dbus-daemon-launch-helper" + chroot "${SDCARD}" /bin/bash -c "chmod u+s /usr/lib/dbus-1.0/dbus-daemon-launch-helper" + +@@ -522,15 +514,16 @@ function install_distribution_agnostic() { + # configure network manager + sed "s/managed=\(.*\)/managed=true/g" -i "${SDCARD}"/etc/NetworkManager/NetworkManager.conf + +- # remove network manager defaults to handle eth by default ++ ## remove network manager defaults to handle eth by default @TODO: why? + rm -f "${SDCARD}"/usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf + + # most likely we don't need to wait for nm to get online + chroot_sdcard systemctl disable NetworkManager-wait-online.service + +- # Just regular DNS and maintain /etc/resolv.conf as a file ++ # Just regular DNS and maintain /etc/resolv.conf as a file @TODO: this does not apply as of impish at least + sed "/dns/d" -i "${SDCARD}"/etc/NetworkManager/NetworkManager.conf + sed "s/\[main\]/\[main\]\ndns=default\nrc-manager=file/g" -i "${SDCARD}"/etc/NetworkManager/NetworkManager.conf ++ + if [[ -n $NM_IGNORE_DEVICES ]]; then + mkdir -p "${SDCARD}"/etc/NetworkManager/conf.d/ + cat <<- EOF > "${SDCARD}"/etc/NetworkManager/conf.d/10-ignore-interfaces.conf + +From 4d47d22489538006f32464dc9a0058a77810536b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 5 Mar 2022 02:24:29 +0100 +Subject: [PATCH] armbian-next: armbianEnv hooks/debugs (bsp / image) + +--- + lib/functions/bsp/bsp-cli.sh | 6 +++++- + lib/functions/image/partitioning.sh | 20 +++++++++++++++----- + 2 files changed, 20 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index ee557963c..5af25dd82 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -18,7 +18,11 @@ create_board_package() { + local bootscript_dst=${BOOTSCRIPT##*:} + mkdir -p "${destination}"/usr/share/armbian/ + +- # create extlinux config file ++ display_alert "BOOTSCRIPT" "${BOOTSCRIPT}" "debug" ++ display_alert "bootscript_src" "${bootscript_src}" "debug" ++ display_alert "bootscript_dst" "${bootscript_dst}" "debug" ++ ++ # if not using extlinux, copy armbianEnv from template; prefer userpatches source + if [[ $SRC_EXTLINUX != yes ]]; then + if [ -f "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" ]; then + cp "${USERPATCHES_PATH}/bootscripts/${bootscript_src}" "${destination}/usr/share/armbian/${bootscript_dst}" +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index ef4714757..05b1492bc 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -297,13 +297,22 @@ prepare_partitions() { + + # stage: adjust boot script or boot environment + if [[ -f $SDCARD/boot/armbianEnv.txt ]]; then ++ display_alert "Found armbianEnv.txt" "${SDCARD}/boot/armbianEnv.txt" "debug" + if [[ $CRYPTROOT_ENABLE == yes ]]; then +- echo "rootdev=$rootdevice cryptdevice=UUID=$(blkid -s UUID -o value ${LOOP}p${rootpart}):$ROOT_MAPPER" >> $SDCARD/boot/armbianEnv.txt ++ echo "rootdev=$rootdevice cryptdevice=UUID=$(blkid -s UUID -o value ${LOOP}p${rootpart}):$ROOT_MAPPER" >> "${SDCARD}/boot/armbianEnv.txt" + else +- echo "rootdev=$rootfs" >> $SDCARD/boot/armbianEnv.txt ++ echo "rootdev=$rootfs" >> "${SDCARD}/boot/armbianEnv.txt" + fi +- echo "rootfstype=$ROOTFS_TYPE" >> $SDCARD/boot/armbianEnv.txt +- elif [[ $rootpart != 1 ]]; then ++ echo "rootfstype=$ROOTFS_TYPE" >> "${SDCARD}/boot/armbianEnv.txt" ++ ++ call_extension_method "image_specific_armbian_env_ready" <<- 'IMAGE_SPECIFIC_ARMBIAN_ENV_READY' ++ *during image build, armbianEnv.txt is ready for image-specific customization (not in BSP)* ++ You can write to `"${SDCARD}/boot/armbianEnv.txt"` here, it is guaranteed to exist. ++ IMAGE_SPECIFIC_ARMBIAN_ENV_READY ++ ++ elif ++ [[ $rootpart != 1 ]] ++ then + local bootscript_dst=${BOOTSCRIPT##*:} + sed -i 's/mmcblk0p1/mmcblk0p2/' $SDCARD/boot/$bootscript_dst + sed -i -e "s/rootfstype=ext4/rootfstype=$ROOTFS_TYPE/" \ +@@ -312,6 +321,7 @@ prepare_partitions() { + + # if we have boot.ini = remove armbianEnv.txt and add UUID there if enabled + if [[ -f $SDCARD/boot/boot.ini ]]; then ++ display_alert "Found boot.ini" "${SDCARD}/boot/boot.ini" "debug" + sed -i -e "s/rootfstype \"ext4\"/rootfstype \"$ROOTFS_TYPE\"/" $SDCARD/boot/boot.ini + if [[ $CRYPTROOT_ENABLE == yes ]]; then + local rootpart="UUID=$(blkid -s UUID -o value ${LOOP}p${rootpart})" +@@ -319,7 +329,7 @@ prepare_partitions() { + else + sed -i 's/^setenv rootdev .*/setenv rootdev "'$rootfs'"/' $SDCARD/boot/boot.ini + fi +- if [[ $LINUXFAMILY != meson64 ]]; then ++ if [[ $LINUXFAMILY != meson64 ]]; then # @TODO: why only for meson64? + [[ -f $SDCARD/boot/armbianEnv.txt ]] && rm $SDCARD/boot/armbianEnv.txt + fi + fi + +From 1afd681bab297b9441fe9e65104ba52d1a3d96ce Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 4 Mar 2022 04:16:50 +0100 +Subject: [PATCH] armbian-next: rpi: completely remove dtb hacks, allowing + flash-kernel to work again + +--- + config/sources/families/bcm2711.conf | 17 +---------------- + 1 file changed, 1 insertion(+), 16 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 8a4eb060d..12ba2caae 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -49,27 +49,12 @@ pre_initramfs_flash_kernel__write_raspi_cmdline() { + + pre_flash_kernel__symlink_dtb_and_kernel() { + if [[ "${RASPI_DISTRO_KERNEL}" != "yes" ]]; then # and firmware. +- display_alert "Preparing DTBs and Kernel..." "bcm2711" "info" +- mkdir -p "${MOUNT}"/etc/flash-kernel/dtbs +- ++ display_alert "Configuring flash-kernel DB..." "bcm2711" "info" + cat <<- EOD >> "${MOUNT}"/etc/flash-kernel/db + # Armbian kernels don't have a 'flavour'. Ignore flavors for all rpi revisions. + Machine: Raspberry Pi * + Kernel-Flavors: any + EOD +- +- ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. +- local oneDTB dtbBase +- for oneDTB in "${MOUNT}"/boot/dtb/broadcom/*.dtb; do +- dtbBase=$(basename "${oneDTB}") +- cp "${MOUNT}"/boot/dtb/broadcom/"${dtbBase}" "${MOUNT}"/etc/flash-kernel/dtbs/"${dtbBase}" +- done +- +- rm -rf "${MOUNT}"/boot/dtb* || true +- +- # @TODO: rpardini: packaging could maybe already use the correct names? I can't figure out how. +- ln -s ./Image "${MOUNT}"/boot/vmlinuz +- ln -s ./Image "${MOUNT}"/boot/vmlinuz- + fi + } + + +From 33beb042960cbf7ab66271a44b53b79dafa01642 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 4 Mar 2022 01:09:55 +0100 +Subject: [PATCH] armbian-next: refactor new kernel packaging; add linux-dtb + package back in finally, upgrades untested + +--- + lib/functions/compilation/kernel-debs.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index e4c78c73c..fe16d37af 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -212,7 +212,7 @@ function kernel_package_callback_linux_image() { + function kernel_package_callback_linux_dtb() { + display_alert "package_directory" "${package_directory}" "debug" + +- mkdir -p "${package_directory}/boot/dtb-${kernel_version_family}" ++ mkdir -p "${package_directory}/boot/" + run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "${package_directory}/boot/dtb-${kernel_version_family}" + + # Generate a control file + +From 5cd4b7a471267aaf8a1336629a65a6df4b81b087 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 3 Mar 2022 23:31:08 +0100 +Subject: [PATCH] armbian-next: refactor new kernel packaging; extract hook + helper, fix kernel symlink + +--- + lib/functions/compilation/kernel-debs.sh | 97 +++++++++++++++++--------------- + 1 file changed, 53 insertions(+), 44 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index c8a3e0377..e4c78c73c 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -126,6 +126,27 @@ function create_kernel_deb() { + run_host_command_logged dpkg-deb ${DEB_COMPRESS:+-Z$DEB_COMPRESS} --build "${package_directory}" "${deb_output_dir}" # not KDEB compress, we're not under a Makefile + } + ++function kernel_package_hook_helper() { ++ declare script="${1}" ++ declare contents="${2}" ++ ++ cat >> "${package_DEBIAN_dir}/${script}" <<- EOT ++ #!/bin/bash ++ echo "Armbian ${package_name} for ${kernel_version_family}: ${script} starting." ++ set -e # Error control ++ set -x # Debugging ++ ++ $(cat "${contents}") ++ ++ echo "Armbian ${package_name} for ${kernel_version_family}: ${script} finishing." ++ true ++ EOT ++ chmod 775 "${package_DEBIAN_dir}/${script}" ++ ++ display_alert "Hook debug" "${script} for ${package_name}" "debug" ++ run_host_command_logged cat "${package_DEBIAN_dir}/${script}" ++} ++ + function kernel_package_callback_linux_image() { + display_alert "package_directory" "${package_directory}" "debug" + +@@ -165,33 +186,27 @@ function kernel_package_callback_linux_image() { + declare debian_kernel_hook_dir="/etc/kernel" + for script in "postinst" "postrm" "preinst" "prerm"; do + mkdir -p "${package_directory}${debian_kernel_hook_dir}/${script}.d" # create kernel hook dir, make sure. +- cat <<- KERNEL_HOOK_DELEGATION > "${package_DEBIAN_dir}/${script}" +- #!/bin/bash +- set -e +- set -x +- +- # Pass maintainer script parameters to hook scripts +- export DEB_MAINT_PARAMS="\$*" +- +- # Tell initramfs builder whether it's wanted +- export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) + +- test -d ${debian_kernel_hook_dir}/${script}.d && run-parts --arg="${kernel_version_family}" --arg="/${installed_image_path}" ${debian_kernel_hook_dir}/${script}.d +- +- true +- KERNEL_HOOK_DELEGATION +- chmod 755 "${package_DEBIAN_dir}/${script}" ++ kernel_package_hook_helper "${script}" <( ++ cat <<- KERNEL_HOOK_DELEGATION ++ export DEB_MAINT_PARAMS="\$*" # Pass maintainer script parameters to hook scripts ++ export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) # Tell initramfs builder whether it's wanted ++ # Run the same hooks Debian/Ubuntu would for their kernel packages. ++ test -d ${debian_kernel_hook_dir}/${script}.d && run-parts --arg="${kernel_version_family}" --arg="/${installed_image_path}" ${debian_kernel_hook_dir}/${script}.d ++ KERNEL_HOOK_DELEGATION ++ ++ # @TODO: only if u-boot, only for postinst. Gotta find a hook scheme for these... ++ if [[ "${script}" == "postinst" ]]; then ++ if [[ "yes" == "yes" ]]; then ++ cat <<- HOOK_FOR_LINK_TO_LAST_INSTALLED_KERNEL ++ echo "Armbian: update last-installed kernel symlink..." ++ ln -sf $(basename "${installed_image_path}") /boot/$image_name || mv /${installed_image_path} /boot/${image_name} ++ touch /boot/.next ++ HOOK_FOR_LINK_TO_LAST_INSTALLED_KERNEL ++ fi ++ fi ++ ) + done +- +- # @TODO: only if u-boot +- if [[ "yes" == "yes" ]]; then +- cat <<- HOOK_FOR_LINK_TO_LAST_INSTALLED_KERNEL >> "${package_DEBIAN_dir}/postinst" +- echo "Armbian: update last-installed kernel symlink..." +- ln -sf $(basename "${installed_image_path}") /boot/$image_name || mv /${installed_image_path} /boot/${image_name} +- touch /boot/.next +- HOOK_FOR_LINK_TO_LAST_INSTALLED_KERNEL +- fi +- + } + + function kernel_package_callback_linux_dtb() { +@@ -212,24 +227,18 @@ function kernel_package_callback_linux_dtb() { + This package contains device blobs from the Linux kernel, version ${kernel_version_family} + CONTROL_FILE + +- cat >> "${package_DEBIAN_dir}/preinst" <<- EOT +- #!/bin/bash +- set -e +- set -x +- rm -rf /boot/dtb +- rm -rf /boot/dtb-${kernel_version_family} +- exit 0 +- EOT +- chmod 775 "${package_DEBIAN_dir}/preinst" +- +- cat >> "${package_DEBIAN_dir}/postinst" <<- EOT +- #!/bin/bash +- set -e +- set -x +- cd /boot +- ln -sfT dtb-${kernel_version_family} dtb || mv dtb-${kernel_version_family} dtb +- exit 0 +- EOT +- chmod 775 "${package_DEBIAN_dir}/postinst" ++ kernel_package_hook_helper "preinst" <( ++ cat <<- EOT ++ rm -rf /boot/dtb ++ rm -rf /boot/dtb-${kernel_version_family} ++ EOT ++ ) ++ ++ kernel_package_hook_helper "postinst" <( ++ cat <<- EOT ++ cd /boot ++ ln -sfT dtb-${kernel_version_family} dtb || mv dtb-${kernel_version_family} dtb ++ EOT ++ ) + + } + +From c2259116c1728595802cf29aae7f29098a4a5c99 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 3 Mar 2022 21:49:24 +0100 +Subject: [PATCH] armbian-next: refactor new kernel packaging; add linux-dtb + package back in finally, all hooks untested + +--- + lib/functions/compilation/kernel-debs.sh | 199 ++++++++++++++++++++++--------- + lib/functions/compilation/kernel.sh | 4 +- + 2 files changed, 142 insertions(+), 61 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +index 26a9bc3cd..c8a3e0377 100644 +--- a/lib/functions/compilation/kernel-debs.sh ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -38,23 +38,51 @@ if_enabled_echo() { + + function prepare_kernel_packaging_debs() { + declare kernel_work_dir="${1}" +- declare kernel_version="${2}" +- declare -n tmp_kernel_install_dirs="${3}" # nameref to declare -n kernel_install_dirs dictionary +- declare kernel_package_dir +- +- kernel_package_dir=$(mktemp -d "${WORKDIR}/kernel.image.package.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. +- display_alert "kernel_package_dir" "${kernel_package_dir}" "debug" ++ declare kernel_dest_install_dir="${2}" ++ declare kernel_version="${3}" ++ declare -n tmp_kernel_install_dirs="${4}" # nameref to declare -n kernel_install_dirs dictionary ++ declare debs_target_dir="${kernel_work_dir}/.." + + # Some variables and settings used throughout the script + declare kernel_version_family="${kernel_version}-${LINUXFAMILY}" +- declare packageversion="${REVISION}" +- declare linux_image_package_name="linux-image-${BRANCH}-${LINUXFAMILY}" ++ declare package_version="${REVISION}" ++ ++ # show incoming tree ++ display_alert "Kernel install dir" "incoming from KBUILD make" "debug" ++ run_host_command_logged tree -C --du -h "${kernel_dest_install_dir}" "| grep --line-buffered -v -e '\.ko' -e '\.h' " ++ ++ display_alert "tmp_kernel_install_dirs INSTALL_PATH:" "${tmp_kernel_install_dirs[INSTALL_PATH]}" "debug" ++ display_alert "tmp_kernel_install_dirs INSTALL_MOD_PATH:" "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}" "debug" ++ display_alert "tmp_kernel_install_dirs INSTALL_HDR_PATH:" "${tmp_kernel_install_dirs[INSTALL_HDR_PATH]}" "debug" ++ display_alert "tmp_kernel_install_dirs INSTALL_DTBS_PATH:" "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "debug" ++ ++ # package the linux-image (image, modules, dtbs (if present)) ++ create_kernel_deb "linux-image-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_image ++ ++ # if dtbs present, package those too separately, for u-boot usage. ++ if [[ -d "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" ]]; then ++ create_kernel_deb "linux-dtb-${BRANCH}-${LINUXFAMILY}" "${debs_target_dir}" kernel_package_callback_linux_dtb ++ fi ++ ++ # @TODO: package headers. probably in 3 phases: common per-version (libc headers), common per-arch (arch-specific, with binary tools), and kernel specific (kernel-headers, no tools) ++ ++} ++ ++function create_kernel_deb() { ++ declare package_name="${1}" ++ declare deb_output_dir="${2}" ++ declare callback_function="${3}" + +- mkdir -p "${kernel_package_dir}/DEBIAN" ++ declare package_directory ++ package_directory=$(mktemp -d "${WORKDIR}/${package_name}.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. ++ display_alert "package_directory" "${package_directory}" "debug" ++ ++ declare package_DEBIAN_dir="${package_directory}/DEBIAN" # DEBIAN dir ++ mkdir -p "${package_DEBIAN_dir}" # maintainer scripts et al + + # Generate copyright file +- mkdir -p "${kernel_package_dir}/usr/share/doc/${linux_image_package_name}" +- cat <<- EOF > "${kernel_package_dir}/usr/share/doc/${linux_image_package_name}/copyright" ++ mkdir -p "${package_directory}/usr/share/doc/${package_name}" ++ cat <<- COPYRIGHT > "${package_directory}/usr/share/doc/${package_name}/copyright" + This is a packaged Armbian patched version of the Linux kernel. + + The sources may be found at most Linux archive sites, including: +@@ -71,12 +99,55 @@ function prepare_kernel_packaging_debs() { + + On Debian GNU/Linux systems, the complete text of the GNU General Public + License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. +- EOF ++ COPYRIGHT ++ ++ # Run the callback. ++ display_alert "Running callback" "callback: ${callback_function}" "debug" ++ "${callback_function}" "${@}" ++ ++ run_host_command_logged chown -R root:root "${package_directory}" # Fix ownership and permissions ++ run_host_command_logged chmod -R go-w "${package_directory}" # Fix ownership and permissions ++ run_host_command_logged chmod -R a+rX "${package_directory}" # in case we are in a restrictive umask environment like 0077 ++ run_host_command_logged chmod -R ug-s "${package_directory}" # in case we build in a setuid/setgid directory ++ ++ cd "${package_directory}" || exit_with_error "major failure 774 for ${package_name}" ++ ++ # create md5sums file ++ sh -c "cd '${package_directory}'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums" ++ ++ declare unpacked_size ++ unpacked_size="$(du -h -s "${package_directory}" | awk '{print $1}')" ++ display_alert "Unpacked ${package_name} tree" "${unpacked_size}" "debug" ++ ++ # Show it ++ display_alert "Package dir" "for package ${package_name}" "debug" ++ run_host_command_logged tree -C -h -d --du "${package_directory}" ++ ++ run_host_command_logged dpkg-deb ${DEB_COMPRESS:+-Z$DEB_COMPRESS} --build "${package_directory}" "${deb_output_dir}" # not KDEB compress, we're not under a Makefile ++} ++ ++function kernel_package_callback_linux_image() { ++ display_alert "package_directory" "${package_directory}" "debug" ++ ++ declare installed_image_path="boot/vmlinuz-${kernel_version_family}" # using old mkdebian terminology here. ++ declare image_name="Image" # for arm64. or, "zImage" for arm, or "vmlinuz" for others. Why? See where u-boot puts them. ++ ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_PATH]}" "${package_directory}/" # /boot stuff ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}/lib" "${package_directory}/" # so "lib" stuff sits at the root ++ ++ if [[ -d "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" ]]; then ++ # /usr/lib/linux-image-${kernel_version_family} is wanted by flash-kernel ++ # /lib/firmware/${kernel_version_family}/device-tree/ would also be acceptable ++ ++ display_alert "DTBs present on kernel output" "DTBs ${package_name}: /usr/lib/linux-image-${kernel_version_family}" "debug" ++ mkdir -p "${package_directory}/usr/lib" ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "${package_directory}/usr/lib/linux-image-${kernel_version_family}" ++ fi + + # Generate a control file +- cat <<- EOF > "${kernel_package_dir}/DEBIAN/control" +- Package: ${linux_image_package_name} +- Version: ${packageversion} ++ cat <<- CONTROL_FILE > "${package_DEBIAN_dir}/control" ++ Package: ${package_name} ++ Version: ${package_version} + Architecture: ${ARCH} + Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> + Section: kernel +@@ -84,20 +155,20 @@ function prepare_kernel_packaging_debs() { + Description: Linux kernel, armbian version $kernel_version_family $BRANCH + This package contains the Linux kernel, modules and corresponding other + files, kernel_version_family: $kernel_version_family. +- EOF ++ CONTROL_FILE + + # Install the maintainer scripts + # Note: hook scripts under /etc/kernel are also executed by official Debian + # kernel packages, as well as kernel packages built using make-kpkg. + # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and + # so do we; recent versions of dracut and initramfs-tools will obey this. +- declare debhookdir="/etc/kernel" +- for script in postinst postrm preinst prerm; do +- mkdir -p "${kernel_package_dir}${debhookdir}/${script}.d" +- cat <<- EOF > "${kernel_package_dir}/DEBIAN/${script}" ++ declare debian_kernel_hook_dir="/etc/kernel" ++ for script in "postinst" "postrm" "preinst" "prerm"; do ++ mkdir -p "${package_directory}${debian_kernel_hook_dir}/${script}.d" # create kernel hook dir, make sure. ++ cat <<- KERNEL_HOOK_DELEGATION > "${package_DEBIAN_dir}/${script}" + #!/bin/bash +- set -x + set -e ++ set -x + + # Pass maintainer script parameters to hook scripts + export DEB_MAINT_PARAMS="\$*" +@@ -105,50 +176,60 @@ function prepare_kernel_packaging_debs() { + # Tell initramfs builder whether it's wanted + export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) + +- test -d $debhookdir/$script.d && run-parts --arg="$kernel_version_family" --arg="/$installed_image_path" $debhookdir/$script.d +- exit 0 +- EOF +- chmod 755 "${kernel_package_dir}/DEBIAN/${script}" +- done +- +- display_alert "tmp_kernel_install_dirs INSTALL_PATH:" "${tmp_kernel_install_dirs[INSTALL_PATH]}" "debug" +- display_alert "tmp_kernel_install_dirs INSTALL_MOD_PATH:" "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}" "debug" +- display_alert "tmp_kernel_install_dirs INSTALL_HDR_PATH:" "${tmp_kernel_install_dirs[INSTALL_HDR_PATH]}" "debug" +- +- display_alert "Kernel install dir" "tree 1" "debug" +- run_host_command_logged tree -C -h --du -d -L 3 "${tmp_kernel_install_dirs[INSTALL_PATH]}/../.." ++ test -d ${debian_kernel_hook_dir}/${script}.d && run-parts --arg="${kernel_version_family}" --arg="/${installed_image_path}" ${debian_kernel_hook_dir}/${script}.d + +- run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_PATH]}" "${kernel_package_dir}/" # /boot stuff +- run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}/lib" "${kernel_package_dir}/" # so "lib" stuff sits at the root +- +- if [[ -d "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" ]]; then +- display_alert "tmp_kernel_install_dirs INSTALL_DTBS_PATH:" "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "debug" +- display_alert "Kernel build will produce DTBs package!" "DTBs YES PACKAGE" "debug" ++ true ++ KERNEL_HOOK_DELEGATION ++ chmod 755 "${package_DEBIAN_dir}/${script}" ++ done + +- # /usr/lib/linux-image-${kernel_version_family} is wanted by flash-kernel +- # /lib/firmware/${kernel_version_family}/device-tree/ would also be acceptable +- mkdir -p "${kernel_package_dir}/usr/lib" +- run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "${kernel_package_dir}/usr/lib/linux-image-${kernel_version_family}" ++ # @TODO: only if u-boot ++ if [[ "yes" == "yes" ]]; then ++ cat <<- HOOK_FOR_LINK_TO_LAST_INSTALLED_KERNEL >> "${package_DEBIAN_dir}/postinst" ++ echo "Armbian: update last-installed kernel symlink..." ++ ln -sf $(basename "${installed_image_path}") /boot/$image_name || mv /${installed_image_path} /boot/${image_name} ++ touch /boot/.next ++ HOOK_FOR_LINK_TO_LAST_INSTALLED_KERNEL + fi + +- run_host_command_logged chown -R root:root "${kernel_package_dir}" # Fix ownership and permissions +- run_host_command_logged chmod -R go-w "${kernel_package_dir}" # Fix ownership and permissions +- run_host_command_logged chmod -R a+rX "${kernel_package_dir}" # in case we are in a restrictive umask environment like 0077 +- run_host_command_logged chmod -R ug-s "${kernel_package_dir}" # in case we build in a setuid/setgid directory +- +- cd "${kernel_package_dir}" || exit_with_error "major failure 774" +- +- # create md5sums file. needed? @TODO: convert to subshell? +- sh -c "cd '${kernel_package_dir}'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums" ++} + +- declare unpacked_size +- unpacked_size="$(du -h -s "${kernel_package_dir}" | awk '{print $1}')" +- display_alert "Unpacked linux-kernel image" "${unpacked_size}" "debug" ++function kernel_package_callback_linux_dtb() { ++ display_alert "package_directory" "${package_directory}" "debug" + +- # Show it +- display_alert "Package dir" "tree 2" "debug" +- run_host_command_logged tree -C -h --du -d -L 3 "${kernel_package_dir}" ++ mkdir -p "${package_directory}/boot/dtb-${kernel_version_family}" ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "${package_directory}/boot/dtb-${kernel_version_family}" + +- run_host_command_logged dpkg-deb ${DEB_COMPRESS:+-Z$DEB_COMPRESS} --build "${kernel_package_dir}" "${kernel_work_dir}/.." # not KDEB compress, we're not under a Makefile ++ # Generate a control file ++ cat <<- CONTROL_FILE > "${package_DEBIAN_dir}/control" ++ Version: ${package_version} ++ Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> ++ Section: kernel ++ Package: ${package_name} ++ Architecture: ${ARCH} ++ Provides: linux-dtb, linux-dtb-armbian, armbian-$BRANCH ++ Description: Armbian Linux DTB, version ${kernel_version_family} $BRANCH ++ This package contains device blobs from the Linux kernel, version ${kernel_version_family} ++ CONTROL_FILE ++ ++ cat >> "${package_DEBIAN_dir}/preinst" <<- EOT ++ #!/bin/bash ++ set -e ++ set -x ++ rm -rf /boot/dtb ++ rm -rf /boot/dtb-${kernel_version_family} ++ exit 0 ++ EOT ++ chmod 775 "${package_DEBIAN_dir}/preinst" ++ ++ cat >> "${package_DEBIAN_dir}/postinst" <<- EOT ++ #!/bin/bash ++ set -e ++ set -x ++ cd /boot ++ ln -sfT dtb-${kernel_version_family} dtb || mv dtb-${kernel_version_family} dtb ++ exit 0 ++ EOT ++ chmod 775 "${package_DEBIAN_dir}/postinst" + + } +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index e663e0265..3a167b17a 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -339,8 +339,8 @@ function kernel_package() { + # define dict with vars passed and target directories + declare -A kernel_install_dirs=( + ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` +- ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/headers" # Used by `make headers_install` + ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` ++ ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/headers" # Used by `make headers_install` + ) + + local -a prepackage_targets=(install modules_install headers_install) +@@ -371,7 +371,7 @@ function kernel_package() { + fasthash_debug "post-prepackage" + + cd "${kernel_work_dir}" +- prepare_kernel_packaging_debs "${kernel_work_dir}" "${version}" kernel_install_dirs ++ prepare_kernel_packaging_debs "${kernel_work_dir}" "${kernel_dest_install_dir}" "${version}" kernel_install_dirs + + ### # produce deb packages: image, headers, firmware, dtb + ### # This mostly only does + +From 7cd425e1c3c2efa14c7fb7a13a9b24f9bb5cfc38 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 20:31:44 +0100 +Subject: [PATCH] flash-kernel: fix short-circuits as last statement in + functions + +--- + extensions/flash-kernel.sh | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/extensions/flash-kernel.sh b/extensions/flash-kernel.sh +index 847eb37b7..ab5d308d8 100644 +--- a/extensions/flash-kernel.sh ++++ b/extensions/flash-kernel.sh +@@ -50,6 +50,8 @@ function post_install_kernel_debs__install_kernel_and_flash_packages() { + + # Remove fake /sys/firmware (/efi) directory + rm -rf "${SDCARD}"/sys/firmware ++ ++ return 0 # prevent future shortcircuits exiting with error + } + + # @TODO: extract u-boot into an extension, so that core bsps don't have this stuff in there to begin with. +@@ -64,6 +66,7 @@ post_family_tweaks_bsp__remove_uboot_flash_kernel() { + pre_umount_final_image__remove_uboot_initramfs_hook_flash_kernel() { + # even if BSP still contained this (cached .deb), make sure by removing from ${MOUNT} + [[ -f "$MOUNT"/etc/initramfs/post-update.d/99-uboot ]] && rm -v "$MOUNT"/etc/initramfs/post-update.d/99-uboot ++ return 0 # shortcircuit above + } + + function pre_update_initramfs__setup_flash_kernel() { + +From b459fb3af894ae4315e8416fee62d77c2a1a191b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 13:28:37 +0100 +Subject: [PATCH] armbian-next: do not force `SHOW_LOG=yes` if `CI=true`; let's + _trust_ logging and error handling works + +--- + compile.sh | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/compile.sh b/compile.sh +index 0c35c5fd6..2bc765f9f 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -36,10 +36,6 @@ if [[ ! -f "${SRC}"/lib/single.sh ]]; then + exit 255 + fi + +-# Most CI runners, GitHub Actions included, pass env var "CI=true". In this case, force full logging. +-if [[ "${CI}" == "true" ]]; then +- export SHOW_LOG=yes +-fi + + # shellcheck source=lib/single.sh + source "${SRC}"/lib/single.sh + +From a0ed264825785655fba53d67de525ddebbb48090 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 13:26:56 +0100 +Subject: [PATCH] armbian-next: back out of setting mtime to the revision time + during git checkout. + +- of course this causes huge recompiles when wanted revision moves forward +--- + lib/functions/general/git.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index c4477ca0a..8330b3fe4 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -171,9 +171,9 @@ fetch_from_repo() { + regular_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. + + # set the checkout date on all the versioned files. +- git ls-tree -r -z --name-only "${checkout_from}" | xargs -0 -- touch -m -t "${checked_out_revision_mtime:0:12}.${checked_out_revision_mtime:12}" +- +- fasthash_debug "after setting checkout time for $dir $ref_name" #yeah ++ # @TODO: this is contentious. disable for now. patches will still use the mininum date set by checked_out_revision_mtime above ++ #git ls-tree -r -z --name-only "${checkout_from}" | xargs -0 -- touch -m -t "${checked_out_revision_mtime:0:12}.${checked_out_revision_mtime:12}" ++ #fasthash_debug "after setting checkout time for $dir $ref_name" #yeah + + if [[ -f .gitmodules ]]; then + display_alert "Updating submodules" "" "ext" + +From 4d1d62558c4cf4f670fae821f7629a01a1f2c35e Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 13:16:04 +0100 +Subject: [PATCH] armbian-next: sync 'config' dir from master revision + ed589b248aef675cb5e845fcb55c12dfbcc5e925 + +- this is _also_ getting out of hand... gotta merge soon +--- + config/boards/rpi4b.wip | 16 +++++++++++++++- + config/boards/uefi-arm64.conf | 2 +- + config/boards/uefi-x86.conf | 2 +- + config/sources/families/bcm2711.conf | 2 +- + config/sources/families/include/meson64_common.inc | 2 +- + config/sources/families/include/rockchip64_common.inc | 10 +++++----- + config/sources/families/include/uefi_common.inc | 2 +- + config/sources/families/jetson-nano.conf | 6 +----- + config/sources/families/media.conf | 2 +- + 9 files changed, 27 insertions(+), 17 deletions(-) + +diff --git a/config/boards/rpi4b.wip b/config/boards/rpi4b.wip +index c78b14060..3c1926821 100644 +--- a/config/boards/rpi4b.wip ++++ b/config/boards/rpi4b.wip +@@ -2,7 +2,7 @@ + export BOARD_NAME="Raspberry Pi 4" + export BOARDFAMILY="bcm2711" + export KERNEL_TARGET="legacy,current,edge" +-export FK__MACHINE_MODEL="Raspberry Pi 4 Model B" # this is passed to flash-kernel. ++export FK__MACHINE_MODEL="Raspberry Pi 4 Model B" # flash kernel (FK) configuration + export ASOUND_STATE="asound.state.rpi" + + # configure stuff at the appropriate time in flash-kernel +@@ -12,6 +12,8 @@ pre_initramfs_flash_kernel__write_raspi_config() { + cat <<- EOD > "${FIRMWARE_DIR}/config.txt" + [pi4] + max_framebuffers=2 ++ over_voltage=2 ++ arm_freq=1800 + + [all] + kernel=vmlinuz +@@ -20,10 +22,22 @@ pre_initramfs_flash_kernel__write_raspi_config() { + disable_overscan=1 + hdmi_drive=2 + arm_64bit=1 ++ disable_splash=1 ++ ++ # enable audio (loads snd_bcm2835) ++ dtparam=audio=on + + # bootloader logs to serial, second stage + # enable_uart=1 + ++ # overclock. requires decent thermals. COMMENT OUT IF DON'T USE A GREAT COOLER OR HEATSINK. ++ # over_voltage=6 ++ # arm_freq=2000 ++ ++ # uncomment to disable wifi or bt. ++ #dtoverlay=disable-wifi ++ #dtoverlay=disable-bt ++ + # gpu and 3d stuff. + gpu_mem=256 + dtoverlay=vc4-fkms-v3d +diff --git a/config/boards/uefi-arm64.conf b/config/boards/uefi-arm64.conf +index 8f5e201f7..3da87e459 100644 +--- a/config/boards/uefi-arm64.conf ++++ b/config/boards/uefi-arm64.conf +@@ -1,4 +1,4 @@ + # aarch64 via UEFI for all UEFI-enabled boards + export BOARD_NAME="UEFI arm64" + export BOARDFAMILY="uefi-arm64" +-export KERNEL_TARGET="legacy,current,edge" ++export KERNEL_TARGET="current,edge" +diff --git a/config/boards/uefi-x86.conf b/config/boards/uefi-x86.conf +index 7ff375bb8..0188da545 100644 +--- a/config/boards/uefi-x86.conf ++++ b/config/boards/uefi-x86.conf +@@ -1,4 +1,4 @@ + # x86_64 via UEFI/BIOS for all boards + export BOARD_NAME="UEFI x86" + export BOARDFAMILY="uefi-x86" +-export KERNEL_TARGET="legacy,current,edge" ++export KERNEL_TARGET="current,edge" +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index a5a0bff7f..8a4eb060d 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -12,7 +12,7 @@ export GOVERNOR=ondemand + + case "${BRANCH}" in + +- legacy | ddk) ++ ddk) + export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source + ;; + +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index ea4363e81..e3fc577e9 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -270,7 +270,7 @@ family_tweaks_bsp() { + EndSection + EOF + ;; +- "odroidn2" | "odroidc4" | "khadas-vim2" | "odroidhc4" | "khadas-vim3" | "khadas-vim3l" | "radxa-zero") ++ "odroidn2" | "odroidc4" | "khadas-vim2" | "odroidhc4" | "khadas-vim3" | "khadas-vim3l" | "radxa-zero" | "radxa-zero2") + cat <<- EOF > "$destination"/etc/X11/xorg.conf + Section "Device" + Identifier "DRM Graphics Acclerated" +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 815e87b26..eb5ab78b2 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -90,8 +90,8 @@ case $BRANCH in + + current) + +- export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.10.y" ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.15.y" + KERNELPATCHDIR='rockchip64-'$BRANCH + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH +@@ -100,8 +100,8 @@ case $BRANCH in + edge) + + KERNELPATCHDIR='rockchip64-'$BRANCH +- export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. +- KERNELBRANCH="branch:linux-5.15.y" ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.16.y" + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH + +@@ -234,7 +234,7 @@ family_tweaks() { + + chroot $SDCARD /bin/bash -c "systemctl --no-reload enable z28pro-bluetooth.service >/dev/null 2>&1" + +- elif [[ $BOARD == nanopi-r2s || $BOARD == nanopi-r2c || $BOARD == orangepi-r1plus ]]; then ++ elif [[ $BOARD == nanopi-r2s || $BOARD == nanopi-r2c || $BOARD == orangepi-r1plus || $BOARD == orangepi-r1plus-lts ]]; then + + # rename USB based network to lan0 + mkdir -p $SDCARD/etc/udev/rules.d/ +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index b362bcba0..175fcae2f 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -5,7 +5,7 @@ export UEFI_GRUB_TIMEOUT=${UEFI_GRUB_TIMEOUT:-3} # Default 3-seconds timeout for + export BOARD_FIRMWARE_INSTALL="-full" # Install full firmware for UEFI boards + case "${BRANCH}" in + +- legacy | ddk) ++ ddk) + # This will force `unset KERNELSOURCE` later; no kernel will be built. + # Instead, the distro's default linux-generic kernel will be installed. + export DISTRO_GENERIC_KERNEL=yes +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +index 77b83e479..9001baf0b 100644 +--- a/config/sources/families/jetson-nano.conf ++++ b/config/sources/families/jetson-nano.conf +@@ -31,7 +31,7 @@ case $BRANCH in + ;; + + edge) +- SKIP_BOOTSPLASH="yes" ++ #SKIP_BOOTSPLASH="yes" + export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='media-'$BRANCH +@@ -42,10 +42,6 @@ case $BRANCH in + + esac + +-write_uboot_platform() { +- dd if=$1/u-boot.bin of=$2 bs=32k seek=1 status=noxfer > /dev/null 2>&1 +-} +- + family_tweaks() { + + install -m 755 $SRC/packages/blobs/jetson/jetson.sh $SDCARD/etc/initramfs-tools/hooks/jetson.sh +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 07529a634..cf1a5603b 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -39,7 +39,7 @@ case $BRANCH in + ;; + + edge) +- SKIP_BOOTSPLASH="yes" ++ #SKIP_BOOTSPLASH="yes" + export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='media-'$BRANCH + +From b4c137bdb097e7cbba7bfc22795fa1223ea2bc7d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 12:57:31 +0100 +Subject: [PATCH] armbian-next: sync 'packages' dir from master revision + ed589b248aef675cb5e845fcb55c12dfbcc5e925 + +--- + packages/armbian/builddeb | 217 +++++++----- + packages/armbian/mkdebian | 268 +++++++-------- + .../armbian-activate-profile-sync-daemon.sh | 8 +- + .../profile.d/armbian-check-first-login-reboot.sh | 8 +- + .../bsp/common/etc/profile.d/armbian-ssh-title.sh | 12 +- + packages/bsp/jethub/jethub-remove-log-file.sh | 12 +- + packages/bsp/nanopim4/nanopim4-pwm-fan.sh | 380 ++++++++++----------- + packages/bsp/odroid/c1_init.sh | 123 ++----- + packages/bsp/odroid/c2_init.sh | 255 +++++++------- + packages/bsp/rk3328/z28pro/start_bt.sh | 1 + + packages/bsp/rockchip/start_bt.sh | 17 +- + packages/bsp/sunxi/zeroplus2-bt.sh | 5 +- + .../hostapd-realtek/debian/ifupdown/hostapd.sh | 22 +- + .../hostapd/debian/ifupdown/hostapd.sh | 22 +- + 14 files changed, 680 insertions(+), 670 deletions(-) + +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +index 631380a0c..0163d401a 100755 +--- a/packages/armbian/builddeb ++++ b/packages/armbian/builddeb +@@ -1,4 +1,4 @@ +-#!/usr/bin/bash ++#!/bin/sh + # + # builddeb 1.3 + # Copyright 2003 Wichert Akkerman +@@ -45,13 +45,11 @@ create_package() { + local pname="$1" pdir="$2" + local dpkg_deb_opts + +- echo "Armbian kernel packaging: ${pname} ${pdir}" +- + mkdir -m 755 -p "$pdir/DEBIAN" + mkdir -p "$pdir/usr/share/doc/$pname" +- cp -pv debian/copyright "$pdir/usr/share/doc/$pname/" +- cp -pv debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" +- gzip --force -9 "$pdir/usr/share/doc/$pname/changelog.Debian" ++ cp debian/copyright "$pdir/usr/share/doc/$pname/" ++ cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" ++ gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" + sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ + | xargs -r0 md5sum > DEBIAN/md5sums" + +@@ -116,14 +114,13 @@ create_package() { + + # Create the package + dpkg-gencontrol -p$pname -P"$pdir" +- echo "Building deb package with compression '$KDEB_COMPRESS'" 1>&2 + dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. + } + + deploy_kernel_headers() { +- pdir=$1 # kernel_headers_dir ++ pdir=$1 + +- echo "Armbian deploy_kernel_headers: ${pdir}" ++ rm -rf $pdir + + destdir=$pdir/usr/src/linux-headers-$version + mkdir -p $destdir +@@ -131,14 +128,15 @@ deploy_kernel_headers() { + ( + cd $srctree + find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl +- find arch/*/include include scripts -type f -o -type l # @TODO: could strip off some stuff? ++ find arch/*/include include scripts -type f -o -type l + find security/*/include -type f + find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform + find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f +- ) | grep -v "^\/debian" > debian/hdrsrcfiles ++ ) > debian/hdrsrcfiles + + { + if is_enabled CONFIG_STACK_VALIDATION; then ++ # echo tools/objtool/objtool + find tools/objtool -type f -executable + fi + +@@ -147,77 +145,147 @@ deploy_kernel_headers() { + if is_enabled CONFIG_GCC_PLUGINS; then + find scripts/gcc-plugins -name \*.so -o -name gcc-common.h + fi +- } | grep -v "^\/debian" > debian/hdrobjfiles +- +- echo "Headers copying over..." +- tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir # Copy over using tar pipes, sources +- tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir # Copy over using tar pipes, object files +- rm -f debian/hdrsrcfiles debian/hdrobjfiles # remove file lists ++ } > debian/hdrobjfiles + +- # After copying over, apply patch; + if is_native; then + echo "info: Build native: Skip headers-debian-byteshift.patch" >&2 + elif is_build_on_amd64; then + ( + cd $destdir +- # detect and remove files which patch will create +- lsdiff -s --strip=1 "/tmp/headers-debian-byteshift.patch" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' +- patch --batch -p1 < "/tmp/headers-debian-byteshift.patch" ++ patch -p1 < /tmp/headers-debian-byteshift.patch + ) + fi + ++ tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir ++ tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir ++ rm -f debian/hdrsrcfiles debian/hdrobjfiles ++ + # copy .config manually to be where it's expected to be +- cp -pv $KCONFIG_CONFIG $destdir/.config ++ cp $KCONFIG_CONFIG $destdir/.config + + mkdir -p $pdir/lib/modules/$version/ +- rm -f $pdir/lib/modules/$version/build + ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build + } + + deploy_libc_headers() { + pdir=$1 ++ ++ rm -rf $pdir ++ ++ $MAKE -f $srctree/Makefile headers ++ $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr ++ + # move asm headers to /usr/include//asm to match the structure + # used by Debian-based distros (to support multi-arch) + host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) +- mkdir -p $pdir/usr/include/$host_arch +- [ -d $pdir/usr/include/asm ] && cp -rv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ +- return 0 ++ mkdir $pdir/usr/include/$host_arch ++ mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ + } + +-# set -x +-echo "Armbian builddeb starting: ${KERNELRELEASE}..." +- +-version=${KERNELRELEASE} ++version=$KERNELRELEASE + tmpdir="debian/tmp" + kernel_headers_dir="debian/hdrtmp" +-libc_headers_dir="debian/libc_header_tmp" ++libc_headers_dir="debian/headertmp" + dbg_dir="debian/dbgtmp" + dtb_dir="debian/dtbtmp" +-packagename=linux-image-"${BRANCH}${LOCALVERSION}" +-kernel_headers_packagename=linux-headers-"${BRANCH}${LOCALVERSION}" +-dtb_packagename=linux-dtb-"${BRANCH}${LOCALVERSION}" ++packagename=linux-image-"$BRANCH$LOCALVERSION" ++kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" ++dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" + libc_headers_packagename=linux-libc-dev +-dbg_packagename=${packagename}-dbg +-installed_image_path="boot/vmlinuz-$version" # for all arches ++dbg_packagename=$packagename-dbg ++ ++if [ "$ARCH" = "um" ]; then ++ packagename=user-mode-linux-$version ++fi ++ ++# Not all arches have the same installed path in debian ++# XXX: have each arch Makefile export a variable of the canonical image install ++# path instead ++case $ARCH in ++ ++aarch64|arm64) ++ image_name=Image ++ installed_image_path="boot/vmlinuz-$version" ++ ;; ++ arm*) ++ image_name=zImage ++ installed_image_path="boot/vmlinuz-$version" ++ ;; ++ um) ++ installed_image_path="usr/bin/linux-$version" ++ ;; ++ parisc|mips|powerpc) ++ installed_image_path="boot/vmlinux-$version" ++ ;; ++ *) ++ image_name=vmlinuz ++ installed_image_path="boot/vmlinuz-$version" ++ ;; ++esac + + BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) + +-# Complement the directory structure ++# Setup the directory structure ++rm -rf "$tmpdir" "$dbg_dir" "$dtb_dir" debian/files + mkdir -m 755 -p "$tmpdir/DEBIAN" + mkdir -p "$tmpdir/lib" "$tmpdir/boot" + mkdir -m 755 -p "$dtb_dir/DEBIAN" +-mkdir -p "$dtb_dir/usr/share/doc/$dtb_packagename" ++mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" + mkdir -m 755 -p "$kernel_headers_dir/lib/modules/$version/" + mkdir -m 755 -p "$libc_headers_dir/DEBIAN" + +-# Install the kernel's System.map and config +-cp -pv System.map "$tmpdir/boot/System.map-$version" +-cp -pv $KCONFIG_CONFIG "$tmpdir/boot/config-$version" ++# Install the kernel ++if [ "$ARCH" = "um" ]; then ++ mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" ++ $MAKE linux ++ cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" ++ cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" ++ gzip "$tmpdir/usr/share/doc/$packagename/config" ++else ++ cp System.map "$tmpdir/boot/System.map-$version" ++ cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" ++fi ++cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" ++ ++if is_enabled CONFIG_OF_EARLY_FLATTREE; then ++ # Only some architectures with OF support have this target ++ if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then ++ $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/linux-image-$version" dtbs_install ++ fi ++fi + +-# Get the image from the makefile and install it as vmlinuz +-image_name_from_makefile="$($MAKE -s -f "$srctree/Makefile" image_name)" +-cp -pv "${image_name_from_makefile}" "$tmpdir/$installed_image_path" +-image_name="$(basename "${image_name_from_makefile}")" # Just the file name ++if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG; then ++ #mkdir -p "$tmpdir/boot/dtb" ++ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install ++fi ++ ++if is_enabled CONFIG_MODULES; then ++ INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install ++ rm -f "$tmpdir/lib/modules/$version/build" ++ rm -f "$tmpdir/lib/modules/$version/source" ++ ++ if [ "$ARCH" = "um" ]; then ++ mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" ++ rmdir "$tmpdir/lib/modules/$version" ++ fi ++ ++ if [ -n "$BUILD_DEBUG" ]; then ++ for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do ++ module=lib/modules/$module ++ mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) ++ # only keep debug symbols in the debug file ++ $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module ++ # strip original module from debug symbols ++ $OBJCOPY --strip-debug $tmpdir/$module ++ # then add a link to those ++ $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module ++ done ++ ++ # resign stripped modules ++ if is_enabled CONFIG_MODULE_SIG_ALL; then ++ INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign ++ fi ++ fi ++fi + + # Install the maintainer scripts + # Note: hook scripts under /etc/kernel are also executed by official Debian +@@ -229,7 +297,7 @@ for script in postinst postrm preinst prerm; do + mkdir -p "$tmpdir$debhookdir/$script.d" + cat <<- EOF > "$tmpdir/DEBIAN/$script" + #!/bin/bash +- set -x ++ + set -e + + # Pass maintainer script parameters to hook scripts +@@ -262,12 +330,12 @@ cat >> $tmpdir/DEBIAN/preinst <<- EOT + # exit if we are running chroot + if [ "\$(stat -c %d:%i /)" != "\$(stat -c %d:%i /proc/1/root/.)" ]; then exit 0; fi + +- check_and_unmount (){ ++ check_boot_dev (){ + boot_device=\$(mountpoint -d /boot) + + for file in /dev/* ; do + CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file)) +- if [ "\$CURRENT_DEVICE" = "\$boot_device" ]; then ++ if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then + boot_partition=\$file + break + fi +@@ -275,43 +343,40 @@ cat >> $tmpdir/DEBIAN/preinst <<- EOT + + bootfstype=\$(blkid -s TYPE -o value \$boot_partition) + if [ "\$bootfstype" = "vfat" ]; then +- umount /boot + rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/$image_name /boot/uImage + fi + } +- mountpoint -q /boot && check_and_unmount ++ mountpoint -q /boot && check_boot_dev + exit 0 + EOT + + create_package "$packagename" "$tmpdir" + +-# Put the DTBs, installed by kernel make at "$dtb_dir/boot/dtbs_install", at "$dtb_dir/boot/dtb-$version" +-if [ -d "$dtb_dir/boot/dtbs_install" ]; then +- echo "Armbian: DTB " "$dtb_dir/boot/dtbs_install" "exists, moving to" "$dtb_dir/boot/dtb-$version" +- [ -d "$dtb_dir/boot/dtb-$version" ] && rm -rf "$dtb_dir/boot/dtb-$version" +- mv -v "$dtb_dir/boot/dtbs_install" "$dtb_dir/boot/dtb-$version" +- create_package "$dtb_packagename" "$dtb_dir" "dtb" +-fi ++if [ "$ARCH" != "um" ]; then + +-deploy_libc_headers ${libc_headers_dir} +-create_package $libc_headers_packagename $libc_headers_dir ++ if [ "$(cat debian/arch)" != "amd64" ]; then # No DTB for amd64 target ++ create_package "$dtb_packagename" "$dtb_dir" "dtb" ++ fi + +-if is_enabled CONFIG_MODULES; then +- if is_native; then +- # echo "Skip scripts folder cleaning" >&2 +- # echo "Skip creating postinst prerm scripts for headers" >&2 +- deploy_kernel_headers $kernel_headers_dir +- create_package $kernel_headers_packagename $kernel_headers_dir # no "headers" here, no postinst +- else +- # Clean up the executables that are left over from +- # cross-compilation for a different host architecture. +- #( +- # cd $srctree +- # make M=scripts clean +- #) +- echo "-- NOT CLEANING before packaging headers. " 1>&2 +- deploy_kernel_headers $kernel_headers_dir +- create_package $kernel_headers_packagename $kernel_headers_dir "headers" ++ deploy_libc_headers $libc_headers_dir ++ create_package $libc_headers_packagename $libc_headers_dir ++ ++ if is_enabled CONFIG_MODULES; then ++ if is_native; then ++ # echo "Skip scripts folder cleaning" >&2 ++ # echo "Skip creating postinst prerm scripts for headers" >&2 ++ deploy_kernel_headers $kernel_headers_dir ++ create_package $kernel_headers_packagename $kernel_headers_dir ++ else ++ # Clean up the executables that are left over from ++ # cross-compilation for a different host architecture. ++ ( ++ cd $srctree ++ make M=scripts clean ++ ) ++ deploy_kernel_headers $kernel_headers_dir ++ create_package $kernel_headers_packagename $kernel_headers_dir "headers" ++ fi + fi + + fi +@@ -321,7 +386,7 @@ if [ -n "$BUILD_DEBUG" ]; then + # Different tools want the image in different locations + # perf + mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ +- cp -pv vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ ++ cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ + # systemtap + mkdir -p $dbg_dir/usr/lib/debug/boot/ + ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version +diff --git a/packages/armbian/mkdebian b/packages/armbian/mkdebian +index 83a37b99d..003195372 100755 +--- a/packages/armbian/mkdebian ++++ b/packages/armbian/mkdebian +@@ -1,4 +1,4 @@ +-#!/usr/bin/bash ++#!/bin/sh + # + # Copyright 2003 Wichert Akkerman + # +@@ -19,64 +19,57 @@ if_enabled_echo() { + } + + set_debarch() { +- if [ -n "$KBUILD_DEBARCH" ]; then ++ if [ -n "$KBUILD_DEBARCH" ] ; then + debarch="$KBUILD_DEBARCH" + return + fi + + # Attempt to find the correct Debian architecture + case "$UTS_MACHINE" in +- i386 | ia64 | alpha | m68k | riscv*) +- debarch="$UTS_MACHINE" +- ;; +- x86_64) +- debarch=amd64 +- ;; +- sparc*) +- debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) +- ;; +- s390*) +- debarch=s390x +- ;; +- ppc*) +- if is_enabled CONFIG_64BIT; then +- debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) +- else +- debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) +- fi +- ;; +- parisc*) +- debarch=hppa +- ;; +- mips*) +- if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then +- debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el +- elif is_enabled CONFIG_CPU_MIPSR6; then +- debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 +- else +- debarch=mips +- fi +- ;; +- aarch64 | arm64) +- debarch=arm64 +- ;; +- arm*) +- if is_enabled CONFIG_AEABI; then +- debarch=arm$(if_enabled_echo CONFIG_VFP hf el) +- else +- debarch=arm +- fi +- ;; +- openrisc) +- debarch=or1k +- ;; +- sh) +- if is_enabled CONFIG_CPU_SH3; then +- debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) +- elif is_enabled CONFIG_CPU_SH4; then +- debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) +- fi +- ;; ++ i386|ia64|alpha|m68k|riscv*) ++ debarch="$UTS_MACHINE" ;; ++ x86_64) ++ debarch=amd64 ;; ++ sparc*) ++ debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;; ++ s390*) ++ debarch=s390x ;; ++ ppc*) ++ if is_enabled CONFIG_64BIT; then ++ debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) ++ else ++ debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) ++ fi ++ ;; ++ parisc*) ++ debarch=hppa ;; ++ mips*) ++ if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then ++ debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el ++ elif is_enabled CONFIG_CPU_MIPSR6; then ++ debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 ++ else ++ debarch=mips ++ fi ++ ;; ++ aarch64|arm64) ++ debarch=arm64 ;; ++ arm*) ++ if is_enabled CONFIG_AEABI; then ++ debarch=arm$(if_enabled_echo CONFIG_VFP hf el) ++ else ++ debarch=arm ++ fi ++ ;; ++ openrisc) ++ debarch=or1k ;; ++ sh) ++ if is_enabled CONFIG_CPU_SH3; then ++ debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) ++ elif is_enabled CONFIG_CPU_SH4; then ++ debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) ++ fi ++ ;; + esac + if [ -z "$debarch" ]; then + debarch=$(dpkg-architecture -qDEB_HOST_ARCH) +@@ -91,9 +84,6 @@ set_debarch() { + fi + } + +-#set -x +-echo "Armbian mkdebian starting..." +- + # Some variables and settings used throughout the script + KDEB_SOURCENAME=linux-$KERNELRELEASE + version=$KERNELRELEASE +@@ -101,7 +91,7 @@ if [ -n "$KDEB_PKGVERSION" ]; then + packageversion=$KDEB_PKGVERSION + revision=${packageversion##*-} + else +- revision=$(cat .version 2> /dev/null || echo 1) ++ revision=$(cat .version 2>/dev/null||echo 1) + packageversion=$version-$revision + fi + sourcename=$KDEB_SOURCENAME +@@ -111,6 +101,10 @@ libc_headers_packagename=linux-libc-dev + dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" + dbg_packagename=$packagename-dbg + ++if [ "$ARCH" = "um" ] ; then ++ packagename=user-mode-linux-$version ++fi ++ + debarch= + set_debarch + +@@ -124,7 +118,7 @@ else + user=${KBUILD_BUILD_USER-$(id -nu)} + name=${DEBFULLNAME-$user} + if [ -z "$email" ]; then +- buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2> /dev/null || hostname)} ++ buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)} + email="$user@$buildhost" + fi + maintainer="$name <$email>" +@@ -132,14 +126,14 @@ fi + + # Try to determine distribution + if [ -n "$KDEB_CHANGELOG_DIST" ]; then +- distribution=$KDEB_CHANGELOG_DIST ++ distribution=$KDEB_CHANGELOG_DIST + # In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog +-elif distribution=$(lsb_release -cs 2> /dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then +- : # nothing to do in this case ++elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then ++ : # nothing to do in this case + else +- distribution="unstable" +- echo >&2 "Using default distribution of 'unstable' in the changelog" +- echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" ++ distribution="unstable" ++ echo >&2 "Using default distribution of 'unstable' in the changelog" ++ echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" + fi + + mkdir -p debian/source/ +@@ -150,109 +144,111 @@ extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)" + extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)" + + # Generate a simple changelog template +-cat <<- EOF > debian/changelog +- $sourcename ($packageversion) $distribution; urgency=low ++cat < debian/changelog ++$sourcename ($packageversion) $distribution; urgency=low + +- * Armbian built Linux kernel. $BRANCH ++ * Armbian built Linux kernel. $BRANCH + +- -- $maintainer $(date -R) ++ -- $maintainer $(date -R) + EOF + + # Generate copyright file +-cat <<- EOF > debian/copyright +- This is a packacked armbian patches version of the Linux kernel. ++cat < debian/copyright ++This is a packacked armbian patches version of the Linux kernel. + +- The sources may be found at most Linux archive sites, including: +- https://www.kernel.org/pub/linux/kernel ++The sources may be found at most Linux archive sites, including: ++https://www.kernel.org/pub/linux/kernel + +- Copyright: 1991 - 2018 Linus Torvalds and others. ++Copyright: 1991 - 2018 Linus Torvalds and others. + +- The git repository for mainline kernel development is at: +- git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ++The git repository for mainline kernel development is at: ++git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; version 2 dated June, 1991. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; version 2 dated June, 1991. + +- On Debian GNU/Linux systems, the complete text of the GNU General Public +- License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. ++On Debian GNU/Linux systems, the complete text of the GNU General Public ++License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. + EOF + + # Generate a control file +-cat <<- EOF > debian/control +- Source: $sourcename +- Section: kernel +- Priority: optional +- Maintainer: $maintainer +- Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends +- Homepage: https://www.kernel.org/ +- +- Package: $packagename +- Architecture: $debarch +- Provides: linux-image, linux-image-armbian, armbian-$BRANCH +- Description: Linux kernel, armbian version $version $BRANCH +- This package contains the Linux kernel, modules and corresponding other +- files, version: $version. +- +- Package: $libc_headers_packagename +- Section: devel +- Provides: linux-kernel-headers +- Conflicts: linux-kernel-headers +- Replaces: linux-kernel-headers +- Architecture: $debarch +- Description: Armbian Linux support headers for userspace development +- This package provides userspaces headers from the Linux kernel. These headers +- are used by the installed headers for GNU glibc and other system libraries. +- Multi-Arch: same +- +- Package: $dtb_packagename +- Architecture: $debarch +- Provides: linux-dtb, linux-dtb-armbian, armbian-$BRANCH +- Description: Armbian Linux DTB, version $version $BRANCH +- This package contains device blobs from the Linux kernel, version $version ++cat < debian/control ++Source: $sourcename ++Section: kernel ++Priority: optional ++Maintainer: $maintainer ++Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends ++Homepage: https://www.kernel.org/ ++ ++Package: $packagename ++Architecture: $debarch ++Provides: linux-image, linux-image-armbian, armbian-$BRANCH ++Description: Linux kernel, armbian version $version $BRANCH ++ This package contains the Linux kernel, modules and corresponding other ++ files, version: $version. ++ ++Package: $libc_headers_packagename ++Section: devel ++Provides: linux-kernel-headers ++Conflicts: linux-kernel-headers ++Replaces: linux-kernel-headers ++Architecture: $debarch ++Description: Armbian Linux support headers for userspace development ++ This package provides userspaces headers from the Linux kernel. These headers ++ are used by the installed headers for GNU glibc and other system libraries. ++Multi-Arch: same ++ ++Package: $dtb_packagename ++Architecture: $debarch ++Provides: linux-dtb, linux-dtb-armbian, armbian-$BRANCH ++Description: Armbian Linux DTB, version $version $BRANCH ++ This package contains device blobs from the Linux kernel, version $version + EOF + + if is_enabled CONFIG_MODULES; then +- cat <<- EOF >> debian/control +- +- Package: $kernel_headers_packagename +- Section: devel +- Architecture: $debarch +- Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH +- Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +- Description: Linux kernel headers for $version on $debarch $BRANCH +- This package provides kernel header files for $version on $debarch +- . +- This is useful for people who need to build external modules +- EOF ++cat <> debian/control ++ ++Package: $kernel_headers_packagename ++Section: devel ++Architecture: $debarch ++Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH ++Depends: make, gcc, libc6-dev, bison, flex, libssl-dev ++Description: Linux kernel headers for $version on $debarch $BRANCH ++ This package provides kernel header files for $version on $debarch ++ . ++ This is useful for people who need to build external modules ++EOF + fi + + if is_enabled CONFIG_DEBUG_INFO; then +- cat <<- EOF >> debian/control +- +- Package: $dbg_packagename +- Section: debug +- Architecture: $debarch +- Description: Linux kernel debugging symbols for $version +- This package will come in handy if you need to debug the kernel. It provides +- all the necessary debug symbols for the kernel and its modules. +- EOF ++cat <> debian/control ++ ++Package: $dbg_packagename ++Section: debug ++Architecture: $debarch ++Description: Linux kernel debugging symbols for $version ++ This package will come in handy if you need to debug the kernel. It provides ++ all the necessary debug symbols for the kernel and its modules. ++EOF + fi + +-cat << EOF > debian/rules ++cat < debian/rules + #!$(command -v $MAKE) -f + + srctree ?= . + + build: +- echo "Kernel should be built, headers and modules installed before calling this." ++ \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ ++ KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile + + binary-arch: +- echo "Armbian: Calling builddep via make intdeb-pkg" +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg ++ \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ ++ KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg + + clean: + rm -rf debian/*tmp debian/files ++ \$(MAKE) clean + + binary: binary-arch + EOF +diff --git a/packages/bsp/common/etc/profile.d/armbian-activate-profile-sync-daemon.sh b/packages/bsp/common/etc/profile.d/armbian-activate-profile-sync-daemon.sh +index 3cfd5c451..9f0b86523 100644 +--- a/packages/bsp/common/etc/profile.d/armbian-activate-profile-sync-daemon.sh ++++ b/packages/bsp/common/etc/profile.d/armbian-activate-profile-sync-daemon.sh +@@ -10,13 +10,13 @@ + + if [ -f "${HOME}/.activate_psd" ]; then + rm -f ${HOME}/.activate_psd +- /usr/bin/psd > /dev/null 2>&1 ++ /usr/bin/psd >/dev/null 2>&1 + config_file="${HOME}/.config/psd/psd.conf" + if [ -f "${config_file}" ]; then + # test for overlayfs + # TODO: don't enable on btrfs + sed -i 's/#USE_OVERLAYFS=.*/USE_OVERLAYFS="yes"/' "${config_file}" +- case $(/usr/bin/psd p 2> /dev/null | grep Overlayfs) in ++ case $(/usr/bin/psd p 2>/dev/null | grep Overlayfs) in + *active*) + echo -e "\nConfigured profile sync daemon with overlayfs." + ;; +@@ -26,6 +26,6 @@ if [ -f "${HOME}/.activate_psd" ]; then + ;; + esac + fi +- systemctl --user enable psd.service > /dev/null 2>&1 +- systemctl --user start psd.service > /dev/null 2>&1 ++ systemctl --user enable psd.service >/dev/null 2>&1 ++ systemctl --user start psd.service >/dev/null 2>&1 + fi +diff --git a/packages/bsp/common/etc/profile.d/armbian-check-first-login-reboot.sh b/packages/bsp/common/etc/profile.d/armbian-check-first-login-reboot.sh +index 2e4d6e1ae..8d4ce0b3c 100644 +--- a/packages/bsp/common/etc/profile.d/armbian-check-first-login-reboot.sh ++++ b/packages/bsp/common/etc/profile.d/armbian-check-first-login-reboot.sh +@@ -8,17 +8,17 @@ + + # only do this for interactive shells + if [ "$-" != "${-#*i}" ]; then +- OutstandingPackages="$(egrep -v "linux-base|linux-image" /var/run/reboot-required.pkgs 2> /dev/null)" ++ OutstandingPackages="$(egrep -v "linux-base|linux-image" /var/run/reboot-required.pkgs 2>/dev/null)" + if [ -f "/var/run/.reboot_required" ]; then + printf "\n[\e[0;91m Kernel was updated, please reboot\x1B[0m ]\n\n" + elif [ "X${OutstandingPackages}" != "X" ]; then + # No kernel update involved, just regular packages like e.g. dbus require a reboot + Packages="$(egrep -v "linux-base|linux-image" /var/run/reboot-required.pkgs | sort | uniq | tr '\n' ',' | sed -e 's/,/, /g' -e 's/,\ $//')" + OlderThanOneDay=$(find /var/run/reboot-required -mtime +1) +- if [ "X${OlderThanOneDay}" = "X" ]; then ++ if [ "X${OlderThanOneDay}" = "X" ]; then + printf "\n[\e[0;92m some packages require a reboot (${Packages})\x1B[0m ]\n\n" +- else ++ else + printf "\n[\e[0;91m some packages require a reboot since more than 1 day (${Packages})\x1B[0m ]\n\n" +- fi ++ fi + fi + fi +diff --git a/packages/bsp/common/etc/profile.d/armbian-ssh-title.sh b/packages/bsp/common/etc/profile.d/armbian-ssh-title.sh +index 9932ec62e..c3b1822cb 100644 +--- a/packages/bsp/common/etc/profile.d/armbian-ssh-title.sh ++++ b/packages/bsp/common/etc/profile.d/armbian-ssh-title.sh +@@ -6,9 +6,9 @@ + # License version 2. This program is licensed "as is" without any + # warranty of any kind, whether express or implied. + +-if [ -n "$PS1" ] && ([ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]); then +- tput tsl > /dev/null +- if [ "$?" -eq 0 ]; then +- echo $(tput tsl) $(whoami)@$(hostname) $(tput fsl) +- fi +-fi ++if [ -n "$PS1" ] && ( [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] ); then ++ tput tsl > /dev/null ++ if [ "$?" -eq 0 ]; then ++ echo `tput tsl` `whoami`@`hostname` `tput fsl` ++ fi ++fi +\ No newline at end of file +diff --git a/packages/bsp/jethub/jethub-remove-log-file.sh b/packages/bsp/jethub/jethub-remove-log-file.sh +index 0384825c3..62086cd40 100755 +--- a/packages/bsp/jethub/jethub-remove-log-file.sh ++++ b/packages/bsp/jethub/jethub-remove-log-file.sh +@@ -8,10 +8,10 @@ LOGS_ROTATE_DEBUG_FILE=/tmp/$(basename "$0").log + LOG_FILE=$1 + + if [ -f "$LOG_FILE" ]; then +- if [ -n "$LOGS_ROTATE_DEBUG" ]; then +- date > "$LOGS_ROTATE_DEBUG_FILE" +- rm -fv "$LOG_FILE" >> "$LOGS_ROTATE_DEBUG_FILE" +- else +- rm -f "$LOG_FILE" +- fi ++ if [ -n "$LOGS_ROTATE_DEBUG" ]; then ++ date > "$LOGS_ROTATE_DEBUG_FILE" ++ rm -fv "$LOG_FILE" >> "$LOGS_ROTATE_DEBUG_FILE" ++ else ++ rm -f "$LOG_FILE" ++ fi + fi +diff --git a/packages/bsp/nanopim4/nanopim4-pwm-fan.sh b/packages/bsp/nanopim4/nanopim4-pwm-fan.sh +index 33c913d25..6040a3109 100644 +--- a/packages/bsp/nanopim4/nanopim4-pwm-fan.sh ++++ b/packages/bsp/nanopim4/nanopim4-pwm-fan.sh +@@ -10,7 +10,7 @@ + # This is free. There is NO WARRANTY. Use at your own risk. + ############################################################################### + +-cache() { ++cache () { + if [[ -z "$1" ]]; then + echo '[pwm-fan] Cache file was not specified. Assuming generic.' + local FILENAME='generic' +@@ -30,7 +30,7 @@ cache() { + fi + } + +-check_requisites() { ++check_requisites () { + local REQUISITES=('bc' 'cat' 'echo' 'mkdir' 'touch' 'trap' 'sleep') + echo '[pwm-fan] Checking requisites: '${REQUISITES[@]} + for cmd in ${REQUISITES[@]}; do +@@ -43,7 +43,7 @@ check_requisites() { + echo '[pwm-fan] All commands are accesible.' + } + +-cleanup() { ++cleanup () { + echo '---- cleaning up ----' + # disable the channel + unexport_pwmchip_channel +@@ -54,7 +54,7 @@ cleanup() { + echo '--------------------' + } + +-config() { ++config () { + pwmchip + export_pwmchip_channel + fan_startup +@@ -63,7 +63,7 @@ config() { + } + + # takes message and status as argument +-end() { ++end () { + cleanup + echo '####################################################' + echo '# END OF THE PWM-FAN SCRIPT' +@@ -72,39 +72,39 @@ end() { + exit $2 + } + +-export_pwmchip_channel() { ++export_pwmchip_channel () { + if [[ ! -d "$CHANNEL_FOLDER" ]]; then +- local EXPORT=$PWMCHIP_FOLDER'export' +- cache 'export' +- local EXPORT_SET=$(echo 0 2> "$CACHE" > "$EXPORT") +- if [[ ! -z $(cat "$CACHE") ]]; then +- # on error, parse output +- if [[ $(cat "$CACHE") =~ (P|p)ermission\ denied ]]; then +- echo '[pwm-fan] This user does not have permission to use channel '$CHANNEL'.' +- if [[ ! -z $(command -v stat) ]]; then +- echo '[pwm-fan] Export is owned by user: '$(stat -c '%U' "$EXPORT")'.' +- echo '[pwm-fan] Export is owned by group: '$(stat -c '%G' "$EXPORT")'.' +- fi +- local ERR_MSG='User permission error while setting channel.' +- elif [[ $(cat "$CACHE") =~ (D|d)evice\ or\ resource\ busy ]]; then +- echo '[pwm-fan] It seems the pin is already in use. Cannot write to export.' +- local ERR_MSG=$PWMCHIP' was busy while setting channel.' +- else +- echo '[pwm-fan] There was an unknown error while setting the channel '$CHANNEL'.' +- if [[ $(cat "$CACHE") =~ \ ([^\:]+)$ ]]; then +- echo '[pwm-fan] Error: '${BASH_REMATCH[1]}'.' +- fi +- local ERR_MSG='Unknown error while setting channel.' +- fi +- end "$ERR_MSG" 1 +- fi +- sleep 1 ++ local EXPORT=$PWMCHIP_FOLDER'export' ++ cache 'export' ++ local EXPORT_SET=$(echo 0 2> "$CACHE" > "$EXPORT") ++ if [[ ! -z $(cat "$CACHE") ]]; then ++ # on error, parse output ++ if [[ $(cat "$CACHE") =~ (P|p)ermission\ denied ]]; then ++ echo '[pwm-fan] This user does not have permission to use channel '$CHANNEL'.' ++ if [[ ! -z $(command -v stat) ]]; then ++ echo '[pwm-fan] Export is owned by user: '$(stat -c '%U' "$EXPORT")'.' ++ echo '[pwm-fan] Export is owned by group: '$(stat -c '%G' "$EXPORT")'.' ++ fi ++ local ERR_MSG='User permission error while setting channel.' ++ elif [[ $(cat "$CACHE") =~ (D|d)evice\ or\ resource\ busy ]]; then ++ echo '[pwm-fan] It seems the pin is already in use. Cannot write to export.' ++ local ERR_MSG=$PWMCHIP' was busy while setting channel.' ++ else ++ echo '[pwm-fan] There was an unknown error while setting the channel '$CHANNEL'.' ++ if [[ $(cat "$CACHE") =~ \ ([^\:]+)$ ]]; then ++ echo '[pwm-fan] Error: '${BASH_REMATCH[1]}'.' ++ fi ++ local ERR_MSG='Unknown error while setting channel.' ++ fi ++ end "$ERR_MSG" 1 ++ fi ++ sleep 1 + elif [[ -d "$CHANNEL_FOLDER" ]]; then + echo '[pwm-fan] '$CHANNEL' channel is already accessible.' + fi + } + +-fan_initialization() { ++fan_initialization () { + if [[ -z "$TIME_STARTUP" ]]; then + TIME_STARTUP=10 + fi +@@ -113,7 +113,7 @@ fan_initialization() { + echo $READ_MAX_DUTY_CYCLE 2> $CACHE > $CHANNEL_FOLDER'duty_cycle' + # on error, try setting duty_cycle to a lower value + if [[ ! -z $(cat $CACHE) ]]; then +- local READ_MAX_DUTY_CYCLE=$(($(cat $CHANNEL_FOLDER'period') - 100)) ++ local READ_MAX_DUTY_CYCLE=$(($(cat $CHANNEL_FOLDER'period')-100)) + > $CACHE + echo $READ_MAX_DUTY_CYCLE 2> $CACHE > $CHANNEL_FOLDER'duty_cycle' + if [[ ! -z $(cat $CACHE) ]]; then +@@ -124,12 +124,12 @@ fan_initialization() { + echo '[pwm-fan] Running fan at full speed for the next '$TIME_STARTUP' seconds...' + echo 1 > $CHANNEL_FOLDER'enable' + sleep $TIME_STARTUP +- echo $((MAX_DUTY_CYCLE / 2)) > $CHANNEL_FOLDER'duty_cycle' +- echo '[pwm-fan] Initialization done. Duty cycle at 50% now: '$((MAX_DUTY_CYCLE / 2))' ns.' ++ echo $((MAX_DUTY_CYCLE/2)) > $CHANNEL_FOLDER'duty_cycle' ++ echo '[pwm-fan] Initialization done. Duty cycle at 50% now: '$((MAX_DUTY_CYCLE/2))' ns.' + sleep 1 + } + +-fan_run() { ++fan_run () { + if [[ $THERMAL_STATUS -eq 0 ]]; then + fan_run_max + else +@@ -137,7 +137,7 @@ fan_run() { + fi + } + +-fan_run_max() { ++fan_run_max () { + echo '[pwm-fan] Running fan at full speed until stopped (Ctrl+C or kill '$$')...' + while true; do + echo $MAX_DUTY_CYCLE > $CHANNEL_FOLDER'duty_cycle' +@@ -146,7 +146,7 @@ fan_run_max() { + done + } + +-fan_run_thermal() { ++fan_run_thermal () { + echo '[pwm-fan] Running fan in temp monitor mode until stopped (Ctrl+C or kill '$$')...' + if [[ -z $THERMAL_ABS_THRESH_LOW ]]; then + THERMAL_ABS_THRESH_LOW=25 +@@ -161,7 +161,7 @@ fan_run_thermal() { + if [[ -z $DC_PERCENT_MAX ]]; then + DC_PERCENT_MAX=100 + fi +- DC_ABS_THRESH=($(((DC_PERCENT_MIN * MAX_DUTY_CYCLE) / 100)) $(((DC_PERCENT_MAX * MAX_DUTY_CYCLE) / 100))) ++ DC_ABS_THRESH=($(((DC_PERCENT_MIN*MAX_DUTY_CYCLE)/100)) $(((DC_PERCENT_MAX*MAX_DUTY_CYCLE)/100))) + if [[ -z $TEMPS_SIZE ]]; then + TEMPS_SIZE=6 + fi +@@ -183,9 +183,9 @@ fan_run_thermal() { + for TEMP in ${TEMPS[@]}; do + let TEMPS_SUM+=$TEMP + done +- # moving mid-point +- MEAN_TEMP=$((TEMPS_SUM / ${#TEMPS[@]})) +- DEV_MEAN_CRITICAL=$((MEAN_TEMP - 100)) ++ # moving mid-point ++ MEAN_TEMP=$((TEMPS_SUM/${#TEMPS[@]})) ++ DEV_MEAN_CRITICAL=$((MEAN_TEMP-100)) + X0=${DEV_MEAN_CRITICAL#-} + # args: x, x0, L, a, b (k=a/b) + MODEL=$(function_logistic ${TEMPS[-1]} $X0 ${DC_ABS_THRESH[-1]} 1 10) +@@ -201,7 +201,7 @@ fan_run_thermal() { + done + } + +-fan_startup() { ++fan_startup () { + if [[ -z $PERIOD ]]; then + PERIOD=25000000 + fi +@@ -222,25 +222,25 @@ fan_startup() { + done + } + +-function_logistic() { +- # https://en.wikipedia.org/wiki/Logistic_function +- local x=$1 +- local x0=$2 +- local L=$3 +- # k=a/b +- local a=$4 +- local b=$5 +- local equation="output=$L/(1+e(-($a/$b)*($x-$x0)));scale=0;output/1" +- local result=$(echo $equation | bc -lq) +- echo $result ++function_logistic () { ++ # https://en.wikipedia.org/wiki/Logistic_function ++ local x=$1 ++ local x0=$2 ++ local L=$3 ++ # k=a/b ++ local a=$4 ++ local b=$5 ++ local equation="output=$L/(1+e(-($a/$b)*($x-$x0)));scale=0;output/1" ++ local result=$(echo $equation | bc -lq) ++ echo $result + } + +-interrupt() { ++interrupt () { + echo '!! ATTENTION !!' + end 'Received a signal to stop the script.' 0 + } + +-pwmchip() { ++pwmchip () { + if [[ -z $PWMCHIP ]]; then + PWMCHIP='pwmchip1' + fi +@@ -257,7 +257,7 @@ pwmchip() { + CHANNEL_FOLDER="$PWMCHIP_FOLDER""$CHANNEL"'/' + } + +-set_default() { ++set_default () { + cache 'set_default_duty_cycle' + echo 0 2> $CACHE > $CHANNEL_FOLDER'duty_cycle' + if [[ ! -z $(cat $CACHE) ]]; then +@@ -273,13 +273,13 @@ set_default() { + local decrement=100 + local rate=$decrement + until [[ $PERIOD_NEW -le 200 ]]; do +- local PERIOD_NEW=$((PERIOD - rate)) ++ local PERIOD_NEW=$((PERIOD-rate)) + > $CACHE + echo $PERIOD_NEW 2> $CACHE > $CHANNEL_FOLDER'period' + if [[ -z $(cat $CACHE) ]]; then + break + fi +- local rate=$((rate + decrement)) ++ local rate=$((rate+decrement)) + done + PERIOD=$PERIOD_NEW + if [[ $PERIOD -le 100 ]]; then +@@ -292,7 +292,7 @@ set_default() { + echo '[pwm-fan] Default duty cycle: '$(cat $CHANNEL_FOLDER'duty_cycle')' ns' + } + +-start() { ++start () { + echo '####################################################' + echo '# STARTING PWM-FAN SCRIPT' + echo '# Date and time: '$(date) +@@ -300,15 +300,15 @@ start() { + check_requisites + } + +-thermal_meter() { ++thermal_meter () { + if [[ -f $TEMP_FILE ]]; then + local TEMP=$(cat $TEMP_FILE 2> /dev/null) + # TEMP is in millidegrees, so convert to degrees +- echo $((TEMP / 1000)) ++ echo $((TEMP/1000)) + fi + } + +-thermal_monit() { ++thermal_monit () { + if [[ -z $MONIT_DEVICE ]]; then + # soc for legacy Kernel or cpu for latest Kernel + MONIT_DEVICE='(soc|cpu)' +@@ -333,7 +333,7 @@ thermal_monit() { + THERMAL_STATUS=0 + } + +-unexport_pwmchip_channel() { ++unexport_pwmchip_channel () { + if [[ -d "$CHANNEL_FOLDER" ]]; then + echo '[pwm-fan] Freeing up the channel '$CHANNEL' controlled by the '$PWMCHIP'.' + echo 0 > $CHANNEL_FOLDER'enable' +@@ -351,135 +351,135 @@ unexport_pwmchip_channel() { + } + + usage() { +- echo '' +- echo 'Usage:' +- echo '' +- echo "$0" '[OPTIONS]' +- echo '' +- echo ' Options:' +- echo ' -c str Name of the PWM CHANNEL (e.g., pwm0, pwm1). Default: pwm0' +- echo ' -C str Name of the PWM CONTROLLER (e.g., pwmchip0, pwmchip1). Default: pwmchip1' +- echo ' -d int Lowest DUTY CYCLE threshold (in percentage of the period). Default: 25' +- echo ' -D int Highest DUTY CYCLE threshold (in percentage of the period). Default: 100' +- echo ' -f Fan runs at FULL SPEED all the time. If omitted (default), speed depends on temperature.' +- echo ' -F int TIME (in seconds) to run the fan at full speed during STARTUP. Default: 60' +- echo ' -h Show this HELP message.' +- echo ' -l int TIME (in seconds) to LOOP thermal reads. Lower means higher resolution but uses ever more resources. Default: 10' +- echo ' -m str Name of the DEVICE to MONITOR the temperature in the thermal sysfs interface. Default: (soc|cpu)' +- echo ' -p int The fan PERIOD (in nanoseconds). Default (25kHz): 25000000.' +- echo ' -s int The MAX SIZE of the TEMPERATURE ARRAY. Interval between data points is set by -l. Default (store last 1min data): 6.' +- echo ' -t int Lowest TEMPERATURE threshold (in Celsius). Lower temps set the fan speed to min. Default: 25' +- echo ' -T int Highest TEMPERATURE threshold (in Celsius). Higher temps set the fan speed to max. Default: 75' +- echo '' +- echo ' If no options are provided, the script will run with default values.' +- echo ' Defaults have been tested and optimized for the following hardware:' +- echo ' - NanoPi-M4 v2' +- echo ' - M4 SATA hat' +- echo ' - Fan 12V (.08A and .2A)' +- echo ' And software:' +- echo ' - Kernel: Linux 4.4.231-rk3399' +- echo ' - OS: Armbian Buster (20.08.9) stable' +- echo ' - GNU bash v5.0.3' +- echo ' - bc v1.07.1' +- echo '' +- echo 'Author: cgomesu' +- echo 'Repo: https://github.com/cgomesu/nanopim4-satahat-fan' +- echo '' +- echo 'This is free. There is NO WARRANTY. Use at your own risk.' +- echo '' ++ echo '' ++ echo 'Usage:' ++ echo '' ++ echo "$0" '[OPTIONS]' ++ echo '' ++ echo ' Options:' ++ echo ' -c str Name of the PWM CHANNEL (e.g., pwm0, pwm1). Default: pwm0' ++ echo ' -C str Name of the PWM CONTROLLER (e.g., pwmchip0, pwmchip1). Default: pwmchip1' ++ echo ' -d int Lowest DUTY CYCLE threshold (in percentage of the period). Default: 25' ++ echo ' -D int Highest DUTY CYCLE threshold (in percentage of the period). Default: 100' ++ echo ' -f Fan runs at FULL SPEED all the time. If omitted (default), speed depends on temperature.' ++ echo ' -F int TIME (in seconds) to run the fan at full speed during STARTUP. Default: 60' ++ echo ' -h Show this HELP message.' ++ echo ' -l int TIME (in seconds) to LOOP thermal reads. Lower means higher resolution but uses ever more resources. Default: 10' ++ echo ' -m str Name of the DEVICE to MONITOR the temperature in the thermal sysfs interface. Default: (soc|cpu)' ++ echo ' -p int The fan PERIOD (in nanoseconds). Default (25kHz): 25000000.' ++ echo ' -s int The MAX SIZE of the TEMPERATURE ARRAY. Interval between data points is set by -l. Default (store last 1min data): 6.' ++ echo ' -t int Lowest TEMPERATURE threshold (in Celsius). Lower temps set the fan speed to min. Default: 25' ++ echo ' -T int Highest TEMPERATURE threshold (in Celsius). Higher temps set the fan speed to max. Default: 75' ++ echo '' ++ echo ' If no options are provided, the script will run with default values.' ++ echo ' Defaults have been tested and optimized for the following hardware:' ++ echo ' - NanoPi-M4 v2' ++ echo ' - M4 SATA hat' ++ echo ' - Fan 12V (.08A and .2A)' ++ echo ' And software:' ++ echo ' - Kernel: Linux 4.4.231-rk3399' ++ echo ' - OS: Armbian Buster (20.08.9) stable' ++ echo ' - GNU bash v5.0.3' ++ echo ' - bc v1.07.1' ++ echo '' ++ echo 'Author: cgomesu' ++ echo 'Repo: https://github.com/cgomesu/nanopim4-satahat-fan' ++ echo '' ++ echo 'This is free. There is NO WARRANTY. Use at your own risk.' ++ echo '' + } + + while getopts 'c:C:d:D:fF:hl:m:p:s:t:T:' OPT; do +- case ${OPT} in +- c) +- CHANNEL="$OPTARG" +- if [[ ! $CHANNEL =~ ^pwm[0-9]+$ ]]; then +- echo 'The name of the pwm channel must contain pwm and at least a number (pwm0).' +- exit 1 +- fi +- ;; +- C) +- PWMCHIP="$OPTARG" +- if [[ ! $PWMCHIP =~ ^pwmchip[0-9]+$ ]]; then +- echo 'The name of the pwm controller must contain pwmchip and at least a number (pwmchip1).' +- exit 1 +- fi +- ;; +- d) +- DC_PERCENT_MIN="$OPTARG" +- if [[ ! $DC_PERCENT_MIN =~ ^([0-6][0-9]?|70)$ ]]; then +- echo 'The lowest duty cycle threshold must be an integer between 0 and 70.' +- exit 1 +- fi +- ;; +- D) +- DC_PERCENT_MAX="$OPTARG" +- if [[ ! $DC_PERCENT_MAX =~ ^([8-9][0-9]?|100)$ ]]; then +- echo 'The highest duty cycle threshold must be an integer between 80 and 100.' +- exit 1 +- fi +- ;; +- f) +- SKIP_THERMAL=1 +- ;; +- F) +- TIME_STARTUP="$OPTARG" +- if [[ ! $TIME_STARTUP =~ ^[0-9]+$ ]]; then +- echo 'The time to run the fan at full speed during startup must be an integer.' +- exit 1 +- fi +- ;; +- h) +- usage +- exit 0 +- ;; +- l) +- TIME_LOOP="$OPTARG" +- if [[ ! $TIME_LOOP =~ ^[0-9]+$ ]]; then +- echo 'The time to loop thermal reads must be an integer.' +- exit 1 +- fi +- ;; +- m) +- MONIT_DEVICE="$OPTARG" +- ;; +- p) +- PERIOD="$OPTARG" +- if [[ ! $PERIOD =~ ^[0-9]+$ ]]; then +- echo 'The period must be an integer.' +- exit 1 +- fi +- ;; +- s) +- TEMPS_SIZE="$OPTARG" +- if [[ ! $TEMPS_SIZE =~ ^[0-9]+$ ]]; then +- echo 'The max size of the temperature array must be an integer.' +- exit 1 +- fi +- ;; +- t) +- THERMAL_ABS_THRESH_LOW="$OPTARG" +- if [[ ! $THERMAL_ABS_THRESH_LOW =~ ^[0-4][0-9]?$ ]]; then +- echo 'The lowest temperature threshold must be an integer between 0 and 49.' +- exit 1 +- fi +- ;; +- T) +- THERMAL_ABS_THRESH_HIGH="$OPTARG" +- if [[ ! $THERMAL_ABS_THRESH_HIGH =~ ^([5-9][0-9]?|1[0-1][0-9]?|120)$ ]]; then +- echo 'The highest temperature threshold must be an integer between 50 and 120.' +- exit 1 +- fi +- ;; +- \?) +- echo '!! ATTENTION !!' +- echo '................................' +- echo 'Detected an invalid option.' +- echo 'Try: '"$0"' -h' +- echo '................................' +- exit 1 +- ;; +- esac ++ case ${OPT} in ++ c) ++ CHANNEL="$OPTARG" ++ if [[ ! $CHANNEL =~ ^pwm[0-9]+$ ]]; then ++ echo 'The name of the pwm channel must contain pwm and at least a number (pwm0).' ++ exit 1 ++ fi ++ ;; ++ C) ++ PWMCHIP="$OPTARG" ++ if [[ ! $PWMCHIP =~ ^pwmchip[0-9]+$ ]]; then ++ echo 'The name of the pwm controller must contain pwmchip and at least a number (pwmchip1).' ++ exit 1 ++ fi ++ ;; ++ d) ++ DC_PERCENT_MIN="$OPTARG" ++ if [[ ! $DC_PERCENT_MIN =~ ^([0-6][0-9]?|70)$ ]]; then ++ echo 'The lowest duty cycle threshold must be an integer between 0 and 70.' ++ exit 1 ++ fi ++ ;; ++ D) ++ DC_PERCENT_MAX="$OPTARG" ++ if [[ ! $DC_PERCENT_MAX =~ ^([8-9][0-9]?|100)$ ]]; then ++ echo 'The highest duty cycle threshold must be an integer between 80 and 100.' ++ exit 1 ++ fi ++ ;; ++ f) ++ SKIP_THERMAL=1 ++ ;; ++ F) ++ TIME_STARTUP="$OPTARG" ++ if [[ ! $TIME_STARTUP =~ ^[0-9]+$ ]]; then ++ echo 'The time to run the fan at full speed during startup must be an integer.' ++ exit 1 ++ fi ++ ;; ++ h) ++ usage ++ exit 0 ++ ;; ++ l) ++ TIME_LOOP="$OPTARG" ++ if [[ ! $TIME_LOOP =~ ^[0-9]+$ ]]; then ++ echo 'The time to loop thermal reads must be an integer.' ++ exit 1 ++ fi ++ ;; ++ m) ++ MONIT_DEVICE="$OPTARG" ++ ;; ++ p) ++ PERIOD="$OPTARG" ++ if [[ ! $PERIOD =~ ^[0-9]+$ ]]; then ++ echo 'The period must be an integer.' ++ exit 1 ++ fi ++ ;; ++ s) ++ TEMPS_SIZE="$OPTARG" ++ if [[ ! $TEMPS_SIZE =~ ^[0-9]+$ ]]; then ++ echo 'The max size of the temperature array must be an integer.' ++ exit 1 ++ fi ++ ;; ++ t) ++ THERMAL_ABS_THRESH_LOW="$OPTARG" ++ if [[ ! $THERMAL_ABS_THRESH_LOW =~ ^[0-4][0-9]?$ ]]; then ++ echo 'The lowest temperature threshold must be an integer between 0 and 49.' ++ exit 1 ++ fi ++ ;; ++ T) ++ THERMAL_ABS_THRESH_HIGH="$OPTARG" ++ if [[ ! $THERMAL_ABS_THRESH_HIGH =~ ^([5-9][0-9]?|1[0-1][0-9]?|120)$ ]]; then ++ echo 'The highest temperature threshold must be an integer between 50 and 120.' ++ exit 1 ++ fi ++ ;; ++ \?) ++ echo '!! ATTENTION !!' ++ echo '................................' ++ echo 'Detected an invalid option.' ++ echo 'Try: '"$0"' -h' ++ echo '................................' ++ exit 1 ++ ;; ++ esac + done + + start +diff --git a/packages/bsp/odroid/c1_init.sh b/packages/bsp/odroid/c1_init.sh +index 2b7b7e6f7..0192d68bb 100644 +--- a/packages/bsp/odroid/c1_init.sh ++++ b/packages/bsp/odroid/c1_init.sh +@@ -11,9 +11,9 @@ HPD_STATE=/sys/class/amhdmitx/amhdmitx0/hpd_state + DISP_CAP=/sys/class/amhdmitx/amhdmitx0/disp_cap + DISP_MODE=/sys/class/display/mode + +-hdmi=$(cat $HPD_STATE) ++hdmi=`cat $HPD_STATE` + if [ $hdmi -eq 1 ]; then +- echo $mode > $DISP_MODE ++ echo $mode > $DISP_MODE + fi + + outputmode=$mode +@@ -26,20 +26,20 @@ common_display_setup() { + echo 1 > /sys/class/graphics/fb0/freescale_mode + + case $outputmode in +- 800x480*) M="0 0 799 479" ;; +- vga*) M="0 0 639 749" ;; +- 800x600p60*) M="0 0 799 599" ;; +- 1024x600p60h*) M="0 0 1023 599" ;; +- 1024x768p60h*) M="0 0 1023 767" ;; +- sxga*) M="0 0 1279 1023" ;; +- 1440x900p60*) M="0 0 1439 899" ;; +- 480*) M="0 0 719 479" ;; +- 576*) M="0 0 719 575" ;; +- 720*) M="0 0 1279 719" ;; +- 800*) M="0 0 1279 799" ;; +- 1080*) M="0 0 1919 1079" ;; +- 1920x1200*) M="0 0 1919 1199" ;; +- 1680x1050p60*) M="0 0 1679 1049" ;; ++ 800x480*) M="0 0 799 479" ;; ++ vga*) M="0 0 639 749" ;; ++ 800x600p60*) M="0 0 799 599" ;; ++ 1024x600p60h*) M="0 0 1023 599" ;; ++ 1024x768p60h*) M="0 0 1023 767" ;; ++ sxga*) M="0 0 1279 1023" ;; ++ 1440x900p60*) M="0 0 1439 899" ;; ++ 480*) M="0 0 719 479" ;; ++ 576*) M="0 0 719 575" ;; ++ 720*) M="0 0 1279 719" ;; ++ 800*) M="0 0 1279 799" ;; ++ 1080*) M="0 0 1919 1079" ;; ++ 1920x1200*) M="0 0 1919 1199" ;; ++ 1680x1050p60*) M="0 0 1679 1049" ;; + 1360x768p60*) M="0 0 1359 767" ;; + 1366x768p60*) M="0 0 1365 767" ;; + 1600x900p60*) M="0 0 1599 899" ;; +@@ -52,81 +52,32 @@ common_display_setup() { + } + + case $mode in +- 800x480*) +- fbset -fb /dev/fb0 -g 800 480 800 960 $bpp +- common_display_setup +- ;; +- vga*) +- fbset -fb /dev/fb0 -g 640 480 640 960 $bpp +- common_display_setup +- ;; +- 480*) +- fbset -fb /dev/fb0 -g 720 480 720 960 $bpp +- common_display_setup +- ;; +- 800x600p60*) +- fbset -fb /dev/fb0 -g 800 600 800 1200 $bpp +- common_display_setup +- ;; +- 576*) +- fbset -fb /dev/fb0 -g 720 576 720 1152 $bpp +- common_display_setup +- ;; +- 1024x600p60h*) +- fbset -fb /dev/fb0 -g 1024 600 1024 1200 $bpp +- common_display_setup +- ;; +- 1024x768p60h*) +- fbset -fb /dev/fb0 -g 1024 768 1024 1536 $bpp +- common_display_setup +- ;; +- 720*) +- fbset -fb /dev/fb0 -g 1280 720 1280 1440 $bpp +- common_display_setup +- ;; +- 800*) +- fbset -fb /dev/fb0 -g 1280 800 1280 1600 $bpp +- common_display_setup +- ;; +- sxga*) +- fbset -fb /dev/fb0 -g 1280 1024 1280 2048 $bpp +- common_display_setup +- ;; +- 1440x900p60*) +- fbset -fb /dev/fb0 -g 1440 900 1440 1800 $bpp +- common_display_setup +- ;; +- 1080*) +- fbset -fb /dev/fb0 -g 1920 1080 1920 2160 $bpp +- common_display_setup +- ;; +- 1920x1200*) +- fbset -fb /dev/fb0 -g 1920 1200 1920 2400 $bpp +- common_display_setup +- ;; +- 1360x768p60*) +- fbset -fb /dev/fb0 -g 1360 768 1360 1536 $bpp +- common_display_setup +- ;; +- 1366x768p60*) +- fbset -fb /dev/fb0 -g 1366 768 1366 1536 $bpp +- common_display_setup +- ;; +- 1600x900p60*) +- fbset -fb /dev/fb0 -g 1600 900 1600 1800 $bpp +- common_display_setup +- ;; +- 1680x1050p60*) +- fbset -fb /dev/fb0 -g 1680 1050 1680 2100 $bpp +- common_display_setup +- ;; +- ++ 800x480*) fbset -fb /dev/fb0 -g 800 480 800 960 $bpp; common_display_setup ;; ++ vga*) fbset -fb /dev/fb0 -g 640 480 640 960 $bpp; common_display_setup ;; ++ 480*) fbset -fb /dev/fb0 -g 720 480 720 960 $bpp; common_display_setup ;; ++ 800x600p60*) fbset -fb /dev/fb0 -g 800 600 800 1200 $bpp; common_display_setup ;; ++ 576*) fbset -fb /dev/fb0 -g 720 576 720 1152 $bpp; common_display_setup ;; ++ 1024x600p60h*) fbset -fb /dev/fb0 -g 1024 600 1024 1200 $bpp; common_display_setup ;; ++ 1024x768p60h*) fbset -fb /dev/fb0 -g 1024 768 1024 1536 $bpp; common_display_setup ;; ++ 720*) fbset -fb /dev/fb0 -g 1280 720 1280 1440 $bpp; common_display_setup ;; ++ 800*) fbset -fb /dev/fb0 -g 1280 800 1280 1600 $bpp; common_display_setup ;; ++ sxga*) fbset -fb /dev/fb0 -g 1280 1024 1280 2048 $bpp; common_display_setup ;; ++ 1440x900p60*) fbset -fb /dev/fb0 -g 1440 900 1440 1800 $bpp; common_display_setup ;; ++ 1080*) fbset -fb /dev/fb0 -g 1920 1080 1920 2160 $bpp; common_display_setup ;; ++ 1920x1200*) fbset -fb /dev/fb0 -g 1920 1200 1920 2400 $bpp; common_display_setup ;; ++ 1360x768p60*) fbset -fb /dev/fb0 -g 1360 768 1360 1536 $bpp; common_display_setup ;; ++ 1366x768p60*) fbset -fb /dev/fb0 -g 1366 768 1366 1536 $bpp; common_display_setup ;; ++ 1600x900p60*) fbset -fb /dev/fb0 -g 1600 900 1600 1800 $bpp; common_display_setup ;; ++ 1680x1050p60*) fbset -fb /dev/fb0 -g 1680 1050 1680 2100 $bpp; common_display_setup ;; ++ + esac + ++ + # Console unblack + echo 0 > /sys/class/graphics/fb0/blank + echo 0 > /sys/class/graphics/fb1/blank + ++ + # Network Tweaks. Thanks to mlinuxguy + echo 32768 > /proc/sys/net/core/rps_sock_flow_entries + echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt +@@ -137,7 +88,7 @@ echo 7 > /sys/class/net/eth0/queues/tx-0/xps_cpus + echo 1,2 > /proc/irq/40/smp_affinity_list + + # Workaround for a cron issue +-DT=$(date +%Y) ++DT=`date +%Y` + if [ "$DT" -lt "1980" ]; then + date -s "1/1/1980" + fi +diff --git a/packages/bsp/odroid/c2_init.sh b/packages/bsp/odroid/c2_init.sh +index 2cf93a21d..3465c042b 100644 +--- a/packages/bsp/odroid/c2_init.sh ++++ b/packages/bsp/odroid/c2_init.sh +@@ -4,11 +4,11 @@ + [ -f /boot/.next ] && exit + + for x in $(cat /proc/cmdline); do +- case ${x} in +- m_bpp=*) export bpp=${x#*=} ;; +- hdmimode=*) export mode=${x#*=} ;; +- modeline=*) export modeline=${x#*=} ;; +- esac ++ case ${x} in ++ m_bpp=*) export bpp=${x#*=} ;; ++ hdmimode=*) export mode=${x#*=} ;; ++ modeline=*) export modeline=${x#*=} ;; ++ esac + done + + HPD_STATE=/sys/class/amhdmitx/amhdmitx0/hpd_state +@@ -23,128 +23,127 @@ fi + echo $mode > $DISP_MODE + + common_display_setup() { +- M="0 0 $(($X - 1)) $(($Y - 1))" +- Y_VIRT=$(($Y * 2)) +- fbset -fb /dev/fb0 -g $X $Y $X $Y_VIRT $bpp +- fbset -fb /dev/fb1 -g 32 32 32 32 32 +- echo $mode > /sys/class/display/mode +- echo 0 > /sys/class/graphics/fb0/free_scale +- echo 1 > /sys/class/graphics/fb0/freescale_mode +- echo $M > /sys/class/graphics/fb0/free_scale_axis +- echo $M > /sys/class/graphics/fb0/window_axis +- echo 0 > /sys/class/graphics/fb1/free_scale +- echo 1 > /sys/class/graphics/fb1/freescale_mode ++ M="0 0 $(($X - 1)) $(($Y - 1))" ++ Y_VIRT=$(($Y * 2)) ++ fbset -fb /dev/fb0 -g $X $Y $X $Y_VIRT $bpp ++ fbset -fb /dev/fb1 -g 32 32 32 32 32 ++ echo $mode > /sys/class/display/mode ++ echo 0 > /sys/class/graphics/fb0/free_scale ++ echo 1 > /sys/class/graphics/fb0/freescale_mode ++ echo $M > /sys/class/graphics/fb0/free_scale_axis ++ echo $M > /sys/class/graphics/fb0/window_axis ++ echo 0 > /sys/class/graphics/fb1/free_scale ++ echo 1 > /sys/class/graphics/fb1/freescale_mode + } + + case $mode in +- custombuilt*) +- export X=$(echo $modeline | cut -f1 -d",") +- export Y=$(echo $modeline | cut -f2 -d",") +- ;; +- 480x320*) +- export X=480 +- export Y=320 +- ;; +- 480x800*) +- export X=480 +- export Y=800 +- ;; +- 480i* | 480p*) +- export X=720 +- export Y=480 +- ;; +- 576*) +- export X=720 +- export Y=576 +- ;; +- 720p*) +- export X=1280 +- export Y=720 +- ;; +- 1080*) +- export X=1920 +- export Y=1080 +- ;; +- 2160p*) +- export X=3840 +- export Y=2160 +- ;; +- smpte24hz*) +- export X=3840 +- export Y=2160 +- ;; +- 640x480p60hz*) +- export X=640 +- export Y=480 +- ;; +- 800x480p60hz*) +- export X=800 +- export Y=480 +- ;; +- 800x600p60hz*) +- export X=800 +- export Y=600 +- ;; +- 1024x600p60hz*) +- export X=1024 +- export Y=600 +- ;; +- 1024x768p60hz*) +- export X=1024 +- export Y=768 +- ;; +- 1280x800p60hz*) +- export X=1280 +- export Y=800 +- ;; +- 1280x1024p60hz*) +- export X=1280 +- export Y=1024 +- ;; +- 1360x768p60hz*) +- export X=1360 +- export Y=768 +- ;; +- 1366x768p60hz*) +- export X=1366 +- export Y=768 +- ;; +- 1440x900p60hz*) +- export X=1440 +- export Y=900 +- ;; +- 1600x900p60hz*) +- export X=1600 +- export Y=900 +- ;; +- 1680x1050p60hz*) +- export X=1680 +- export Y=1050 +- ;; +- 1600x1200p60hz*) +- export X=1600 +- export Y=1200 +- ;; +- 1920x1200p60hz*) +- export X=1920 +- export Y=1200 +- ;; +- 2560x1080p60hz*) +- export X=2560 +- export Y=1080 +- ;; +- 2560x1440p60hz*) +- export X=2560 +- export Y=1440 +- ;; +- 2560x1600p60hz*) +- export X=2560 +- export Y=1600 +- ;; +- 3440x1440p60hz*) +- export X=3440 +- export Y=1440 +- ;; ++ custombuilt*) ++ export X=`echo $modeline | cut -f1 -d","` ++ export Y=`echo $modeline | cut -f2 -d","` ++ ;; ++ 480x320*) ++ export X=480 ++ export Y=320 ++ ;; ++ 480x800*) ++ export X=480 ++ export Y=800 ++ ;; ++ 480i*|480p*) ++ export X=720 ++ export Y=480 ++ ;; ++ 576*) ++ export X=720 ++ export Y=576 ++ ;; ++ 720p*) ++ export X=1280 ++ export Y=720 ++ ;; ++ 1080*) ++ export X=1920 ++ export Y=1080 ++ ;; ++ 2160p*) ++ export X=3840 ++ export Y=2160 ++ ;; ++ smpte24hz*) ++ export X=3840 ++ export Y=2160 ++ ;; ++ 640x480p60hz*) ++ export X=640 ++ export Y=480 ++ ;; ++ 800x480p60hz*) ++ export X=800 ++ export Y=480 ++ ;; ++ 800x600p60hz*) ++ export X=800 ++ export Y=600 ++ ;; ++ 1024x600p60hz*) ++ export X=1024 ++ export Y=600 ++ ;; ++ 1024x768p60hz*) ++ export X=1024 ++ export Y=768 ++ ;; ++ 1280x800p60hz*) ++ export X=1280 ++ export Y=800 ++ ;; ++ 1280x1024p60hz*) ++ export X=1280 ++ export Y=1024 ++ ;; ++ 1360x768p60hz*) ++ export X=1360 ++ export Y=768 ++ ;; ++ 1366x768p60hz*) ++ export X=1366 ++ export Y=768 ++ ;; ++ 1440x900p60hz*) ++ export X=1440 ++ export Y=900 ++ ;; ++ 1600x900p60hz*) ++ export X=1600 ++ export Y=900 ++ ;; ++ 1680x1050p60hz*) ++ export X=1680 ++ export Y=1050 ++ ;; ++ 1600x1200p60hz*) ++ export X=1600 ++ export Y=1200 ++ ;; ++ 1920x1200p60hz*) ++ export X=1920 ++ export Y=1200 ++ ;; ++ 2560x1080p60hz*) ++ export X=2560 ++ export Y=1080 ++ ;; ++ 2560x1440p60hz*) ++ export X=2560 ++ export Y=1440 ++ ;; ++ 2560x1600p60hz*) ++ export X=2560 ++ export Y=1600 ++ ;; ++ 3440x1440p60hz*) ++ export X=3440 ++ export Y=1440 + esac + + # force 16bpp for 4k +@@ -154,12 +153,12 @@ common_display_setup + + # Console unblack + case $mode in +- *cvbs* | 480i* | 576i* | 1080i*) ++ *cvbs*|480i*|576i*|1080i*) + echo 0 > /sys/class/graphics/fb0/blank + echo 1 > /sys/class/graphics/fb1/blank + ;; +- *) ++ *) + echo 0 > /sys/class/graphics/fb0/blank +- echo 0 > /sys/class/graphics/fb1/blank ++ echo 0 > /sys/class/graphics/fb1/blank + ;; +-esac ++esac +\ No newline at end of file +diff --git a/packages/bsp/rk3328/z28pro/start_bt.sh b/packages/bsp/rk3328/z28pro/start_bt.sh +index 0fbb36499..31dbb369b 100644 +--- a/packages/bsp/rk3328/z28pro/start_bt.sh ++++ b/packages/bsp/rk3328/z28pro/start_bt.sh +@@ -7,6 +7,7 @@ function die_on_error { + fi + } + ++ + # Kill any rtk_hciattach actually running. + # Do not complain if we didn't kill anything. + killall -q -SIGTERM 8822b_hciattach +diff --git a/packages/bsp/rockchip/start_bt.sh b/packages/bsp/rockchip/start_bt.sh +index 25e4a36a4..ca9335b90 100644 +--- a/packages/bsp/rockchip/start_bt.sh ++++ b/packages/bsp/rockchip/start_bt.sh +@@ -1,6 +1,6 @@ + #!/bin/bash + +-GPIO_CONFIGURED_CHECK_DIRECTORY="/var/run/rtk_bt" ++GPIO_CONFIGURED_CHECK_DIRECTORY="/var/run/rtk_bt" + GPIO_CONFIGURED_CHECK_FILE="/var/run/rtk_bt/gpio_configured" + + function die_on_error { +@@ -14,8 +14,9 @@ function die_on_error { + # Do not complain if we didn't kill anything. + killall -q -SIGTERM rtk_hciattach + +-# If the GPIO are not yet configured +-if [ ! -f "$GPIO_CONFIGURED_CHECK_FILE" ]; then ++# If the GPIO are not yet configured ++if [ ! -f "$GPIO_CONFIGURED_CHECK_FILE" ]; ++then + # We'll create the directory first + # So that, if the user is not root + # he'll get a user permission error +@@ -40,11 +41,11 @@ fi + + echo "Resetting the Bluetooth chip" + echo 0 > /sys/class/gpio/gpio149/value && +- echo -e "\tBluetooth chip power down..." && +- sleep 1 && +- echo 1 > /sys/class/gpio/gpio149/value && +- echo -e "\tBluetooth chip power up..." && +- sleep 1 ++echo -e "\tBluetooth chip power down..." && ++sleep 1 && ++echo 1 > /sys/class/gpio/gpio149/value && ++echo -e "\tBluetooth chip power up..." && ++sleep 1 + echo -e "\tResetting done" + + /usr/bin/rtk_hciattach -n -s 115200 /dev/ttyS0 rtk_h5 || die_on_error "Could not create hci0 through rtk_hciattach" +diff --git a/packages/bsp/sunxi/zeroplus2-bt.sh b/packages/bsp/sunxi/zeroplus2-bt.sh +index e99daa74f..87631908b 100755 +--- a/packages/bsp/sunxi/zeroplus2-bt.sh ++++ b/packages/bsp/sunxi/zeroplus2-bt.sh +@@ -1,9 +1,6 @@ + #!/bin/bash + +-MAC=$( +- echo -n 1c:1b +- dd bs=1 count=4 if=/dev/random 2> /dev/null | hexdump -v -e '/1 ":%02X"' +-) ++MAC=$(echo -n 1c:1b; dd bs=1 count=4 if=/dev/random 2>/dev/null | hexdump -v -e '/1 ":%02X"') + + rfkill unblock all + echo "0" > /sys/class/rfkill/rfkill0/state +diff --git a/packages/extras-buildpkgs/hostapd-realtek/debian/ifupdown/hostapd.sh b/packages/extras-buildpkgs/hostapd-realtek/debian/ifupdown/hostapd.sh +index ce578818a..c5d235776 100644 +--- a/packages/extras-buildpkgs/hostapd-realtek/debian/ifupdown/hostapd.sh ++++ b/packages/extras-buildpkgs/hostapd-realtek/debian/ifupdown/hostapd.sh +@@ -1,6 +1,6 @@ + #!/bin/sh + +-# Copyright (C) 2006-2009 Debian hostapd maintainers ++# Copyright (C) 2006-2009 Debian hostapd maintainers + # Faidon Liambotis + # Kel Modderman + # +@@ -43,7 +43,7 @@ else + TO_NULL="/dev/null" + fi + +-hostapd_msg() { ++hostapd_msg () { + case "$1" in + verbose) + shift +@@ -53,12 +53,12 @@ hostapd_msg() { + shift + echo "$HOSTAPD_PNAME: $@" > /dev/stderr + ;; +- *) ;; +- ++ *) ++ ;; + esac + } + +-test_hostapd_pidfile() { ++test_hostapd_pidfile () { + if [ -n "$1" ] && [ -f "$2" ]; then + if start-stop-daemon --stop --quiet --signal 0 \ + --exec "$1" --pidfile "$2"; then +@@ -72,10 +72,10 @@ test_hostapd_pidfile() { + fi + } + +-init_hostapd() { ++init_hostapd () { + HOSTAPD_OPTIONS="-B -P $HOSTAPD_PIDFILE $HOSTAPD_CONF" + HOSTAPD_MESSAGE="$HOSTAPD_BIN $HOSTAPD_OPTIONS" +- ++ + test_hostapd_pidfile "$HOSTAPD_BIN" "$HOSTAPD_PIDFILE" && return 0 + + hostapd_msg verbose "$HOSTAPD_MESSAGE" +@@ -102,19 +102,19 @@ init_hostapd() { + return 0 + } + +-kill_hostapd() { ++kill_hostapd () { + HOSTAPD_MESSAGE="stopping $HOSTAPD_PNAME via pidfile: $HOSTAPD_PIDFILE" + + test_hostapd_pidfile "$HOSTAPD_BIN" "$HOSTAPD_PIDFILE" || return 0 +- ++ + hostapd_msg verbose "$HOSTAPD_MESSAGE" + start-stop-daemon --stop --oknodo --quiet --exec "$HOSTAPD_BIN" \ + --pidfile "$HOSTAPD_PIDFILE" > "$TO_NULL" +- ++ + [ "$HOSTAPD_OMIT_PIDFILE" ] && rm -f "$HOSTAPD_OMIT_PIDFILE" + } + +-case "$MODE" in ++case "$MODE" in + start) + case "$PHASE" in + pre-up) +diff --git a/packages/extras-buildpkgs/hostapd/debian/ifupdown/hostapd.sh b/packages/extras-buildpkgs/hostapd/debian/ifupdown/hostapd.sh +index ce578818a..c5d235776 100644 +--- a/packages/extras-buildpkgs/hostapd/debian/ifupdown/hostapd.sh ++++ b/packages/extras-buildpkgs/hostapd/debian/ifupdown/hostapd.sh +@@ -1,6 +1,6 @@ + #!/bin/sh + +-# Copyright (C) 2006-2009 Debian hostapd maintainers ++# Copyright (C) 2006-2009 Debian hostapd maintainers + # Faidon Liambotis + # Kel Modderman + # +@@ -43,7 +43,7 @@ else + TO_NULL="/dev/null" + fi + +-hostapd_msg() { ++hostapd_msg () { + case "$1" in + verbose) + shift +@@ -53,12 +53,12 @@ hostapd_msg() { + shift + echo "$HOSTAPD_PNAME: $@" > /dev/stderr + ;; +- *) ;; +- ++ *) ++ ;; + esac + } + +-test_hostapd_pidfile() { ++test_hostapd_pidfile () { + if [ -n "$1" ] && [ -f "$2" ]; then + if start-stop-daemon --stop --quiet --signal 0 \ + --exec "$1" --pidfile "$2"; then +@@ -72,10 +72,10 @@ test_hostapd_pidfile() { + fi + } + +-init_hostapd() { ++init_hostapd () { + HOSTAPD_OPTIONS="-B -P $HOSTAPD_PIDFILE $HOSTAPD_CONF" + HOSTAPD_MESSAGE="$HOSTAPD_BIN $HOSTAPD_OPTIONS" +- ++ + test_hostapd_pidfile "$HOSTAPD_BIN" "$HOSTAPD_PIDFILE" && return 0 + + hostapd_msg verbose "$HOSTAPD_MESSAGE" +@@ -102,19 +102,19 @@ init_hostapd() { + return 0 + } + +-kill_hostapd() { ++kill_hostapd () { + HOSTAPD_MESSAGE="stopping $HOSTAPD_PNAME via pidfile: $HOSTAPD_PIDFILE" + + test_hostapd_pidfile "$HOSTAPD_BIN" "$HOSTAPD_PIDFILE" || return 0 +- ++ + hostapd_msg verbose "$HOSTAPD_MESSAGE" + start-stop-daemon --stop --oknodo --quiet --exec "$HOSTAPD_BIN" \ + --pidfile "$HOSTAPD_PIDFILE" > "$TO_NULL" +- ++ + [ "$HOSTAPD_OMIT_PIDFILE" ] && rm -f "$HOSTAPD_OMIT_PIDFILE" + } + +-case "$MODE" in ++case "$MODE" in + start) + case "$PHASE" in + pre-up) + +From c216282d323014ca365a1539a305911ca835906b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 12:44:36 +0100 +Subject: [PATCH] armbian-next: manual merge (11) of all lib/*.sh changes + between revisions 3305d45b8175dbdd647dc1dc53fa6f0a522920c7 and + ed589b248aef675cb5e845fcb55c12dfbcc5e925 + +--- + lib/functions/compilation/patch/kernel-bootsplash.sh | 2 ++ + lib/functions/compilation/patch/kernel-drivers.sh | 2 +- + lib/functions/configuration/main-config.sh | 14 +++----------- + lib/functions/main/config-prepare.sh | 2 +- + 4 files changed, 7 insertions(+), 13 deletions(-) + +diff --git a/lib/functions/compilation/patch/kernel-bootsplash.sh b/lib/functions/compilation/patch/kernel-bootsplash.sh +index e5d279110..f4e078bfb 100644 +--- a/lib/functions/compilation/patch/kernel-bootsplash.sh ++++ b/lib/functions/compilation/patch/kernel-bootsplash.sh +@@ -8,11 +8,13 @@ function apply_kernel_patches_for_bootsplash() { + + display_alert "Adding" "Kernel bootsplash patch" "info" + ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0000-Revert-fbcon-Avoid-cap-set-but-not-used-warning.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" + + if linux-version compare "${version}" ge 5.15; then + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0002-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" + fi ++ + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0003-Revert-vgacon-remove-software-scrollback-support.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0004-Revert-drivers-video-fbcon-fix-NULL-dereference-in-f.patch" "applying" + process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0005-Revert-fbcon-remove-no-op-fbcon_set_origin.patch" "applying" +diff --git a/lib/functions/compilation/patch/kernel-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +index 61f1cb630..0f9d54bfe 100644 +--- a/lib/functions/compilation/patch/kernel-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -31,7 +31,7 @@ function prepare_extra_kernel_drivers() { + # + # Older versions have AUFS support with a patch + +- if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" le 5.12 && [ "$AUFS" == yes ]; then ++ if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" le 5.17 && [ "$AUFS" == yes ]; then + # @TODO: Fasthash for this whole block is only the git hash of revision we'd apply from Mr. Okajima + local aufs_tag # attach to specifics tag or branch + aufs_tag=$(echo "${version}" | cut -f 1-2 -d ".") +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index d96938dd0..5bf904f58 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -33,7 +33,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=14 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=15 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote 2> /dev/null | grep origin)" 2> /dev/null) + BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) +@@ -51,16 +51,8 @@ function do_main_configuration() { + + # image artefact destination with or without subfolder + FINALDEST=$DEST/images +- if [[ "${MAKE_FOLDERS}" == yes ]]; then +- +- if [[ "$RC" == yes ]]; then +- FINALDEST=$DEST/images/"${BOARD}"/rc +- elif [[ "$BETA" == yes ]]; then +- FINALDEST=$DEST/images/"${BOARD}"/nightly +- else +- FINALDEST=$DEST/images/"${BOARD}"/archive +- fi +- ++ if [[ -n "${MAKE_FOLDERS}" ]]; then ++ FINALDEST=$DEST/images/"${BOARD}"/"${MAKE_FOLDERS}" + install -d ${FINALDEST} + fi + +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 7984e3c1b..013b903d4 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -117,7 +117,7 @@ function prepare_and_config_main_build_single() { + + if [[ $BETA == yes ]]; then + IMAGE_TYPE=nightly +- elif [[ $BETA != "yes" && $BUILD_ALL == yes && -n $GPG_PASS ]]; then ++ elif [[ $BETA != "yes" && $BUILD_ALL == yes ]]; then + IMAGE_TYPE=stable + else + IMAGE_TYPE=user-built + +From c2871d87a4237f167e274f9ec38442e6ff4e0934 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 2 Mar 2022 02:31:37 +0100 +Subject: [PATCH] armbian-next: more refactorings, general logging; fixes; + split image stuff + +- logging flowing correct to LOGDIR, still needs packaging +--- + lib/extensions.sh | 14 ++- + lib/functions/compilation/kernel.sh | 9 +- + lib/functions/configuration/main-config.sh | 6 +- + lib/functions/general/chroot-helpers.sh | 23 ++--- + lib/functions/image/compress-checksum.sh | 72 ++++++++++++++ + lib/functions/{general => image}/fingerprint.sh | 0 + lib/functions/image/partitioning.sh | 2 +- + lib/functions/image/rootfs-to-image.sh | 122 ++---------------------- + lib/functions/image/write-device.sh | 41 ++++++++ + lib/functions/logging/logging.sh | 11 ++- + lib/functions/logging/traps.sh | 6 ++ + lib/functions/main/default-build.sh | 8 +- + lib/functions/main/rootfs-image.sh | 70 ++++++++------ + lib/library-functions.sh | 36 +++++-- + 14 files changed, 237 insertions(+), 183 deletions(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 12a86fcfe..2bec020ce 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -336,15 +336,19 @@ enable_extension() { + local extension_dir extension_file extension_file_in_dir extension_floating_file + local stacktrace + +- # capture the stack leading to this, possibly with a hint in front. +- stacktrace="${ENABLE_EXTENSION_TRACE_HINT}$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" +- + # if LOG_ENABLE_EXTENSION, output useful stack, so user can figure out which extensions are being added where +- [[ "${LOG_ENABLE_EXTENSION}" == "yes" ]] && +- display_alert "Extension being added" "${extension_name} :: added by ${stacktrace}" "" ++ if [[ "${LOG_ENABLE_EXTENSION}" == "yes" ]]; then ++ if [[ "${SHOW_DEBUG}" == "yes" ]]; then ++ stacktrace="${ENABLE_EXTENSION_TRACE_HINT}$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" ++ display_alert "Enabling extension" "${extension_name} :: added by ${stacktrace}" "debug" ++ else ++ display_alert "Enabling extension" "${extension_name}" "" ++ fi ++ fi + + # first a check, has the extension manager already initialized? then it is too late to enable_extension(). bail. + if [[ ${initialize_extension_manager_counter} -gt 0 ]]; then ++ stacktrace="${ENABLE_EXTENSION_TRACE_HINT}$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" + display_alert "Extension problem" "already initialized -- too late to add '${extension_name}' (trace: ${stacktrace})" "err" + exit 2 + fi +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 68a748d46..e663e0265 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -68,7 +68,7 @@ function compile_kernel() { + + function kernel_prepare_git() { + if [[ -n $KERNELSOURCE ]]; then +- [[ -d "${kernel_work_dir}" ]] && "${kernel_work_dir}" && fasthash_debug "pre git, existing tree" ++ [[ -d "${kernel_work_dir}" ]] && cd "${kernel_work_dir}" && fasthash_debug "pre git, existing tree" + + display_alert "Downloading sources" "kernel" "git" + +@@ -268,7 +268,8 @@ function kernel_package_source() { + local sources_pkg_dir tmp_src_dir tarball_size package_size + tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + +- sources_pkg_dir=${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all ++ sources_pkg_dir="${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all" ++ + mkdir -p "${sources_pkg_dir}"/usr/src/ \ + "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}" \ + "${sources_pkg_dir}"/DEBIAN +@@ -287,7 +288,7 @@ function kernel_package_source() { + tarball_size="$(du -h -s "${output_tarball}" | awk '{print $1}')" + + cat <<- EOF > "${sources_pkg_dir}"/DEBIAN/control +- Package: linux-source-${version}-${BRANCH}-${LINUXFAMILY} ++ Package: linux-source-${BRANCH}-${LINUXFAMILY} + Version: ${version}-${BRANCH}-${LINUXFAMILY}+${REVISION} + Architecture: all + Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> +@@ -302,7 +303,7 @@ function kernel_package_source() { + fakeroot_dpkg_deb_build -Znone -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" # do not compress .deb, it already contains a zstd compressed tarball! ignores ${KDEB_COMPRESS} on purpose + package_size="$(du -h -s "${sources_pkg_dir}.deb" | awk '{print $1}')" + run_host_command_logged rsync --remove-source-files -r "${sources_pkg_dir}.deb" "${DEB_STORAGE}/" +- display_alert "linux-source-${version}-${BRANCH}-${LINUXFAMILY} packaged" "$((SECONDS - ts)) seconds, ${tarball_size} tarball, ${package_size} .deb" "info" ++ display_alert "$(basename "${sources_pkg_dir}.deb" ".deb") packaged" "$((SECONDS - ts)) seconds, ${tarball_size} tarball, ${package_size} .deb" "info" + } + + function kernel_make_headers_dtbs_image_modules() { +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 8fc63c032..d96938dd0 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -422,12 +422,10 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + to confirm or change any packages. + POST_AGGREGATE_PACKAGES + +- # If not only capturing defs, write the output file. This an early write to disk, and @TODO: should be moved later into the configuration phase +- [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] || write_config_summary_output_file +- + display_alert "Done with main-config.sh" "do_main_configuration" "debug" + } + ++# This is called by main_default_build_single(), which is logged correctly. so just output to stdout here. + function write_config_summary_output_file() { + local debug_dpkg_arch debug_uname debug_virt debug_src_mount debug_src_perms debug_src_temp_perms + debug_dpkg_arch="$(dpkg --print-architecture)" +@@ -438,7 +436,7 @@ function write_config_summary_output_file() { + debug_src_temp_perms="$(getfacl -p "${SRC}"/.tmp 2> /dev/null)" + + display_alert "Writing build config summary to" "debug log" "debug" +- run_host_command_logged cat "1>&2" <<- EOF ++ run_host_command_logged cat <<- EOF + ## BUILD SCRIPT ENVIRONMENT + + Repository: $REPOSITORY_URL +diff --git a/lib/functions/general/chroot-helpers.sh b/lib/functions/general/chroot-helpers.sh +index fcd092993..8c90cc578 100644 +--- a/lib/functions/general/chroot-helpers.sh ++++ b/lib/functions/general/chroot-helpers.sh +@@ -28,30 +28,31 @@ umount_chroot() { + } + + # demented recursive version, for final umount. +-umount_chroot_recursive() { +- set +e # really, ignore errors. we wanna unmount everything and will try very hard. +- local target="$1" ++function umount_chroot_recursive() { ++ local target="${1}/" + +- if [[ ! -d "${target}" ]]; then # only even try if target is a directory +- return 0 # success, nothing to do. ++ if [[ ! -d "${target}" ]]; then # only even try if target is a directory ++ return 0 # success, nothing to do. ++ elif [[ "${target}" == "/" ]]; then # make sure we're not trying to umount root itself. ++ return 0 + fi +- display_alert "Unmounting recursively" "$target" "" ++ display_alert "Unmounting recursively" "${target}" "" + sync # sync. coalesce I/O. wait for writes to flush to disk. it might take a second. + # First, try to umount some well-known dirs, in a certain order. for speed. + local -a well_known_list=("dev/pts" "dev" "proc" "sys" "boot/efi" "boot/firmware" "boot" "tmp" ".") + for well_known in "${well_known_list[@]}"; do +- umount --recursive "${target}${well_known}" &> /dev/null && sync ++ umount --recursive "${target}${well_known}" &> /dev/null || true # ignore errors + done + + # now try in a loop to unmount all that's still mounted under the target +- local -i tries=1 # the first try above +- mapfile -t current_mount_list < <(cut -d " " -f 2 "/proc/mounts" | grep "^${target}") ++ local -i tries=1 # the first try above ++ mapfile -t current_mount_list < <(cut -d " " -f 2 "/proc/mounts" | grep "^${target}" || true) # don't let grep error out. + while [[ ${#current_mount_list[@]} -gt 0 ]]; do + if [[ $tries -gt 10 ]]; then + display_alert "${#current_mount_list[@]} dirs still mounted after ${tries} tries:" "${current_mount_list[*]}" "wrn" + fi +- cut -d " " -f 2 "/proc/mounts" | grep "^${target}" | xargs -n1 umount --recursive &> /dev/null +- sync # wait for fsync, then count again for next loop. ++ cut -d " " -f 2 "/proc/mounts" | grep "^${target}" | xargs -n1 umount --recursive &> /dev/null || true # ignore errors ++ sync # wait for fsync, then count again for next loop. + mapfile -t current_mount_list < <(cut -d " " -f 2 "/proc/mounts" | grep "^${target}") + tries=$((tries + 1)) + done +diff --git a/lib/functions/image/compress-checksum.sh b/lib/functions/image/compress-checksum.sh +new file mode 100644 +index 000000000..0a9e5898c +--- /dev/null ++++ b/lib/functions/image/compress-checksum.sh +@@ -0,0 +1,72 @@ ++function image_compress_and_checksum() { ++ [[ -n $SEND_TO_SERVER ]] && return 0 ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == "" || $COMPRESS_OUTPUTIMAGE == no ]]; then ++ COMPRESS_OUTPUTIMAGE="sha,gpg,img" ++ elif [[ $COMPRESS_OUTPUTIMAGE == yes ]]; then ++ COMPRESS_OUTPUTIMAGE="sha,gpg,7z" ++ fi ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == *gz* ]]; then ++ display_alert "Compressing" "${DESTIMG}/${version}.img.gz" "info" ++ pigz -3 < $DESTIMG/${version}.img > $DESTIMG/${version}.img.gz ++ compression_type=".gz" ++ fi ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == *xz* ]]; then ++ # @TODO: rpardini: I'd just move to zstd and be done with it. It does it right. ++ ++ display_alert "Compressing" "${DESTIMG}/${version}.img.xz" "info" ++ # compressing consumes a lot of memory we don't have. Waiting for previous packing job to finish helps to run a lot more builds in parallel ++ available_cpu=$(grep -c 'processor' /proc/cpuinfo) ++ [[ ${available_cpu} -gt 16 ]] && available_cpu=16 # using more cpu cores for compressing is pointless ++ available_mem=$(LC_ALL=c free | grep Mem | awk '{print $4/$2 * 100.0}' | awk '{print int($1)}') # in percentage ++ # build optimisations when memory drops below 5% ++ if [[ ${BUILD_ALL} == yes && (${available_mem} -lt 15 || $(ps -uax | grep "pixz" | wc -l) -gt 4) ]]; then ++ while [[ $(ps -uax | grep "pixz" | wc -l) -gt 2 ]]; do ++ echo -en "#" ++ sleep 20 ++ done ++ fi ++ pixz -7 -p ${available_cpu} -f $(expr ${available_cpu} + 2) < $DESTIMG/${version}.img > ${DESTIMG}/${version}.img.xz ++ compression_type=".xz" ++ fi ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == *img* || $COMPRESS_OUTPUTIMAGE == *7z* ]]; then ++ # mv $DESTIMG/${version}.img ${FINALDEST}/${version}.img || exit 1 ++ compression_type="" ++ fi ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == *sha* ]]; then ++ cd ${DESTIMG} ++ display_alert "SHA256 calculating" "${version}.img${compression_type}" "info" ++ sha256sum -b ${version}.img${compression_type} > ${version}.img${compression_type}.sha ++ fi ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == *gpg* ]]; then ++ cd ${DESTIMG} ++ if [[ -n $GPG_PASS ]]; then ++ display_alert "GPG signing" "${version}.img${compression_type}" "info" ++ if [[ -n $SUDO_USER ]]; then ++ sudo chown -R ${SUDO_USER}:${SUDO_USER} "${DESTIMG}"/ ++ SUDO_PREFIX="sudo -H -u ${SUDO_USER}" ++ else ++ SUDO_PREFIX="" ++ fi ++ echo "${GPG_PASS}" | $SUDO_PREFIX bash -c "gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes ${DESTIMG}/${version}.img${compression_type}" || exit 1 ++ else ++ display_alert "GPG signing skipped - no GPG_PASS" "${version}.img" "wrn" ++ fi ++ fi ++ ++ fingerprint_image "${DESTIMG}/${version}.img${compression_type}.txt" "${version}" ++ ++ if [[ $COMPRESS_OUTPUTIMAGE == *7z* ]]; then ++ display_alert "Compressing" "${DESTIMG}/${version}.7z" "info" ++ 7za a -t7z -bd -m0=lzma2 -mx=3 -mfb=64 -md=32m -ms=on \ ++ ${DESTIMG}/${version}.7z ${version}.key ${version}.img* > /dev/null 2>&1 ++ find ${DESTIMG}/ -type \ ++ f \( -name "${version}.img" -o -name "${version}.img.asc" -o -name "${version}.img.txt" -o -name "${version}.img.sha" \) -print0 | ++ xargs -0 rm > /dev/null 2>&1 ++ fi ++} +diff --git a/lib/functions/general/fingerprint.sh b/lib/functions/image/fingerprint.sh +similarity index 100% +rename from lib/functions/general/fingerprint.sh +rename to lib/functions/image/fingerprint.sh +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 2aa7c6f7b..ef4714757 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -227,7 +227,7 @@ prepare_partitions() { + + export LOOP + LOOP=$(losetup -f) || exit_with_error "Unable to find free loop device" +- display_alert "Allocated loop device" "LOOP=${LOOP}" "wrn" ++ display_alert "Allocated loop device" "LOOP=${LOOP}" + + check_loop_device "$LOOP" + +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 8c6e26081..d38a14ad1 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -84,101 +84,28 @@ PRE_UMOUNT_FINAL_IMAGE + [[ $ROOTFS_TYPE != nfs ]] && umount "${MOUNT}" + [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose $ROOT_MAPPER + ++ umount_chroot_recursive "${MOUNT}" # @TODO: wait. NFS is not really unmounted above. ++ + call_extension_method "post_umount_final_image" "config_post_umount_final_image" <<- 'POST_UMOUNT_FINAL_IMAGE' + *allow config to hack into the image after the unmount* + Called after unmounting both `/root` and `/boot`. + POST_UMOUNT_FINAL_IMAGE + +- # @TODO: this is simply wrong and never does anything. we should use the recursive unmounter here +- while grep -Eq '(${MOUNT}|${DESTIMG})' /proc/mounts; do +- display_alert "Wait for unmount" "${MOUNT}" "info" +- sleep 5 +- done +- +- display_alert "Freeing loop device" "${LOOP}" "wrn" ++ display_alert "Freeing loop device" "${LOOP}" + losetup -d "${LOOP}" + unset LOOP # unset so cleanup handler does not try it again + + # Don't delete $DESTIMG here, extensions might have put nice things there already. +- rm -rf --one-file-system $MOUNT ++ rm -rf --one-file-system "${MOUNT}" + +- mkdir -p $DESTIMG +- mv ${SDCARD}.raw $DESTIMG/${version}.img ++ mkdir -p "${DESTIMG}" ++ mv "${SDCARD}.raw" "${DESTIMG}/${version}.img" + + # custom post_build_image_modify hook to run before fingerprinting and compression + [[ $(type -t post_build_image_modify) == function ]] && display_alert "Custom Hook Detected" "post_build_image_modify" "info" && post_build_image_modify "${DESTIMG}/${version}.img" + +- if [[ -z $SEND_TO_SERVER ]]; then +- +- if [[ $COMPRESS_OUTPUTIMAGE == "" || $COMPRESS_OUTPUTIMAGE == no ]]; then +- COMPRESS_OUTPUTIMAGE="sha,gpg,img" +- elif [[ $COMPRESS_OUTPUTIMAGE == yes ]]; then +- COMPRESS_OUTPUTIMAGE="sha,gpg,7z" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *gz* ]]; then +- display_alert "Compressing" "${DESTIMG}/${version}.img.gz" "info" +- pigz -3 < $DESTIMG/${version}.img > $DESTIMG/${version}.img.gz +- compression_type=".gz" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *xz* ]]; then +- display_alert "Compressing" "${DESTIMG}/${version}.img.xz" "info" +- # compressing consumes a lot of memory we don't have. Waiting for previous packing job to finish helps to run a lot more builds in parallel +- available_cpu=$(grep -c 'processor' /proc/cpuinfo) +- #[[ ${BUILD_ALL} == yes ]] && available_cpu=$(( $available_cpu * 30 / 100 )) # lets use 20% of resources in case of build-all +- [[ ${available_cpu} -gt 16 ]] && available_cpu=16 # using more cpu cores for compressing is pointless +- available_mem=$(LC_ALL=c free | grep Mem | awk '{print $4/$2 * 100.0}' | awk '{print int($1)}') # in percentage +- # build optimisations when memory drops below 5% +- if [[ ${BUILD_ALL} == yes && (${available_mem} -lt 15 || $(ps -uax | grep "pixz" | wc -l) -gt 4) ]]; then +- while [[ $(ps -uax | grep "pixz" | wc -l) -gt 2 ]]; do +- echo -en "#" +- sleep 20 +- done +- fi +- pixz -7 -p ${available_cpu} -f $(expr ${available_cpu} + 2) < $DESTIMG/${version}.img > ${DESTIMG}/${version}.img.xz +- compression_type=".xz" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *img* || $COMPRESS_OUTPUTIMAGE == *7z* ]]; then +- # mv $DESTIMG/${version}.img ${FINALDEST}/${version}.img || exit 1 +- compression_type="" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *sha* ]]; then +- cd ${DESTIMG} +- display_alert "SHA256 calculating" "${version}.img${compression_type}" "info" +- sha256sum -b ${version}.img${compression_type} > ${version}.img${compression_type}.sha +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *gpg* ]]; then +- cd ${DESTIMG} +- if [[ -n $GPG_PASS ]]; then +- display_alert "GPG signing" "${version}.img${compression_type}" "info" +- if [[ -n $SUDO_USER ]]; then +- sudo chown -R ${SUDO_USER}:${SUDO_USER} "${DESTIMG}"/ +- SUDO_PREFIX="sudo -H -u ${SUDO_USER}" +- else +- SUDO_PREFIX="" +- fi +- echo "${GPG_PASS}" | $SUDO_PREFIX bash -c "gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes ${DESTIMG}/${version}.img${compression_type}" || exit 1 +- else +- display_alert "GPG signing skipped - no GPG_PASS" "${version}.img" "wrn" +- fi +- fi +- +- fingerprint_image "${DESTIMG}/${version}.img${compression_type}.txt" "${version}" +- +- if [[ $COMPRESS_OUTPUTIMAGE == *7z* ]]; then +- display_alert "Compressing" "${DESTIMG}/${version}.7z" "info" +- 7za a -t7z -bd -m0=lzma2 -mx=3 -mfb=64 -md=32m -ms=on \ +- ${DESTIMG}/${version}.7z ${version}.key ${version}.img* > /dev/null 2>&1 +- find ${DESTIMG}/ -type \ +- f \( -name "${version}.img" -o -name "${version}.img.asc" -o -name "${version}.img.txt" -o -name "${version}.img.sha" \) -print0 | +- xargs -0 rm > /dev/null 2>&1 +- fi ++ image_compress_and_checksum + +- fi + display_alert "Done building" "${FINALDEST}/${version}.img" "info" # A bit predicting the future, since it's still in DESTIMG at this point. + + # Previously, post_build_image passed the .img path as an argument to the hook. Now its an ENV var. +@@ -197,39 +124,6 @@ PRE_UMOUNT_FINAL_IMAGE + rm -rf --one-file-system $DESTIMG + + # write image to SD card +- if [[ $(lsblk "$CARD_DEVICE" 2> /dev/null) && -f ${FINALDEST}/${version}.img ]]; then +- +- # make sha256sum if it does not exists. we need it for comparisson +- if [[ -f "${FINALDEST}/${version}".img.sha ]]; then +- local ifsha=$(cat ${FINALDEST}/${version}.img.sha | awk '{print $1}') +- else +- local ifsha=$(sha256sum -b "${FINALDEST}/${version}".img | awk '{print $1}') +- fi +- +- display_alert "Writing image" "$CARD_DEVICE ${readsha}" "info" +- +- # write to SD card +- pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "write_device") dd" ${FINALDEST}/${version}.img | dd of=$CARD_DEVICE bs=1M iflag=fullblock oflag=direct status=none +- +- call_extension_method "post_write_sdcard" <<- 'POST_BUILD_IMAGE' +- *run after writing img to sdcard* +- After the image is written to `$CARD_DEVICE`, but before verifying it. +- You can still set SKIP_VERIFY=yes to skip verification. +- POST_BUILD_IMAGE +- +- if [[ "${SKIP_VERIFY}" != "yes" ]]; then +- # read and compare +- display_alert "Verifying. Please wait!" +- local ofsha=$(dd if=$CARD_DEVICE count=$(du -b ${FINALDEST}/${version}.img | cut -f1) status=none iflag=count_bytes oflag=direct | sha256sum | awk '{print $1}') +- if [[ $ifsha == $ofsha ]]; then +- display_alert "Writing verified" "${version}.img" "info" +- else +- display_alert "Writing failed" "${version}.img" "err" +- fi +- fi +- elif [[ $(systemd-detect-virt) == 'docker' && -n $CARD_DEVICE ]]; then +- # display warning when we want to write sd card under Docker +- display_alert "Can't write to $CARD_DEVICE" "Enable docker privileged mode in config-docker.conf" "wrn" +- fi ++ write_image_to_device "${FINALDEST}/${version}.img" "${CARD_DEVICE}" + + } +diff --git a/lib/functions/image/write-device.sh b/lib/functions/image/write-device.sh +new file mode 100644 +index 000000000..7aefbd2fc +--- /dev/null ++++ b/lib/functions/image/write-device.sh +@@ -0,0 +1,41 @@ ++# @TODO: make usable as a separate tool as well ++function write_image_to_device() { ++ local image_file="${1}" ++ local device="${2}" ++ if [[ $(lsblk "${device}" 2> /dev/null) && -f "${image_file}" ]]; then ++ # create sha256sum if it does not exist. we need it for comparison, later. ++ local if_sha="" ++ if [[ -f "${image_file}.img.sha" ]]; then ++ # shellcheck disable=SC2002 # cat most definitely is useful. she purrs. ++ if_sha=$(cat "${image_file}.sha" | awk '{print $1}') ++ else ++ if_sha=$(sha256sum -b "${image_file}" | awk '{print $1}') ++ fi ++ ++ display_alert "Writing image" "${device} ${if_sha}" "info" ++ ++ # write to SD card ++ pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "write_device") dd" "${image_file}" | dd "of=${device}" bs=1M iflag=fullblock oflag=direct status=none ++ ++ call_extension_method "post_write_sdcard" <<- 'POST_BUILD_IMAGE' ++ *run after writing img to sdcard* ++ After the image is written to `${device}`, but before verifying it. ++ You can still set SKIP_VERIFY=yes to skip verification. ++ POST_BUILD_IMAGE ++ ++ if [[ "${SKIP_VERIFY}" != "yes" ]]; then ++ # read and compare ++ display_alert "Verifying. Please wait!" ++ local of_sha="" ++ of_sha=$(dd "if=${device}" "count=$(du -b "${image_file}" | cut -f1)" status=none iflag=count_bytes oflag=direct | sha256sum | awk '{print $1}') ++ if [[ "$if_sha" == "$of_sha" ]]; then ++ display_alert "Writing verified" "${image_file}" "info" ++ else ++ display_alert "Writing failed" "${image_file}" "err" ++ fi ++ fi ++ elif [[ $(systemd-detect-virt) == 'docker' && -n ${device} ]]; then ++ # display warning when we want to write sd card under Docker ++ display_alert "Can't write to ${device}" "Enable docker privileged mode in config-docker.conf" "wrn" ++ fi ++} +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 64001b013..519cb5031 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -45,7 +45,8 @@ function start_logging_section() { + export CURRENT_LOGGING_COUNTER + CURRENT_LOGGING_COUNTER="$(printf "%03d" "$logging_section_counter")" + export CURRENT_LOGGING_SECTION=${LOG_SECTION:-early} # default to "early", should be overwritten soon enough +- export CURRENT_LOGGING_DIR="${LOGDIR}" # set in cli-entrypoint.sh ++ export CURRENT_LOGGING_SECTION_START=${SECONDS} ++ export CURRENT_LOGGING_DIR="${LOGDIR}" # set in cli-entrypoint.sh + export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${CURRENT_LOGGING_SECTION}.log" + mkdir -p "${CURRENT_LOGGING_DIR}" + touch "${CURRENT_LOGFILE}" # Touch it, make sure it's writable. +@@ -54,7 +55,7 @@ function start_logging_section() { + if [[ "${CI}" == "true" ]]; then # On CI, this has special meaning. + echo "::group::[🥑] Group ${CURRENT_LOGGING_SECTION}" + else +- display_alert "start group" "<${CURRENT_LOGGING_SECTION}>" "group" ++ display_alert "" "<${CURRENT_LOGGING_SECTION}>" "group" + fi + return 0 + } +@@ -62,9 +63,10 @@ function start_logging_section() { + function finish_logging_section() { + # Close opened CI group. + if [[ "${CI}" == "true" ]]; then ++ echo "Section '${CURRENT_LOGGING_SECTION}' took $((SECONDS - CURRENT_LOGGING_SECTION_START))s to execute." 1>&2 # write directly to stderr + echo "::endgroup::" + else +- display_alert "finish group" "" "group" ++ display_alert "" " in $((SECONDS - CURRENT_LOGGING_SECTION_START))s" "group" + fi + } + +@@ -93,6 +95,7 @@ function do_with_logging() { + exec 3> >( + cd "${SRC}" || exit 2 + #grep --line-buffered -v "^$" | \ ++ # @TODO: tee to CURRENT_LOGFILE. + sed -u -e "${prefix_sed_cmd}" + ) + "$@" >&3 +@@ -166,7 +169,7 @@ function display_alert() { + return 0 + fi + level_indicator="🦋" +- inline_logs_color="\e[1;36m" # cyan ++ inline_logs_color="\e[1;34m" # blue; 36 would be cyan + ;; + + command) +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index 7c3eb97cd..c6279cabc 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -94,6 +94,12 @@ function add_cleanup_handler() { + trap_manager_cleanup_handlers+=("$callback") + } + ++function execute_and_remove_cleanup_handler() { ++ local callback="$1" ++ display_alert "Execute and remove cleanup handler" "${callback}" "cleanup" ++ # @TODO implement! ++} ++ + function remove_all_trap_handlers() { + display_alert "Will remove ALL trap handlers, for a clean exit..." "" "cleanup" + } +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index e2882082b..2e40456c0 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -1,6 +1,6 @@ + # 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. +-main_default_build_single() { ++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. +@@ -12,6 +12,10 @@ main_default_build_single() { + export TMPDIR="${WORKDIR}" + + start=$(date +%s) ++ ++ ### Write config summary to its own logging section. ++ 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 + +@@ -103,7 +107,7 @@ main_default_build_single() { + 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" do_with_logging compile_firmware ++ FULL="-full" REPLACE="" LOG_SECTION="compile_firmware_full" do_with_logging compile_firmware + + fi + fi +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 270145b04..bca09eca0 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -11,26 +11,31 @@ + function build_rootfs_and_image() { + display_alert "Starting rootfs and image building process for" "${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" "info" + +- [[ $ROOTFS_TYPE != ext4 ]] && display_alert "Assuming $BOARD $BRANCH kernel supports $ROOTFS_TYPE" "" "wrn" ++ [[ $ROOTFS_TYPE != ext4 ]] && display_alert "Assuming ${BOARD} ${BRANCH} kernel supports ${ROOTFS_TYPE}" "" "wrn" + + # add handler to cleanup when done or if something fails or is interrupted. + add_cleanup_handler trap_handler_cleanup_rootfs_and_image + + # stage: clean and create directories +- rm -rf $SDCARD $MOUNT +- mkdir -p $SDCARD $MOUNT $DEST/images $SRC/cache/rootfs ++ rm -rf "${SDCARD}" "${MOUNT}" ++ mkdir -p "${SDCARD}" "${MOUNT}" "${DEST}/images" "${SRC}/cache/rootfs" + + # bind mount rootfs if defined + if [[ -d "${ARMBIAN_CACHE_ROOTFS_PATH}" ]]; then +- mountpoint -q "${SRC}"/cache/rootfs && umount -l "${SRC}"/cache/toolchain +- mount --bind "${ARMBIAN_CACHE_ROOTFS_PATH}" "${SRC}"/cache/rootfs ++ mountpoint -q "${SRC}"/cache/rootfs && umount "${SRC}"/cache/toolchain ++ mount --bind "${ARMBIAN_CACHE_ROOTFS_PATH}" "${SRC}/cache/rootfs" + fi + + # stage: verify tmpfs configuration and mount + # CLI needs ~1.5GiB, desktop - ~3.5GiB + # calculate and set tmpfs mount to use 9/10 of available RAM+SWAP ++ # @TODO: this does not make sense; swap should not be considered. Actually, only free + cached memory should be considered! + local phymem=$(((($(awk '/MemTotal/ {print $2}' /proc/meminfo) + $(awk '/SwapTotal/ {print $2}' /proc/meminfo))) / 1024 * 9 / 10)) # MiB +- if [[ $BUILD_DESKTOP == yes ]]; then local tmpfs_max_size=3500; else local tmpfs_max_size=1500; fi # MiB ++ local tmpfs_max_size=1500 # MiB ++ if [[ $BUILD_DESKTOP == yes ]]; then ++ tmpfs_max_size=3500 ++ fi ++ + if [[ $FORCE_USE_RAMDISK == no ]]; then + local use_tmpfs=no + elif [[ $FORCE_USE_RAMDISK == yes || $phymem -gt $tmpfs_max_size ]]; then +@@ -38,7 +43,10 @@ function build_rootfs_and_image() { + fi + [[ -n $FORCE_TMPFS_SIZE ]] && phymem=$FORCE_TMPFS_SIZE + +- [[ $use_tmpfs == yes ]] && mount -t tmpfs -o size=${phymem}M tmpfs $SDCARD ++ if [[ $use_tmpfs == yes ]]; then ++ display_alert "Using tmpfs for rootfs" "${phymem}M" "debug" ++ mount -t tmpfs -o "size=${phymem}M" tmpfs "${SDCARD}" ++ fi + + # stage: prepare basic rootfs: unpack cache or create from scratch + LOG_SECTION="get_or_create_rootfs_cache_chroot_sdcard" do_with_logging get_or_create_rootfs_cache_chroot_sdcard +@@ -51,25 +59,24 @@ function build_rootfs_and_image() { + # stage: install kernel and u-boot packages + # install distribution and board specific applications + +- LOG_SECTION="distro" do_with_logging install_distribution_specific ++ LOG_SECTION="install_distribution_specific_${RELEASE}" do_with_logging install_distribution_specific + LOG_SECTION="install_distribution_agnostic" do_with_logging install_distribution_agnostic + +- # install locally built packages ++ # install locally built packages # @TODO: armbian-nextify this eventually + [[ $EXTERNAL_NEW == compile ]] && LOG_SECTION="packages_local" do_with_logging chroot_installpackages_local + +- # install from apt.armbian.com ++ # install from apt.armbian.com # @TODO: armbian-nextify this eventually + [[ $EXTERNAL_NEW == prebuilt ]] && LOG_SECTION="packages_prebuilt" do_with_logging chroot_installpackages "yes" + + # stage: user customization script + # NOTE: installing too many packages may fill tmpfs mount +- LOG_SECTION="custom" do_with_logging customize_image ++ LOG_SECTION="customize_image" do_with_logging customize_image + + # remove packages that are no longer needed. rootfs cache + uninstall might have leftovers. +- LOG_SECTION="rootfs_apt_get_autoremove" do_with_logging apt_purge_unneeded_packages ++ LOG_SECTION="apt_purge_unneeded_packages" do_with_logging apt_purge_unneeded_packages + +- # create list of installed packages for debug purposes +- display_alert "Recording list of installed packages" "debug log" "debug" +- chroot_sdcard dpkg --get-selections "| grep -v deinstall | awk '{print \$1}' | cut -f1 -d':' 1>&2" ++ # for reference, debugging / sanity checking ++ LOG_SECTION="list_installed_packages" do_with_logging list_installed_packages + + # clean up / prepare for making the image + umount_chroot "$SDCARD" +@@ -85,31 +92,34 @@ function build_rootfs_and_image() { + display_alert "Starting FEL boot" "$BOARD" "info" + start_fel_boot + else +- LOG_SECTION="partitioning" do_with_logging prepare_partitions +- LOG_SECTION="image" do_with_logging create_image_from_sdcard_rootfs ++ LOG_SECTION="prepare_partitions" do_with_logging prepare_partitions ++ LOG_SECTION="create_image_from_sdcard_rootfs" do_with_logging create_image_from_sdcard_rootfs + fi + +- # stage: unmount tmpfs +- umount $SDCARD 2>&1 +- if [[ $use_tmpfs = yes ]]; then +- while grep -qs "$SDCARD" /proc/mounts; do +- umount $SDCARD +- sleep 5 +- done +- fi +- rm -rf $SDCARD ++ # Completely and recursively unmount the directory. This will remove the tmpfs mount too ++ umount_chroot_recursive "${SDCARD}" ++ ++ # Remove the dir ++ [[ -d "${SDCARD}" ]] && rm -rf --one-file-system "${SDCARD}" ++ ++ # Run the cleanup handler. @TODO: this already does the above, so can be simpler. ++ execute_and_remove_cleanup_handler trap_handler_cleanup_rootfs_and_image + +- # No need to remove the cleanup handler here, it's automatic. + return 0 + } + ++function list_installed_packages() { ++ display_alert "Recording list of installed packages" "debug log" "debug" ++ chroot_sdcard dpkg --get-selections "| grep -v deinstall | awk '{print \$1}' | cut -f1 -d':' | column -c 80" ++} ++ + function trap_handler_cleanup_rootfs_and_image() { + display_alert "Cleanup for rootfs and image" "trap_handler_cleanup_rootfs_and_image" "cleanup" + + cd "${SRC}" || echo "Failed to cwd to ${SRC}" # Move pwd away, so unmounts work + # those will loop until they're unmounted. +- umount_chroot_recursive "${SDCARD}/" || true +- umount_chroot_recursive "${MOUNT}/" || true ++ umount_chroot_recursive "${SDCARD}" || true ++ umount_chroot_recursive "${MOUNT}" || true + + mountpoint -q "${SRC}"/cache/toolchain && umount -l "${SRC}"/cache/toolchain >&2 # @TODO: why does Igor uses lazy umounts? nfs? + mountpoint -q "${SRC}"/cache/rootfs && umount -l "${SRC}"/cache/rootfs >&2 +@@ -123,4 +133,6 @@ function trap_handler_cleanup_rootfs_and_image() { + + [[ -d "${SDCARD}" ]] && rm -rf --one-file-system "${SDCARD}" + [[ -d "${MOUNT}" ]] && rm -rf --one-file-system "${MOUNT}" ++ ++ return 0 # short-circuit above, so exit clean here + } +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 75771db01..dc62374e0 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -235,15 +235,6 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/general/downloads.sh + source "${SRC}"/lib/functions/general/downloads.sh + +-# no errors tolerated. invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/fingerprint.sh +-# shellcheck source=lib/functions/general/fingerprint.sh +-source "${SRC}"/lib/functions/general/fingerprint.sh +- + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +@@ -271,6 +262,24 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/general/repo.sh + source "${SRC}"/lib/functions/general/repo.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/compress-checksum.sh ++# shellcheck source=lib/functions/image/compress-checksum.sh ++source "${SRC}"/lib/functions/image/compress-checksum.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/fingerprint.sh ++# shellcheck source=lib/functions/image/fingerprint.sh ++source "${SRC}"/lib/functions/image/fingerprint.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +@@ -307,6 +316,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/image/rootfs-to-image.sh + source "${SRC}"/lib/functions/image/rootfs-to-image.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/write-device.sh ++# shellcheck source=lib/functions/image/write-device.sh ++source "${SRC}"/lib/functions/image/write-device.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + +From c7862c7c5e2807060ead176597998270256faff9 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 1 Mar 2022 11:44:32 +0100 +Subject: [PATCH] armbian-next: complete removal of usages of `LOG_SUBPATH`; + 100% error handled + +- loose ends, use new LOGDIR +- remove the last shortcircuit in extensions execution, now it's 100% error handled +- many logging fixes +- still missing: final log consolidation/cleanup +--- + extensions/gen-sample-extension-docs.sh | 2 +- + extensions/grub.sh | 1 + + lib/extensions.sh | 15 ++++---- + lib/functions/bsp/bsp-desktop.sh | 14 +++----- + lib/functions/cli/cli-entrypoint.sh | 41 +++++++++++---------- + lib/functions/configuration/main-config.sh | 15 ++------ + lib/functions/general/downloads.sh | 35 +++++++++--------- + lib/functions/general/host.sh | 3 +- + lib/functions/image/initrd.sh | 2 +- + lib/functions/image/partitioning.sh | 57 +++++++++++++++--------------- + lib/functions/image/rootfs-to-image.sh | 23 ++++++------ + lib/functions/logging/logging.sh | 12 +++++-- + lib/functions/logging/runners.sh | 10 ++++-- + lib/functions/main/config-prepare.sh | 32 ----------------- + lib/functions/main/rootfs-image.sh | 3 +- + lib/functions/rootfs/distro-agnostic.sh | 2 +- + lib/functions/rootfs/rootfs-desktop.sh | 8 ++--- + 17 files changed, 116 insertions(+), 159 deletions(-) + +diff --git a/extensions/gen-sample-extension-docs.sh b/extensions/gen-sample-extension-docs.sh +index ea78631f7..728585c76 100644 +--- a/extensions/gen-sample-extension-docs.sh ++++ b/extensions/gen-sample-extension-docs.sh +@@ -4,7 +4,7 @@ function extension_metadata_ready__499_display_docs_generation_start_info() { + } + + function extension_metadata_ready__docs_markdown() { +- generate_markdown_docs_to_stdout > "${DEST}/"${LOG_SUBPATH}"/hooks.auto.docs.md" ++ generate_markdown_docs_to_stdout > "${EXTENSION_MANAGER_TMP_DIR}/hooks.auto.docs.md" + } + + function extension_metadata_ready__docs_sample_extension() { +diff --git a/extensions/grub.sh b/extensions/grub.sh +index e1b20a87e..0ae97ed43 100644 +--- a/extensions/grub.sh ++++ b/extensions/grub.sh +@@ -75,6 +75,7 @@ post_family_tweaks_bsp__remove_uboot_grub() { + pre_umount_final_image__remove_uboot_initramfs_hook_grub() { + # even if BSP still contained this (cached .deb), make sure by removing from ${MOUNT} + [[ -f "$MOUNT"/etc/initramfs/post-update.d/99-uboot ]] && rm -v "$MOUNT"/etc/initramfs/post-update.d/99-uboot ++ return 0 # shortcircuit above + } + + pre_umount_final_image__install_grub() { +diff --git a/lib/extensions.sh b/lib/extensions.sh +index ad215bdf0..12a86fcfe 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -20,7 +20,7 @@ export LOG_ENABLE_EXTENSION=yes # colorful logs with stacktrace when enable_exte + # notice: this is not involved in how the hook functions came to be. read below for that. + call_extension_method() { + # First, consume the stdin and write metadata about the call. +- write_hook_point_metadata "$@" || true ++ write_hook_point_metadata "$@" + + # @TODO: hack to handle stdin again, possibly with '< /dev/tty' + +@@ -36,9 +36,9 @@ call_extension_method() { + # Then call the hooks, if they are defined. + for hook_name in "$@"; do + echo "-- Extension Method being called: ${hook_name}" >> "${EXTENSION_MANAGER_LOG_FILE}" +- # shellcheck disable=SC2086 +- # shellcheck disable=SC2015 +- [[ $(type -t ${hook_name} || true) == function ]] && { ${hook_name}; } || true ++ if [[ $(type -t ${hook_name} || true) == function ]]; then ++ ${hook_name} ++ fi + done + } + +@@ -66,7 +66,7 @@ initialize_extension_manager() { + mkdir -p "${EXTENSION_MANAGER_TMP_DIR}" + + # Log destination. +- export EXTENSION_MANAGER_LOG_FILE="${EXTENSION_MANAGER_TMP_DIR}/extensions.log" ++ export EXTENSION_MANAGER_LOG_FILE="${LOGDIR}/999.extensions.log" + [[ "${WRITE_EXTENSIONS_METADATA:-yes}" == "no" ]] && echo -n "" > "${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt" + + # Add trap handler to cleanup and not leave garbage behind when exiting. +@@ -270,10 +270,7 @@ function cleanup_handler_extensions() { + display_alert "yeah the extensions trap handler..." "cleanup_handler_extensions" "cleanup" + cleanup_extension_manager + +- # Move temporary log file over to final destination. +- if [[ -f "${EXTENSION_MANAGER_LOG_FILE}" ]]; then +- mv "${EXTENSION_MANAGER_LOG_FILE}" "${DEST}/${LOG_SUBPATH:-debug}/extensions.log" +- fi ++ # Stop logging. + unset EXTENSION_MANAGER_LOG_FILE + + # cleanup our tmpdir. +diff --git a/lib/functions/bsp/bsp-desktop.sh b/lib/functions/bsp/bsp-desktop.sh +index 54259fc4a..8ebc53738 100644 +--- a/lib/functions/bsp/bsp-desktop.sh ++++ b/lib/functions/bsp/bsp-desktop.sh +@@ -10,10 +10,7 @@ + # https://github.com/armbian/build/ + + create_desktop_package() { +- +- echo "Showing PACKAGE_LIST_DESKTOP before postprocessing" >> "${DEST}"/${LOG_SUBPATH}/output.log +- # Use quotes to show leading and trailing spaces +- echo "\"$PACKAGE_LIST_DESKTOP\"" >> "${DEST}"/${LOG_SUBPATH}/output.log ++ display_alert "bsp-desktop: PACKAGE_LIST_DESKTOP" "'${PACKAGE_LIST_DESKTOP}'" "debug" + + # Remove leading and trailing spaces with some bash monstruosity + # https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash-variable#12973694 +@@ -24,7 +21,7 @@ create_desktop_package() { + # Remove others 'spacing characters' (like tabs) + DEBIAN_RECOMMENDS=${DEBIAN_RECOMMENDS//[[:space:]]/} + +- echo "DEBIAN_RECOMMENDS : ${DEBIAN_RECOMMENDS}" >> "${DEST}"/${LOG_SUBPATH}/output.log ++ display_alert "bsp-desktop: DEBIAN_RECOMMENDS" "'${DEBIAN_RECOMMENDS}'" "debug" + + # Replace whitespace characters by commas + PACKAGE_LIST_PREDEPENDS=${PACKAGE_LIST_PREDEPENDS// /,} +@@ -37,7 +34,7 @@ create_desktop_package() { + rm -rf "${destination}" + mkdir -p "${destination}"/DEBIAN + +- echo "${PACKAGE_LIST_PREDEPENDS}" >> "${DEST}"/${LOG_SUBPATH}/output.log ++ display_alert "bsp-desktop: PACKAGE_LIST_PREDEPENDS" "'${PACKAGE_LIST_PREDEPENDS}'" "debug" + + # set up control file + cat <<- EOF > "${destination}"/DEBIAN/control +@@ -65,9 +62,6 @@ create_desktop_package() { + + chmod 755 "${destination}"/DEBIAN/postinst + +- #display_alert "Showing ${destination}/DEBIAN/postinst" +- cat "${destination}/DEBIAN/postinst" >> "${DEST}/${LOG_SUBPATH}/bsp_postinst.log" +- + # Armbian create_desktop_package scripts + + unset aggregated_content +@@ -138,7 +132,7 @@ create_bsp_desktop_package() { + local aggregated_content="" + aggregate_all_desktop "debian/armbian-bsp-desktop/prepare.sh" $'\n' + eval "${aggregated_content}" +- [[ $? -ne 0 ]] && display_alert "prepare.sh exec error" "" "wrn" ++ [[ $? -ne 0 ]] && display_alert "prepare.sh exec error" "" "wrn" # @TODO: this is a fantasy, error would be thrown in line above + + mkdir -p "${DEB_STORAGE}/${RELEASE}" + cd "${destination}" +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 22de78eb4..3b8c1ad7d 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -1,22 +1,3 @@ +-function bla_cleanup1() { +- echo "-- bla cleanup1" 1>&2 +-} +-function bla_cleanup2() { +- echo "-- bla cleanup2" 1>&2 +-} +- +-function bla() { +- display_alert "bla starting" "bla is here! PID: $$ - BASHPID: $BASHPID" "debug" +- add_cleanup_handler bla_cleanup1 +- add_cleanup_handler bla_cleanup2 +- +- #sleep 10 +- #explode_here +- #exit 66 # exit with error +- exit_with_error "something" "wrong" +- #exit 0 # exit without error +-} +- + function cli_entrypoint() { + if [[ "${ARMBIAN_ENABLE_CALL_TRACING}" == "yes" ]]; then + set -T # inherit return/debug traps +@@ -90,6 +71,28 @@ function cli_entrypoint() { + + CONFIG_PATH=$(dirname "${CONFIG_FILE}") + ++ # DEST is the main output dir. ++ # destination. # @TODO: logging this is when we can start logging to file. make sure. ++ declare DEST="${SRC}/output" ++ if [ -d "$CONFIG_PATH/output" ]; then ++ DEST="${CONFIG_PATH}/output" ++ fi ++ display_alert "Output directory DEST:" "${DEST}" "debug" ++ ++ # set unique mounting directory for this build. ++ export ARMBIAN_BUILD_UUID="$(uuidgen)" ++ display_alert "Build UUID:" "${ARMBIAN_BUILD_UUID}" "debug" ++ ++ # Super-global variables, used everywhere. The directories are NOT _created_ here, since this very early stage. ++ export WORKDIR="${SRC}/.tmp/work-${ARMBIAN_BUILD_UUID}" # WORKDIR at this stage. It will become TMPDIR later. It has special significance to `mktemp` and others! ++ export SDCARD="${SRC}/.tmp/rootfs-${ARMBIAN_BUILD_UUID}" # SDCARD (which is NOT an sdcard, but will be, maybe, one day) is where we work the rootfs before final imaging. "rootfs" stage. ++ export MOUNT="${SRC}/.tmp/mount-${ARMBIAN_BUILD_UUID}" # MOUNT ("mounted on the loop") is the mounted root on final image (via loop). "image" stage ++ export EXTENSION_MANAGER_TMP_DIR="${SRC}/.tmp/extensions-${ARMBIAN_BUILD_UUID}" # EXTENSION_MANAGER_TMP_DIR used to store extension-composed functions ++ export DESTIMG="${SRC}/.tmp/image-${ARMBIAN_BUILD_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept ++ export LOGDIR="${SRC}/.tmp/logs-${ARMBIAN_BUILD_UUID}" # Will be initialized very soon, literally, below. ++ ++ LOG_SECTION=entrypoint start_logging_section # This creates LOGDIR. Hopefully. ++ + # Source the extensions manager library at this point, before sourcing the config. + # This allows early calls to enable_extension(), but initialization proper is done later. + # shellcheck source=lib/extensions.sh +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index b5b2e9ca5..8fc63c032 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -10,16 +10,6 @@ + # https://github.com/armbian/build/ + + function do_main_configuration() { +- # set unique mounting directory for this build. +- MOUNT_UUID=$(uuidgen) +- +- # Super-global variables, used everywhere. The directories are NOT _created_ here, since this is config stage, not build. +- export WORKDIR="${SRC}/.tmp/work-${MOUNT_UUID}" # WORKDIR at this stage. It will become TMPDIR later. It has special significance to `mktemp` and others! +- export SDCARD="${SRC}/.tmp/rootfs-${MOUNT_UUID}" # SDCARD (which is NOT an sdcard, but will be, maybe, one day) is where we work the rootfs before final imaging. "rootfs" stage. +- export MOUNT="${SRC}/.tmp/mount-${MOUNT_UUID}" # MOUNT ("mounted on the loop") is the mounted root on final image (via loop). "image" stage +- export EXTENSION_MANAGER_TMP_DIR="${SRC}/.tmp/extensions-${MOUNT_UUID}" # EXTENSION_MANAGER_TMP_DIR used to store extension-composed functions +- export DESTIMG="${SRC}/.tmp/image-${MOUNT_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept +- + display_alert "Starting main configuration" "${MOUNT_UUID}" "info" + + # common options +@@ -439,7 +429,6 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + } + + function write_config_summary_output_file() { +- local build_script_env_file="${DEST}/${LOG_SUBPATH}/output.log" + local debug_dpkg_arch debug_uname debug_virt debug_src_mount debug_src_perms debug_src_temp_perms + debug_dpkg_arch="$(dpkg --print-architecture)" + debug_uname="$(uname -a)" +@@ -448,8 +437,8 @@ function write_config_summary_output_file() { + debug_src_perms="$(getfacl -p "${SRC}")" + debug_src_temp_perms="$(getfacl -p "${SRC}"/.tmp 2> /dev/null)" + +- display_alert "Writing build config summary to" "${build_script_env_file}" "debug" +- cat <<- EOF >> "${build_script_env_file}" ++ display_alert "Writing build config summary to" "debug log" "debug" ++ run_host_command_logged cat "1>&2" <<- EOF + ## BUILD SCRIPT ENVIRONMENT + + Repository: $REPOSITORY_URL +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index 5d36282c0..b51f0d9c4 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -80,7 +80,6 @@ download_and_verify() { + + # download torrent first + if [[ ${USE_TORRENT} == "yes" ]]; then +- + display_alert "downloading using torrent network" "$filename" + local ariatorrent="--summary-interval=0 --auto-save-interval=0 --seed-time=0 --bt-stop-timeout=120 --console-log-level=error \ + --allow-overwrite=true --download-result=hide --rpc-save-upload-metadata=false --auto-file-renaming=false \ +@@ -90,14 +89,13 @@ download_and_verify() { + # exception. It throws error if dht.dat file does not exists. Error suppress needed only at first download. + if [[ -f "${SRC}"/cache/.aria2/dht.dat ]]; then + # shellcheck disable=SC2086 +- aria2c ${ariatorrent} ++ run_host_command_logged aria2c ${ariatorrent} + else + # shellcheck disable=SC2035 +- aria2c ${ariatorrent} &> "${DEST}"/${LOG_SUBPATH}/torrent.log ++ run_host_command_logged aria2c ${ariatorrent} + fi + # mark complete +- [[ $? -eq 0 ]] && touch "${localdir}/${filename}.complete" +- ++ touch "${localdir}/${filename}.complete" + fi + + # direct download if torrent fails +@@ -126,39 +124,38 @@ download_and_verify() { + # Verify archives with Linaro and Armbian GPG keys + + if [ x"" != x"${http_proxy}" ]; then +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 8F427EAF >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ ++ (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 8F427EAF || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ + --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-options http-proxy="${http_proxy}" \ +- --recv-keys 8F427EAF >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1) ++ --recv-keys 8F427EAF) + +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 9F0E78D5 >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ ++ (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 9F0E78D5 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ + --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-options http-proxy="${http_proxy}" \ +- --recv-keys 9F0E78D5 >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1) ++ --recv-keys 9F0E78D5) + else +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 8F427EAF >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ ++ (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 8F427EAF || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ + --keyserver hkp://keyserver.ubuntu.com:80 \ +- --recv-keys 8F427EAF >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1) ++ --recv-keys 8F427EAF) + +- (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 9F0E78D5 >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ ++ (gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --list-keys 9F0E78D5 || gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning \ + --keyserver hkp://keyserver.ubuntu.com:80 \ +- --recv-keys 9F0E78D5 >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1) ++ --recv-keys 9F0E78D5) + fi + + gpg --homedir "${SRC}"/cache/.gpg --no-permission-warning --verify \ +- --trust-model always -q "${localdir}/${filename}.asc" >> "${DEST}"/${LOG_SUBPATH}/output.log 2>&1 ++ --trust-model always -q "${localdir}/${filename}.asc" + [[ ${PIPESTATUS[0]} -eq 0 ]] && verified=true && display_alert "Verified" "PGP" "info" + + else +- + md5sum -c --status "${localdir}/${filename}.asc" && verified=true && display_alert "Verified" "MD5" "info" +- + fi + + if [[ $verified == true ]]; then + if [[ "${filename:(-6)}" == "tar.xz" ]]; then +- + display_alert "decompressing" +- pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "decompress") ${filename}" "${filename}" | xz -dc | tar xp --xattrs --no-same-owner --overwrite +- [[ $? -eq 0 ]] && touch "${localdir}/${dirname}/.download-complete" ++ pv -p -b -r -c -N "$(logging_echo_prefix_for_pv "decompress") ${filename}" "${filename}" | ++ xz -dc | ++ tar xp --xattrs --no-same-owner --overwrite && ++ touch "${localdir}/${dirname}/.download-complete" + fi + else + exit_with_error "verification failed" +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 2af993dc9..818541c6c 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -186,7 +186,8 @@ prepare_host() { + find "${SRC}"/output "${USERPATCHES_PATH}" -type d ! -group sudo -exec chgrp --quiet sudo {} \; + find "${SRC}"/output "${USERPATCHES_PATH}" -type d ! -perm -g+w,g+s -exec chmod --quiet g+w,g+s {} \; + fi +- mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp ++ # @TODO: original: mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp ++ mkdir -p "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp + + # build aarch64 + if [[ $(dpkg --print-architecture) == amd64 ]]; then +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index a3ea4b186..de431cbbc 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -23,7 +23,7 @@ update_initramfs() { + cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ + mount_chroot "$chroot_target/" + +- local logging_filter="| grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary' " ++ local logging_filter="2>&1 | grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary ' -e 'Adding module ' " + chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" "${logging_filter}" || { + exit_with_error "Updating initramfs FAILED" + } +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 2387f37e0..2aa7c6f7b 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -161,7 +161,7 @@ prepare_partitions() { + + # stage: create partition table + display_alert "Creating partitions" "${bootfs:+/boot: $bootfs }root: $ROOTFS_TYPE" "info" +- parted -s ${SDCARD}.raw -- mklabel ${IMAGE_PARTITION_TABLE} ++ run_host_command_logged parted -s ${SDCARD}.raw -- mklabel ${IMAGE_PARTITION_TABLE} + if [[ "${USE_HOOK_FOR_PARTITION}" == "yes" ]]; then + call_extension_method "create_partition_table" <<- 'CREATE_PARTITION_TABLE' + *only called when USE_HOOK_FOR_PARTITION=yes to create the complete partition table* +@@ -170,7 +170,7 @@ prepare_partitions() { + CREATE_PARTITION_TABLE + elif [[ $ROOTFS_TYPE == nfs ]]; then + # single /boot partition +- parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$bootfs]} ${bootstart}s "100%" ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$bootfs]} ${bootstart}s "100%" + elif [[ $UEFISIZE -gt 0 ]]; then + # uefi partition + root partition + if [[ "${IMAGE_PARTITION_TABLE}" == "gpt" ]]; then +@@ -182,38 +182,38 @@ prepare_partitions() { + local rootstart=$(($uefistart + ($UEFISIZE * 2048))) + local biosend=$(($uefistart - 1)) + local uefiend=$(($rootstart - 1)) +- parted -s ${SDCARD}.raw -- mkpart bios fat32 ${biosstart}s ${biosend}s +- parted -s ${SDCARD}.raw -- mkpart efi fat32 ${uefistart}s ${uefiend}s +- parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart bios fat32 ${biosstart}s ${biosend}s ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart efi fat32 ${uefistart}s ${uefiend}s ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + # transpose so BIOS is in sda14; EFI is in sda15 and root in sda1; requires sgdisk, parted cant do numbers +- sgdisk --transpose 1:14 ${SDCARD}.raw +- sgdisk --transpose 2:15 ${SDCARD}.raw +- sgdisk --transpose 3:1 ${SDCARD}.raw ++ run_host_command_logged sgdisk --transpose 1:14 ${SDCARD}.raw ++ run_host_command_logged sgdisk --transpose 2:15 ${SDCARD}.raw ++ run_host_command_logged sgdisk --transpose 3:1 ${SDCARD}.raw + # set the ESP (efi) flag on 15 +- parted -s ${SDCARD}.raw -- set 14 bios_grub on +- parted -s ${SDCARD}.raw -- set 15 esp on ++ run_host_command_logged parted -s ${SDCARD}.raw -- set 14 bios_grub on ++ run_host_command_logged parted -s ${SDCARD}.raw -- set 15 esp on + else + display_alert "Creating partitions" "UEFI+rootfs (no BIOS)" "info" + # Simple EFI + root partition on GPT, no BIOS. +- parted -s ${SDCARD}.raw -- mkpart efi fat32 ${bootstart}s ${bootend}s +- parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart efi fat32 ${bootstart}s ${bootend}s ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + # transpose so EFI is in sda15 and root in sda1; requires sgdisk, parted cant do numbers +- sgdisk --transpose 1:15 ${SDCARD}.raw +- sgdisk --transpose 2:1 ${SDCARD}.raw ++ run_host_command_logged sgdisk --transpose 1:15 ${SDCARD}.raw ++ run_host_command_logged sgdisk --transpose 2:1 ${SDCARD}.raw + # set the ESP (efi) flag on 15 +- parted -s ${SDCARD}.raw -- set 15 esp on ++ run_host_command_logged parted -s ${SDCARD}.raw -- set 15 esp on + fi + else +- parted -s ${SDCARD}.raw -- mkpart primary fat32 ${bootstart}s ${bootend}s +- parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary fat32 ${bootstart}s ${bootend}s ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + fi + elif [[ $BOOTSIZE == 0 ]]; then + # single root partition +- parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + else + # /boot partition + root partition +- parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$bootfs]} ${bootstart}s ${bootend}s +- parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$bootfs]} ${bootstart}s ${bootend}s ++ run_host_command_logged parted -s ${SDCARD}.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + fi + + call_extension_method "post_create_partitions" <<- 'POST_CREATE_PARTITIONS' +@@ -231,12 +231,13 @@ prepare_partitions() { + + check_loop_device "$LOOP" + +- losetup $LOOP ${SDCARD}.raw ++ run_host_command_logged losetup $LOOP ${SDCARD}.raw + + # loop device was grabbed here, unlock + flock -u $FD + +- partprobe $LOOP ++ display_alert "Running partprobe" "${LOOP}" "debug" ++ run_host_command_logged partprobe $LOOP + + # stage: create fs, mount partitions, create fstab + rm -f $SDCARD/etc/fstab +@@ -259,7 +260,7 @@ prepare_partitions() { + if [[ $ROOTFS_TYPE == btrfs && $BTRFS_COMPRESSION != none ]]; then + local fscreateopt="-o compress-force=${BTRFS_COMPRESSION}" + fi +- mount ${fscreateopt} $rootdevice $MOUNT/ ++ run_host_command_logged mount ${fscreateopt} $rootdevice $MOUNT/ + # create fstab (and crypttab) entry + if [[ $CRYPTROOT_ENABLE == yes ]]; then + # map the LUKS container partition via its UUID to be the 'cryptroot' device +@@ -273,17 +274,17 @@ prepare_partitions() { + if [[ -n $bootpart ]]; then + display_alert "Creating /boot" "$bootfs on ${LOOP}p${bootpart}" + check_loop_device "${LOOP}p${bootpart}" +- mkfs.${mkfs[$bootfs]} ${mkopts[$bootfs]} ${LOOP}p${bootpart} 2>&1 ++ run_host_command_logged mkfs.${mkfs[$bootfs]} ${mkopts[$bootfs]} ${LOOP}p${bootpart} 2>&1 + mkdir -p $MOUNT/boot/ +- mount ${LOOP}p${bootpart} $MOUNT/boot/ ++ run_host_command_logged mount ${LOOP}p${bootpart} $MOUNT/boot/ + echo "UUID=$(blkid -s UUID -o value ${LOOP}p${bootpart}) /boot ${mkfs[$bootfs]} defaults${mountopts[$bootfs]} 0 2" >> $SDCARD/etc/fstab + fi + if [[ -n $uefipart ]]; then + display_alert "Creating EFI partition" "FAT32 ${UEFI_MOUNT_POINT} on ${LOOP}p${uefipart} label ${UEFI_FS_LABEL}" + check_loop_device "${LOOP}p${uefipart}" +- mkfs.fat -F32 -n "${UEFI_FS_LABEL^^}" ${LOOP}p${uefipart} 2>&1 # "^^" makes variable UPPERCASE, required for FAT32. ++ run_host_command_logged mkfs.fat -F32 -n "${UEFI_FS_LABEL^^}" ${LOOP}p${uefipart} 2>&1 # "^^" makes variable UPPERCASE, required for FAT32. + mkdir -p "${MOUNT}${UEFI_MOUNT_POINT}" +- mount ${LOOP}p${uefipart} "${MOUNT}${UEFI_MOUNT_POINT}" ++ run_host_command_logged mount ${LOOP}p${uefipart} "${MOUNT}${UEFI_MOUNT_POINT}" + echo "UUID=$(blkid -s UUID -o value ${LOOP}p${uefipart}) ${UEFI_MOUNT_POINT} vfat defaults 0 2" >> $SDCARD/etc/fstab + fi + [[ $ROOTFS_TYPE == nfs ]] && echo "/dev/nfs / nfs defaults 0 0" >> $SDCARD/etc/fstab +@@ -334,7 +335,7 @@ prepare_partitions() { + + # recompile .cmd to .scr if boot.cmd exists + [[ -f $SDCARD/boot/boot.cmd ]] && +- mkimage -C none -A arm -T script -d $SDCARD/boot/boot.cmd $SDCARD/boot/boot.scr > /dev/null 2>&1 ++ run_host_command_logged mkimage -C none -A arm -T script -d $SDCARD/boot/boot.cmd $SDCARD/boot/boot.scr + + # create extlinux config + if [[ -f $SDCARD/boot/extlinux/extlinux.conf ]]; then +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 77d61fc2c..8c6e26081 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -19,7 +19,7 @@ create_image_from_sdcard_rootfs() { + [[ $ROOTFS_TYPE == nfs ]] && version=${version}_nfsboot + + if [[ $ROOTFS_TYPE != nfs ]]; then +- display_alert "Copying files via rsync to" "/" ++ display_alert "Copying files via rsync to" "/ at ${MOUNT}" + run_host_command_logged rsync -aHWXh \ + --exclude="/boot/*" \ + --exclude="/dev/*" \ +@@ -38,7 +38,7 @@ create_image_from_sdcard_rootfs() { + fi + + # stage: rsync /boot +- display_alert "Copying files to" "/boot" ++ display_alert "Copying files to" "/boot at ${MOUNT}" + if [[ $(findmnt --target $MOUNT/boot -o FSTYPE -n) == vfat ]]; then + # fat32 + run_host_command_logged rsync -rLtWh --info=progress0,stats1 "$SDCARD/boot" "$MOUNT" +@@ -58,11 +58,10 @@ create_image_from_sdcard_rootfs() { + } + + # DEBUG: print free space +- local freespace=$(LC_ALL=C df -h) +- # @TODO: this is very specific; we don't want it on screen ever? +- #echo $freespace >> $DEST/${LOG_SUBPATH}/debootstrap.log +- display_alert "Free SD cache" "$(echo -e "$freespace" | grep $SDCARD | awk '{print $5}')" "info" +- display_alert "Mount point" "$(echo -e "$freespace" | grep $MOUNT | head -1 | awk '{print $5}')" "info" ++ local freespace ++ freespace=$(LC_ALL=C df -h) ++ display_alert "Free SD cache" "$(echo -e "$freespace" | grep "${SDCARD}" | awk '{print $5}')" "info" ++ display_alert "Mount point" "$(echo -e "$freespace" | grep "${MOUNT}" | head -1 | awk '{print $5}')" "info" + + # stage: write u-boot, unless the deb is not there, which would happen if BOOTCONFIG=none + # exception: if we use the one from repository, install version which was downloaded from repo +@@ -78,11 +77,11 @@ create_image_from_sdcard_rootfs() { + Called before unmounting both `/root` and `/boot`. + PRE_UMOUNT_FINAL_IMAGE + +- # unmount /boot/efi first, then /boot, rootfs third, image file last # @TODO: why using lazy unmount? ++ # unmount /boot/efi first, then /boot, rootfs third, image file last + sync +- [[ $UEFISIZE != 0 ]] && umount -l "${MOUNT}${UEFI_MOUNT_POINT}" +- [[ $BOOTSIZE != 0 ]] && umount -l $MOUNT/boot +- [[ $ROOTFS_TYPE != nfs ]] && umount -l $MOUNT ++ [[ $UEFISIZE != 0 ]] && umount "${MOUNT}${UEFI_MOUNT_POINT}" ++ [[ $BOOTSIZE != 0 ]] && umount "${MOUNT}/boot" ++ [[ $ROOTFS_TYPE != nfs ]] && umount "${MOUNT}" + [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose $ROOT_MAPPER + + call_extension_method "post_umount_final_image" "config_post_umount_final_image" <<- 'POST_UMOUNT_FINAL_IMAGE' +@@ -90,7 +89,7 @@ PRE_UMOUNT_FINAL_IMAGE + Called after unmounting both `/root` and `/boot`. + POST_UMOUNT_FINAL_IMAGE + +- # to make sure its unmounted # @TODO: maybe use the recursive unmount we have now ++ # @TODO: this is simply wrong and never does anything. we should use the recursive unmounter here + while grep -Eq '(${MOUNT}|${DESTIMG})' /proc/mounts; do + display_alert "Wait for unmount" "${MOUNT}" "info" + sleep 5 +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index e73a6e2d5..64001b013 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -44,10 +44,11 @@ function start_logging_section() { + export logging_section_counter=$((logging_section_counter + 1)) # increment counter, used in filename + export CURRENT_LOGGING_COUNTER + CURRENT_LOGGING_COUNTER="$(printf "%03d" "$logging_section_counter")" +- export CURRENT_LOGGING_SECTION=${LOG_SECTION:-build} # default to "build" +- export CURRENT_LOGGING_DIR="${DEST}/${LOG_SUBPATH}" # origin: build-all-ng - @TODO: rpardini: lets revisit this later ++ export CURRENT_LOGGING_SECTION=${LOG_SECTION:-early} # default to "early", should be overwritten soon enough ++ export CURRENT_LOGGING_DIR="${LOGDIR}" # set in cli-entrypoint.sh + export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${CURRENT_LOGGING_SECTION}.log" + mkdir -p "${CURRENT_LOGGING_DIR}" ++ touch "${CURRENT_LOGFILE}" # Touch it, make sure it's writable. + + # Markers for CI (GitHub Actions); CI env var comes predefined as true there. + if [[ "${CI}" == "true" ]]; then # On CI, this has special meaning. +@@ -192,8 +193,13 @@ function display_alert() { + pids_info="${tool_color}(${normal_color}$$ - ${BASHPID}${tool_color})" # BASHPID is the current subshell; $$ is parent's? + fi + ++ local bashopts_info="" ++ if [[ "${SHOW_BASHOPTS}" == "yes" ]]; then ++ bashopts_info="${tool_color}(${normal_color}$-${tool_color})" # $- is the currently active bashopts ++ fi ++ + [[ -n $2 ]] && extra=" [${inline_logs_color} ${2} ${normal_color}]" +- echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker}${timing_info}${pids_info} ${normal_color}${message}${extra}${normal_color}" >&2 ++ echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker}${timing_info}${pids_info}${bashopts_info} ${normal_color}${message}${extra}${normal_color}" >&2 + + # Now write to CI, if we're running on it + if [[ "${CI}" == "true" ]] && [[ "${ci_log}" != "" ]]; then +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 3ef7071c8..0d0c887ed 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -14,11 +14,16 @@ function chroot_sdcard_apt_get() { + chroot_sdcard DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" + } + +-# please, please, unify around this function. if SDCARD is not enough, I'll make a mount version. ++# please, please, unify around this function. + function chroot_sdcard() { + TMPDIR="" run_host_command_logged_raw chroot "${SDCARD}" /bin/bash -e -o pipefail -c "$*" + } + ++# please, please, unify around this function. ++function chroot_mount() { ++ TMPDIR="" run_host_command_logged_raw chroot "${MOUNT}" /bin/bash -e -o pipefail -c "$*" ++} ++ + # This should be used if you need to capture the stdout produced by the command. It is NOT logged, and NOT run thru bash, and NOT quoted. + function chroot_sdcard_with_stdout() { + TMPDIR="" chroot "${SDCARD}" "$@" +@@ -127,9 +132,8 @@ function run_host_command_logged_raw() { + if [[ -f "${CURRENT_LOGFILE}" ]]; then + echo " " >> "${CURRENT_LOGFILE}" # blank line for reader's benefit + echo "-->" "$*" " <- at $(date --utc)" >> "${CURRENT_LOGFILE}" +- else +- display_alert "Command debug" "$*" "command" # A special 'command' level. + fi ++ display_alert "Command debug" "$*" "command" # A special 'command' level. + + # uncomment when desperate to understand what's going on + # echo "cmd about to run" "$@" >&2 +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index cd795ccd2..7984e3c1b 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -3,44 +3,12 @@ function prepare_and_config_main_build_single() { + # this is used instead of making the chmod in prepare_host() recursive + umask 002 + +- # destination. # @TODO: logging this is when we can start logging to file. make sure. +- if [ -d "$CONFIG_PATH/output" ]; then +- DEST="${CONFIG_PATH}"/output +- else +- DEST="${SRC}"/output +- fi +- display_alert "Determined DEST:" "${DEST}" "debug" +- + interactive_config_prepare_terminal + + # Warnings mitigation + [[ -z $LANGUAGE ]] && export LANGUAGE="en_US:en" # set to english if not set + [[ -z $CONSOLE_CHAR ]] && export CONSOLE_CHAR="UTF-8" # set console to UTF-8 if not set + +- # @TODO: rpardini: this definitely should NOT be done during config preparation. move outside +- if [[ "${CONFIG_DEFS_ONLY}" != "yes" ]]; then +- # set log path +- LOG_SUBPATH=${LOG_SUBPATH:=debug} +- mkdir -p "${DEST}/${LOG_SUBPATH}" # This creates the logging output. +- +- # compress and remove old logs, if they exist. +- if [[ -f "${DEST}/${LOG_SUBPATH}/timestamp" ]]; then +- if ls "${DEST}/${LOG_SUBPATH}/"*.log &> /dev/null; then +- display_alert "Archiving previous build logs..." "${DEST}/${LOG_SUBPATH}" "info" +- (cd "${DEST}/${LOG_SUBPATH}" && tar -czf logs-"$(< timestamp)".tgz ./*.log) # > /dev/null 2>&1 +- rm -f "${DEST}/${LOG_SUBPATH}"/*.log +- fi +- # delete compressed logs older than 7 days +- find "${DEST}"/${LOG_SUBPATH} -name '*.tgz' -mtime +7 -delete +- fi +- +- # Mark a timestamp, for next build. +- date +"%d_%m_%Y-%H_%M_%S" > "${DEST}"/${LOG_SUBPATH}/timestamp +- fi +- +- # PROGRESS_LOG_TO_FILE is either yes, or unset. (@TODO: this is still used in buildpkg) +- if [[ $PROGRESS_LOG_TO_FILE != yes ]]; then unset PROGRESS_LOG_TO_FILE; fi +- + export SHOW_WARNING=yes # If you try something that requires EXPERT=yes. + + display_alert "Starting single build process" "${BOARD}" "info" +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index a43659f43..270145b04 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -68,7 +68,8 @@ function build_rootfs_and_image() { + LOG_SECTION="rootfs_apt_get_autoremove" do_with_logging apt_purge_unneeded_packages + + # create list of installed packages for debug purposes +- chroot $SDCARD /bin/bash -c "dpkg --get-selections" | grep -v deinstall | awk '{print $1}' | cut -f1 -d':' > $DEST/${LOG_SUBPATH}/installed-packages-${RELEASE}$([[ ${BUILD_MINIMAL} == yes ]] && echo "-minimal")$([[ ${BUILD_DESKTOP} == yes ]] && echo "-desktop").list.log 2>&1 ++ display_alert "Recording list of installed packages" "debug log" "debug" ++ chroot_sdcard dpkg --get-selections "| grep -v deinstall | awk '{print \$1}' | cut -f1 -d':' 1>&2" + + # clean up / prepare for making the image + umount_chroot "$SDCARD" +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 7732a5b80..4188a6a48 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -1,4 +1,4 @@ +-install_distribution_agnostic() { ++function install_distribution_agnostic() { + display_alert "Installing distro-agnostic part of rootfs" "install_distribution_agnostic" "debug" + + # install rootfs encryption related packages separate to not break packages cache +diff --git a/lib/functions/rootfs/rootfs-desktop.sh b/lib/functions/rootfs/rootfs-desktop.sh +index 3564d8df2..b0785949a 100644 +--- a/lib/functions/rootfs/rootfs-desktop.sh ++++ b/lib/functions/rootfs/rootfs-desktop.sh +@@ -62,14 +62,10 @@ add_apt_sources() { + } + + add_desktop_package_sources() { +- +- # Myy : I see Snap and Flatpak coming up in the next releases +- # so... let's prepare for that + add_apt_sources + chroot_sdcard_apt_get "update" +- ls -l "${SDCARD}/etc/apt/sources.list.d" >> "${DEST}/${LOG_SUBPATH}/desktop_packages_apt_sources.log" +- cat "${SDCARD}/etc/apt/sources.list" >> "${DEST}/${LOG_SUBPATH}/desktop_packages_apt_sources.log" +- ++ run_host_command_logged ls -l "${SDCARD}/etc/apt/sources.list.d" ++ run_host_command_logged cat "${SDCARD}/etc/apt/sources.list" + } + + # a-kind-of-hook, called by install_distribution_agnostic() if it's a desktop build + +From 11d89f69e44b97e6f494a92ea688099f2c9b8370 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 28 Feb 2022 20:36:55 +0100 +Subject: [PATCH] logging: blue groups if `SHOW_DEBUG=yes` or `SHOW_GROUPS=yes` + (console equivalent of CI's avocado) + +--- + lib/functions/logging/logging.sh | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index cb6876420..e73a6e2d5 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -50,8 +50,10 @@ function start_logging_section() { + mkdir -p "${CURRENT_LOGGING_DIR}" + + # Markers for CI (GitHub Actions); CI env var comes predefined as true there. +- if [[ "${CI}" == "true" ]]; then ++ if [[ "${CI}" == "true" ]]; then # On CI, this has special meaning. + echo "::group::[🥑] Group ${CURRENT_LOGGING_SECTION}" ++ else ++ display_alert "start group" "<${CURRENT_LOGGING_SECTION}>" "group" + fi + return 0 + } +@@ -60,6 +62,8 @@ function finish_logging_section() { + # Close opened CI group. + if [[ "${CI}" == "true" ]]; then + echo "::endgroup::" ++ else ++ display_alert "finish group" "" "group" + fi + } + +@@ -156,6 +160,14 @@ function display_alert() { + inline_logs_color="\e[1;33m" + ;; + ++ group) ++ if [[ "${SHOW_DEBUG}" != "yes" && "${SHOW_GROUPS}" != "yes" ]]; then # show when debugging, or when specifically requested ++ return 0 ++ fi ++ level_indicator="🦋" ++ inline_logs_color="\e[1;36m" # cyan ++ ;; ++ + command) + if [[ "${SHOW_COMMAND}" != "yes" ]]; then # enable to log all calls to external cmds + return 0 + +From c3f70639f0f0323baef75950f664e10517ef94fb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 28 Feb 2022 17:20:18 +0100 +Subject: [PATCH] armbian-next: shut down some too-verbose logging: logo + building and update-initramfs + +--- + lib/functions/image/initrd.sh | 3 ++- + lib/functions/rootfs/boot_logo.sh | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/image/initrd.sh b/lib/functions/image/initrd.sh +index 8c90321a1..a3ea4b186 100644 +--- a/lib/functions/image/initrd.sh ++++ b/lib/functions/image/initrd.sh +@@ -23,7 +23,8 @@ update_initramfs() { + cp "/usr/bin/$QEMU_BINARY" "$chroot_target/usr/bin"/ + mount_chroot "$chroot_target/" + +- chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" || { ++ local logging_filter="| grep --line-buffered -v -e '.xz' -e 'ORDER ignored' -e 'Adding binary' " ++ chroot_custom_long_running "$chroot_target" "$update_initramfs_cmd" "${logging_filter}" || { + exit_with_error "Updating initramfs FAILED" + } + display_alert "Updated initramfs." "${update_initramfs_cmd}" "info" +diff --git a/lib/functions/rootfs/boot_logo.sh b/lib/functions/rootfs/boot_logo.sh +index 4b5e98aa9..5b2861e57 100644 +--- a/lib/functions/rootfs/boot_logo.sh ++++ b/lib/functions/rootfs/boot_logo.sh +@@ -102,7 +102,8 @@ function boot_logo() { + --blob "${SDCARD}"/tmp/throbber72.rgb \ + --blob "${SDCARD}"/tmp/throbber73.rgb \ + --blob "${SDCARD}"/tmp/throbber74.rgb \ +- "${SDCARD}"/lib/firmware/bootsplash.armbian ++ "${SDCARD}"/lib/firmware/bootsplash.armbian \ ++ "| grep --line-buffered -v -e 'File header' -e 'Picture header' -e 'Blob header' -e 'length:' -e 'type:' -e 'picture_id:' -e 'bg_' -e 'num_' -e '^$'" + + if [[ $BOOT_LOGO == yes || $BOOT_LOGO == desktop && $BUILD_DESKTOP == yes ]]; then + [[ -f "${SDCARD}"/boot/armbianEnv.txt ]] && grep -q '^bootlogo' "${SDCARD}"/boot/armbianEnv.txt && + +From 9218d4a1196a4b7d0f303a972e2f5c293e789d90 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 28 Feb 2022 15:43:03 +0100 +Subject: [PATCH] armbian-next: git/patching, kernel: use date from git as + mtime minimum for patched files + +- use revision's date from git log as mtime for all fetch_from_repo +- fix patched files date at least checkout date, otherwise some patches never build +--- + lib/functions/compilation/kernel.sh | 7 ++++ + lib/functions/compilation/patch/fasthash.sh | 26 +++++++------- + lib/functions/compilation/patch/patching.sh | 56 +++++++++++++---------------- + lib/functions/general/git.sh | 36 ++++++++++++------- + 4 files changed, 67 insertions(+), 58 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 54304e34f..68a748d46 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -43,7 +43,9 @@ function run_kernel_make_long_running() { + function compile_kernel() { + local kernel_work_dir="${SRC}/cache/sources/${LINUXSOURCEDIR}" + display_alert "Kernel build starting" "${LINUXSOURCEDIR}" "info" ++ declare checked_out_revision_mtime="" # set by fetch_from_repo + LOG_SECTION="kernel_prepare_git" do_with_logging do_with_hooks kernel_prepare_git ++ declare kernel_base_revision_mtime="${checked_out_revision_mtime}" + LOG_SECTION="kernel_maybe_clean" do_with_logging do_with_hooks kernel_maybe_clean + local version hash pre_patch_version + local kernel_packaging_target +@@ -66,6 +68,8 @@ function compile_kernel() { + + function kernel_prepare_git() { + if [[ -n $KERNELSOURCE ]]; then ++ [[ -d "${kernel_work_dir}" ]] && "${kernel_work_dir}" && fasthash_debug "pre git, existing tree" ++ + display_alert "Downloading sources" "kernel" "git" + + # Does not work well with rpi for example: GIT_WARM_REMOTE_SHALLOW_AT_TAG="v${KERNEL_MAJOR_MINOR}" \ +@@ -127,6 +131,9 @@ function kernel_patching() { + ## - (always) produce a fasthash: represents "what would be done" (eg: md5 of a patch, crc32 of description). + ## - (optionally) execute modification against living tree (eg: apply a patch, copy a file, etc). only if `DO_MODIFY=yes` + ## - (always) call mark_change_commit with the description of what was done and fasthash. ++ declare -i patch_minimum_target_mtime="${kernel_base_revision_mtime}" ++ display_alert "patch_minimum_target_mtime:" "${patch_minimum_target_mtime}" "debug" ++ + initialize_fasthash "kernel" "${hash}" "${pre_patch_version}" "${kernel_work_dir}" + fasthash_debug "init" + +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index 0e0cc60f3..8158ab477 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -20,7 +20,7 @@ function report_fasthash() { + function initialize_fasthash() { + display_alert "initialize_fasthash" "$*" "debug" + return 0 +- declare -a fast_hash_list=() ++ declare -a fast_hash_list=() # @TODO: declaring here won't do it any good, this is a shared var + } + + function fasthash_branch() { +@@ -43,25 +43,25 @@ function fasthash_debug() { + sort -n | tail -n 10 1>&2 + } + +-function get_file_modification_time() { +- local file_date ++function get_file_modification_time() { # @TODO: This is almost always called from a subshell. No use throwing errors? ++ local -i file_date + if [[ ! -f "${1}" ]]; then + exit_with_error "Can't get modification time of nonexisting file" "${1}" ++ return 1 + fi +- +- # [[CC]YY]MMDDhhmm.[ss] - it is NOT a valid integer +- file_date=$(date +%Y%m%d%H%M.%S -r "${1}") +- display_alert "Got date ${file_date} for file" "${1}" "debug" +- +- # @TODO: if MIN_PATCH_AGE ++ # YYYYMMDDhhmm.ss - it is NOT a valid integer, but is what 'touch' wants for its "-t" parameter ++ # YYYYMMDDhhmmss - IS a valid integer and we can do math to it. 'touch' code will format it later ++ file_date=$(date +%Y%m%d%H%M%S -r "${1}") + echo -n "${file_date}" +- + return 0 + } + ++# This is for simple "set without thinking" usage, date preservation is done directly by process_patch_file + function set_files_modification_time() { +- local mtime="${1}" ++ local -i mtime="${1}" ++ local formatted_mtime + shift +- display_alert "Setting date ${mtime} " "${*}" "debug" +- touch -m -t "${mtime}" "${@}" ++ display_alert "Setting date ${mtime}" "${*} (no newer check)" "debug" ++ formatted_mtime="${mtime:0:12}.${mtime:12}" ++ touch --no-create -m -t "${formatted_mtime}" "${@}" + } +diff --git a/lib/functions/compilation/patch/patching.sh b/lib/functions/compilation/patch/patching.sh +index 32351d1b8..df253d969 100644 +--- a/lib/functions/compilation/patch/patching.sh ++++ b/lib/functions/compilation/patch/patching.sh +@@ -81,49 +81,41 @@ advanced_patch() { + # : additional status text + # + process_patch_file() { +- local patch=$1 +- local status=$2 +- local patch_date +- +- # get the modification date of the patch. make it not less than MIN_PATCH_AGE, if set. +- # [[CC]YY]MMDDhhmm[.ss] time format +- patch_date=$(get_file_modification_time "${patch}") +- +- # detect and remove files which patch will create +- lsdiff -s --strip=1 "${patch}" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' +- +- # store an array of the files that patch will modify, we'll set their modification times after the fact +- declare -a patched_files +- mapfile -t patched_files < <(lsdiff -s --strip=1 "${patch}" | awk '{print $2}') +- +- # @TODO: try patching with `git am` first, so git contains the patch commit info/msg. -- For future git-based hashing. +- # shellcheck disable=SC2015 # noted, thanks. I need to handle exit code here. +- patch --batch -p1 -N < "${patch}" && { +- set_files_modification_time "${patch_date}" "${patched_files[@]}" +- display_alert "* $status $(basename "${patch}")" "" "info" +- } || { +- display_alert "* $status $(basename "${patch}")" "failed" "wrn" +- [[ $EXIT_PATCHING_ERROR == yes ]] && exit_with_error "Aborting due to" "EXIT_PATCHING_ERROR" +- } +- return 0 # short-circuit above, avoid exiting with error +-} +-function new_process_patch_file() { +- local patch="$1" # full filename +- local status="$2" # message, may contain ANSI ++ local patch="${1}" ++ local status="${2}" ++ local -i patch_date + local relative_patch="${patch##"${SRC}"/}" # ${FOO##prefix} remove prefix from FOO + + # report_fashtash_should_execute is report_fasthash returns true only if we're supposed to apply the patch on disk. + if report_fashtash_should_execute file "${patch}" "Apply patch ${relative_patch}"; then ++ ++ # get the modification date of the patch. make it not less than MIN_PATCH_AGE, if set. ++ patch_date=$(get_file_modification_time "${patch}") ++ # shellcheck disable=SC2154 # patch_minimum_target_mtime can be declared in outer scope ++ if [[ "${patch_minimum_target_mtime}" != "" ]]; then ++ if [[ ${patch_date} -lt ${patch_minimum_target_mtime} ]]; then ++ display_alert "Patch before minimum date" "${patch_date} -lt ${patch_minimum_target_mtime}" "debug" ++ patch_date=${patch_minimum_target_mtime} ++ fi ++ fi ++ + # detect and remove files which patch will create + lsdiff -s --strip=1 "${patch}" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' + ++ # store an array of the files that patch will add or modify, we'll set their modification times after the fact ++ declare -a patched_files ++ mapfile -t patched_files < <(lsdiff -s --strip=1 "${patch}" | grep -e '^+' -e '^!' | awk '{print $2}') ++ + # @TODO: try patching with `git am` first, so git contains the patch commit info/msg. -- For future git-based hashing. + # shellcheck disable=SC2015 # noted, thanks. I need to handle exit code here. + patch --batch -p1 -N < "${patch}" && { +- display_alert "* ${status} ${relative_patch}" "" "info" || true ++ # Fix the dates. ++ set_files_modification_time "${patch_date}" "${patched_files[@]}" ++ ++ display_alert "* $status ${relative_patch}" "" "info" + } || { +- display_alert "* ${status} ${relative_patch}" "failed" "wrn" +- [[ $EXIT_PATCHING_ERROR == yes ]] && exit_with_error "Aborting due to EXIT_PATCHING_ERROR" "Patch ${relative_patch} failed" ++ display_alert "* $status ${relative_patch}" "failed" "wrn" ++ [[ $EXIT_PATCHING_ERROR == yes ]] && exit_with_error "Aborting due to" "EXIT_PATCHING_ERROR" + } + mark_fasthash_done # will do git commit, associate fasthash to real hash. + fi +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 73c066be4..c4477ca0a 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -138,6 +138,8 @@ fetch_from_repo() { + + fi # offline + ++ local checkout_from="HEAD" # Probably best to use the local revision? ++ + if [[ "${changed}" == "true" ]]; then + git_handle_cold_and_warm_bundle_remotes # Delegate to function to find or create cache if appropriate. + +@@ -153,21 +155,25 @@ fetch_from_repo() { + head) improved_git_fetch --no-tags origin HEAD ;; + esac + display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size again +- +- display_alert "Checking out" "$dir $ref_name" +- regular_git checkout -f -q FETCH_HEAD +- regular_git clean -q -d -f +- display_alert "After checkout, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull +- +- elif [[ -n $(git status -uno --porcelain --ignore-submodules=all) ]]; then # if not changed, but dirty... +- display_alert "Cleaning git dir" "$(git status -s | wc -l) files" # working directory is not clean, show it +- regular_git checkout -f -q HEAD # Return the files that are tracked by git to the initial state. +- regular_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. +- else # not changed, not dirty. +- display_alert "Up to date" "$dir $ref_name at revision ${local_hash}" # working directory is clean, nothing to do ++ checkout_from="FETCH_HEAD" + fi + +- display_alert "Final working copy size" "$(du -h -s | awk '{print $1}')" "debug" ++ # should be declared in outside scope, so can be read. ++ checked_out_revision_mtime="$(git log --date='format:%Y%m%d%H%M%S' --format='format:%ad' -1 "${checkout_from}")" ++ display_alert "checked_out_revision_mtime set!" "${checked_out_revision_mtime}" "debug" ++ ++ display_alert "Cleaning git dir" "$(git status -s 2> /dev/null | wc -l) files" # working directory is not clean, show it ++ ++ fasthash_debug "before git checkout of $dir $ref_name" # fasthash interested in this ++ regular_git checkout -f -q "${checkout_from}" # Return the files that are tracked by git to the initial state. ++ ++ fasthash_debug "before git clean of $dir $ref_name" ++ regular_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. ++ ++ # set the checkout date on all the versioned files. ++ git ls-tree -r -z --name-only "${checkout_from}" | xargs -0 -- touch -m -t "${checked_out_revision_mtime:0:12}.${checked_out_revision_mtime:12}" ++ ++ fasthash_debug "after setting checkout time for $dir $ref_name" #yeah + + if [[ -f .gitmodules ]]; then + display_alert "Updating submodules" "" "ext" +@@ -182,9 +188,13 @@ fetch_from_repo() { + else + sref="head" + fi ++ # @TODO: in case of the bundle stuff this will fail terribly + fetch_from_repo "$surl" "$workdir/$i" "$sref" + done + fi ++ ++ display_alert "Final working copy size" "$(du -h -s | awk '{print $1}')" "debug" ++ fasthash_debug "at the end of fetch_from_repo $dir $ref_name" + } + + function git_fetch_from_bundle_file() { + +From 839e3ab254e7d5f91fa5eeb1f456e66bf0483a1c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 28 Feb 2022 00:20:41 +0100 +Subject: [PATCH] armbian-next: first attempt at kernel packaging rework; just + linux-image pkg, no dtbs yet + +- correctly predict KERNELRELEASE, put image-dtbs in the right spot for flash-kernel +- remove dpkg-gencontrol, do it all directly +--- + lib/functions/compilation/kernel-debs.sh | 154 ++++++++++++++++++++++++++ + lib/functions/compilation/kernel.sh | 92 +++++++++------ + lib/functions/compilation/patch/kernel-pkg.sh | 3 + + lib/library-functions.sh | 9 ++ + 4 files changed, 227 insertions(+), 31 deletions(-) + +diff --git a/lib/functions/compilation/kernel-debs.sh b/lib/functions/compilation/kernel-debs.sh +new file mode 100644 +index 000000000..26a9bc3cd +--- /dev/null ++++ b/lib/functions/compilation/kernel-debs.sh +@@ -0,0 +1,154 @@ ++# This is a re-imagining of mkdebian and builddeb from the kernel tree. ++ ++# We wanna produce Debian/Ubuntu compatible packages so we're able to use their standard tools, like ++# `flash-kernel`, `u-boot-menu`, `grub2`, and others, so we gotta stick to their conventions. ++ ++# Headers are important. We wanna be compatible with `dkms` stuff from Ubuntu, like `nvidia-driver-xxx`. ++# This is affected by cross-compilation: Armbian usually builds arm64 on amd64, and the KBUILD tools ++# that would be included in such headers package will be the wrong arch for `dkms`ing on target arm64 machine. ++ ++# The main difference is that this is NOT invoked from KBUILD's Makefile, but instead ++# directly by Armbian, with references to the dirs where KBUILD's ++# `make install dtbs_install modules_install headers_install` have already successfully been run. ++ ++# This will create a SET of packages. It should always create these: ++# image package: vmlinuz and such, config, modules, and dtbs (if exist) in /usr/lib/xxx ++# libc header package: just the libc headers ++# linux-headers package: just the image headers. (what about the binaries? cross compilation?) ++# linux-dtbs package: only dtbs, if they exist. in /boot/ ++ ++# So this will handle ++# - Creating .deb package skeleton dir (mktemp) ++# - Moving/copying around of KBUILD installed stuff for Debian/Ubuntu/Armbian standard locations, in the correct packages ++# - Separating headers, between image and libc packages. ++# - Fixing the symlinks to stuff so they fit a target system. ++# - building the .debs; ++ ++is_enabled() { ++ grep -q "^$1=y" include/config/auto.conf ++} ++ ++if_enabled_echo() { ++ if is_enabled "$1"; then ++ echo -n "$2" ++ elif [ $# -ge 3 ]; then ++ echo -n "$3" ++ fi ++} ++ ++function prepare_kernel_packaging_debs() { ++ declare kernel_work_dir="${1}" ++ declare kernel_version="${2}" ++ declare -n tmp_kernel_install_dirs="${3}" # nameref to declare -n kernel_install_dirs dictionary ++ declare kernel_package_dir ++ ++ kernel_package_dir=$(mktemp -d "${WORKDIR}/kernel.image.package.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. ++ display_alert "kernel_package_dir" "${kernel_package_dir}" "debug" ++ ++ # Some variables and settings used throughout the script ++ declare kernel_version_family="${kernel_version}-${LINUXFAMILY}" ++ declare packageversion="${REVISION}" ++ declare linux_image_package_name="linux-image-${BRANCH}-${LINUXFAMILY}" ++ ++ mkdir -p "${kernel_package_dir}/DEBIAN" ++ ++ # Generate copyright file ++ mkdir -p "${kernel_package_dir}/usr/share/doc/${linux_image_package_name}" ++ cat <<- EOF > "${kernel_package_dir}/usr/share/doc/${linux_image_package_name}/copyright" ++ This is a packaged Armbian patched version of the Linux kernel. ++ ++ The sources may be found at most Linux archive sites, including: ++ https://www.kernel.org/pub/linux/kernel ++ ++ Copyright: 1991 - 2018 Linus Torvalds and others. ++ ++ The git repository for mainline kernel development is at: ++ git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; version 2 dated June, 1991. ++ ++ On Debian GNU/Linux systems, the complete text of the GNU General Public ++ License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. ++ EOF ++ ++ # Generate a control file ++ cat <<- EOF > "${kernel_package_dir}/DEBIAN/control" ++ Package: ${linux_image_package_name} ++ Version: ${packageversion} ++ Architecture: ${ARCH} ++ Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> ++ Section: kernel ++ Provides: linux-image, linux-image-armbian, armbian-$BRANCH ++ Description: Linux kernel, armbian version $kernel_version_family $BRANCH ++ This package contains the Linux kernel, modules and corresponding other ++ files, kernel_version_family: $kernel_version_family. ++ EOF ++ ++ # Install the maintainer scripts ++ # Note: hook scripts under /etc/kernel are also executed by official Debian ++ # kernel packages, as well as kernel packages built using make-kpkg. ++ # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and ++ # so do we; recent versions of dracut and initramfs-tools will obey this. ++ declare debhookdir="/etc/kernel" ++ for script in postinst postrm preinst prerm; do ++ mkdir -p "${kernel_package_dir}${debhookdir}/${script}.d" ++ cat <<- EOF > "${kernel_package_dir}/DEBIAN/${script}" ++ #!/bin/bash ++ set -x ++ set -e ++ ++ # Pass maintainer script parameters to hook scripts ++ export DEB_MAINT_PARAMS="\$*" ++ ++ # Tell initramfs builder whether it's wanted ++ export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) ++ ++ test -d $debhookdir/$script.d && run-parts --arg="$kernel_version_family" --arg="/$installed_image_path" $debhookdir/$script.d ++ exit 0 ++ EOF ++ chmod 755 "${kernel_package_dir}/DEBIAN/${script}" ++ done ++ ++ display_alert "tmp_kernel_install_dirs INSTALL_PATH:" "${tmp_kernel_install_dirs[INSTALL_PATH]}" "debug" ++ display_alert "tmp_kernel_install_dirs INSTALL_MOD_PATH:" "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}" "debug" ++ display_alert "tmp_kernel_install_dirs INSTALL_HDR_PATH:" "${tmp_kernel_install_dirs[INSTALL_HDR_PATH]}" "debug" ++ ++ display_alert "Kernel install dir" "tree 1" "debug" ++ run_host_command_logged tree -C -h --du -d -L 3 "${tmp_kernel_install_dirs[INSTALL_PATH]}/../.." ++ ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_PATH]}" "${kernel_package_dir}/" # /boot stuff ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_MOD_PATH]}/lib" "${kernel_package_dir}/" # so "lib" stuff sits at the root ++ ++ if [[ -d "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" ]]; then ++ display_alert "tmp_kernel_install_dirs INSTALL_DTBS_PATH:" "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "debug" ++ display_alert "Kernel build will produce DTBs package!" "DTBs YES PACKAGE" "debug" ++ ++ # /usr/lib/linux-image-${kernel_version_family} is wanted by flash-kernel ++ # /lib/firmware/${kernel_version_family}/device-tree/ would also be acceptable ++ mkdir -p "${kernel_package_dir}/usr/lib" ++ run_host_command_logged cp -rp "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}" "${kernel_package_dir}/usr/lib/linux-image-${kernel_version_family}" ++ fi ++ ++ run_host_command_logged chown -R root:root "${kernel_package_dir}" # Fix ownership and permissions ++ run_host_command_logged chmod -R go-w "${kernel_package_dir}" # Fix ownership and permissions ++ run_host_command_logged chmod -R a+rX "${kernel_package_dir}" # in case we are in a restrictive umask environment like 0077 ++ run_host_command_logged chmod -R ug-s "${kernel_package_dir}" # in case we build in a setuid/setgid directory ++ ++ cd "${kernel_package_dir}" || exit_with_error "major failure 774" ++ ++ # create md5sums file. needed? @TODO: convert to subshell? ++ sh -c "cd '${kernel_package_dir}'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums" ++ ++ declare unpacked_size ++ unpacked_size="$(du -h -s "${kernel_package_dir}" | awk '{print $1}')" ++ display_alert "Unpacked linux-kernel image" "${unpacked_size}" "debug" ++ ++ # Show it ++ display_alert "Package dir" "tree 2" "debug" ++ run_host_command_logged tree -C -h --du -d -L 3 "${kernel_package_dir}" ++ ++ run_host_command_logged dpkg-deb ${DEB_COMPRESS:+-Z$DEB_COMPRESS} --build "${kernel_package_dir}" "${kernel_work_dir}/.." # not KDEB compress, we're not under a Makefile ++ ++} +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 8c5db9e92..54304e34f 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -9,20 +9,19 @@ function run_kernel_make() { + ) + + common_make_params_quoted=( +- "$CTHREADS" # Parallel compile, "-j X" for X cpus +- "LOCALVERSION=-${LINUXFAMILY}" # Kernel param +- "KDEB_PKGVERSION=${REVISION}" # deb package version +- "KDEB_COMPRESS=${DEB_COMPRESS}" # dpkg compression for deb +- "BRANCH=${BRANCH}" # @TODO: rpardini: Wonder what BRANCH is used for during packaging? +- "INSTALL_HDR_PATH=debian/hdrtmp/usr" # For packaging headers_install used for headers +- "INSTALL_MOD_PATH=debian/tmp" # For packaging modules for image package +- "INSTALL_DTBS_PATH=debian/dtbtmp/boot/dtbs_install" # For packaging DTBs for dtb package +- "ARCH=${ARCHITECTURE}" # Why? +- "KBUILD_DEBARCH=${ARCH}" # Where used? +- "DEBFULLNAME=${MAINTAINER}" # For changelog generation +- "DEBEMAIL=${MAINTAINERMAIL}" # idem +- "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. +- "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. ++ "$CTHREADS" # Parallel compile, "-j X" for X cpus ++ "ARCH=${ARCHITECTURE}" # Key param. Everything depends on this. ++ "LOCALVERSION=-${LINUXFAMILY}" # Change the internal kernel version to include the family.? ++ ++ "BRANCH=${BRANCH}" # For mkdebian/builddep packaging only ++ "KBUILD_DEBARCH=${ARCH}" # For mkdebian/builddep packaging only ++ "KDEB_PKGVERSION=${REVISION}" # For mkdebian/builddep packaging only ++ "KDEB_COMPRESS=${DEB_COMPRESS}" # For mkdebian/builddep packaging only ++ "DEBFULLNAME=${MAINTAINER}" # For mkdebian/builddep packaging only ++ "DEBEMAIL=${MAINTAINERMAIL}" # For mkdebian/builddep packaging only ++ "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # For mkdebian/builddep packaging only ++ ++ "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. + ) + + # last statement, so it passes the result to calling function. +@@ -58,8 +57,9 @@ function compile_kernel() { + LOG_SECTION="kernel_make_headers_dtbs_image_modules" do_with_logging do_with_hooks kernel_make_headers_dtbs_image_modules + LOG_SECTION="kernel_package" do_with_logging do_with_hooks kernel_package + display_alert "Done with" "kernel compile" "debug" +- cd .. || exit ++ cd "${kernel_work_dir}/.." || exit + rm -f linux-firmware-image-*.deb # remove firmware image packages here - easier than patching ~40 packaging scripts at once ++ #run_host_command_logged dpkg-deb --contents ./*.deb || true + rsync --remove-source-files -rq ./*.deb "${DEB_STORAGE}/" || exit_with_error "Failed moving kernel DEBs" + return 0 + } +@@ -323,30 +323,60 @@ function kernel_make_headers_dtbs_image_modules() { + } + + function kernel_package() { ++ cd "${kernel_work_dir}" ++ ++ declare kernel_dest_install_dir ++ kernel_dest_install_dir=$(mktemp -d "${WORKDIR}/kernel.temp.install.target.XXXXXXXXX") # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. ++ ++ # define dict with vars passed and target directories ++ declare -A kernel_install_dirs=( ++ ["INSTALL_PATH"]="${kernel_dest_install_dir}/image/boot" # Used by `make install` ++ ["INSTALL_HDR_PATH"]="${kernel_dest_install_dir}/headers" # Used by `make headers_install` ++ ["INSTALL_MOD_PATH"]="${kernel_dest_install_dir}/modules" # Used by `make modules_install` ++ ) ++ ++ local -a prepackage_targets=(install modules_install headers_install) ++ if [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]]; then ++ display_alert "Kernel build will produce DTBs!" "DTBs YES" "debug" ++ prepackage_targets+=("dtbs_install") ++ kernel_install_dirs+=(["INSTALL_DTBS_PATH"]="${kernel_dest_install_dir}/dtbs") # Used by `make dtbs_install` ++ fi + +- local -a prepackage_targets=(modules_install headers_install) +- [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]] && prepackage_targets+=("dtbs_install") ++ display_alert "Packaging Kernel" "${LINUXCONFIG} $kernel_packaging_target at ${kernel_dest_install_dir}" "info" + +- display_alert "Packaging Kernel" "${LINUXCONFIG} $kernel_packaging_target" "info" ++ # loop over the keys above, get the value, create param value in array; also mkdir the dir ++ declare -a install_make_params_quoted ++ local dir_key ++ for dir_key in "${!kernel_install_dirs[@]}"; do ++ local dir="${kernel_install_dirs["${dir_key}"]}" ++ local value="${dir_key}=${dir}" ++ mkdir -p "${dir}" ++ display_alert "Adding kernel packaging param" "${value}" "debug" ++ install_make_params_quoted+=("${value}") ++ done + ++ # See https://www.kernel.org/doc/Documentation/kbuild/headers_install.txt + # Prepare for packaging, using the exact same options as original compile. + display_alert "Installing kernel headers and modules for packaging" "${LINUXCONFIG} ${prepackage_targets[*]}" "info" + fasthash_debug "pre-prepackage" +- make_filter="| grep --line-buffered -v -e 'INSTALL' -e 'SIGN' -e 'XZ'" run_kernel_make_long_running "${prepackage_targets[@]}" ++ make_filter="| grep --line-buffered -v -e 'INSTALL' -e 'SIGN' -e 'XZ'" run_kernel_make_long_running "${install_make_params_quoted[@]@Q}" "${prepackage_targets[@]}" + fasthash_debug "post-prepackage" + +- # produce deb packages: image, headers, firmware, dtb +- # This mostly only does +- fasthash_debug "pre-packaging" +- run_kernel_make_long_running $kernel_packaging_target +- fasthash_debug "post-packaging" +- +- if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then +- display_alert "DOUBLE Packaging Kernel, Headers and DTBs" "${LINUXCONFIG} $kernel_packaging_target" "info" +- fasthash_debug "pre-double-packaging" +- run_kernel_make_long_running $kernel_packaging_target +- fasthash_debug "post-double-packaging" +- fi ++ cd "${kernel_work_dir}" ++ prepare_kernel_packaging_debs "${kernel_work_dir}" "${version}" kernel_install_dirs ++ ++ ### # produce deb packages: image, headers, firmware, dtb ++ ### # This mostly only does ++ ### fasthash_debug "pre-packaging" ++ ### run_kernel_make_long_running "${install_make_params_quoted[@]@Q}" $kernel_packaging_target ++ ### fasthash_debug "post-packaging" ++ ### ++ ### if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then ++ ### display_alert "DOUBLE Packaging Kernel, Headers and DTBs" "${LINUXCONFIG} $kernel_packaging_target" "info" ++ ### fasthash_debug "pre-double-packaging" ++ ### run_kernel_make_long_running $kernel_packaging_target ++ ### fasthash_debug "post-double-packaging" ++ ### fi + + display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" + } +diff --git a/lib/functions/compilation/patch/kernel-pkg.sh b/lib/functions/compilation/patch/kernel-pkg.sh +index e1653a66e..51e163b1e 100644 +--- a/lib/functions/compilation/patch/kernel-pkg.sh ++++ b/lib/functions/compilation/patch/kernel-pkg.sh +@@ -7,6 +7,9 @@ function apply_kernel_patches_for_packaging() { + # Temporally set for new "default->legacy,next->current" family naming + + if linux-version compare "${version}" ge 5.10; then ++ display_alert "NOT using old packaging mkdebian etc" "skipping mkdebian patching" "warn" ++ return 0 # Not anymore for new packaging. ++ + # This case is special: it does not use process_patch_file. fasthash manually. + local builddeb="packages/armbian/builddeb" + local mkdebian="packages/armbian/mkdebian" +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 6b14c18a2..75771db01 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -64,6 +64,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/debs.sh + source "${SRC}"/lib/functions/compilation/debs.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/kernel-debs.sh ++# shellcheck source=lib/functions/compilation/kernel-debs.sh ++source "${SRC}"/lib/functions/compilation/kernel-debs.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + +From 477926aac9205e2b7bc07c14e2727730eba11a27 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 25 Feb 2022 22:49:47 +0100 +Subject: [PATCH] armbian-next: rework kernel source packaging, now exporting + from git, to .tar.zst + +- compress with zstdmt (multi-thread zstd), remove pv indicator, it's much faster anyway +- export from git (soon will have all patches et al too) +- better logging, show pkg name +- much, much faster due to zstdmt and deb with none compression +--- + lib/functions/compilation/kernel.sh | 51 +++++++++++++++++-------------------- + 1 file changed, 24 insertions(+), 27 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index e4cb38908..8c5db9e92 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -22,13 +22,12 @@ function run_kernel_make() { + "DEBFULLNAME=${MAINTAINER}" # For changelog generation + "DEBEMAIL=${MAINTAINERMAIL}" # idem + "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. ++ "KCFLAGS=-fdiagnostics-color=always" # Force GCC colored messages. + ) + +- common_make_params_quoted+=("KCFLAGS=-fdiagnostics-color=always") # Force GCC colored messages. +- + # last statement, so it passes the result to calling function. + full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" +- make "$@" "${common_make_params_quoted[@]@Q}" "${make_filter}") ++ make "${common_make_params_quoted[@]@Q}" "$@" "${make_filter}") + "${full_command[@]}" # and exit with it's code, since it's the last statement + } + +@@ -254,38 +253,37 @@ function kernel_config() { + } + + function kernel_package_source() { +- # create linux-source package - with already patched sources +- # We will build this package first and clear the memory. +- if [[ $BUILD_KSRC != no ]]; then +- display_alert "Creating kernel source package" "${LINUXCONFIG}" "info" +- create_linux-source_package +- fi +-} ++ [[ "${BUILD_KSRC}" != "yes" ]] && return 0 ++ ++ display_alert "Creating kernel source package" "${LINUXCONFIG}" "info" + +-create_linux-source_package() { +- ts=$(date +%s) +- local sources_pkg_dir tmp_src_dir ++ local ts=${SECONDS} ++ local sources_pkg_dir tmp_src_dir tarball_size package_size + tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + + sources_pkg_dir=${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all + mkdir -p "${sources_pkg_dir}"/usr/src/ \ +- "${sources_pkg_dir}"/usr/share/doc/linux-source-${version}-${LINUXFAMILY} \ ++ "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}" \ + "${sources_pkg_dir}"/DEBIAN + +- cp "${SRC}/config/kernel/${LINUXCONFIG}.config" "default_${LINUXCONFIG}.config" +- xz < .config > "${sources_pkg_dir}/usr/src/${LINUXCONFIG}_${version}_${REVISION}_config.xz" ++ run_host_command_logged cp -v "${SRC}/config/kernel/${LINUXCONFIG}.config" "${sources_pkg_dir}/usr/src/${LINUXCONFIG}_${version}_${REVISION}_config" ++ run_host_command_logged cp -v COPYING "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}/LICENSE" + +- display_alert "Compressing sources for the linux-source package" +- tar cp --directory="$kernel_work_dir" --exclude='.git' --owner=root . | +- pv -N "$(logging_echo_prefix_for_pv "compress_kernel_sources") $display_name" -p -b -r -s "$(du -sb "$kernel_work_dir" --exclude=='.git' | cut -f1)" | +- pixz -0 > "${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.xz" # @TODO: .deb will compress this later. -0 for now, but should be a plain tar +- cp COPYING "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}/LICENSE" ++ display_alert "Compressing sources for the linux-source package" "exporting from git" "info" ++ cd "${kernel_work_dir}" ++ ++ local tar_prefix="${version}/" ++ local output_tarball="${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.zst" ++ ++ # export tar with `git archive`; we point it at HEAD, but could be anything else too ++ run_host_command_logged git archive "--prefix=${tar_prefix}" --format=tar HEAD "| zstdmt > '${output_tarball}'" ++ tarball_size="$(du -h -s "${output_tarball}" | awk '{print $1}')" + + cat <<- EOF > "${sources_pkg_dir}"/DEBIAN/control + Package: linux-source-${version}-${BRANCH}-${LINUXFAMILY} + Version: ${version}-${BRANCH}-${LINUXFAMILY}+${REVISION} + Architecture: all +- Maintainer: $MAINTAINER <$MAINTAINERMAIL> ++ Maintainer: ${MAINTAINER} <${MAINTAINERMAIL}> + Section: kernel + Priority: optional + Depends: binutils, coreutils +@@ -294,11 +292,10 @@ create_linux-source_package() { + Description: This package provides the source code for the Linux kernel $version + EOF + +- fakeroot_dpkg_deb_build -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" +- rsync --remove-source-files -rq "${sources_pkg_dir}.deb" "${DEB_STORAGE}/" +- +- te=$(date +%s) +- display_alert "Make the linux-source package" "$(($te - $ts)) sec." "info" ++ fakeroot_dpkg_deb_build -Znone -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" # do not compress .deb, it already contains a zstd compressed tarball! ignores ${KDEB_COMPRESS} on purpose ++ package_size="$(du -h -s "${sources_pkg_dir}.deb" | awk '{print $1}')" ++ run_host_command_logged rsync --remove-source-files -r "${sources_pkg_dir}.deb" "${DEB_STORAGE}/" ++ display_alert "linux-source-${version}-${BRANCH}-${LINUXFAMILY} packaged" "$((SECONDS - ts)) seconds, ${tarball_size} tarball, ${package_size} .deb" "info" + } + + function kernel_make_headers_dtbs_image_modules() { + +From d14b2a9265f92d47185047eb8520a956f6ce9ea4 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 25 Feb 2022 00:50:27 +0100 +Subject: [PATCH] armbian-next: a bit atrocious, nameref loaded, + `get_list_of_all_buildable_boards()` + +- in the process, add support for userpatches/config structure mirroring core, for easy upstreaming +--- + lib/functions/compilation/kernel.sh | 3 ++ + lib/functions/configuration/interactive.sh | 75 +++++++++++++++++++----------- + lib/functions/configuration/main-config.sh | 25 ++++++++-- + lib/functions/main/config-prepare.sh | 31 ++++++------ + 4 files changed, 85 insertions(+), 49 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 5cde24980..e4cb38908 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -189,6 +189,9 @@ function kernel_config() { + if [[ -f $USERPATCHES_PATH/$LINUXCONFIG.config ]]; then + display_alert "Using kernel config provided by user" "userpatches/$LINUXCONFIG.config" "info" + cp -p "${USERPATCHES_PATH}/${LINUXCONFIG}.config" .config ++ elif [[ -f "${USERPATCHES_PATH}/config/kernel/${LINUXCONFIG}.config" ]]; then ++ display_alert "Using kernel config provided by user in config/kernel folder" "config/kernel/${LINUXCONFIG}.config" "info" ++ cp -p "${USERPATCHES_PATH}/config/kernel/${LINUXCONFIG}.config" .config + else + display_alert "Using kernel config file" "config/kernel/$LINUXCONFIG.config" "info" + cp -p "${SRC}/config/kernel/${LINUXCONFIG}.config" .config +diff --git a/lib/functions/configuration/interactive.sh b/lib/functions/configuration/interactive.sh +index 165f6257f..325553433 100644 +--- a/lib/functions/configuration/interactive.sh ++++ b/lib/functions/configuration/interactive.sh +@@ -39,8 +39,48 @@ function interactive_config_ask_kernel_configure() { + unset options + } + ++# Required usage: ++# declare -a arr_all_board_names=() arr_all_board_options=() # arrays ++# declare -A dict_all_board_types=() dict_all_board_source_files=() dict_all_board_descriptions=() # dictionaries ++# get_list_of_all_buildable_boards arr_all_board_names arr_all_board_options dict_all_board_types dict_all_board_source_files dict_all_board_descriptions # invoke ++function get_list_of_all_buildable_boards() { ++ local -a board_types=("conf") ++ [[ "${WIP_STATE}" != "supported" ]] && board_types+=("wip" "csc" "eos" "tvb") ++ local -a board_file_paths=("${SRC}/config/boards" "${USERPATCHES_PATH}/config/boards") ++ ++ # local -n is a name reference, see https://www.linuxjournal.com/content/whats-new-bash-parameter-expansion ++ # it works with arrays and associative arrays/dictionaries ++ local -n ref_arr_all_board_names="${1}" ++ [[ "${2}" != "" ]] && local -n ref_arr_all_board_options="${2}" # optional ++ local -n ref_dict_all_board_types="${3}" ++ local -n ref_dict_all_board_source_files="${4}" ++ [[ "${5}" != "" ]] && local -n ref_dict_all_board_descriptions="${5}" # optional ++ ++ local board_file_path board_type full_board_file ++ for board_file_path in "${board_file_paths[@]}"; do ++ [[ ! -d "${board_file_path}" ]] && continue ++ for board_type in "${board_types[@]}"; do ++ for full_board_file in "${board_file_path}"/*."${board_type}"; do ++ [[ "${full_board_file}" == *"*"* ]] && continue # ignore non-matches, due to bash's (non-)globbing behaviour ++ local board_name board_desc ++ board_name="$(basename "${full_board_file}" | cut -d'.' -f1)" ++ ref_dict_all_board_types["${board_name}"]="${board_type}" ++ ref_dict_all_board_source_files["${board_name}"]="${ref_dict_all_board_source_files["${board_name}"]} ${full_board_file}" # accumulate, will have extra space ++ ++ if [[ "${2}" != "" || "${5}" != "" ]]; then # only if second or fifth reference specified, otherwise too costly ++ board_desc="$(head -1 "${full_board_file}" | cut -d'#' -f2)" ++ ref_arr_all_board_options+=("${board_name}" "\Z1(${board_type})\Zn ${board_desc}") ++ ref_dict_all_board_descriptions["${board_name}"]="${board_desc}" ++ fi ++ done ++ done ++ done ++ ref_arr_all_board_names=("${!ref_dict_all_board_types[@]}") # Expand the keys of one of the dicts, that's the list of boards. ++ return 0 ++} ++ + function interactive_config_ask_board_list() { +- # if BOARD is not set, display selection menu ++ # if BOARD is not set, display selection menu, otherwise return success + [[ -n ${BOARD} ]] && return 0 + + WIP_STATE=supported +@@ -49,27 +89,11 @@ function interactive_config_ask_board_list() { + temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow + + while true; do +- options=() +- if [[ $WIP_STATE == supported ]]; then +- for board in "${SRC}"/config/boards/*.conf; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "$(head -1 "${board}" | cut -d'#' -f2)") +- done +- else +- for board in "${SRC}"/config/boards/*.wip; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(WIP)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.csc; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(CSC)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.eos; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(EOS)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.tvb; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(TVB)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- fi +- +- if [[ $WIP_STATE != supported ]]; then ++ declare -a arr_all_board_names=() arr_all_board_options=() # arrays ++ declare -A dict_all_board_types=() dict_all_board_source_files=() dict_all_board_descriptions=() # dictionaries ++ get_list_of_all_buildable_boards arr_all_board_names arr_all_board_options dict_all_board_types dict_all_board_source_files dict_all_board_descriptions # invoke ++ echo > "${temp_rc}" # zero out the rcfile to start ++ if [[ $WIP_STATE != supported ]]; then # be if wip csc etc included. I personally disagree here. + cat <<- 'EOF' > "${temp_rc}" + dialog_color = (RED,WHITE,OFF) + screen_color = (WHITE,RED,ON) +@@ -78,14 +102,12 @@ function interactive_config_ask_board_list() { + tag_selected_color = (WHITE,RED,ON) + tag_key_selected_color = (WHITE,RED,ON) + EOF +- else +- echo > "${temp_rc}" + fi + + DIALOGRC=$temp_rc \ + dialog_if_terminal_set_vars --title "Choose a board" --backtitle "$backtitle" --scrollbar \ + --colors --extra-label "Show $WIP_BUTTON" --extra-button \ +- --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${arr_all_board_options[@]}" + BOARD="${DIALOG_RESULT}" + STATUS=${DIALOG_EXIT_CODE} + +@@ -101,7 +123,7 @@ function interactive_config_ask_board_list() { + STATE_DESCRIPTION=' - boards with high level of software maturity' + WIP_STATE=supported + WIP_BUTTON='CSC/WIP/EOS' +- EXPERT=no ++ EXPERT=no # @TODO: this overrides an "expert" mode that could be set on by the user. revert to original one? + fi + continue + elif [[ $STATUS == 0 ]]; then +@@ -109,7 +131,6 @@ function interactive_config_ask_board_list() { + else + exit_with_error "You cancelled interactive config" "Build cancelled, board not chosen" + fi +- unset options + done + } + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 4183d4041..b5b2e9ca5 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -190,19 +190,36 @@ function do_main_configuration() { + + # single ext4 partition is the default and preferred configuration + #BOOTFS_TYPE='' +- [[ ! -f ${SRC}/config/sources/families/$LINUXFAMILY.conf ]] && +- exit_with_error "Sources configuration not found" "$LINUXFAMILY" + +- display_alert "Sourcing family configuration" "${LINUXFAMILY}.conf" "info" +- source "${SRC}/config/sources/families/${LINUXFAMILY}.conf" ++ ## ------ Sourcing family config --------------------------- + ++ declare -a family_source_paths=("${SRC}/config/sources/families/${LINUXFAMILY}.conf" "${USERPATCHES_PATH}/config/sources/families/${LINUXFAMILY}.conf") ++ declare -i family_sourced_ok=0 ++ for family_source_path in "${family_source_paths[@]}"; do ++ [[ ! -f "${family_source_path}" ]] && continue ++ ++ display_alert "Sourcing family configuration" "${family_source_path}" "info" ++ # shellcheck source=/dev/null ++ source "${family_source_path}" ++ ++ # @TODO: reset error handling, go figure what they do in there. ++ ++ family_sourced_ok=$((family_sourced_ok + 1)) ++ done ++ ++ [[ ${family_sourced_ok} -lt 1 ]] && ++ exit_with_error "Sources configuration not found" "tried ${family_source_paths[*]}" ++ ++ # This is for compatibility only; path above should suffice + if [[ -f $USERPATCHES_PATH/sources/families/$LINUXFAMILY.conf ]]; then + display_alert "Adding user provided $LINUXFAMILY overrides" ++ # shellcheck source=/dev/null + source "$USERPATCHES_PATH/sources/families/${LINUXFAMILY}.conf" + fi + + # load architecture defaults + display_alert "Sourcing arch configuration" "${ARCH}.conf" "info" ++ # shellcheck source=/dev/null + source "${SRC}/config/sources/${ARCH}.conf" + + ## Extensions: at this point we've sourced all the config files that will be used, +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index e26f11b3f..cd795ccd2 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -83,29 +83,24 @@ function prepare_and_config_main_build_single() { + [[ -z $KERNEL_ONLY ]] && exit_with_error "No option selected: KERNEL_ONLY" + [[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected: KERNEL_CONFIGURE" + +- interactive_config_ask_board_list # @TODO: rpardini: This obtains a list of boards. refactor that... ++ interactive_config_ask_board_list # this uses get_list_of_all_buildable_boards too + [[ -z $BOARD ]] && exit_with_error "No board selected: BOARD" + +- if [[ -f $SRC/config/boards/${BOARD}.conf ]]; then +- BOARD_TYPE='conf' +- elif [[ -f $SRC/config/boards/${BOARD}.csc ]]; then +- BOARD_TYPE='csc' +- elif [[ -f $SRC/config/boards/${BOARD}.wip ]]; then +- BOARD_TYPE='wip' +- elif [[ -f $SRC/config/boards/${BOARD}.eos ]]; then +- BOARD_TYPE='eos' +- elif [[ -f $SRC/config/boards/${BOARD}.tvb ]]; then +- BOARD_TYPE='tvb' +- fi ++ declare -a arr_all_board_names=() # arrays ++ declare -A dict_all_board_types=() dict_all_board_source_files=() # dictionaries ++ get_list_of_all_buildable_boards arr_all_board_names "" dict_all_board_types dict_all_board_source_files "" # invoke + +- # @TODO: rpardini: this is when Alice enters the hole. Sourcing stuff, extensions getting activated, etc. ++ BOARD_TYPE="${dict_all_board_types["${BOARD}"]}" ++ BOARD_SOURCE_FILES="${dict_all_board_source_files["${BOARD}"]}" + +- display_alert "Sourcing board configuration" "${BOARD}.${BOARD_TYPE}" "info" +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}.${BOARD_TYPE}" +- LINUXFAMILY="${BOARDFAMILY}" # @TODO: wtf? why? this is (100%?) rewritten by family config! ++ for BOARD_SOURCE_FILE in ${BOARD_SOURCE_FILES}; do # No quotes, so expand the space-delimited list ++ display_alert "Sourcing board configuration" "${BOARD_SOURCE_FILE}" "info" ++ # shellcheck source=/dev/null ++ source "${BOARD_SOURCE_FILE}" ++ done + +- # @TODO: interesting. this sourced the board config. What sources the family? do_main_configuration! ++ LINUXFAMILY="${BOARDFAMILY}" # @TODO: wtf? why? this is (100%?) rewritten by family config! ++ # this sourced the board config. do_main_configuration will source the family file. + + [[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config" + + +From bc0d123dc5e1baf21a20ef86d5c4e32aff3aa931 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 19:57:43 +0100 +Subject: [PATCH] armbian-next: make `SKIP_EXTERNAL_TOOLCHAINS=yes` default. + lets see what breaks [WiP] + +--- + lib/functions/configuration/main-config.sh | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 5aa637534..4183d4041 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -35,6 +35,7 @@ function do_main_configuration() { + [[ -z $MAINTAINER ]] && MAINTAINER="Igor Pecovnik" # deb signature + [[ -z $MAINTAINERMAIL ]] && MAINTAINERMAIL="igor.pecovnik@****l.com" # deb signature + [[ -z $DEB_COMPRESS ]] && DEB_COMPRESS="xz" # compress .debs with XZ by default. Use 'none' for faster/larger builds ++ export SKIP_EXTERNAL_TOOLCHAINS="${SKIP_EXTERNAL_TOOLCHAINS:-yes}" # don't use any external toolchains, by default. + TZDATA=$(cat /etc/timezone) # Timezone for target is taken from host or defined here. + USEALLCORES=yes # Use all CPU cores for compiling + HOSTRELEASE=$(cat /etc/os-release | grep VERSION_CODENAME | cut -d"=" -f2) + +From 7fb54baca48ed6ae60b6a0025e83b0e29380164f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 19:57:17 +0100 +Subject: [PATCH] armbian-next: keeping stdout clean, use display_alert() for + cleanup logging + +--- + compile.sh | 3 ++- + lib/functions/configuration/config-desktop.sh | 5 ++--- + lib/functions/configuration/main-config.sh | 1 - + lib/functions/main/rootfs-image.sh | 2 +- + 4 files changed, 5 insertions(+), 6 deletions(-) + +diff --git a/compile.sh b/compile.sh +index fcd9046a0..0c35c5fd6 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -53,4 +53,5 @@ traps_init + # Execute the main CLI entrypoint. + cli_entrypoint "$@" + +-echo "-- very last thing" 1>&2 ++# Log the last statement of this script for debugging purposes. ++display_alert "Armbian build script exiting" "very last thing" "cleanup" +diff --git a/lib/functions/configuration/config-desktop.sh b/lib/functions/configuration/config-desktop.sh +index 72ddd07ec..9ff0106da 100644 +--- a/lib/functions/configuration/config-desktop.sh ++++ b/lib/functions/configuration/config-desktop.sh +@@ -2,9 +2,8 @@ function desktop_element_available_for_arch() { + local desktop_element_path="${1}" + local targeted_arch="${2}" + local arch_limitation_file="${1}/only_for" +- echo "Checking if ${desktop_element_path} is available for ${targeted_arch} in ${arch_limitation_file}" >> "${DEST}"/${LOG_SUBPATH}/output.log + if [[ -f "${arch_limitation_file}" ]]; then +- if ! grep -- "${targeted_arch}" "${arch_limitation_file}"; then ++ if ! grep -- "${targeted_arch}" "${arch_limitation_file}" &> /dev/null; then + return 1 + fi + fi +@@ -35,7 +34,7 @@ function desktop_element_supported() { + function desktop_environments_prepare_menu() { + for desktop_env_dir in "${DESKTOP_CONFIGS_DIR}/"*; do + local desktop_env_name expert_infos="" desktop_element_supported_result=0 +- desktop_env_name=$(basename ${desktop_env_dir}) ++ desktop_env_name="$(basename "${desktop_env_dir}")" + [[ "${EXPERT}" == "yes" ]] && expert_infos="[$(cat "${desktop_env_dir}/support" 2> /dev/null)]" + desktop_element_supported "${desktop_env_dir}" "${ARCH}" + [[ ${desktop_element_supported_result} == 0 ]] && options+=("${desktop_env_name}" "${desktop_env_name^} desktop environment ${expert_infos}") +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 5f43fb075..5aa637534 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -245,7 +245,6 @@ function do_main_configuration() { + CLI_CONFIG_PATH="${SRC}/config/cli/${RELEASE}" + DEBOOTSTRAP_CONFIG_PATH="${CLI_CONFIG_PATH}/debootstrap" + +- + AGGREGATION_SEARCH_ROOT_ABSOLUTE_DIRS=" + ${SRC}/config + ${SRC}/config/optional/_any_board/_config +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index db8fe5b40..a43659f43 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -103,7 +103,7 @@ function build_rootfs_and_image() { + } + + function trap_handler_cleanup_rootfs_and_image() { +- echo "-- trap_handler_cleanup_rootfs_and_image cleaning up..." 1>&2 ++ display_alert "Cleanup for rootfs and image" "trap_handler_cleanup_rootfs_and_image" "cleanup" + + cd "${SRC}" || echo "Failed to cwd to ${SRC}" # Move pwd away, so unmounts work + # those will loop until they're unmounted. + +From a3b64e15f9130871ff37061aa533ca0649c0bc0c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 19:35:23 +0100 +Subject: [PATCH] armbian-next: library cleanups; remove `build-all.sh` for + good; bring `patching.sh` back + +--- + .../compilation/patch/{apply.sh => patching.sh} | 0 + lib/functions/multi/build-all.sh | 440 --------------------- + lib/library-functions.sh | 27 +- + 3 files changed, 9 insertions(+), 458 deletions(-) + +diff --git a/lib/functions/compilation/patch/apply.sh b/lib/functions/compilation/patch/patching.sh +similarity index 100% +rename from lib/functions/compilation/patch/apply.sh +rename to lib/functions/compilation/patch/patching.sh +diff --git a/lib/functions/multi/build-all.sh b/lib/functions/multi/build-all.sh +deleted file mode 100644 +index 762a588d7..000000000 +--- a/lib/functions/multi/build-all.sh ++++ /dev/null +@@ -1,440 +0,0 @@ +-function do_main_build_all_ng() { +- if [[ -z $VENDOR ]]; then VENDOR="Armbian"; fi +- if [[ $BETA == "yes" ]]; then STABILITY="beta"; else STABILITY="stable"; fi +- if [[ $BETA == "yes" ]]; then upload_subdir=nightly; else upload_subdir="archive"; fi +- if [[ $MAKE_ALL_BETA == "yes" ]]; then STABILITY="stable"; fi +- if [[ -z $KERNEL_ONLY ]]; then KERNEL_ONLY="yes"; fi +- if [[ -z $MULTITHREAD ]]; then MULTITHREAD=0; fi +- if [[ -z $START ]]; then START=0; fi +- if [[ -z $KERNEL_CONFIGURE ]]; then KERNEL_CONFIGURE="no"; fi +- if [[ -z $CLEAN_LEVEL ]]; then CLEAN_LEVEL="make,oldcache"; fi +- +- MAINLINE_KERNEL_SOURCE='https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable' +- +- # cleanup +- rm -f /run/armbian/*.pid +- mkdir -p /run/armbian +- +- # read user defined targets if exits +- if [[ -f $USERPATCHES_PATH/targets.conf ]]; then +- display_alert "Adding user provided targets configuration" +- BUILD_TARGETS="${USERPATCHES_PATH}/targets.conf" +- else +- BUILD_TARGETS="${SRC}/config/targets.conf" +- fi +- +- # bump version in case there was a change +- if [[ ${BUMP_VERSION} == yes ]]; then +- cd "${SRC}" || exit +- CURRENT_VERSION=$(cat VERSION) +- NEW_VERSION="${CURRENT_VERSION%%-trunk}" +- if [[ $CURRENT_VERSION == *trunk* ]]; then +- NEW_VERSION=$(echo "${CURRENT_VERSION}" | cut -d. -f1-3)"."$((${NEW_VERSION##*.} + 1)) +- else +- NEW_VERSION=$(echo "${CURRENT_VERSION}" | cut -d. -f1-2)"."$((${NEW_VERSION##*.} + 1)) +- fi +- +- echo "${NEW_VERSION}" > VERSION +- improved_git add "${SRC}"/VERSION +- improved_git commit -m "Bumping to new version" -m "" -m "Adding following kernels:" -m "$(find output/debs-beta/ -type f -name "linux-image*${CURRENT_VERSION}*.deb" -printf "%f\n" | sort)" +- improved_git push +- display_alert "Bumping to new version" "${NEW_VERSION}" "info" +- else +- +- # display what will be build +- echo "" +- [[ -f userpatches/family.skip ]] && display_alert "userpatches/family.skip exists and familes noted there will be skipped" "" "wrn" +- display_alert "Building all targets" "$STABILITY $(if [[ $KERNEL_ONLY == "yes" ]]; then +- echo "kernels" +- else echo "images"; fi)" "info" +- +- printf "\n%s\t%-32s\t%-8s\t%-14s\t%-6s\t%-6s\t%-6s\t%-6s\n\n" "" "board" "branch" "release" "DE" "desktop" "minimal" "DE app groups" +- +- # display what we will build +- build_all "dryrun" +- +- if [[ $BUILD_ALL != demo ]]; then +- echo "" +- # build +- build_all +- fi +- +- # wait until they are not finshed +- sleep 5 +- while :; do +- if [[ $(df | grep -c /.tmp) -lt 1 ]]; then +- break +- fi +- sleep 5 +- done +- +- while :; do +- if [[ -z $(ps -uax | grep 7z | grep Armbian) ]]; then +- break +- fi +- sleep 5 +- done +- +- fi +- +- [[ $n -eq 0 ]] && display_alert "No changes in upstream sources, patches or configs found. Exiting." "info" +- +- buildall_end=$(date +%s) +- buildall_runtime=$(((buildall_end - buildall_start) / 60)) +- display_alert "Runtime in total" "${buildall_runtime} min" "info" +- mkdir -p .tmp +- echo "${n}" > "${SRC}"/.tmp/n +- +- # display what we will build +- build_all "dryrun" +- display_alert "Done" +-} +- +-unset_all() { +- cleanup_extension_manager +- unset LINUXFAMILY LINUXCONFIG KERNELDIR KERNELSOURCE KERNELBRANCH BOOTDIR BOOTSOURCE BOOTBRANCH ARCH UBOOT_USE_GCC KERNEL_USE_GCC CPUMIN CPUMAX \ +- UBOOT_VER KERNEL_VER GOVERNOR BOOTSIZE BOOTFS_TYPE UBOOT_TOOLCHAIN KERNEL_TOOLCHAIN DEBOOTSTRAP_LIST PACKAGE_LIST_EXCLUDE KERNEL_IMAGE_TYPE \ +- write_uboot_platform family_tweaks family_tweaks_bsp setup_write_uboot_platform uboot_custom_postprocess atf_custom_postprocess family_tweaks_s \ +- LOCALVERSION UBOOT_COMPILER KERNEL_COMPILER BOOTCONFIG BOOTCONFIG_VAR_NAME INITRD_ARCH BOOTENV_FILE BOOTDELAY ATF_TOOLCHAIN2 MOUNT SDCARD \ +- BOOTPATCHDIR KERNELPATCHDIR RELEASE IMAGE_TYPE OVERLAY_PREFIX ASOUND_STATE ATF_COMPILER ATF_USE_GCC ATFSOURCE ATFDIR ATFBRANCH ATFSOURCEDIR \ +- PACKAGE_LIST_RM NM_IGNORE_DEVICES DISPLAY_MANAGER family_tweaks_bsp_s CRYPTROOT_ENABLE CRYPTROOT_PASSPHRASE CRYPTROOT_SSH_UNLOCK \ +- CRYPTROOT_SSH_UNLOCK_PORT CRYPTROOT_SSH_UNLOCK_KEY_NAME ROOT_MAPPER NETWORK HDMI USB WIRELESS ARMBIANMONITOR FORCE_BOOTSCRIPT_UPDATE \ +- UBOOT_TOOLCHAIN2 toolchain2 BUILD_REPOSITORY_URL BUILD_REPOSITORY_COMMIT BUILD_TARGET HOST BUILD_IMAGE DEB_STORAGE REPO_STORAGE REPO_CONFIG \ +- REPOSITORY_UPDATE PACKAGE_LIST_RELEASE LOCAL_MIRROR COMPILE_ATF PACKAGE_LIST_BOARD PACKAGE_LIST_FAMILY PACKAGE_LIST_DESKTOP_BOARD \ +- PACKAGE_LIST_DESKTOP_FAMILY ATF_COMPILE ATFPATCHDIR OFFSET BOOTSOURCEDIR \ +- BOOT_SOC DDR_BLOB MINILOADER_BLOB BL31_BLOB BOOT_SCENARIO BOOT_SUPPORT_SPI OFFLINE_WORK VAR_SHALLOW_ORIGINAL KERNELSWITCHOBJ \ +- IMAGE_PARTITION_TABLE BOOT_LOGO UBOOT_REPO_VERSION FORCED_MONTH_OFFSET PACKAGE_LIST_BOARD_REMOVE PACKAGE_LIST_FAMILY_REMOVE PACKAGE_LIST_DESKTOP \ +- PACKAGE_LIST_DESKTOP_BOARD_REMOVE PACKAGE_LIST_DESKTOP_FAMILY_REMOVE BOOTCONFIG_EDGE DESKTOP_ENVIRONMENT DESKTOP_ENVIRONMENT_CONFIG_NAME \ +- DESKTOP_APPGROUPS_SELECTED DESKTOP_APT_FLAGS_SELECTED DESKTOP_ENVIRONMENT_DIRPATH DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH UBOOT_TARGET_MAP \ +- DESKTOP_ENVIRONMENT_DIRPATH DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH DESKTOP_CONFIG_PREFIX DESKTOP_CONFIGS_DIR DESKTOP_APPGROUPS_DIR \ +- DEBIAN_RECOMMENDS USE_OVERLAYFS aggregated_content DEBOOTSTRAP_COMPONENTS DEBOOTSTRAP_OPTION DEB_COMPRESS MAINTAINER MAINTAINERMAIL EXTRAWIFI BOOTSCRIPT +-} +- +-pack_upload() { +- +- # pack and upload to server or just pack +- +- display_alert "Signing" "Please wait!" "info" +- local version="${VENDOR}_${REVISION}_${BOARD^}_${RELEASE}_${BRANCH}_${VER/-$LINUXFAMILY/}${DESKTOP_ENVIRONMENT:+_$DESKTOP_ENVIRONMENT}" +- compression_type="" +- +- [[ $BUILD_DESKTOP == yes ]] && version=${version}_desktop +- [[ $BUILD_MINIMAL == yes ]] && version=${version}_minimal +- [[ $BETA == yes ]] && local subdir=nightly +- [[ $RC == yes ]] && local subdir=rc +- +- cd "${DESTIMG}" || exit +- +- if [[ $COMPRESS_OUTPUTIMAGE == yes ]]; then +- COMPRESS_OUTPUTIMAGE="sha,gpg,7z" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *gz* ]]; then +- display_alert "Compressing" "$DEST/images/${version}.img.gz" "info" +- pigz "$DESTIMG/${version}.img" +- rm "${DESTIMG}/${version}.img" +- compression_type=".gz" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *xz* ]]; then +- display_alert "Compressing" "$DEST/images/${version}.img.xz" "info" +- pixz -9 < "$DESTIMG/${version}.img" > "${DESTIMG}/${version}.img.xz" +- rm "${DESTIMG}/${version}.img" +- compression_type=".xz" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *sha* ]]; then +- display_alert "SHA256 calculating" "${version}.img" "info" +- sha256sum -b "${version}.img${compression_type}" > "${version}.img${compression_type}.sha" +- fi +- +- if [[ $COMPRESS_OUTPUTIMAGE == *gpg* ]]; then +- if [[ -n "${GPG_PASS}" && "${SUDO_USER}" ]]; then +- display_alert "GPG signing" "${version}.img" "info" +- [[ -n ${SUDO_USER} ]] && sudo chown -R ${SUDO_USER}:${SUDO_USER} "${DEST}"/images/ +- echo "${GPG_PASS}" | sudo -H -u ${SUDO_USER} bash -c "gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes ${version}.img${compression_type}" || exit 1 +- else +- display_alert "GPG signing skipped - no GPG_PASS" "${version}.img" "wrn" +- fi +- fi +- +- fingerprint_image "${version}.img${compression_type}.txt" "${version}" +- +- if [[ $COMPRESS_OUTPUTIMAGE == *7z* ]]; then +- display_alert "Compressing" "${version}.7z" "info" +- 7za a -t7z -bd -m0=lzma2 -mx=3 -mfb=64 -md=32m -ms=on "${version}".7z "${version}".img* > /dev/null 2>&1 +- find . -type f -not -name '*.7z' -print0 | xargs -0 rm -- +- fi +- +- if [[ -n "${SEND_TO_SERVER}" ]]; then +- ssh "${SEND_TO_SERVER}" "mkdir -p ${SEND_TO_LOCATION}${BOARD}/{archive,nightly}" & +- display_alert "Uploading" "Please wait!" "info" +- nice -n 19 bash -c "rsync -arP --info=progress2 --prune-empty-dirs $DESTIMG/ -e 'ssh -T -c aes128-ctr -o Compression=no -x -p 22' ${SEND_TO_SERVER}:${SEND_TO_LOCATION}${BOARD}/${subdir}; rm -rf ${DESTIMG}/*" & +- else +- mv "${DESTIMG}"/*.* "${DEST}"/images/ +- fi +- +-} +- +-build_main() { +- # shellcheck source=/dev/null +- source "$USERPATCHES_PATH"/lib.config +- # build images which we do pack or kernel +- local upload_image +- upload_image="${VENDOR}_$(cat "${SRC}"/VERSION)_${BOARD^}_${RELEASE}_${BRANCH}_*${VER/-$LINUXFAMILY/}" +- +- [[ $BUILD_DESKTOP == yes ]] && upload_image=${upload_image}_desktop +- [[ $BUILD_MINIMAL == yes ]] && upload_image=${upload_image}_minimal +- +- touch "/run/armbian/${VENDOR}_${BOARD^}_${BRANCH}_${RELEASE}_${DESKTOP_ENVIRONMENT}_${BUILD_DESKTOP}_${BUILD_MINIMAL}.pid" +- LOG_SUBPATH="debug/${VENDOR}/${BOARD^}/${BRANCH}/${RELEASE}/${DESKTOP_ENVIRONMENT}_${BUILD_DESKTOP}_${BUILD_MINIMAL}" +- +- if [[ $KERNEL_ONLY != yes ]]; then +- #if ssh ${SEND_TO_SERVER} stat ${SEND_TO_LOCATION}${BOARD}/${upload_subdir}/${upload_image}* \> /dev/null 2\>\&1; then +- # echo "$n exists $upload_image" +- #else +- #shellcheck source=lib/main.sh +- source "${SRC}"/lib/main.sh +- [[ "$BSP_BUILD" != yes && -n "${SEND_TO_SERVER}" ]] && pack_upload +- #fi +- +- else +- #shellcheck source=lib/main.sh +- source "${SRC}"/lib/main.sh +- +- fi +- +- cd "${SRC}" +- rm "/run/armbian/${VENDOR}_${BOARD^}_${BRANCH}_${RELEASE}_${DESKTOP_ENVIRONMENT}_${BUILD_DESKTOP}_${BUILD_MINIMAL}.pid" +-} +- +-array_contains() { +- +- # utility snippet +- +- local array="$1[@]" +- local seeking=$2 +- local in=1 +- +- for element in "${!array}"; do +- if [[ "${element}" == "${seeking}" ]]; then +- in=0 +- break +- fi +- done +- return $in +- +-} +- +-function check_hash() { +- local BOARDFAMILY ref_type ref_name +- +- BOARDFAMILY=$(grep BOARDFAMILY "${SRC}/config/boards/${BOARD}".* | cut -d \" -f2) +- # shellcheck source=/dev/null +- source "${SRC}/config/sources/families/${BOARDFAMILY}.conf" &> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/sources/${ARCH}.conf" &> /dev/null +- ref_type=${KERNELBRANCH%%:*} +- if [[ $ref_type == head ]]; then +- ref_name=HEAD +- else +- ref_name=${KERNELBRANCH##*:} +- fi +- [[ -z $LINUXFAMILY ]] && LINUXFAMILY=$BOARDFAMILY +- [[ -z ${KERNELPATCHDIR} ]] && KERNELPATCHDIR=$LINUXFAMILY-$BRANCH +- [[ -z ${LINUXCONFIG} ]] && LINUXCONFIG=linux-$LINUXFAMILY-$BRANCH +- hash_watch_1=$(LC_COLLATE=C find -L "${SRC}/patch/kernel/${KERNELPATCHDIR}"/ -name '*.patch' -mindepth 1 -maxdepth 1 -printf '%s %P\n' 2> /dev/null | LC_COLLATE=C sort -n) +- hash_watch_2=$(cat "${SRC}/config/kernel/${LINUXCONFIG}.config" 2> /dev/null) +- patch_hash=$(echo "${hash_watch_1}${hash_watch_2}" | improved_git hash-object --stdin) +- +- case $ref_type in +- branch) hash=$(improved_git ls-remote "${KERNELSOURCE}" refs/heads/"${ref_name}" 2> /dev/null | awk '{print $1}') ;; +- tag) hash=$(improved_git ls-remote "${KERNELSOURCE}" tags/"${ref_name}" 2> /dev/null | awk '{print $1}') ;; +- head) hash=$(improved_git ls-remote "${KERNELSOURCE}" HEAD 2> /dev/null | awk '{print $1}') ;; +- commit) hash=$ref_name ;; +- esac +- # ignore diff checking in case of network errrors +- local kernel_hash="${SRC}/cache/hash"$([[ ${BETA} == yes ]] && echo "-beta")"/linux-image-${BRANCH}-${LINUXFAMILY}.githash" +- if [[ -f ${kernel_hash} ]]; then +- [[ "$hash" == "$(head -1 "${kernel_hash}")" && "$patch_hash" == "$(tail -1 "${kernel_hash}")" || -z $hash ]] && echo "IDENTICAL" +- fi +-} +- +-function build_all() { +- +- # main routine +- +- buildall_start=$(date +%s) +- n=0 +- ARRAY=() +- buildlist="cat " +- +- # building selected ones +- if [[ -n ${REBUILD_IMAGES} ]]; then +- +- buildlist="grep -w '" +- filter="'" +- for build in $(tr ',' ' ' <<< "${REBUILD_IMAGES}"); do +- buildlist=$buildlist"$build\|" +- filter=$filter"$build\|" +- done +- buildlist=${buildlist::-2}"'" +- filter=${filter::-2}"'" +- +- fi +- +- # find unique boards - we will build debs for all variants +- sorted_unique_ids=($(echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) +- unique_boards=$(eval "${buildlist}" "${SRC}"/config/targets.conf | sed '/^#/ d' | awk '{print $1}') +- read -r -a unique_boards <<< "$(echo "${unique_boards[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')" +- +- while read -r line; do +- # @TODO: this almost a complete copy of main.sh. refactor. +- +- [[ "${line}" =~ ^#.*$ ]] && continue +- [[ -n "${REBUILD_IMAGES}" ]] && [[ -z $(echo "${line}" | eval grep -w "${filter}") ]] && continue +- #[[ $n -lt $START ]] && ((n+=1)) && continue +- +- unset_all +- # unset also board related variables +- unset BOARDFAMILY DESKTOP_AUTOLOGIN DEFAULT_CONSOLE FULL_DESKTOP MODULES MODULES_CURRENT MODULES_LEGACY MODULES_EDGE \ +- BOOTCONFIG MODULES_BLACKLIST MODULES_BLACKLIST_LEGACY MODULES_BLACKLIST_CURRENT MODULES_BLACKLIST_EDGE DEFAULT_OVERLAYS SERIALCON \ +- BUILD_MINIMAL RELEASE ATFBRANCH BOOT_FDT_FILE BOOTCONFIG_EDGE BOOTSOURCEDIR SRC_CMDLINE SRC_EXTLINUX INITRD_ARCH +- +- read -r BOARD BRANCH RELEASE BUILD_TARGET BUILD_STABILITY BUILD_IMAGE DESKTOP_ENVIRONMENT DESKTOP_ENVIRONMENT_CONFIG_NAME DESKTOP_APPGROUPS_SELECTED <<< "${line}" +- DESKTOP_APPGROUPS_SELECTED="${DESKTOP_APPGROUPS_SELECTED//,/ }" +- # read all possible configurations +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".eos 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".tvb 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".csc 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".wip 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".conf 2> /dev/null +- +- # override branch to build selected branches if defined +- if [[ -n "${BROVER}" ]]; then +- if [[ "${KERNEL_TARGET}" == *${BROVER}* ]]; then +- BRANCH=${BROVER} +- else +- continue +- fi +- fi +- +- # exceptions handling +- [[ ${BOARDFAMILY} == sun*i ]] && BOARDFAMILY=sunxi +- [[ ${BOARDFAMILY} == sun8i-v3s ]] && BOARDFAMILY=sunxi +- [[ ${BOARDFAMILY} == sun*iw* ]] && BOARDFAMILY=sunxi64 +- [[ ${BOARDFAMILY} == meson8b ]] && BOARDFAMILY=meson +- [[ ${BOARDFAMILY} == meson-* ]] && BOARDFAMILY=meson64 +- # small optimisation. we only (try to) build needed kernels +- if [[ $KERNEL_ONLY == yes ]]; then +- LINUXFAMILY="${BOARDFAMILY}" +- array_contains ARRAY "${LINUXFAMILY}${BRANCH}${BUILD_STABILITY}" && continue +- +- elif [[ $BUILD_IMAGE == no ]]; then +- +- continue +- +- fi +- ARRAY+=("${LINUXFAMILY}${BRANCH}${BUILD_STABILITY}") +- +- BUILD_DESKTOP="no" +- BUILD_MINIMAL="no" +- +- [[ ${BUILD_TARGET} == "desktop" && ${BSP_BUILD} != "yes" ]] && BUILD_DESKTOP="yes" +- [[ ${BUILD_TARGET} == "minimal" ]] && BUILD_MINIMAL="yes" +- [[ ${BSP_BUILD} == yes ]] && BUILD_STABILITY=$STABILITY +- +- # create a file and put grep style list of the one that must be skipped: sunxi\|sunxi64 +- [[ -f userpatches/family.skip ]] && grep -qw "$BOARDFAMILY" userpatches/family.skip && continue +- +- # create beta or stable +- if [[ "${BUILD_STABILITY}" == "${STABILITY}" ]]; then +- # check if currnt hash is the same as upstream +- if [[ "$IGNORE_HASH" != yes ]]; then +- local store_hash +- store_hash=$(check_hash) +- fi +- if [[ "$store_hash" != IDENTICAL ]]; then +- +- if [[ $1 != "dryrun" ]] && [[ $n -ge $START ]]; then +- ((n += 1)) +- while :; do +- if [[ $(find /run/armbian/*.pid 2> /dev/null | wc -l) -le ${MULTITHREAD} || ${MULTITHREAD} -eq 0 ]]; then +- break +- fi +- sleep 5 +- done +- +- display_alert "Building ${n}." +- if [[ "$KERNEL_ONLY" == "no" && "${MULTITHREAD}" -gt 0 ]]; then +- build_main & +- sleep $((RANDOM % 25)) +- elif [[ "${MULTITHREAD}" -gt 0 ]]; then +- build_main & +- sleep $((RANDOM % 5)) +- else +- build_main +- fi +- +- # create BSP for all boards +- elif [[ "${BSP_BUILD}" == yes ]]; then +- ((n += 1)) +- for BOARD in "${unique_boards[@]}"; do +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".eos 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".tvb 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".csc 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".wip 2> /dev/null +- # shellcheck source=/dev/null +- source "${SRC}/config/boards/${BOARD}".conf 2> /dev/null +- IFS=',' read -r -a RELBRANCH <<< "${KERNEL_TARGET}" +- for BRANCH in "${RELBRANCH[@]}"; do +- RELTARGETS=($(ls -1d config/distributions/*/ | cut -d"/" -f3)) +- # we don't need to cycle all distributions when making u-boot package +- [[ $BOOTONLY == "yes" ]] && RELTARGETS=(focal) +- for RELEASE in "${RELTARGETS[@]}"; do +- display_alert "BSP for ${BOARD} ${BRANCH} ${RELEASE}." +- if [[ "$IGNORE_HASH" == yes && "$KERNEL_ONLY" != "yes" && "${MULTITHREAD}" -gt 0 ]]; then +- build_main & +- sleep 0.02 +- elif [[ "${MULTITHREAD}" -gt 0 ]]; then +- build_main & +- sleep $((RANDOM % 5)) +- else +- build_main +- fi +- # unset non board related stuff +- unset_all +- done +- done +- done +- display_alert "Done building all BSP images" +- exit +- else +- ((n += 1)) +- # In dryrun it only prints out what will be build but also color green if file already exists +- FIND="$SRC/output/images/$BOARD/$upload_subdir/Armbian_$(cat "${SRC}"/VERSION)_${BOARD^}_${RELEASE}_${BRANCH}" +- if ls $FIND* 1> /dev/null 2>&1; then +- echo -ne "\e[0;92m" +- else +- echo -ne "\x1B[0m" +- fi +- printf "%s\t%-32s\t%-8s\t%-14s\t%-6s\t%-6s\t%-6s\t%-6s\n" "${n}." \ +- "$BOARD (${BOARDFAMILY})" "${BRANCH}" "${RELEASE}" "${DESKTOP_ENVIRONMENT}" "${BUILD_DESKTOP}" "${BUILD_MINIMAL}" "${DESKTOP_APPGROUPS_SELECTED}" +- fi +- fi +- fi +- +- # at which image to stop +- [[ "$STOP" == "$n" ]] && [[ $1 != "dryrun" ]] && exit +- done < "${BUILD_TARGETS}" +- +-} +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index cec0c0fc7..6b14c18a2 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -73,15 +73,6 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/kernel.sh + source "${SRC}"/lib/functions/compilation/kernel.sh + +-# no errors tolerated. invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/patch/apply.sh +-# shellcheck source=lib/functions/compilation/patch/apply.sh +-source "${SRC}"/lib/functions/compilation/patch/apply.sh +- + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +@@ -118,6 +109,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/patch/kernel-pkg.sh + source "${SRC}"/lib/functions/compilation/patch/kernel-pkg.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/patch/patching.sh ++# shellcheck source=lib/functions/compilation/patch/patching.sh ++source "${SRC}"/lib/functions/compilation/patch/patching.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +@@ -370,15 +370,6 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/main/rootfs-image.sh + source "${SRC}"/lib/functions/main/rootfs-image.sh + +-# no errors tolerated. invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/multi/build-all.sh +-# shellcheck source=lib/functions/multi/build-all.sh +-source "${SRC}"/lib/functions/multi/build-all.sh +- + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + +From 68efe99a09da93c27a9cf20d1f14fc9354c73b92 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 19:27:06 +0100 +Subject: [PATCH] armbian-next: `interactive_desktop_main_configuration()` and + stderr'ed + error handl'ed dialog + +- use redirection to fd 3 for dialog, now cleanly on stderr +- `show_menu()` -> `dialog_menu()` et al +- interactive configuration now works again! +--- + lib/functions/configuration/config-desktop.sh | 61 ++++++++++++--------------- + lib/functions/configuration/interactive.sh | 14 +++--- + lib/functions/configuration/main-config.sh | 16 ++----- + lib/functions/configuration/menu.sh | 49 +++++++++++++-------- + lib/functions/general/host.sh | 2 +- + lib/functions/main/config-prepare.sh | 3 +- + 6 files changed, 72 insertions(+), 73 deletions(-) + +diff --git a/lib/functions/configuration/config-desktop.sh b/lib/functions/configuration/config-desktop.sh +index 32afa4a95..72ddd07ec 100644 +--- a/lib/functions/configuration/config-desktop.sh ++++ b/lib/functions/configuration/config-desktop.sh +@@ -66,7 +66,8 @@ function desktop_environment_check_if_valid() { + exit_with_error "${error_msg}" + } + +-function desktop_main_configuration_interactive() { ++function interactive_desktop_main_configuration() { ++ [[ $BUILD_DESKTOP != "yes" ]] && return 0 # Only for desktops. + + # Myy : Once we got a list of selected groups, parse the PACKAGE_LIST inside configuration.sh + DESKTOP_ELEMENTS_DIR="${SRC}/config/desktop/${RELEASE}" +@@ -74,37 +75,36 @@ function desktop_main_configuration_interactive() { + DESKTOP_CONFIG_PREFIX="config_" + DESKTOP_APPGROUPS_DIR="${DESKTOP_ELEMENTS_DIR}/appgroups" + +- display_alert "Handling some" "desktop config stuff 1" "${DESKTOP_CONFIGS_DIR}" "debug" ++ display_alert "desktop-config" "DESKTOP_ENVIRONMENT entry: ${DESKTOP_ENVIRONMENT}" "debug" + +- if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT ]]; then ++ if [[ -z $DESKTOP_ENVIRONMENT ]]; then + options=() + desktop_environments_prepare_menu + if [[ "${options[0]}" == "" ]]; then + exit_with_error "No desktop environment seems to be available for your board ${BOARD} (ARCH : ${ARCH} - EXPERT : ${EXPERT})" + fi +- DESKTOP_ENVIRONMENT=$(show_menu "Choose a desktop environment" "$backtitle" "Select the default desktop environment to bundle with this image" "${options[@]}") ++ ++ display_alert "Desktops available" "${options[*]}" "debug" ++ dialog_menu "Choose a desktop environment" "$backtitle" "Select the default desktop environment to bundle with this image" "${options[@]}" ++ DESKTOP_ENVIRONMENT="${DIALOG_MENU_RESULT}" ++ + unset options + if [[ -z "${DESKTOP_ENVIRONMENT}" ]]; then + exit_with_error "No desktop environment selected..." + fi + fi +- display_alert "Handling some" "desktop config stuff 2" "debug" + +- if [[ $BUILD_DESKTOP == "yes" ]]; then +- DESKTOP_ENVIRONMENT_DIRPATH="${DESKTOP_CONFIGS_DIR}/${DESKTOP_ENVIRONMENT}" +- desktop_environment_check_if_valid # Make sure desktop config is sane. +- fi ++ display_alert "desktop-config" "DESKTOP_ENVIRONMENT selected: ${DESKTOP_ENVIRONMENT}" "debug" + +- display_alert "Handling some" "desktop config stuff 3" "debug" ++ DESKTOP_ENVIRONMENT_DIRPATH="${DESKTOP_CONFIGS_DIR}/${DESKTOP_ENVIRONMENT}" ++ desktop_environment_check_if_valid # Make sure desktop config is sane. + +- if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then +- # FIXME Check for empty folders, just in case the current maintainer +- # messed up +- # Note, we could also ignore it and don't show anything in the previous +- # menu, but that hides information and make debugging harder, which I +- # don't like. Adding desktop environments as a maintainer is not a +- # trivial nor common task. ++ display_alert "desktop-config" "DESKTOP_ENVIRONMENT_CONFIG_NAME entry: ${DESKTOP_ENVIRONMENT_CONFIG_NAME}" "debug" + ++ if [[ -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then ++ # @FIXME: Myy: Check for empty folders, just in case the current maintainer messed up ++ # Note, we could also ignore it and don't show anything in the previous menu, but that hides information and make debugging harder, which I ++ # don't like. Adding desktop environments as a maintainer is not a trivial nor common task. + options=() + for configuration in "${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_CONFIG_PREFIX}"*; do + config_filename=$(basename ${configuration}) +@@ -112,38 +112,33 @@ function desktop_main_configuration_interactive() { + options+=("${config_filename}" "${config_name} configuration") + done + +- DESKTOP_ENVIRONMENT_CONFIG_NAME=$(show_menu "Choose the desktop environment config" "$backtitle" "Select the configuration for this environment.\nThese are sourced from ${desktop_environment_config_dir}" "${options[@]}") ++ dialog_menu "Choose the desktop environment config" "$backtitle" "Select the configuration for this environment.\nThese are sourced from ${desktop_environment_config_dir}" "${options[@]}" ++ DESKTOP_ENVIRONMENT_CONFIG_NAME="${DIALOG_MENU_RESULT}" + unset options + + if [[ -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then + exit_with_error "No desktop configuration selected... Do you really want a desktop environment ?" + fi + fi +- display_alert "Handling some" "desktop config stuff 4" "debug" ++ display_alert "desktop-config" "DESKTOP_ENVIRONMENT_CONFIG_NAME exit: ${DESKTOP_ENVIRONMENT_CONFIG_NAME}" "debug" + +- if [[ $BUILD_DESKTOP == "yes" ]]; then +- DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH="${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_ENVIRONMENT_CONFIG_NAME}" +- DESKTOP_ENVIRONMENT_PACKAGE_LIST_FILEPATH="${DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH}/packages" +- fi ++ export DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH="${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_ENVIRONMENT_CONFIG_NAME}" ++ export DESKTOP_ENVIRONMENT_PACKAGE_LIST_FILEPATH="${DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH}/packages" + ++ display_alert "desktop-config" "DESKTOP_APPGROUPS_SELECTED+x entry: ${DESKTOP_APPGROUPS_SELECTED+x}" "debug" + # "-z ${VAR+x}" allows to check for unset variable + # Technically, someone might want to build a desktop with no additional + # appgroups. +- if [[ $BUILD_DESKTOP == "yes" && -z ${DESKTOP_APPGROUPS_SELECTED+x} ]]; then ++ if [[ -z ${DESKTOP_APPGROUPS_SELECTED+x} ]]; then + options=() + for appgroup_path in "${DESKTOP_APPGROUPS_DIR}/"*; do + appgroup="$(basename "${appgroup_path}")" + options+=("${appgroup}" "${appgroup^}" off) + done +- # FIXME: pardini: here's a subshell to run dialog. in the middle of the main config. refactor this away +- DESKTOP_APPGROUPS_SELECTED=$( +- show_select_menu \ +- "Choose desktop softwares to add" \ +- "$backtitle" \ +- "Select which kind of softwares you'd like to add to your build" \ +- "${options[@]}" +- ) ++ ++ dialog_checklist "Choose desktop softwares to add" "$backtitle" "Select which kind of softwares you'd like to add to your build" "${options[@]}" ++ DESKTOP_APPGROUPS_SELECTED="${DIALOG_CHECKLIST_RESULT}" + unset options + fi +- display_alert "Done with" "desktop config stuff - END" "debug" ++ display_alert "desktop-config" "DESKTOP_APPGROUPS_SELECTED exit: ${DESKTOP_APPGROUPS_SELECTED}" "debug" + } +diff --git a/lib/functions/configuration/interactive.sh b/lib/functions/configuration/interactive.sh +index 28486fa02..165f6257f 100644 +--- a/lib/functions/configuration/interactive.sh ++++ b/lib/functions/configuration/interactive.sh +@@ -22,7 +22,7 @@ function interactive_config_ask_kernel_only() { + [[ -n ${KERNEL_ONLY} ]] && return 0 + options+=("yes" "U-boot and kernel packages") + options+=("no" "Full OS image for flashing") +- dialog_if_terminal_set_vars --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ dialog_if_terminal_set_vars --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + KERNEL_ONLY="${DIALOG_RESULT}" + [[ "${DIALOG_EXIT_CODE}" != "0" ]] && exit_with_error "You cancelled interactive during KERNEL_ONLY selection: '${DIALOG_EXIT_CODE}'" "Build cancelled: ${DIALOG_EXIT_CODE}" + unset options +@@ -33,7 +33,7 @@ function interactive_config_ask_kernel_configure() { + options+=("no" "Do not change the kernel configuration") + options+=("yes" "Show a kernel configuration menu before compilation") + options+=("prebuilt" "Use precompiled packages from Armbian repository") +- dialog_if_terminal_set_vars --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ dialog_if_terminal_set_vars --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + KERNEL_CONFIGURE="${DIALOG_RESULT}" + [[ ${DIALOG_EXIT_CODE} != 0 ]] && exit_with_error "You cancelled interactive during kernel configuration" "Build cancelled" + unset options +@@ -83,7 +83,7 @@ function interactive_config_ask_board_list() { + fi + + DIALOGRC=$temp_rc \ +- dialog_if_terminal_set_vars --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ ++ dialog_if_terminal_set_vars --title "Choose a board" --backtitle "$backtitle" --scrollbar \ + --colors --extra-label "Show $WIP_BUTTON" --extra-button \ + --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + BOARD="${DIALOG_RESULT}" +@@ -125,7 +125,7 @@ function interactive_config_ask_branch() { + if [[ "${#options[@]}" == 2 ]]; then + BRANCH="${options[0]}" + else +- dialog_if_terminal_set_vars --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ ++ dialog_if_terminal_set_vars --title "Choose a kernel" --backtitle "$backtitle" --colors \ + --menu "Select the target kernel branch\nExact kernel versions depend on selected board" \ + $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + BRANCH="${DIALOG_RESULT}" +@@ -141,7 +141,7 @@ function interactive_config_ask_release() { + + options=() + distros_options +- dialog_if_terminal_set_vars --stdout --title "Choose a release package base" --backtitle "$backtitle" --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ dialog_if_terminal_set_vars --title "Choose a release package base" --backtitle "$backtitle" --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + RELEASE="${DIALOG_RESULT}" + [[ -z ${RELEASE} ]] && exit_with_error "No release selected" + unset options +@@ -158,7 +158,7 @@ function interactive_config_ask_desktop_build() { + options=() + options+=("no" "Image with console interface (server)") + options+=("yes" "Image with desktop environment") +- dialog_if_terminal_set_vars --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ dialog_if_terminal_set_vars --title "Choose image type" --backtitle "$backtitle" --no-tags \ + --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + BUILD_DESKTOP="${DIALOG_RESULT}" + unset options +@@ -177,7 +177,7 @@ function interactive_config_ask_standard_or_minimal() { + options=() + options+=("no" "Standard image with console interface") + options+=("yes" "Minimal image with console interface") +- dialog_if_terminal_set_vars --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ dialog_if_terminal_set_vars --title "Choose image type" --backtitle "$backtitle" --no-tags \ + --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" + BUILD_MINIMAL="${DIALOG_RESULT}" + unset options +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 848474b09..5f43fb075 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -217,7 +217,7 @@ function do_main_configuration() { + it is often used to in turn override those. + POST_FAMILY_CONFIG + +- desktop_main_configuration_interactive ++ interactive_desktop_main_configuration + + # dropbear needs to be configured differently # @TODO: rpardini: yes, and? are you a lost leftover comment from a previous era? + [[ $CRYPTROOT_ENABLE == yes && $RELEASE == xenial ]] && exit_with_error "Encrypted rootfs is not supported in Xenial" +@@ -295,17 +295,9 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + PACKAGE_LIST="$(one_line aggregate_all_cli "packages" " ")" + PACKAGE_LIST_ADDITIONAL="$(one_line aggregate_all_cli "packages.additional" " ")" + +- LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/debootstrap-list.log" +- +- # Dependent desktop packages +- # Myy : Sources packages from file here +- +- # Myy : FIXME Rename aggregate_all to aggregate_all_desktop # @TODO: rpardini: already done? + if [[ $BUILD_DESKTOP == "yes" ]]; then + PACKAGE_LIST_DESKTOP+="$(one_line aggregate_all_desktop "packages" " ")" +- echo -e "\nGroups selected ${DESKTOP_APPGROUPS_SELECTED} -> PACKAGES :" >> "${LOG_OUTPUT_FILE}" + fi +- unset LOG_OUTPUT_FILE + + DEBIAN_MIRROR='deb.debian.org/debian' + DEBIAN_SECURTY='security.debian.org/' +@@ -333,10 +325,8 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + # don't use mirrors that throws garbage on 404 + if [[ -z ${ARMBIAN_MIRROR} ]]; then + while true; do +- + ARMBIAN_MIRROR=$(wget -SO- -T 1 -t 1 https://redirect.armbian.com 2>&1 | egrep -i "Location" | awk '{print $2}' | head -1) + [[ ${ARMBIAN_MIRROR} != *armbian.hosthatch* ]] && break +- + done + fi + +@@ -363,10 +353,9 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + EXTENSION_PREPARE_CONFIG + + # apt-cacher-ng mirror configurarion ++ APT_MIRROR=$DEBIAN_MIRROR + if [[ $DISTRIBUTION == Ubuntu ]]; then + APT_MIRROR=$UBUNTU_MIRROR +- else +- APT_MIRROR=$DEBIAN_MIRROR + fi + + [[ -n $APT_PROXY_ADDR ]] && display_alert "Using custom apt-cacher-ng address" "$APT_PROXY_ADDR" "info" +@@ -391,6 +380,7 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + PACKAGE_LIST_UNINSTALL="$(cleanup_list aggregated_content)" + unset aggregated_content + ++ # @TODO: rpardini: this has to stop. refactor this into array or dict-based and stop the madness. + if [[ -n $PACKAGE_LIST_RM ]]; then + # Turns out that \b can be tricked by dashes. + # So if you remove mesa-utils but still want to install "mesa-utils-extra" +diff --git a/lib/functions/configuration/menu.sh b/lib/functions/configuration/menu.sh +index c0ecc6e06..64b5350f3 100644 +--- a/lib/functions/configuration/menu.sh ++++ b/lib/functions/configuration/menu.sh +@@ -1,47 +1,60 @@ + # Stuff involving dialog + + # rpardini: dialog reports what happened via nonzero exit codes. +-# most certainly, we also want to capture the stdout of dialog. ++# we also want to capture the stdout of dialog. + # this is a helper function that handles the error logging on/off and does the capturing +-# then reports via exported variables, which we can test directly. +-# warning: this will exit on errors if dialog is not a terminal or running under CI, or if dialog not installed +-# otherwise it will NOT exit on common errors. ++# then reports via exported variables, which the caller can/should test for later. ++# warning: this will exit with error if stdin/stdout/stderr is not a terminal or running under CI, or if dialog not installed ++# otherwise it will NOT exit with error, even if user cancelled. ++# This is a boring topic, see https://askubuntu.com/questions/491509/how-to-get-dialog-box-input-directed-to-a-variable + function dialog_if_terminal_set_vars() { + export DIALOG_RESULT="" + export DIALOG_EXIT_CODE=0 ++ + [[ ! -t 0 ]] && exit_with_error "stdin is not a terminal. can't use dialog." "dialog_if_terminal_set_vars ${*}" "err" ++ [[ ! -t 1 ]] && exit_with_error "stdout is not a terminal. can't use dialog." "dialog_if_terminal_set_vars ${*}" "err" ++ [[ ! -t 2 ]] && exit_with_error "stderr is not a terminal. can't use dialog." "dialog_if_terminal_set_vars ${*}" "err" ++ + [[ "${CI}" == "true" ]] && exit_with_error "CI=true. can't use dialog." "dialog_if_terminal_set_vars ${*}" "err" ++ + [[ ! -f /usr/bin/dialog ]] && exit_with_error "Dialog is not installed at /usr/bin/dialog" "dialog_if_terminal_set_vars ${*}" "err" ++ + set +e # allow errors through + set +o errtrace # do not trap errors inside a subshell/function + set +o errexit # disable +- DIALOG_RESULT=$(dialog "$@") +- export DIALOG_EXIT_CODE=$? +- export DIALOG_RESULT ++ ++ exec 3>&1 # open fd 3... ++ DIALOG_RESULT=$(dialog "$@" 2>&1 1>&3) # juggle fds and capture. ++ DIALOG_EXIT_CODE=$? # get the exit code. ++ exec 3>&- # close fd 3... ++ + set -e # back to normal + set -o errtrace # back to normal + set -o errexit # back to normal +- return 0 # always success ++ ++ return 0 # always success, caller must check DIALOG_EXIT_CODE and DIALOG_RESULT + } + + # Myy : Menu configuration for choosing desktop configurations +-show_menu() { ++dialog_menu() { ++ export DIALOG_MENU_RESULT="" + provided_title=$1 + provided_backtitle=$2 + provided_menuname=$3 +- dialog_if_terminal_set_vars --stdout --title "$provided_title" --backtitle "${provided_backtitle}" --menu "$provided_menuname" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" +- [[ $DIALOG_EXIT_CODE != 0 ]] && return $DIALOG_EXIT_CODE +- echo -n "${DIALOG_RESULT}" ++ dialog_if_terminal_set_vars --title "$provided_title" --backtitle "${provided_backtitle}" --menu "$provided_menuname" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" ++ DIALOG_MENU_RESULT="${DIALOG_RESULT}" ++ return $DIALOG_EXIT_CODE + } + +-# Myy : FIXME Factorize +-show_select_menu() { ++# Almost identical, but is a checklist instead of menu ++dialog_checklist() { ++ export DIALOG_CHECKLIST_RESULT="" + provided_title=$1 + provided_backtitle=$2 + provided_menuname=$3 +- dialog_if_terminal_set_vars --stdout --title "${provided_title}" --backtitle "${provided_backtitle}" --checklist "${provided_menuname}" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" +- [[ $DIALOG_EXIT_CODE != 0 ]] && return $DIALOG_EXIT_CODE +- echo -n "${DIALOG_RESULT}" ++ dialog_if_terminal_set_vars --title "${provided_title}" --backtitle "${provided_backtitle}" --checklist "${provided_menuname}" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" ++ DIALOG_CHECKLIST_RESULT="${DIALOG_RESULT}" ++ return $DIALOG_EXIT_CODE + } + + # Other menu stuff +@@ -63,7 +76,7 @@ show_developer_warning() { + - Forum posts related to dev kernel, CSC, WIP and EOS boards + should be created in the \Z2\"Community forums\"\Zn section + " +- DIALOGRC=$temp_rc dialog_if_terminal_set_vars --stdout --title "Expert mode warning" --backtitle "${backtitle}" --colors --defaultno --no-label "I do not agree" --yes-label "I understand and agree" --yesno "$warn_text" "${TTY_Y}" "${TTY_X}" ++ DIALOGRC=$temp_rc dialog_if_terminal_set_vars --title "Expert mode warning" --backtitle "${backtitle}" --colors --defaultno --no-label "I do not agree" --yes-label "I understand and agree" --yesno "$warn_text" "${TTY_Y}" "${TTY_X}" + [[ ${DIALOG_EXIT_CODE} -ne 0 ]] && exit_with_error "Error switching to the expert mode" + SHOW_WARNING=no + } +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index ff5f9ee89..2af993dc9 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -268,7 +268,7 @@ prepare_host() { + display_alert "Low free space left" "$(($freespace / 1073741824)) GiB" "wrn" + # pause here since dialog-based menu will hide this message otherwise + echo -e "Press \e[0;33m\x1B[0m to abort compilation, \e[0;33m\x1B[0m to ignore and continue" +- read ++ read # @TODO: this fails if stdin is not a tty, or just hangs + fi + } + +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 98a0260e6..e26f11b3f 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -17,6 +17,7 @@ function prepare_and_config_main_build_single() { + [[ -z $LANGUAGE ]] && export LANGUAGE="en_US:en" # set to english if not set + [[ -z $CONSOLE_CHAR ]] && export CONSOLE_CHAR="UTF-8" # set console to UTF-8 if not set + ++ # @TODO: rpardini: this definitely should NOT be done during config preparation. move outside + if [[ "${CONFIG_DEFS_ONLY}" != "yes" ]]; then + # set log path + LOG_SUBPATH=${LOG_SUBPATH:=debug} +@@ -40,7 +41,7 @@ function prepare_and_config_main_build_single() { + # PROGRESS_LOG_TO_FILE is either yes, or unset. (@TODO: this is still used in buildpkg) + if [[ $PROGRESS_LOG_TO_FILE != yes ]]; then unset PROGRESS_LOG_TO_FILE; fi + +- SHOW_WARNING=yes ++ export SHOW_WARNING=yes # If you try something that requires EXPERT=yes. + + display_alert "Starting single build process" "${BOARD}" "info" + + +From 8aed5b427cbc6fd3ddef54b604ee0a8287ebdd7b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 16:36:59 +0100 +Subject: [PATCH] armbian-next: logging: `SHOW_PIDS=yes` + +--- + lib/functions/logging/logging.sh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index a3c6523ad..cb6876420 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -175,8 +175,13 @@ function display_alert() { + timing_info="${tool_color}(${normal_color}$(printf "%3s" "${SECONDS}")${tool_color})" # SECONDS is bash builtin for seconds since start of script. + fi + ++ local pids_info="" ++ if [[ "${SHOW_PIDS}" == "yes" ]]; then ++ pids_info="${tool_color}(${normal_color}$$ - ${BASHPID}${tool_color})" # BASHPID is the current subshell; $$ is parent's? ++ fi ++ + [[ -n $2 ]] && extra=" [${inline_logs_color} ${2} ${normal_color}]" +- echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker}${timing_info} ${normal_color}${message}${extra}${normal_color}" >&2 ++ echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker}${timing_info}${pids_info} ${normal_color}${message}${extra}${normal_color}" >&2 + + # Now write to CI, if we're running on it + if [[ "${CI}" == "true" ]] && [[ "${ci_log}" != "" ]]; then + +From 5ede8ce433706f6e98413a2e976c8698bbc85afa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 16:36:18 +0100 +Subject: [PATCH] armbian-next: refactor and error-handle most of desktop + configuration, incl menus/dialog + +- `dialog_if_terminal_set_vars()` in place of `dialog_if_terminal()` +--- + lib/functions/configuration/config-desktop.sh | 137 ++++++++++--- + lib/functions/configuration/interactive.sh | 278 ++++++++++++++------------ + lib/functions/configuration/main-config.sh | 96 +-------- + lib/functions/configuration/menu.sh | 51 +++-- + lib/functions/general/repo.sh | 1 + + lib/functions/main/config-prepare.sh | 6 +- + 6 files changed, 289 insertions(+), 280 deletions(-) + +diff --git a/lib/functions/configuration/config-desktop.sh b/lib/functions/configuration/config-desktop.sh +index 89658fe3b..32afa4a95 100644 +--- a/lib/functions/configuration/config-desktop.sh ++++ b/lib/functions/configuration/config-desktop.sh +@@ -1,61 +1,60 @@ +-desktop_element_available_for_arch() { ++function desktop_element_available_for_arch() { + local desktop_element_path="${1}" + local targeted_arch="${2}" +- + local arch_limitation_file="${1}/only_for" +- + echo "Checking if ${desktop_element_path} is available for ${targeted_arch} in ${arch_limitation_file}" >> "${DEST}"/${LOG_SUBPATH}/output.log + if [[ -f "${arch_limitation_file}" ]]; then +- grep -- "${targeted_arch}" "${arch_limitation_file}" +- return $? +- else +- return 0 ++ if ! grep -- "${targeted_arch}" "${arch_limitation_file}"; then ++ return 1 ++ fi + fi ++ return 0 + } +-desktop_element_supported() { + ++function desktop_element_supported() { + local desktop_element_path="${1}" +- + local support_level_filepath="${desktop_element_path}/support" ++ export desktop_element_supported_result=0 + if [[ -f "${support_level_filepath}" ]]; then + local support_level="$(cat "${support_level_filepath}")" + if [[ "${support_level}" != "supported" && "${EXPERT}" != "yes" ]]; then +- return 65 ++ desktop_element_supported_result=65 ++ return 0 + fi +- +- desktop_element_available_for_arch "${desktop_element_path}" "${ARCH}" +- if [[ $? -ne 0 ]]; then +- return 66 ++ if ! desktop_element_available_for_arch "${desktop_element_path}" "${ARCH}"; then ++ desktop_element_supported_result=66 ++ return 0 + fi + else +- return 64 ++ desktop_element_supported_result=64 ++ return 0 + fi +- + return 0 +- + } +-desktop_environments_prepare_menu() { ++ ++function desktop_environments_prepare_menu() { + for desktop_env_dir in "${DESKTOP_CONFIGS_DIR}/"*; do +- local desktop_env_name=$(basename ${desktop_env_dir}) +- local expert_infos="" ++ local desktop_env_name expert_infos="" desktop_element_supported_result=0 ++ desktop_env_name=$(basename ${desktop_env_dir}) + [[ "${EXPERT}" == "yes" ]] && expert_infos="[$(cat "${desktop_env_dir}/support" 2> /dev/null)]" +- desktop_element_supported "${desktop_env_dir}" "${ARCH}" && options+=("${desktop_env_name}" "${desktop_env_name^} desktop environment ${expert_infos}") ++ desktop_element_supported "${desktop_env_dir}" "${ARCH}" ++ [[ ${desktop_element_supported_result} == 0 ]] && options+=("${desktop_env_name}" "${desktop_env_name^} desktop environment ${expert_infos}") + done ++ return 0 + } +-desktop_environment_check_if_valid() { + +- local error_msg="" ++function desktop_environment_check_if_valid() { ++ local error_msg="" desktop_element_supported_result=0 + desktop_element_supported "${DESKTOP_ENVIRONMENT_DIRPATH}" "${ARCH}" +- local retval=$? + +- if [[ ${retval} == 0 ]]; then ++ if [[ ${desktop_element_supported_result} == 0 ]]; then + return +- elif [[ ${retval} == 64 ]]; then ++ elif [[ ${desktop_element_supported_result} == 64 ]]; then + error_msg+="Either the desktop environment ${DESKTOP_ENVIRONMENT} does not exist " + error_msg+="or the file ${DESKTOP_ENVIRONMENT_DIRPATH}/support is missing" +- elif [[ ${retval} == 65 ]]; then ++ elif [[ ${desktop_element_supported_result} == 65 ]]; then + error_msg+="Only experts can build an image with the desktop environment \"${DESKTOP_ENVIRONMENT}\", since the Armbian team won't offer any support for it (EXPERT=${EXPERT})" +- elif [[ ${retval} == 66 ]]; then ++ elif [[ ${desktop_element_supported_result} == 66 ]]; then + error_msg+="The desktop environment \"${DESKTOP_ENVIRONMENT}\" has no packages for your targeted board architecture (BOARD=${BOARD} ARCH=${ARCH}). " + error_msg+="The supported boards architectures are : " + error_msg+="$(cat "${DESKTOP_ENVIRONMENT_DIRPATH}/only_for")" +@@ -66,3 +65,85 @@ desktop_environment_check_if_valid() { + + exit_with_error "${error_msg}" + } ++ ++function desktop_main_configuration_interactive() { ++ ++ # Myy : Once we got a list of selected groups, parse the PACKAGE_LIST inside configuration.sh ++ DESKTOP_ELEMENTS_DIR="${SRC}/config/desktop/${RELEASE}" ++ DESKTOP_CONFIGS_DIR="${DESKTOP_ELEMENTS_DIR}/environments" ++ DESKTOP_CONFIG_PREFIX="config_" ++ DESKTOP_APPGROUPS_DIR="${DESKTOP_ELEMENTS_DIR}/appgroups" ++ ++ display_alert "Handling some" "desktop config stuff 1" "${DESKTOP_CONFIGS_DIR}" "debug" ++ ++ if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT ]]; then ++ options=() ++ desktop_environments_prepare_menu ++ if [[ "${options[0]}" == "" ]]; then ++ exit_with_error "No desktop environment seems to be available for your board ${BOARD} (ARCH : ${ARCH} - EXPERT : ${EXPERT})" ++ fi ++ DESKTOP_ENVIRONMENT=$(show_menu "Choose a desktop environment" "$backtitle" "Select the default desktop environment to bundle with this image" "${options[@]}") ++ unset options ++ if [[ -z "${DESKTOP_ENVIRONMENT}" ]]; then ++ exit_with_error "No desktop environment selected..." ++ fi ++ fi ++ display_alert "Handling some" "desktop config stuff 2" "debug" ++ ++ if [[ $BUILD_DESKTOP == "yes" ]]; then ++ DESKTOP_ENVIRONMENT_DIRPATH="${DESKTOP_CONFIGS_DIR}/${DESKTOP_ENVIRONMENT}" ++ desktop_environment_check_if_valid # Make sure desktop config is sane. ++ fi ++ ++ display_alert "Handling some" "desktop config stuff 3" "debug" ++ ++ if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then ++ # FIXME Check for empty folders, just in case the current maintainer ++ # messed up ++ # Note, we could also ignore it and don't show anything in the previous ++ # menu, but that hides information and make debugging harder, which I ++ # don't like. Adding desktop environments as a maintainer is not a ++ # trivial nor common task. ++ ++ options=() ++ for configuration in "${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_CONFIG_PREFIX}"*; do ++ config_filename=$(basename ${configuration}) ++ config_name=${config_filename#"${DESKTOP_CONFIG_PREFIX}"} ++ options+=("${config_filename}" "${config_name} configuration") ++ done ++ ++ DESKTOP_ENVIRONMENT_CONFIG_NAME=$(show_menu "Choose the desktop environment config" "$backtitle" "Select the configuration for this environment.\nThese are sourced from ${desktop_environment_config_dir}" "${options[@]}") ++ unset options ++ ++ if [[ -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then ++ exit_with_error "No desktop configuration selected... Do you really want a desktop environment ?" ++ fi ++ fi ++ display_alert "Handling some" "desktop config stuff 4" "debug" ++ ++ if [[ $BUILD_DESKTOP == "yes" ]]; then ++ DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH="${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_ENVIRONMENT_CONFIG_NAME}" ++ DESKTOP_ENVIRONMENT_PACKAGE_LIST_FILEPATH="${DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH}/packages" ++ fi ++ ++ # "-z ${VAR+x}" allows to check for unset variable ++ # Technically, someone might want to build a desktop with no additional ++ # appgroups. ++ if [[ $BUILD_DESKTOP == "yes" && -z ${DESKTOP_APPGROUPS_SELECTED+x} ]]; then ++ options=() ++ for appgroup_path in "${DESKTOP_APPGROUPS_DIR}/"*; do ++ appgroup="$(basename "${appgroup_path}")" ++ options+=("${appgroup}" "${appgroup^}" off) ++ done ++ # FIXME: pardini: here's a subshell to run dialog. in the middle of the main config. refactor this away ++ DESKTOP_APPGROUPS_SELECTED=$( ++ show_select_menu \ ++ "Choose desktop softwares to add" \ ++ "$backtitle" \ ++ "Select which kind of softwares you'd like to add to your build" \ ++ "${options[@]}" ++ ) ++ unset options ++ fi ++ display_alert "Done with" "desktop config stuff - END" "debug" ++} +diff --git a/lib/functions/configuration/interactive.sh b/lib/functions/configuration/interactive.sh +index 1f6989ae9..28486fa02 100644 +--- a/lib/functions/configuration/interactive.sh ++++ b/lib/functions/configuration/interactive.sh +@@ -8,171 +8,183 @@ function interactive_config_prepare_terminal() { + export TTY_Y=$(($(stty size | awk '{print $1}') - 6)) # determine terminal height + fi + fi +- + # We'll use this title on all menus +- export backtitle="Armbian building script, https://www.armbian.com | https://docs.armbian.com | (c) 2013-2021 Igor Pecovnik " ++ export backtitle="Armbian building script, https://www.armbian.com | https://docs.armbian.com | (c) 2013-2022 Igor Pecovnik " + } + + function interactive_config_ask_kernel() { +- # @TODO: rpardini: should be refactored into 'menu' or something ++ interactive_config_ask_kernel_only ++ interactive_config_ask_kernel_configure ++} ++ ++function interactive_config_ask_kernel_only() { + # if KERNEL_ONLY, KERNEL_CONFIGURE, BOARD, BRANCH or RELEASE are not set, display selection menu +- if [[ -z $KERNEL_ONLY ]]; then +- options+=("yes" "U-boot and kernel packages") +- options+=("no" "Full OS image for flashing") +- KERNEL_ONLY=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ +- --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- fi ++ [[ -n ${KERNEL_ONLY} ]] && return 0 ++ options+=("yes" "U-boot and kernel packages") ++ options+=("no" "Full OS image for flashing") ++ dialog_if_terminal_set_vars --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ KERNEL_ONLY="${DIALOG_RESULT}" ++ [[ "${DIALOG_EXIT_CODE}" != "0" ]] && exit_with_error "You cancelled interactive during KERNEL_ONLY selection: '${DIALOG_EXIT_CODE}'" "Build cancelled: ${DIALOG_EXIT_CODE}" ++ unset options ++} + +- if [[ -z $KERNEL_CONFIGURE ]]; then +- options+=("no" "Do not change the kernel configuration") +- options+=("yes" "Show a kernel configuration menu before compilation") +- options+=("prebuilt" "Use precompiled packages from Armbian repository") +- KERNEL_CONFIGURE=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ +- --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- fi ++function interactive_config_ask_kernel_configure() { ++ [[ -n ${KERNEL_CONFIGURE} ]] && return 0 ++ options+=("no" "Do not change the kernel configuration") ++ options+=("yes" "Show a kernel configuration menu before compilation") ++ options+=("prebuilt" "Use precompiled packages from Armbian repository") ++ dialog_if_terminal_set_vars --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ KERNEL_CONFIGURE="${DIALOG_RESULT}" ++ [[ ${DIALOG_EXIT_CODE} != 0 ]] && exit_with_error "You cancelled interactive during kernel configuration" "Build cancelled" ++ unset options + } + + function interactive_config_ask_board_list() { +- if [[ -z $BOARD ]]; then +- WIP_STATE=supported +- WIP_BUTTON='CSC/WIP/EOS/TVB' +- STATE_DESCRIPTION=' - boards with high level of software maturity' +- temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow +- +- while true; do +- options=() +- if [[ $WIP_STATE == supported ]]; then +- for board in "${SRC}"/config/boards/*.conf; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "$(head -1 "${board}" | cut -d'#' -f2)") +- done +- else +- for board in "${SRC}"/config/boards/*.wip; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(WIP)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.csc; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(CSC)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.eos; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(EOS)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.tvb; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(TVB)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- fi ++ # if BOARD is not set, display selection menu ++ [[ -n ${BOARD} ]] && return 0 + +- if [[ $WIP_STATE != supported ]]; then +- cat <<- 'EOF' > "${temp_rc}" +- dialog_color = (RED,WHITE,OFF) +- screen_color = (WHITE,RED,ON) +- tag_color = (RED,WHITE,ON) +- item_selected_color = (WHITE,RED,ON) +- tag_selected_color = (WHITE,RED,ON) +- tag_key_selected_color = (WHITE,RED,ON) +- EOF +- else +- echo > "${temp_rc}" +- fi +- BOARD=$(DIALOGRC=$temp_rc dialog_if_terminal --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ +- --colors --extra-label "Show $WIP_BUTTON" --extra-button \ +- --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- STATUS=$? +- if [[ $STATUS == 3 ]]; then +- if [[ $WIP_STATE == supported ]]; then +- [[ $SHOW_WARNING == yes ]] && show_developer_warning +- STATE_DESCRIPTION=' - \Z1(CSC)\Zn - Community Supported Configuration\n - \Z1(WIP)\Zn - Work In Progress +- \n - \Z1(EOS)\Zn - End Of Support\n - \Z1(TVB)\Zn - TV boxes' +- WIP_STATE=unsupported +- WIP_BUTTON='matured' +- EXPERT=yes +- else +- STATE_DESCRIPTION=' - boards with high level of software maturity' +- WIP_STATE=supported +- WIP_BUTTON='CSC/WIP/EOS' +- EXPERT=no +- fi +- continue +- elif [[ $STATUS == 0 ]]; then +- break +- fi +- unset options +- done +- fi +-} ++ WIP_STATE=supported ++ WIP_BUTTON='CSC/WIP/EOS/TVB' ++ STATE_DESCRIPTION=' - boards with high level of software maturity' ++ temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow + +-function interactive_config_ask_branch() { +- # @TODO: rpardini, again, refactor into menu/interactive config stuff +- if [[ -z $BRANCH ]]; then ++ while true; do + options=() +- [[ $KERNEL_TARGET == *current* ]] && options+=("current" "Recommended. Come with best support") +- [[ $KERNEL_TARGET == *legacy* ]] && options+=("legacy" "Old stable / Legacy") +- [[ $KERNEL_TARGET == *edge* && $EXPERT = yes ]] && options+=("edge" "\Z1Bleeding edge from @kernel.org\Zn") ++ if [[ $WIP_STATE == supported ]]; then ++ for board in "${SRC}"/config/boards/*.conf; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "$(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ else ++ for board in "${SRC}"/config/boards/*.wip; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(WIP)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ for board in "${SRC}"/config/boards/*.csc; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(CSC)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ for board in "${SRC}"/config/boards/*.eos; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(EOS)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ for board in "${SRC}"/config/boards/*.tvb; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(TVB)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ fi ++ ++ if [[ $WIP_STATE != supported ]]; then ++ cat <<- 'EOF' > "${temp_rc}" ++ dialog_color = (RED,WHITE,OFF) ++ screen_color = (WHITE,RED,ON) ++ tag_color = (RED,WHITE,ON) ++ item_selected_color = (WHITE,RED,ON) ++ tag_selected_color = (WHITE,RED,ON) ++ tag_key_selected_color = (WHITE,RED,ON) ++ EOF ++ else ++ echo > "${temp_rc}" ++ fi ++ ++ DIALOGRC=$temp_rc \ ++ dialog_if_terminal_set_vars --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ ++ --colors --extra-label "Show $WIP_BUTTON" --extra-button \ ++ --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ BOARD="${DIALOG_RESULT}" ++ STATUS=${DIALOG_EXIT_CODE} + +- # do not display selection dialog if only one kernel branch is available +- if [[ "${#options[@]}" == 2 ]]; then +- BRANCH="${options[0]}" ++ if [[ $STATUS == 3 ]]; then ++ if [[ $WIP_STATE == supported ]]; then ++ [[ $SHOW_WARNING == yes ]] && show_developer_warning ++ STATE_DESCRIPTION=' - \Z1(CSC)\Zn - Community Supported Configuration\n - \Z1(WIP)\Zn - Work In Progress ++ \n - \Z1(EOS)\Zn - End Of Support\n - \Z1(TVB)\Zn - TV boxes' ++ WIP_STATE=unsupported ++ WIP_BUTTON='matured' ++ EXPERT=yes ++ else ++ STATE_DESCRIPTION=' - boards with high level of software maturity' ++ WIP_STATE=supported ++ WIP_BUTTON='CSC/WIP/EOS' ++ EXPERT=no ++ fi ++ continue ++ elif [[ $STATUS == 0 ]]; then ++ break + else +- BRANCH=$(dialog_if_terminal --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ +- --menu "Select the target kernel branch\nExact kernel versions depend on selected board" \ +- $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ exit_with_error "You cancelled interactive config" "Build cancelled, board not chosen" + fi + unset options +- [[ $BRANCH == dev && $SHOW_WARNING == yes ]] && show_developer_warning ++ done ++} ++ ++function interactive_config_ask_branch() { ++ # if BRANCH not set, display selection menu ++ [[ -n $BRANCH ]] && return 0 ++ options=() ++ [[ $KERNEL_TARGET == *current* ]] && options+=("current" "Recommended. Come with best support") ++ [[ $KERNEL_TARGET == *legacy* ]] && options+=("legacy" "Old stable / Legacy") ++ [[ $KERNEL_TARGET == *edge* && $EXPERT = yes ]] && options+=("edge" "\Z1Bleeding edge from @kernel.org\Zn") ++ ++ # do not display selection dialog if only one kernel branch is available ++ if [[ "${#options[@]}" == 2 ]]; then ++ BRANCH="${options[0]}" + else +- [[ $BRANCH == next ]] && KERNEL_TARGET="next" +- # next = new legacy. Should stay for backward compatibility, but be removed from menu above +- # or we left definitions in board configs and only remove menu ++ dialog_if_terminal_set_vars --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ ++ --menu "Select the target kernel branch\nExact kernel versions depend on selected board" \ ++ $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ BRANCH="${DIALOG_RESULT}" + fi ++ [[ -z ${BRANCH} ]] && exit_with_error "No kernel branch selected" ++ unset options + return 0 + } + + function interactive_config_ask_release() { +- if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then +- options=() +- distros_options +- RELEASE=$(dialog_if_terminal --stdout --title "Choose a release package base" --backtitle "$backtitle" \ +- --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- echo "options : ${options}" +- unset options +- fi ++ [[ $KERNEL_ONLY == yes ]] && return 0 # Don't ask if building packages only. ++ [[ -n ${RELEASE} ]] && return 0 ++ ++ options=() ++ distros_options ++ dialog_if_terminal_set_vars --stdout --title "Choose a release package base" --backtitle "$backtitle" --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ RELEASE="${DIALOG_RESULT}" ++ [[ -z ${RELEASE} ]] && exit_with_error "No release selected" ++ unset options + } + + function interactive_config_ask_desktop_build() { + # don't show desktop option if we choose minimal build + [[ $BUILD_MINIMAL == yes ]] && BUILD_DESKTOP=no + +- if [[ $KERNEL_ONLY != yes && -z $BUILD_DESKTOP ]]; then +- # read distribution support status which is written to the armbian-release file +- set_distribution_status +- options=() +- options+=("no" "Image with console interface (server)") +- options+=("yes" "Image with desktop environment") +- BUILD_DESKTOP=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ +- --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- [[ -z $BUILD_DESKTOP ]] && exit_with_error "No option selected" +- if [[ ${BUILD_DESKTOP} == "yes" ]]; then +- BUILD_MINIMAL=no +- SELECTED_CONFIGURATION="desktop" +- fi ++ [[ $KERNEL_ONLY == yes ]] && return 0 ++ [[ -n ${BUILD_DESKTOP} ]] && return 0 ++ # read distribution support status which is written to the armbian-release file ++ set_distribution_status ++ options=() ++ options+=("no" "Image with console interface (server)") ++ options+=("yes" "Image with desktop environment") ++ dialog_if_terminal_set_vars --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ BUILD_DESKTOP="${DIALOG_RESULT}" ++ unset options ++ [[ -z $BUILD_DESKTOP ]] && exit_with_error "No image type selected" ++ if [[ ${BUILD_DESKTOP} == "yes" ]]; then ++ BUILD_MINIMAL=no ++ SELECTED_CONFIGURATION="desktop" + fi + return 0 + } + + function interactive_config_ask_standard_or_minimal() { +- if [[ $KERNEL_ONLY != yes && $BUILD_DESKTOP == no && -z $BUILD_MINIMAL ]]; then +- options=() +- options+=("no" "Standard image with console interface") +- options+=("yes" "Minimal image with console interface") +- BUILD_MINIMAL=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ +- --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- [[ -z $BUILD_MINIMAL ]] && exit_with_error "No option selected" +- if [[ $BUILD_MINIMAL == "yes" ]]; then +- SELECTED_CONFIGURATION="cli_minimal" +- else +- SELECTED_CONFIGURATION="cli_standard" +- fi ++ [[ $KERNEL_ONLY == yes ]] && return 0 ++ [[ $BUILD_DESKTOP != no ]] && return 0 ++ [[ -n $BUILD_MINIMAL ]] && return 0 ++ options=() ++ options+=("no" "Standard image with console interface") ++ options+=("yes" "Minimal image with console interface") ++ dialog_if_terminal_set_vars --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}" ++ BUILD_MINIMAL="${DIALOG_RESULT}" ++ unset options ++ [[ -z $BUILD_MINIMAL ]] && exit_with_error "No standard/minimal selected" ++ if [[ $BUILD_MINIMAL == "yes" ]]; then ++ SELECTED_CONFIGURATION="cli_minimal" ++ else ++ SELECTED_CONFIGURATION="cli_standard" + fi + } +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 883550d79..848474b09 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -217,98 +217,7 @@ function do_main_configuration() { + it is often used to in turn override those. + POST_FAMILY_CONFIG + +- display_alert "Handling some" "desktop config stuff 1" "debug" +- +- # Myy : Once we got a list of selected groups, parse the PACKAGE_LIST inside configuration.sh +- DESKTOP_ELEMENTS_DIR="${SRC}/config/desktop/${RELEASE}" +- DESKTOP_CONFIGS_DIR="${DESKTOP_ELEMENTS_DIR}/environments" +- DESKTOP_CONFIG_PREFIX="config_" +- DESKTOP_APPGROUPS_DIR="${DESKTOP_ELEMENTS_DIR}/appgroups" +- +- if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT ]]; then +- +- options=() +- desktop_environments_prepare_menu +- +- if [[ "${options[0]}" == "" ]]; then +- exit_with_error "No desktop environment seems to be available for your board ${BOARD} (ARCH : ${ARCH} - EXPERT : ${EXPERT})" +- fi +- +- DESKTOP_ENVIRONMENT=$(show_menu "Choose a desktop environment" "$backtitle" "Select the default desktop environment to bundle with this image" "${options[@]}") +- +- unset options +- +- if [[ -z "${DESKTOP_ENVIRONMENT}" ]]; then +- exit_with_error "No desktop environment selected..." +- fi +- +- fi +- display_alert "Handling some" "desktop config stuff 2" "debug" +- +- if [[ $BUILD_DESKTOP == "yes" ]]; then +- # Expected environment variables : +- # - options +- # - ARCH +- +- DESKTOP_ENVIRONMENT_DIRPATH="${DESKTOP_CONFIGS_DIR}/${DESKTOP_ENVIRONMENT}" +- +- desktop_environment_check_if_valid +- fi +- display_alert "Handling some" "desktop config stuff 3" "debug" +- +- if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then +- # FIXME Check for empty folders, just in case the current maintainer +- # messed up +- # Note, we could also ignore it and don't show anything in the previous +- # menu, but that hides information and make debugging harder, which I +- # don't like. Adding desktop environments as a maintainer is not a +- # trivial nor common task. +- +- options=() +- for configuration in "${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_CONFIG_PREFIX}"*; do +- config_filename=$(basename ${configuration}) +- config_name=${config_filename#"${DESKTOP_CONFIG_PREFIX}"} +- options+=("${config_filename}" "${config_name} configuration") +- done +- +- DESKTOP_ENVIRONMENT_CONFIG_NAME=$(show_menu "Choose the desktop environment config" "$backtitle" "Select the configuration for this environment.\nThese are sourced from ${desktop_environment_config_dir}" "${options[@]}") +- unset options +- +- if [[ -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then +- exit_with_error "No desktop configuration selected... Do you really want a desktop environment ?" +- fi +- fi +- display_alert "Handling some" "desktop config stuff 4" "debug" +- +- if [[ $BUILD_DESKTOP == "yes" ]]; then +- DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH="${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_ENVIRONMENT_CONFIG_NAME}" +- DESKTOP_ENVIRONMENT_PACKAGE_LIST_FILEPATH="${DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH}/packages" +- fi +- +- # "-z ${VAR+x}" allows to check for unset variable +- # Technically, someone might want to build a desktop with no additional +- # appgroups. +- if [[ $BUILD_DESKTOP == "yes" && -z ${DESKTOP_APPGROUPS_SELECTED+x} ]]; then +- +- options=() +- for appgroup_path in "${DESKTOP_APPGROUPS_DIR}/"*; do +- appgroup="$(basename "${appgroup_path}")" +- options+=("${appgroup}" "${appgroup^}" off) +- done +- +- # FIXME: pardini: here's a subshell to run dialog. in the middle of the main config. refactor this away +- DESKTOP_APPGROUPS_SELECTED=$( +- show_select_menu \ +- "Choose desktop softwares to add" \ +- "$backtitle" \ +- "Select which kind of softwares you'd like to add to your build" \ +- "${options[@]}" +- ) +- +- unset options +- fi +- +- display_alert "Done with" "desktop config stuff - END" "debug" ++ desktop_main_configuration_interactive + + # dropbear needs to be configured differently # @TODO: rpardini: yes, and? are you a lost leftover comment from a previous era? + [[ $CRYPTROOT_ENABLE == yes && $RELEASE == xenial ]] && exit_with_error "Encrypted rootfs is not supported in Xenial" +@@ -336,9 +245,6 @@ function do_main_configuration() { + CLI_CONFIG_PATH="${SRC}/config/cli/${RELEASE}" + DEBOOTSTRAP_CONFIG_PATH="${CLI_CONFIG_PATH}/debootstrap" + +- if [[ $? != 0 ]]; then +- exit_with_error "The desktop environment ${DESKTOP_ENVIRONMENT} is not available for your architecture ${ARCH}" +- fi + + AGGREGATION_SEARCH_ROOT_ABSOLUTE_DIRS=" + ${SRC}/config +diff --git a/lib/functions/configuration/menu.sh b/lib/functions/configuration/menu.sh +index 92afcc5c5..c0ecc6e06 100644 +--- a/lib/functions/configuration/menu.sh ++++ b/lib/functions/configuration/menu.sh +@@ -1,10 +1,27 @@ + # Stuff involving dialog + +-# Pardini: dialog_if_terminal prints error and exits if stdin is not a terminal, or if running under CI. +-function dialog_if_terminal() { +- [[ ! -t 0 ]] && exit_with_error "stdin is not a terminal. can't use dialog." "dialog_if_terminal ${*}" "err" +- [[ "${CI}" == "true" ]] && exit_with_error "CI=true. can't use dialog." "dialog_if_terminal ${*}" "err" +- dialog "$@" ++# rpardini: dialog reports what happened via nonzero exit codes. ++# most certainly, we also want to capture the stdout of dialog. ++# this is a helper function that handles the error logging on/off and does the capturing ++# then reports via exported variables, which we can test directly. ++# warning: this will exit on errors if dialog is not a terminal or running under CI, or if dialog not installed ++# otherwise it will NOT exit on common errors. ++function dialog_if_terminal_set_vars() { ++ export DIALOG_RESULT="" ++ export DIALOG_EXIT_CODE=0 ++ [[ ! -t 0 ]] && exit_with_error "stdin is not a terminal. can't use dialog." "dialog_if_terminal_set_vars ${*}" "err" ++ [[ "${CI}" == "true" ]] && exit_with_error "CI=true. can't use dialog." "dialog_if_terminal_set_vars ${*}" "err" ++ [[ ! -f /usr/bin/dialog ]] && exit_with_error "Dialog is not installed at /usr/bin/dialog" "dialog_if_terminal_set_vars ${*}" "err" ++ set +e # allow errors through ++ set +o errtrace # do not trap errors inside a subshell/function ++ set +o errexit # disable ++ DIALOG_RESULT=$(dialog "$@") ++ export DIALOG_EXIT_CODE=$? ++ export DIALOG_RESULT ++ set -e # back to normal ++ set -o errtrace # back to normal ++ set -o errexit # back to normal ++ return 0 # always success + } + + # Myy : Menu configuration for choosing desktop configurations +@@ -12,14 +29,9 @@ show_menu() { + provided_title=$1 + provided_backtitle=$2 + provided_menuname=$3 +- # Myy : I don't know why there's a TTY_Y - 8... +- #echo "Provided title : $provided_title" +- #echo "Provided backtitle : $provided_backtitle" +- #echo "Provided menuname : $provided_menuname" +- #echo "Provided options : " "${@:4}" +- #echo "TTY X: $TTY_X Y: $TTY_Y" +- dialog_if_terminal --stdout --title "$provided_title" --backtitle "${provided_backtitle}" \ +- --menu "$provided_menuname" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" ++ dialog_if_terminal_set_vars --stdout --title "$provided_title" --backtitle "${provided_backtitle}" --menu "$provided_menuname" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" ++ [[ $DIALOG_EXIT_CODE != 0 ]] && return $DIALOG_EXIT_CODE ++ echo -n "${DIALOG_RESULT}" + } + + # Myy : FIXME Factorize +@@ -27,12 +39,12 @@ show_select_menu() { + provided_title=$1 + provided_backtitle=$2 + provided_menuname=$3 +- dialog_if_terminal --stdout --title "${provided_title}" --backtitle "${provided_backtitle}" \ +- --checklist "${provided_menuname}" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" ++ dialog_if_terminal_set_vars --stdout --title "${provided_title}" --backtitle "${provided_backtitle}" --checklist "${provided_menuname}" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" ++ [[ $DIALOG_EXIT_CODE != 0 ]] && return $DIALOG_EXIT_CODE ++ echo -n "${DIALOG_RESULT}" + } + + # Other menu stuff +- + show_developer_warning() { + local temp_rc + temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow +@@ -51,16 +63,14 @@ show_developer_warning() { + - Forum posts related to dev kernel, CSC, WIP and EOS boards + should be created in the \Z2\"Community forums\"\Zn section + " +- DIALOGRC=$temp_rc dialog_if_terminal --title "Expert mode warning" --backtitle "${backtitle}" --colors --defaultno --no-label "I do not agree" \ +- --yes-label "I understand and agree" --yesno "$warn_text" "${TTY_Y}" "${TTY_X}" +- [[ $? -ne 0 ]] && exit_with_error "Error switching to the expert mode" ++ DIALOGRC=$temp_rc dialog_if_terminal_set_vars --stdout --title "Expert mode warning" --backtitle "${backtitle}" --colors --defaultno --no-label "I do not agree" --yes-label "I understand and agree" --yesno "$warn_text" "${TTY_Y}" "${TTY_X}" ++ [[ ${DIALOG_EXIT_CODE} -ne 0 ]] && exit_with_error "Error switching to the expert mode" + SHOW_WARNING=no + } + + # Stuff that was in config files + function distro_menu() { + # create a select menu for choosing a distribution based EXPERT status +- + local distrib_dir="${1}" + + if [[ -d "${distrib_dir}" && -f "${distrib_dir}/support" ]]; then +@@ -75,7 +85,6 @@ function distro_menu() { + options+=("${distro_codename}" "${distro_fullname} ${expert_infos}") + fi + fi +- + } + + function distros_options() { +diff --git a/lib/functions/general/repo.sh b/lib/functions/general/repo.sh +index be3121527..155151300 100644 +--- a/lib/functions/general/repo.sh ++++ b/lib/functions/general/repo.sh +@@ -193,6 +193,7 @@ repo-manipulate() { + LIST=("${new_list[@]}") + LIST_LENGTH=$((${#LIST[@]} / 2)) + exec 3>&1 ++ # @TODO: this is broken!! revisit + TARGET_VERSION=$(dialog_if_terminal --cancel-label "Cancel" --backtitle "BACKTITLE" --no-collapse --title "Remove packages from repositories" --clear --menu "Delete" $((9 + ${LIST_LENGTH})) 82 65 "${LIST[@]}" 2>&1 1>&3) + exitstatus=$? + exec 3>&- +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 875295a2a..98a0260e6 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -82,7 +82,7 @@ function prepare_and_config_main_build_single() { + [[ -z $KERNEL_ONLY ]] && exit_with_error "No option selected: KERNEL_ONLY" + [[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected: KERNEL_CONFIGURE" + +- interactive_config_ask_board_list ++ interactive_config_ask_board_list # @TODO: rpardini: This obtains a list of boards. refactor that... + [[ -z $BOARD ]] && exit_with_error "No board selected: BOARD" + + if [[ -f $SRC/config/boards/${BOARD}.conf ]]; then +@@ -113,7 +113,7 @@ function prepare_and_config_main_build_single() { + [[ $KERNEL_TARGET != *$BRANCH* ]] && display_alert "Kernel branch not defined for this board" "$BRANCH for ${BOARD}" "warn" + + interactive_config_ask_release +- [[ -z $RELEASE ]] && exit_with_error "No release selected: RELEASE" ++ [[ -z $RELEASE && ${KERNEL_ONLY} != yes ]] && exit_with_error "No release selected: RELEASE" + + interactive_config_ask_desktop_build + +@@ -191,7 +191,7 @@ function prepare_and_config_main_build_single() { + export KERNEL_MAJOR=5 + export KERNEL_MAJOR_SHALLOW_TAG="v${KERNEL_MAJOR_MINOR}-rc1" + elif linux-version compare "${KERNEL_MAJOR_MINOR}" ge "4.4" && linux-version compare "${KERNEL_MAJOR_MINOR}" lt "5.0"; then +- export KERNEL_MAJOR=4 # We support 4.x from 4.4; all require custom packaging. ++ export KERNEL_MAJOR=4 # We support 4.x from 4.4; all require custom packaging. + export KERNEL_MAJOR_SHALLOW_TAG="v${KERNEL_MAJOR_MINOR}-rc1" + else + exit_with_error "Kernel series unsupported" "'${KERNEL_MAJOR_MINOR}' is unsupported, or bad config" + +From 6d5802b05da59513e169dd2837d293b8d99e95c4 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 01:27:39 +0100 +Subject: [PATCH] [WiP] ddk stuff, allow if not in `$KERNEL_TARGET` + +--- + lib/functions/main/config-prepare.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 56616cff6..875295a2a 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -102,7 +102,7 @@ function prepare_and_config_main_build_single() { + display_alert "Sourcing board configuration" "${BOARD}.${BOARD_TYPE}" "info" + # shellcheck source=/dev/null + source "${SRC}/config/boards/${BOARD}.${BOARD_TYPE}" +- LINUXFAMILY="${BOARDFAMILY}" ++ LINUXFAMILY="${BOARDFAMILY}" # @TODO: wtf? why? this is (100%?) rewritten by family config! + + # @TODO: interesting. this sourced the board config. What sources the family? do_main_configuration! + +@@ -110,7 +110,7 @@ function prepare_and_config_main_build_single() { + + interactive_config_ask_branch + [[ -z $BRANCH ]] && exit_with_error "No kernel branch selected: BRANCH" +- [[ $KERNEL_TARGET != *$BRANCH* ]] && exit_with_error "Kernel branch not defined for this board" "$BRANCH" ++ [[ $KERNEL_TARGET != *$BRANCH* ]] && display_alert "Kernel branch not defined for this board" "$BRANCH for ${BOARD}" "warn" + + interactive_config_ask_release + [[ -z $RELEASE ]] && exit_with_error "No release selected: RELEASE" + +From e1e33a3e9413fda79f7240abf61a9bd3ef95d27a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 00:39:31 +0100 +Subject: [PATCH] armbian-next: split `compile_kernel()` function into smaller + functions (+logging) + +- `do_with_logging()` galore, much better error reporting for kernel +- `do_with_hooks()` is for the future, just a placeholder for now +--- + lib/functions/compilation/kernel.sh | 135 +++++++++++++++++++++--------------- + lib/functions/main/default-build.sh | 2 +- + 2 files changed, 79 insertions(+), 58 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 28debe659..5cde24980 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -44,7 +44,28 @@ function run_kernel_make_long_running() { + + function compile_kernel() { + local kernel_work_dir="${SRC}/cache/sources/${LINUXSOURCEDIR}" ++ display_alert "Kernel build starting" "${LINUXSOURCEDIR}" "info" ++ LOG_SECTION="kernel_prepare_git" do_with_logging do_with_hooks kernel_prepare_git ++ LOG_SECTION="kernel_maybe_clean" do_with_logging do_with_hooks kernel_maybe_clean ++ local version hash pre_patch_version ++ local kernel_packaging_target ++ LOG_SECTION="kernel_prepare_patching" do_with_logging do_with_hooks kernel_prepare_patching ++ LOG_SECTION="kernel_patching" do_with_logging do_with_hooks kernel_patching ++ [[ $CREATE_PATCHES == yes ]] && userpatch_create "kernel" # create patch for manual source changes ++ local version ++ local toolchain ++ LOG_SECTION="kernel_config" do_with_logging do_with_hooks kernel_config ++ LOG_SECTION="kernel_package_source" do_with_logging do_with_hooks kernel_package_source ++ LOG_SECTION="kernel_make_headers_dtbs_image_modules" do_with_logging do_with_hooks kernel_make_headers_dtbs_image_modules ++ LOG_SECTION="kernel_package" do_with_logging do_with_hooks kernel_package ++ display_alert "Done with" "kernel compile" "debug" ++ cd .. || exit ++ rm -f linux-firmware-image-*.deb # remove firmware image packages here - easier than patching ~40 packaging scripts at once ++ rsync --remove-source-files -rq ./*.deb "${DEB_STORAGE}/" || exit_with_error "Failed moving kernel DEBs" ++ return 0 ++} + ++function kernel_prepare_git() { + if [[ -n $KERNELSOURCE ]]; then + display_alert "Downloading sources" "kernel" "git" + +@@ -62,15 +83,20 @@ function compile_kernel() { + GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ + fetch_from_repo "$KERNELSOURCE" "unused:set via GIT_FIXED_WORKDIR" "$KERNELBRANCH" "yes" + fi ++} + ++function kernel_maybe_clean() { + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$LINUXSOURCEDIR" "info" + ( + cd "${kernel_work_dir}" + make ARCH="${ARCHITECTURE}" clean > /dev/null 2>&1 + ) ++ fasthash_debug "post make clean" + fi +- fasthash_debug "post git clean" ++} ++ ++function kernel_prepare_patching() { + + if [[ $USE_OVERLAYFS == yes ]]; then + display_alert "Using overlayfs_wrapper" "kernel_${LINUXFAMILY}_${BRANCH}" "debug" +@@ -82,20 +108,21 @@ function compile_kernel() { + rm -f localversion + + # read kernel version +- local version hash pre_patch_version + version=$(grab_version "$kernel_work_dir") + pre_patch_version="${version}" + display_alert "Pre-patch kernel version" "${pre_patch_version}" "debug" + + # different packaging for 4.3+ +- local kernel_packaging_target="deb-pkg" ++ kernel_packaging_target="deb-pkg" + if linux-version compare "${version}" ge 4.3; then + kernel_packaging_target="bindeb-pkg" + fi + + # read kernel git hash + hash=$(git --git-dir="$kernel_work_dir"/.git rev-parse HEAD) ++} + ++function kernel_patching() { + ## Start kernel patching process. + ## There's a few objectives here: + ## - (always) produce a fasthash: represents "what would be done" (eg: md5 of a patch, crc32 of description). +@@ -130,12 +157,10 @@ function compile_kernel() { + + fasthash_debug "finish" + finish_fasthash "kernel" # this reports the final hash and creates git branch to build ID. All modifications commited. ++} + +- # create patch for manual source changes in debug mode +- [[ $CREATE_PATCHES == yes ]] && userpatch_create "kernel" +- ++function kernel_config() { + # re-read kernel version after patching +- local version + version=$(grab_version "$kernel_work_dir") + + display_alert "Compiling $BRANCH kernel" "$version" "info" +@@ -146,7 +171,6 @@ function compile_kernel() { + display_alert "Native compilation" "target ${ARCH} on host $(dpkg --print-architecture)" + elif [[ $(dpkg --print-architecture) == amd64 ]]; then + display_alert "Cross compilation" "target ${ARCH} on host $(dpkg --print-architecture)" +- local toolchain + toolchain=$(find_toolchain "$KERNEL_COMPILER" "$KERNEL_USE_GCC") + [[ -z $toolchain ]] && exit_with_error "Could not find required toolchain" "${KERNEL_COMPILER}gcc $KERNEL_USE_GCC" + else +@@ -224,14 +248,57 @@ function compile_kernel() { + + # Restore the date of .config. Above delta is a pure function, theoretically. + set_files_modification_time "${kernel_config_mtime}" ".config" ++} + ++function kernel_package_source() { + # create linux-source package - with already patched sources + # We will build this package first and clear the memory. + if [[ $BUILD_KSRC != no ]]; then + display_alert "Creating kernel source package" "${LINUXCONFIG}" "info" + create_linux-source_package + fi ++} ++ ++create_linux-source_package() { ++ ts=$(date +%s) ++ local sources_pkg_dir tmp_src_dir ++ tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. ++ ++ sources_pkg_dir=${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all ++ mkdir -p "${sources_pkg_dir}"/usr/src/ \ ++ "${sources_pkg_dir}"/usr/share/doc/linux-source-${version}-${LINUXFAMILY} \ ++ "${sources_pkg_dir}"/DEBIAN + ++ cp "${SRC}/config/kernel/${LINUXCONFIG}.config" "default_${LINUXCONFIG}.config" ++ xz < .config > "${sources_pkg_dir}/usr/src/${LINUXCONFIG}_${version}_${REVISION}_config.xz" ++ ++ display_alert "Compressing sources for the linux-source package" ++ tar cp --directory="$kernel_work_dir" --exclude='.git' --owner=root . | ++ pv -N "$(logging_echo_prefix_for_pv "compress_kernel_sources") $display_name" -p -b -r -s "$(du -sb "$kernel_work_dir" --exclude=='.git' | cut -f1)" | ++ pixz -0 > "${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.xz" # @TODO: .deb will compress this later. -0 for now, but should be a plain tar ++ cp COPYING "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}/LICENSE" ++ ++ cat <<- EOF > "${sources_pkg_dir}"/DEBIAN/control ++ Package: linux-source-${version}-${BRANCH}-${LINUXFAMILY} ++ Version: ${version}-${BRANCH}-${LINUXFAMILY}+${REVISION} ++ Architecture: all ++ Maintainer: $MAINTAINER <$MAINTAINERMAIL> ++ Section: kernel ++ Priority: optional ++ Depends: binutils, coreutils ++ Provides: linux-source, linux-source-${version}-${LINUXFAMILY} ++ Recommends: gcc, make ++ Description: This package provides the source code for the Linux kernel $version ++ EOF ++ ++ fakeroot_dpkg_deb_build -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" ++ rsync --remove-source-files -rq "${sources_pkg_dir}.deb" "${DEB_STORAGE}/" ++ ++ te=$(date +%s) ++ display_alert "Make the linux-source package" "$(($te - $ts)) sec." "info" ++} ++ ++function kernel_make_headers_dtbs_image_modules() { + local -a build_targets=("headers") + [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]] && build_targets+=("dtbs") + build_targets+=("${KERNEL_IMAGE_TYPE}" modules) +@@ -253,6 +320,9 @@ function compile_kernel() { + if [[ ! -f "${check_built_kernel_file}" ]]; then + exit_with_error "Kernel was not built" "${check_built_kernel_file}" + fi ++} ++ ++function kernel_package() { + + local -a prepackage_targets=(modules_install headers_install) + [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]] && prepackage_targets+=("dtbs_install") +@@ -279,53 +349,4 @@ function compile_kernel() { + fi + + display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" +- +- display_alert "Done with" "kernel compile" "debug" +- +- cd .. || exit +- # remove firmware image packages here - easier than patching ~40 packaging scripts at once +- rm -f linux-firmware-image-*.deb +- +- rsync --remove-source-files -rq ./*.deb "${DEB_STORAGE}/" || exit_with_error "Failed moving kernel DEBs" +- +- return 0 +-} +- +-create_linux-source_package() { +- ts=$(date +%s) +- local sources_pkg_dir tmp_src_dir +- tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. +- +- sources_pkg_dir=${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all +- mkdir -p "${sources_pkg_dir}"/usr/src/ \ +- "${sources_pkg_dir}"/usr/share/doc/linux-source-${version}-${LINUXFAMILY} \ +- "${sources_pkg_dir}"/DEBIAN +- +- cp "${SRC}/config/kernel/${LINUXCONFIG}.config" "default_${LINUXCONFIG}.config" +- xz < .config > "${sources_pkg_dir}/usr/src/${LINUXCONFIG}_${version}_${REVISION}_config.xz" +- +- display_alert "Compressing sources for the linux-source package" +- tar cp --directory="$kernel_work_dir" --exclude='.git' --owner=root . | +- pv -N "$(logging_echo_prefix_for_pv "compress_kernel_sources") $display_name" -p -b -r -s "$(du -sb "$kernel_work_dir" --exclude=='.git' | cut -f1)" | +- pixz -0 > "${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.xz" # @TODO: .deb will compress this later. -0 for now, but should be a plain tar +- cp COPYING "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}/LICENSE" +- +- cat <<- EOF > "${sources_pkg_dir}"/DEBIAN/control +- Package: linux-source-${version}-${BRANCH}-${LINUXFAMILY} +- Version: ${version}-${BRANCH}-${LINUXFAMILY}+${REVISION} +- Architecture: all +- Maintainer: $MAINTAINER <$MAINTAINERMAIL> +- Section: kernel +- Priority: optional +- Depends: binutils, coreutils +- Provides: linux-source, linux-source-${version}-${LINUXFAMILY} +- Recommends: gcc, make +- Description: This package provides the source code for the Linux kernel $version +- EOF +- +- fakeroot_dpkg_deb_build -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" +- rsync --remove-source-files -rq "${sources_pkg_dir}.deb" "${DEB_STORAGE}/" +- +- te=$(date +%s) +- display_alert "Make the linux-source package" "$(($te - $ts)) sec." "info" + } +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 3d621c8a1..e2882082b 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -71,7 +71,7 @@ main_default_build_single() { + if [[ ! -f ${DEB_STORAGE}/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb ]]; then + export KDEB_CHANGELOG_DIST=$RELEASE + if [[ -n $KERNELSOURCE ]] && [[ "${REPOSITORY_INSTALL}" != *kernel* ]]; then +- LOG_SECTION="compile_kernel" do_with_logging compile_kernel ++ compile_kernel # This handles its own logging sections. + fi + fi + if [[ "${exit_after_kernel_build}" == "yes" ]]; then + +From e16b1e19e04308d5313908a5750e74ed2bdd72aa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 00:31:23 +0100 +Subject: [PATCH] armbian-next: `do_with_hooks()` placeholder for future ideas + +--- + lib/extensions.sh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index ae3775b14..ad215bdf0 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -267,7 +267,7 @@ cleanup_extension_manager() { + } + + function cleanup_handler_extensions() { +- display_alert "yeah the extensions trap handler..." "cleanup_handler_extensions" "cleanup" ++ display_alert "yeah the extensions trap handler..." "cleanup_handler_extensions" "cleanup" + cleanup_extension_manager + + # Move temporary log file over to final destination. +@@ -417,3 +417,8 @@ enable_extension() { + done + + } ++ ++# Fancy placeholder for future ideas. allow any core function to be hooked. maybe with "voters" infrastructure? ++function do_with_hooks() { ++ "$@" ++} + +From 4416b6b18cdb3c9311aa254189b21dfdf03747cf Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 00:30:55 +0100 +Subject: [PATCH] armbian-next: logging: small refactor and `do_with_logging` + admit it does not do error control + +--- + lib/functions/logging/logging.sh | 40 +++++++++++++++++++++++----------------- + 1 file changed, 23 insertions(+), 17 deletions(-) + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index fd23722b8..a3c6523ad 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -40,10 +40,7 @@ function logging_error_show_log() { + return 0 + } + +-function do_with_logging() { +- [[ -z "${DEST}" ]] && exit_with_error "DEST is not defined. Can't start logging." +- +- # @TODO: check we're not currently logging (eg: this has been called 2 times without exiting) ++function start_logging_section() { + export logging_section_counter=$((logging_section_counter + 1)) # increment counter, used in filename + export CURRENT_LOGGING_COUNTER + CURRENT_LOGGING_COUNTER="$(printf "%03d" "$logging_section_counter")" +@@ -56,13 +53,31 @@ function do_with_logging() { + if [[ "${CI}" == "true" ]]; then + echo "::group::[🥑] Group ${CURRENT_LOGGING_SECTION}" + fi ++ return 0 ++} ++ ++function finish_logging_section() { ++ # Close opened CI group. ++ if [[ "${CI}" == "true" ]]; then ++ echo "::endgroup::" ++ fi ++} ++ ++function do_with_logging() { ++ [[ -z "${DEST}" ]] && exit_with_error "DEST is not defined. Can't start logging." ++ ++ # @TODO: check we're not currently logging (eg: this has been called 2 times without exiting) ++ ++ start_logging_section ++ ++ # Important: no error control is done here. ++ # Called arguments are run with set -e in effect. + + # We now execute whatever was passed as parameters, in some different conditions: + # In both cases, writing to stderr will display to terminal. + # So whatever is being called, should prevent rogue stuff writing to stderr. + # this is mostly handled by redirecting stderr to stdout: 2>&1 + +- local exit_code=176 # fail by default... + if [[ "${SHOW_LOG}" == "yes" ]]; then + local prefix_sed_contents + prefix_sed_contents="$(logging_echo_prefix_for_pv "tool") $(echo -n -e "${tool_color}")" +@@ -76,24 +91,15 @@ function do_with_logging() { + sed -u -e "${prefix_sed_cmd}" + ) + "$@" >&3 +- exit_code=$? # hopefully this is the pipe +- exec 3>&- # close the file descriptor, lest sed keeps running forever. ++ exec 3>&- # close the file descriptor, lest sed keeps running forever. + else + # If not showing the log, just send stdout to logfile. stderr will flow to screen. + "$@" >> "${CURRENT_LOGFILE}" +- exit_code=$? + fi + +- # Close opened CI group. +- if [[ "${CI}" == "true" ]]; then +- echo "::endgroup::" +- fi ++ finish_logging_section + +- if [[ $exit_code != 0 ]]; then +- display_alert "build group FAILED: exit code: ${exit_code}" "${CURRENT_LOGGING_SECTION}" "err" +- fi +- +- return $exit_code ++ return 0 + } + + function display_alert() { + +From 3047f4362cad224283a9febd1dc05c4178768964 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 00:28:09 +0100 +Subject: [PATCH] armbian-next: fix: traps: `trap_manager_error_handled` is + integer (`-i`) not array (`-a`) + +--- + lib/functions/logging/traps.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index a465e718d..7c3eb97cd 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -5,7 +5,7 @@ function traps_init() { + # shellcheck disable=SC2034 # Array of cleanup handlers. + declare -a trap_manager_cleanup_handlers=() + # shellcheck disable=SC2034 # Global to avoid doubly reporting ERR/EXIT pairs. +- declare -a trap_manager_error_handled=0 ++ declare -i trap_manager_error_handled=0 + trap 'main_trap_handler "ERR" "$?"' ERR + trap 'main_trap_handler "EXIT" "$?"' EXIT + trap 'main_trap_handler "INT" "$?"' INT + +From a6df63b905f60045a41f640f98c01e8e5305e8ed Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 00:25:30 +0100 +Subject: [PATCH] armbian-next: sunxi-tools: fix logging for sunxi-tools + compilation + +--- + extensions/sunxi-tools.sh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/extensions/sunxi-tools.sh b/extensions/sunxi-tools.sh +index 5b699ac14..8f0909426 100644 +--- a/extensions/sunxi-tools.sh ++++ b/extensions/sunxi-tools.sh +@@ -6,12 +6,12 @@ function build_host_tools__compile_sunxi_tools() { + # Compile and install only if git commit hash changed + cd "${SRC}"/cache/sources/sunxi-tools || exit + # need to check if /usr/local/bin/sunxi-fexc to detect new Docker containers with old cached sources +- if [[ ! -f .commit_id || $(improved_git rev-parse @ 2> /dev/null) != $(< .commit_id) || ! -f /usr/local/bin/sunxi-fexc ]]; then ++ if [[ ! -f .commit_id || $(git rev-parse @ 2> /dev/null) != $(< .commit_id) || ! -f /usr/local/bin/sunxi-fexc ]]; then + display_alert "Compiling" "sunxi-tools" "info" +- make -s clean > /dev/null +- make -s tools > /dev/null ++ run_host_command_logged make -s clean ++ run_host_command_logged make -s tools + mkdir -p /usr/local/bin/ +- make install-tools > /dev/null 2>&1 +- improved_git rev-parse @ 2> /dev/null > .commit_id ++ run_host_command_logged make install-tools ++ git rev-parse @ 2> /dev/null > .commit_id + fi + } + +From 1f1f7c01f3e77fa8de9c5657a123f0bf723cceb0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 24 Feb 2022 00:24:33 +0100 +Subject: [PATCH] armbian-next: runners now run bash with `-o pipefail` in + addition to `-e` + +- attention, only affects stuff run through the functions in runners.sh +--- + lib/functions/logging/runners.sh | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index a85914f55..3ef7071c8 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -16,7 +16,7 @@ function chroot_sdcard_apt_get() { + + # please, please, unify around this function. if SDCARD is not enough, I'll make a mount version. + function chroot_sdcard() { +- TMPDIR="" run_host_command_logged_raw chroot "${SDCARD}" /bin/bash -e -c "$*" ++ TMPDIR="" run_host_command_logged_raw chroot "${SDCARD}" /bin/bash -e -o pipefail -c "$*" + } + + # This should be used if you need to capture the stdout produced by the command. It is NOT logged, and NOT run thru bash, and NOT quoted. +@@ -31,21 +31,21 @@ function chroot_custom_long_running() { + # @TODO: disabled, the pipe causes the left-hand side to subshell and caos ensues. + # local _exit_code=1 + # if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then +- # TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++ # TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -o pipefail -c "$*" + # _exit_code=$? + # else +- # TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" ++ # TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -o pipefail -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" + # _exit_code=$? + # fi + # return $_exit_code + +- TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++ TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -o pipefail -c "$*" + } + + function chroot_custom() { + local target=$1 + shift +- TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++ TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -o pipefail -c "$*" + } + + # for deb building. +@@ -62,16 +62,16 @@ function run_host_command_logged_long_running() { + # @TODO: disabled. The Pipe used for "pv" causes the left-hand side to run in a subshell. + #local _exit_code=1 + #if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then +- # run_host_command_logged_raw /bin/bash -e -c "$*" ++ # run_host_command_logged_raw /bin/bash -e -o pipefail-c "$*" + # _exit_code=$? + #else +- # run_host_command_logged_raw /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}") " --progress --timer --line-mode --force --cursor --delay-start 0 -i "2" ++ # run_host_command_logged_raw /bin/bash -e -o pipefail -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}") " --progress --timer --line-mode --force --cursor --delay-start 0 -i "2" + # _exit_code=$? + #fi + #return $_exit_code + + # Run simple and exit with it's code. Sorry. +- run_host_command_logged_raw /bin/bash -e -c "$*" ++ run_host_command_logged_raw /bin/bash -e -o pipefail -c "$*" + } + + # For installing packages host-side. Not chroot! +@@ -113,12 +113,12 @@ function run_host_x86_binary_logged() { + + # run_host_command_logged is the very basic, should be used for everything, but, please use helpers above, this is very low-level. + function run_host_command_logged() { +- run_host_command_logged_raw /bin/bash -e -c "$*" ++ run_host_command_logged_raw /bin/bash -e -o pipefail -c "$*" + } + + # for interactive, dialog-like host-side invocations. no redirections performed, but same bash usage and expansion, for consistency. + function run_host_command_dialog() { +- /bin/bash -e -c "$*" ++ /bin/bash -e -o pipefail -c "$*" + } + + # do NOT use directly, it does NOT expand the way it should (through bash) + +From cdfe8e12f9940a457f5161798d11c5131c99b81b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 23 Feb 2022 21:02:10 +0100 +Subject: [PATCH] armbian-next: kernel: reduce logging clutter (CC,LD,AR) + +- hide fasthash_debug under `SHOW_FASTHASH` +--- + lib/functions/compilation/kernel.sh | 4 ++-- + lib/functions/compilation/patch/fasthash.sh | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 014e4d337..28debe659 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -186,7 +186,7 @@ function compile_kernel() { + # hack for OdroidXU4. Copy firmare files + if [[ $BOARD == odroidxu4 ]]; then + mkdir -p "${kernel_work_dir}/firmware/edid" +- cp "${SRC}"/packages/blobs/odroidxu4/*.bin "${kernel_work_dir}/firmware/edid" ++ cp -p "${SRC}"/packages/blobs/odroidxu4/*.bin "${kernel_work_dir}/firmware/edid" + fi + + # hack for deb builder. To pack what's missing in headers pack. +@@ -238,7 +238,7 @@ function compile_kernel() { + + display_alert "Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" + fasthash_debug "pre-compile" +- run_kernel_make_long_running "${build_targets[@]}" ++ make_filter="| grep --line-buffered -v -e 'CC' -e 'LD' -e 'AR'" run_kernel_make_long_running "${build_targets[@]}" + fasthash_debug "post-compile" + + if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index 724b8d3cf..0e0cc60f3 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -34,10 +34,10 @@ function finish_fasthash() { + } + + function fasthash_debug() { +- display_alert "fasthash_debug" "$*" "debug" +- if [[ "${SHOW_DEBUG}" != "yes" ]]; then # enable debug for many, many debugging msgs ++ if [[ "${SHOW_FASTHASH}" != "yes" ]]; then # enable debug for many, many debugging msgs + return 0 + fi ++ display_alert "fasthash_debug" "$*" "debug" + find . -type f -printf '%T@ %p\n' | + grep -v -e "\.ko" -e "\.o" -e "\.cmd" -e "\.mod" -e "\.a" -e "\.tmp" -e "\.dtb" -e ".scr" -e "\.\/debian" | + sort -n | tail -n 10 1>&2 + +From 9ffb0891d8572ab04126bff74632dcabc31a81b1 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 23 Feb 2022 21:00:59 +0100 +Subject: [PATCH] armbian-next: `armhf` should make `zImage` -- or should it? + +--- + config/sources/armhf.conf | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/config/sources/armhf.conf b/config/sources/armhf.conf +index 2d4682408..01a9eac47 100644 +--- a/config/sources/armhf.conf ++++ b/config/sources/armhf.conf +@@ -16,7 +16,7 @@ INITRD_ARCH=arm + QEMU_BINARY="qemu-arm-static" + ARCHITECTURE=arm + ARCH=armhf +-KERNEL_IMAGE_TYPE=Image ++KERNEL_IMAGE_TYPE=zImage + CAN_BUILD_STRETCH=yes + FAST_CREATE_IMAGE="yes" + + +From 4d8eab13c18560b8d64735858b2cf2462ac3f644 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 23 Feb 2022 13:22:21 +0100 +Subject: [PATCH] armbian-next: show logs through ccze; avoid ANSI escapes in + file; `SHOW_xxx` control + +- `SHOW_DEBUG` shows the debug level +- `SHOW_COMMAND` shows all invoked commands through the runners +- `SHOW_TRAPS` to show 'cleanup' and 'trap' level +- `SHOW_TIMING` to show $SECONDS but pretty +- replace hardcoded traps/cleanups logging +--- + lib/extensions.sh | 2 +- + lib/functions/compilation/patch/fasthash.sh | 6 +++-- + lib/functions/general/host.sh | 2 +- + lib/functions/logging/logging.sh | 37 +++++++++++++++++++++++++---- + lib/functions/logging/stacktraces.sh | 6 +++-- + lib/functions/logging/traps.sh | 8 +++---- + lib/functions/main/default-build.sh | 2 +- + 7 files changed, 47 insertions(+), 16 deletions(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 9cbc4b78b..ae3775b14 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -267,7 +267,7 @@ cleanup_extension_manager() { + } + + function cleanup_handler_extensions() { +- echo "-- yeah the extensions trap handler..." 1>&2 ++ display_alert "yeah the extensions trap handler..." "cleanup_handler_extensions" "cleanup" + cleanup_extension_manager + + # Move temporary log file over to final destination. +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index a01fe7664..724b8d3cf 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -21,7 +21,6 @@ function initialize_fasthash() { + display_alert "initialize_fasthash" "$*" "debug" + return 0 + declare -a fast_hash_list=() +- + } + + function fasthash_branch() { +@@ -36,6 +35,9 @@ function finish_fasthash() { + + function fasthash_debug() { + display_alert "fasthash_debug" "$*" "debug" ++ if [[ "${SHOW_DEBUG}" != "yes" ]]; then # enable debug for many, many debugging msgs ++ return 0 ++ fi + find . -type f -printf '%T@ %p\n' | + grep -v -e "\.ko" -e "\.o" -e "\.cmd" -e "\.mod" -e "\.a" -e "\.tmp" -e "\.dtb" -e ".scr" -e "\.\/debian" | + sort -n | tail -n 10 1>&2 +@@ -47,7 +49,7 @@ function get_file_modification_time() { + exit_with_error "Can't get modification time of nonexisting file" "${1}" + fi + +- # [[CC]YY]MMDDhhmm[ss] - it is a valid integer ++ # [[CC]YY]MMDDhhmm.[ss] - it is NOT a valid integer + file_date=$(date +%Y%m%d%H%M.%S -r "${1}") + display_alert "Got date ${file_date} for file" "${1}" "debug" + +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 34f17a38e..ff5f9ee89 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -69,7 +69,7 @@ prepare_host() { + nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz \ + pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig \ + systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip \ +- zlib1g-dev file" ++ zlib1g-dev file ccze" + + if [[ $(dpkg --print-architecture) == amd64 ]]; then + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 368d0a8d6..fd23722b8 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -24,8 +24,15 @@ function logging_error_show_log() { + local prefix_sed_contents="${normal_color}${left_marker}${padding}👉${padding}${right_marker} " + local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" + display_alert " 👇👇👇 Showing logfile below 👇👇👇" "${logfile_to_show}" "err" +- # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. +- cat "${logfile_to_show}" | grep -v -e "^$" | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! ++ ++ if [[ -f /usr/bin/ccze ]]; then # use 'ccze' to colorize the log, making errors a lot more obvious. ++ # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. ++ cat "${logfile_to_show}" | grep -v -e "^$" | /usr/bin/ccze -A | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! ++ else ++ # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. ++ cat "${logfile_to_show}" | grep -v -e "^$" | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! ++ fi ++ + display_alert " 👆👆👆 Showing logfile above 👆👆👆" "${logfile_to_show}" "err" + else + display_alert "✋ Error log not available at this stage of build" "check messages above" "debug" +@@ -92,12 +99,12 @@ function do_with_logging() { + function display_alert() { + # We'll be writing to stderr (" >&2"), so also write the message to the generic logfile, for context. + if [[ -f "${CURRENT_LOGFILE}" ]]; then +- echo "--> A: [" "$@" "]" >> "${CURRENT_LOGFILE}" ++ echo -e "--> A: [" "$@" "]" | sed 's/\x1b\[[0-9;]*m//g' >> "${CURRENT_LOGFILE}" + fi + + # If asked, avoid any fancy ANSI escapes completely. + if [[ "${ANSI_COLOR}" == "none" ]]; then +- echo "${@}" >&2 ++ echo -e "${@}" | sed 's/\x1b\[[0-9;]*m//g' >&2 + return 0 + fi + +@@ -127,12 +134,26 @@ function display_alert() { + inline_logs_color="\e[0;32m" + ;; + ++ cleanup | trap) ++ if [[ "${SHOW_TRAPS}" != "yes" ]]; then # enable debug for many, many debugging msgs ++ return 0 ++ fi ++ level_indicator="🧽" ++ inline_logs_color="\e[1;33m" ++ ;; ++ + debug | deprecation) ++ if [[ "${SHOW_DEBUG}" != "yes" ]]; then # enable debug for many, many debugging msgs ++ return 0 ++ fi + level_indicator="✨" + inline_logs_color="\e[1;33m" + ;; + + command) ++ if [[ "${SHOW_COMMAND}" != "yes" ]]; then # enable to log all calls to external cmds ++ return 0 ++ fi + level_indicator="🐸" + inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. + ;; +@@ -142,8 +163,14 @@ function display_alert() { + inline_logs_color="\e[1;37m" + ;; + esac ++ ++ local timing_info="" ++ if [[ "${SHOW_TIMING}" == "yes" ]]; then ++ timing_info="${tool_color}(${normal_color}$(printf "%3s" "${SECONDS}")${tool_color})" # SECONDS is bash builtin for seconds since start of script. ++ fi ++ + [[ -n $2 ]] && extra=" [${inline_logs_color} ${2} ${normal_color}]" +- echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker} ${normal_color}${message}${extra}${normal_color}" >&2 ++ echo -e "${normal_color}${left_marker}${padding}${level_indicator}${padding}${normal_color}${right_marker}${timing_info} ${normal_color}${message}${extra}${normal_color}" >&2 + + # Now write to CI, if we're running on it + if [[ "${CI}" == "true" ]] && [[ "${ci_log}" != "" ]]; then +diff --git a/lib/functions/logging/stacktraces.sh b/lib/functions/logging/stacktraces.sh +index 3ab2900ef..a08c03499 100644 +--- a/lib/functions/logging/stacktraces.sh ++++ b/lib/functions/logging/stacktraces.sh +@@ -34,11 +34,13 @@ function show_caller_full() { + local line_no + local function_name + local file_name ++ local padded_function_name ++ local short_file_name + while caller $i; do + ((i++)) + done | while read -r line_no function_name file_name; do +- local padded_function_name=$(printf "%30s" "$function_name()") +- local short_file_name="${file_name/"${SRC}/"/"./"}" ++ padded_function_name="$(printf "%30s" "$function_name()")" ++ short_file_name="${file_name/"${SRC}/"/"./"}" + echo -e "$padded_function_name --> $short_file_name:$line_no" + done + } || true # always success +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index fb294e06e..a465e718d 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -32,7 +32,7 @@ function main_trap_handler() { + stack_caller="$(show_caller_full)" + short_stack="${BASH_SOURCE[1]}:${BASH_LINENO[0]}" + +- echo "-- main_trap_handler: ${trap_type} and ${trap_exit_code} trap_manager_error_handled:${trap_manager_error_handled} " 1>&2 ++ display_alert "main_trap_handler" "${trap_type} and ${trap_exit_code} trap_manager_error_handled:${trap_manager_error_handled}" "trap" + + case "${trap_type}" in + TERM | INT) +@@ -71,7 +71,7 @@ function main_trap_handler() { + + # Run the cleanup handlers, if any, and clean the cleanup list. + function run_cleanup_handlers() { +- echo "-- run_cleanup_handlers! list: ${trap_manager_cleanup_handlers[*]}" 1>&2 ++ display_alert "run_cleanup_handlers! list:" "${trap_manager_cleanup_handlers[*]}" "cleanup" + if [[ ${#trap_manager_cleanup_handlers[@]} -lt 1 ]]; then + return 0 # No handlers set, just return. + else +@@ -90,12 +90,12 @@ function run_cleanup_handlers() { + # Adds a callback for trap types; first argument is function name; extra params are the types to add for. + function add_cleanup_handler() { + local callback="$1" +- echo "-- Add callback ${callback} as cleanup handler" 1>&2 ++ display_alert "Add callback as cleanup handler" "${callback}" "cleanup" + trap_manager_cleanup_handlers+=("$callback") + } + + function remove_all_trap_handlers() { +- echo "-- Will remove ALL trap handlers, for a clean exit..." 1>&2 ++ display_alert "Will remove ALL trap handlers, for a clean exit..." "" "cleanup" + } + + # exit_with_error +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 112628729..3d621c8a1 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -178,7 +178,7 @@ main_default_build_single() { + } + + function trap_handler_cleanup_workdir() { +- echo "-- cleanup handler: Should cleanup $WORKDIR WORKDIR here" 1>&2 ++ display_alert "Cleanup WORKDIR: $WORKDIR" "trap_handler_cleanup_workdir" "cleanup" + unset TMPDIR + if [[ -d "${WORKDIR}" ]]; then + display_alert "Cleaning up WORKDIR" "$(du -h -s "$WORKDIR")" "debug" + +From 6cbb8c84798438b5ca5b353829b011cdbc263f1b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 22 Feb 2022 14:36:41 +0100 +Subject: [PATCH] armbian-next: add `KERNEL_MAJOR_MINOR=x.z` to every family, + manually from the `KERNELBRANCH` + +--- + config/sources/families/imx6.conf | 4 +++- + config/sources/families/imx7d.conf | 4 +++- + config/sources/families/include/meson_common.inc | 3 +++ + config/sources/families/include/rockchip64_common.inc | 10 +++++----- + config/sources/families/include/sunxi64_common.inc | 3 +++ + config/sources/families/include/sunxi_common.inc | 3 +++ + config/sources/families/jetson-nano.conf | 3 +++ + config/sources/families/media.conf | 4 ++++ + config/sources/families/mt7623.conf | 1 + + config/sources/families/mvebu.conf | 5 ++++- + config/sources/families/mvebu64.conf | 3 +++ + config/sources/families/odroidxu4.conf | 3 +++ + config/sources/families/rk322x.conf | 3 +++ + config/sources/families/rk3399.conf | 1 + + config/sources/families/rk35xx.conf | 2 ++ + config/sources/families/rockchip.conf | 3 +++ + config/sources/families/rockchip64.conf | 1 + + config/sources/families/rockpis.conf | 1 + + config/sources/families/s5p6818.conf | 1 + + config/sources/families/sun50iw9.conf | 1 + + config/sources/families/virtual.conf | 1 + + config/sources/families/zynq.conf | 1 + + 22 files changed, 53 insertions(+), 8 deletions(-) + +diff --git a/config/sources/families/imx6.conf b/config/sources/families/imx6.conf +index ad22c4982..d63f84266 100644 +--- a/config/sources/families/imx6.conf ++++ b/config/sources/families/imx6.conf +@@ -9,13 +9,15 @@ case $BRANCH in + + current) + ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) + +- KERNELBRANCH='branch:linux-5.19.y' ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.16.y' + + ;; + +diff --git a/config/sources/families/imx7d.conf b/config/sources/families/imx7d.conf +index aa50d4970..8f6c2d3fa 100644 +--- a/config/sources/families/imx7d.conf ++++ b/config/sources/families/imx7d.conf +@@ -11,13 +11,15 @@ case $BRANCH in + legacy) + + KERNELSOURCE='https://source.codeaurora.org/external/imx/linux-imx' ++ export KERNEL_MAJOR_MINOR="4.14" # Major and minor versions of this kernel. + KERNELBRANCH='branch:imx_4.14.98_2.0.0_ga' + KERNELDIR='linux-imx7' + BOOTBRANCH='branch:imx_v2018.03_4.14.98_2.0.0_ga' + BOOTPATCHDIR="u-boot-imx7d-legacy" + ;; +- current | default) ++ current) + KERNELSOURCE='https://source.codeaurora.org/external/imx/linux-imx' ++ export KERNEL_MAJOR_MINOR="5.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:imx_5.4.70_2.3.0' + KERNELDIR='linux-imx7-current' + BOOTBRANCH='branch:imx_v2020.04_5.4.70_2.3.0' +diff --git a/config/sources/families/include/meson_common.inc b/config/sources/families/include/meson_common.inc +index 62f30cfde..d24ac85ee 100644 +--- a/config/sources/families/include/meson_common.inc ++++ b/config/sources/families/include/meson_common.inc +@@ -17,18 +17,21 @@ GOVERNOR=ondemand + case $BRANCH in + legacy) + ++ export KERNEL_MAJOR_MINOR="5.4" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.4.y" + KERNELPATCHDIR='meson-'$BRANCH + + ;; + current) + ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.10.y" + KERNELPATCHDIR='meson-current' + + ;; + edge) + ++ export KERNEL_MAJOR_MINOR="5.11" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.11.y" + KERNELPATCHDIR='meson-current' + +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 0f0000d26..815e87b26 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -90,8 +90,8 @@ case $BRANCH in + + current) + +- KERNELBRANCH="branch:linux-5.15.y" +- KERNELBRANCH="tag:v5.15.35" ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.10.y" + KERNELPATCHDIR='rockchip64-'$BRANCH + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH +@@ -100,8 +100,8 @@ case $BRANCH in + edge) + + KERNELPATCHDIR='rockchip64-'$BRANCH +- KERNELBRANCH="branch:linux-5.17.y" +- KERNELBRANCH="tag:v5.17.5" ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. ++ KERNELBRANCH="branch:linux-5.15.y" + LINUXFAMILY=rockchip64 + LINUXCONFIG='linux-rockchip64-'$BRANCH + +@@ -234,7 +234,7 @@ family_tweaks() { + + chroot $SDCARD /bin/bash -c "systemctl --no-reload enable z28pro-bluetooth.service >/dev/null 2>&1" + +- elif [[ $BOARD == nanopi-r2s || $BOARD == nanopi-r2c || $BOARD == orangepi-r1plus || $BOARD == orangepi-r1plus-lts ]]; then ++ elif [[ $BOARD == nanopi-r2s || $BOARD == nanopi-r2c || $BOARD == orangepi-r1plus ]]; then + + # rename USB based network to lan0 + mkdir -p $SDCARD/etc/udev/rules.d/ +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index c7a3e0a20..323d67c1c 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -14,16 +14,19 @@ export KERNELPATCHDIR='sunxi-'$BRANCH + case $BRANCH in + + legacy) ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. + export KERNELBRANCH="branch:linux-5.10.y" + export KERNELBRANCH_MEGOUS="branch:orange-pi-5.10" + ;; + + current) ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + export KERNELBRANCH="branch:linux-5.15.y" + export KERNELBRANCH_MEGOUS="branch:orange-pi-5.15" + ;; + + edge) ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + export KERNELBRANCH="branch:linux-5.16.y" + export KERNELBRANCH_MEGOUS="branch:orange-pi-5.16" + ;; +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index c450fecbd..a9f14f950 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -15,16 +15,19 @@ export KERNELPATCHDIR='sunxi-'$BRANCH + case $BRANCH in + + legacy) ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. + export KERNELBRANCH="branch:linux-5.10.y" + export KERNELBRANCH_MEGOUS="branch:orange-pi-5.10" + ;; + + current) ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + export KERNELBRANCH="branch:linux-5.15.y" + export KERNELBRANCH_MEGOUS="branch:orange-pi-5.15" + ;; + + edge) ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + export KERNELBRANCH="branch:linux-5.16.y" + export KERNELBRANCH_MEGOUS="branch:orange-pi-5.16" + ;; +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +index fbc14d5af..77b83e479 100644 +--- a/config/sources/families/jetson-nano.conf ++++ b/config/sources/families/jetson-nano.conf +@@ -13,6 +13,7 @@ case $BRANCH in + legacy) + KERNELDIR='linux-nano' + KERNELSOURCE='https://github.com/150balbes/Jetson-Nano' ++ export KERNEL_MAJOR_MINOR="4.9" # Major and minor versions of this kernel. + KERNELBRANCH='branch:4.9.201' + EXTRAWIFI="no" + BOOT_FDT_FILE="none" +@@ -21,6 +22,7 @@ case $BRANCH in + ;; + + current) ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.15.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media +@@ -30,6 +32,7 @@ case $BRANCH in + + edge) + SKIP_BOOTSPLASH="yes" ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index 7c5a76af6..07529a634 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -13,6 +13,7 @@ case $BRANCH in + + if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then + KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' ++ export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='branch:kernel-4.19' + KERNELPATCHDIR='station-p2-'$BRANCH + LINUXCONFIG='linux-station-p2-'$BRANCH +@@ -21,6 +22,7 @@ case $BRANCH in + WIREGUARD="no" + else + KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' + KERNELPATCHDIR='rockchip64-'$BRANCH + LINUXCONFIG='linux-rockchip64-'$BRANCH +@@ -29,6 +31,7 @@ case $BRANCH in + ;; + + current) ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.15.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media +@@ -37,6 +40,7 @@ case $BRANCH in + + edge) + SKIP_BOOTSPLASH="yes" ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media +diff --git a/config/sources/families/mt7623.conf b/config/sources/families/mt7623.conf +index 8c0d9f754..2eb00c881 100644 +--- a/config/sources/families/mt7623.conf ++++ b/config/sources/families/mt7623.conf +@@ -9,6 +9,7 @@ case $BRANCH in + + legacy) + ++ export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-4.19.y' + + ;; +diff --git a/config/sources/families/mvebu.conf b/config/sources/families/mvebu.conf +index 66abc39c3..ad240d6b6 100644 +--- a/config/sources/families/mvebu.conf ++++ b/config/sources/families/mvebu.conf +@@ -11,19 +11,22 @@ fi + case $BRANCH in + legacy) + ++ export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='tag:v4.19.167' + + ;; + + current) + ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) + +- KERNELBRANCH='branch:linux-5.17.y' ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. ++ KERNELBRANCH='branch:linux-5.16.y' + + LINUXCONFIG='linux-mvebu-edge' + KERNELPATCHDIR="mvebu-edge" +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index 58d66ab98..27c4e318a 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -29,6 +29,7 @@ case $BRANCH in + legacy) + + KERNELSOURCE='https://github.com/MarvellEmbeddedProcessors/linux-marvell.git' ++ export KERNEL_MAJOR_MINOR="4.14" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-4.14.22-armada-18.06' + KERNELDIR='linux-marvell' + +@@ -36,11 +37,13 @@ case $BRANCH in + + current) + ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.16.y' + ;; + +diff --git a/config/sources/families/odroidxu4.conf b/config/sources/families/odroidxu4.conf +index ee4a32af5..02a9947a9 100644 +--- a/config/sources/families/odroidxu4.conf ++++ b/config/sources/families/odroidxu4.conf +@@ -10,6 +10,7 @@ case $BRANCH in + legacy) + + KERNELSOURCE='https://github.com/hardkernel/linux' ++ export KERNEL_MAJOR_MINOR="4.14" # Major and minor versions of this kernel. + KERNELBRANCH='branch:odroidxu4-4.14.y' + KERNELDIR='linux-odroidxu4' + +@@ -18,11 +19,13 @@ case $BRANCH in + current) + + KERNELSOURCE='https://github.com/hardkernel/linux' ++ export KERNEL_MAJOR_MINOR="5.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:odroid-5.4.y' + KERNELDIR='linux-odroidxu4' + ;; + + edge) ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.16.y' + ;; + +diff --git a/config/sources/families/rk322x.conf b/config/sources/families/rk322x.conf +index 1a8ba863f..897a452db 100644 +--- a/config/sources/families/rk322x.conf ++++ b/config/sources/families/rk322x.conf +@@ -12,6 +12,7 @@ case $BRANCH in + legacy) + + KERNELSOURCE='https://github.com/armbian/linux' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:stable-4.4-rk3288-linux-v2.x' + KERNELDIR='linux-rockchip' + +@@ -19,12 +20,14 @@ case $BRANCH in + + current) + ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) + ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.16.y' + + ;; +diff --git a/config/sources/families/rk3399.conf b/config/sources/families/rk3399.conf +index b7d5ccdb7..cc1f3ba71 100644 +--- a/config/sources/families/rk3399.conf ++++ b/config/sources/families/rk3399.conf +@@ -5,6 +5,7 @@ case $BRANCH in + legacy) + + KERNELSOURCE='https://github.com/friendlyarm/kernel-rockchip' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:nanopi4-linux-v4.4.y' + KERNELDIR='linux-rockchip64' + KERNELCONFIG='linux-rockchip64' +diff --git a/config/sources/families/rk35xx.conf b/config/sources/families/rk35xx.conf +index acc5ffc16..3744e6e5f 100644 +--- a/config/sources/families/rk35xx.conf ++++ b/config/sources/families/rk35xx.conf +@@ -12,6 +12,7 @@ case $BRANCH in + UBOOT_USE_GCC='< 8.0' + BOOTDIR='u-boot-rockchip64' + KERNELSOURCE='https://github.com/radxa/kernel' ++ export KERNEL_MAJOR_MINOR="4.19" # Major and minor versions of this kernel. + KERNELBRANCH='branch:stable-4.19-rock3' + KERNELDIR='linux-rockchip64' + KERNELPATCHDIR='rk35xx-legacy' +@@ -23,6 +24,7 @@ case $BRANCH in + + # temporary until kernel 5.16 is well supported for rockchip64 + edge) ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='rk35xx-'$BRANCH + SKIP_BOOTSPLASH="yes" +diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf +index 5870ed1fb..55f56e492 100644 +--- a/config/sources/families/rockchip.conf ++++ b/config/sources/families/rockchip.conf +@@ -20,6 +20,7 @@ case $BRANCH in + legacy) + + KERNELSOURCE='https://github.com/armbian/linux' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:stable-4.4-rk3288-linux' + KERNELDIR='linux-rockchip' + +@@ -27,12 +28,14 @@ case $BRANCH in + + current) + ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) + ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.16.y' + + ;; +diff --git a/config/sources/families/rockchip64.conf b/config/sources/families/rockchip64.conf +index 6790c35b7..7734f69a7 100644 +--- a/config/sources/families/rockchip64.conf ++++ b/config/sources/families/rockchip64.conf +@@ -5,6 +5,7 @@ case $BRANCH in + legacy) + KERNELDIR='linux-rockchip64' + KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' + KERNELPATCHDIR='rockchip64-'$BRANCH + ;; +diff --git a/config/sources/families/rockpis.conf b/config/sources/families/rockpis.conf +index 0f40c9ad7..2dd31ae5b 100644 +--- a/config/sources/families/rockpis.conf ++++ b/config/sources/families/rockpis.conf +@@ -35,6 +35,7 @@ case $BRANCH in + UBOOT_USE_GCC='< 8.0' + BOOTDIR='u-boot-rockchip64' + KERNELSOURCE='https://github.com/piter75/rockchip-kernel' ++ export KERNEL_MAJOR_MINOR="4.4" # Major and minor versions of this kernel. + KERNELBRANCH='branch:rockpis-develop-4.4' + KERNELDIR='linux-rockchip64' + unset IDBLOADER_BLOB +diff --git a/config/sources/families/s5p6818.conf b/config/sources/families/s5p6818.conf +index 9074ba85a..38e4e566e 100644 +--- a/config/sources/families/s5p6818.conf ++++ b/config/sources/families/s5p6818.conf +@@ -9,6 +9,7 @@ ATF_COMPILE="no" + case $BRANCH in + legacy | current) + KERNELSOURCE='https://github.com/armbian/linux' ++ export KERNEL_MAJOR_MINOR="4.14" # Major and minor versions of this kernel. See https://github.com/armbian/linux/blob/s5p6818/Makefile + KERNELBRANCH='branch:s5p6818' + KERNELDIR='linux-mainline' + ;; +diff --git a/config/sources/families/sun50iw9.conf b/config/sources/families/sun50iw9.conf +index 3384f869a..c8b311493 100644 +--- a/config/sources/families/sun50iw9.conf ++++ b/config/sources/families/sun50iw9.conf +@@ -10,6 +10,7 @@ case $BRANCH in + + LINUXFAMILY=sun50iw9 + KERNELSOURCE='https://github.com/orangepi-xunlong/linux-orangepi.git' ++ export KERNEL_MAJOR_MINOR="4.9" # Major and minor versions of this kernel. + KERNELBRANCH="branch:orange-pi-4.9-sun50iw9" + KERNELPATCHDIR=${BOARDFAMILY}-${BRANCH} + KERNELDIR='linux-orangepi' +diff --git a/config/sources/families/virtual.conf b/config/sources/families/virtual.conf +index 41d36d1f9..3745afee6 100644 +--- a/config/sources/families/virtual.conf ++++ b/config/sources/families/virtual.conf +@@ -1,5 +1,6 @@ + BOOTBRANCH='tag:v2021.04' + ++export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. + KERNELBRANCH='branch:linux-5.10.y' + + ARCH=arm64 +diff --git a/config/sources/families/zynq.conf b/config/sources/families/zynq.conf +index b69bcc347..2bc2d6e9d 100644 +--- a/config/sources/families/zynq.conf ++++ b/config/sources/families/zynq.conf +@@ -3,6 +3,7 @@ SERIALCON='ttyPS0' + LINUXFAMILY=zynq + + KERNELSOURCE='https://github.com/Xilinx/linux-xlnx.git' ++export KERNEL_MAJOR_MINOR="5.4" # Major and minor versions of this kernel. See https://github.com/Xilinx/linux-xlnx/blob/xilinx-v2020.2/Makefile + KERNELBRANCH='tag:xilinx-v2020.2' + KERNELDIR='linux-xlnx' + KERNELPATCHDIR='zynq-'$BRANCH + +From 7b907d446bfae3db8c5afb4431d8e9bbd9e5df9e Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 22 Feb 2022 02:27:09 +0100 +Subject: [PATCH] armbian-next: cold/warm bundles import/download/export for + fetch_from_repo + +- warm remote, if present, can be exported shallow +- if warm remote bundle is present, can be imported shallow too +- fallback to cold bundle if warm not present +- export (from cold, if exists + warm) shallow bundle +- use temp clone and DATE (not rev or tag) for shallowing, WORKS! +- info JSON/CSV, include "config_ok" true/false, kernel/uboot info + - include logs for failed configs too + - core reports ARMBIAN_WILL_BUILD_KERNEL and ARMBIAN_WILL_BUILD_UBOOT now with package names +--- + lib/functions/compilation/kernel.sh | 16 ++- + lib/functions/general/git.sh | 259 +++++++++++++++++++++++++---------- + lib/functions/main/config-prepare.sh | 50 +++++-- + lib/tools/info.py | 17 +-- + lib/tools/json2csv.py | 2 + + 5 files changed, 246 insertions(+), 98 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 9deb439eb..014e4d337 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -47,10 +47,18 @@ function compile_kernel() { + + if [[ -n $KERNELSOURCE ]]; then + display_alert "Downloading sources" "kernel" "git" ++ ++ # Does not work well with rpi for example: GIT_WARM_REMOTE_SHALLOW_AT_TAG="v${KERNEL_MAJOR_MINOR}" \ ++ # GIT_WARM_REMOTE_SHALLOW_AT_TAG sets GIT_WARM_REMOTE_SHALLOW_AT_DATE for you, as long as it is included by GIT_WARM_REMOTE_FETCH_TAGS ++ # GIT_WARM_REMOTE_SHALLOW_AT_DATE is the only one really used for making shallow ++ + GIT_FIXED_WORKDIR="${LINUXSOURCEDIR}" \ +- WARM_REMOTE_NAME="kernel-stable-${KERNEL_MAJOR_MINOR}" \ +- WARM_REMOTE_URL="${MAINLINE_KERNEL_SOURCE}" \ +- WARM_REMOTE_BRANCH="branch:linux-${KERNEL_MAJOR_MINOR}.y" \ ++ GIT_WARM_REMOTE_NAME="kernel-stable-${KERNEL_MAJOR_MINOR}" \ ++ GIT_WARM_REMOTE_URL="${MAINLINE_KERNEL_SOURCE}" \ ++ GIT_WARM_REMOTE_BRANCH="linux-${KERNEL_MAJOR_MINOR}.y" \ ++ GIT_WARM_REMOTE_FETCH_TAGS="v${KERNEL_MAJOR_MINOR}*" \ ++ GIT_WARM_REMOTE_SHALLOW_AT_TAG="${KERNEL_MAJOR_SHALLOW_TAG}" \ ++ GIT_WARM_REMOTE_BUNDLE="kernel-stable-${KERNEL_MAJOR_MINOR}" \ + GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ + fetch_from_repo "$KERNELSOURCE" "unused:set via GIT_FIXED_WORKDIR" "$KERNELBRANCH" "yes" + fi +@@ -254,7 +262,7 @@ function compile_kernel() { + # Prepare for packaging, using the exact same options as original compile. + display_alert "Installing kernel headers and modules for packaging" "${LINUXCONFIG} ${prepackage_targets[*]}" "info" + fasthash_debug "pre-prepackage" +- make_filter="| grep --line-buffered -v -e 'INSTALL' -e 'SIGN'" run_kernel_make_long_running "${prepackage_targets[@]}" ++ make_filter="| grep --line-buffered -v -e 'INSTALL' -e 'SIGN' -e 'XZ'" run_kernel_make_long_running "${prepackage_targets[@]}" + fasthash_debug "post-prepackage" + + # produce deb packages: image, headers, firmware, dtb +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 15a5cbbd2..73c066be4 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -8,7 +8,7 @@ improved_git() { + local delay=10 + local count=0 + while [ $count -lt $retries ]; do +- run_host_command_logged_raw "$real_git" --no-pager "$@" && return 0 # this gobbles up errors, but returns if OK, so everything after is error ++ run_host_command_logged_raw eatmydata "$real_git" --no-pager "$@" && return 0 # this gobbles up errors, but returns if OK, so everything after is error + count=$((count + 1)) + display_alert "improved_git try $count failed, retrying in ${delay} seconds" "git $*" "warn" + sleep $delay +@@ -17,6 +17,11 @@ improved_git() { + return 17 # explode with error if this is reached, "too many retries" + } + ++# Not improved, just regular, but logged "correctly". ++regular_git() { ++ run_host_command_logged_raw eatmydata -- git --no-pager "$@" ++} ++ + # avoid repeating myself too much + function improved_git_fetch() { + improved_git fetch --progress --verbose --no-auto-maintenance "$@" +@@ -67,6 +72,7 @@ fetch_from_repo() { + + git_work_dir="${SRC}/cache/sources/${workdir}" + ++ # if GIT_FIXED_WORKDIR has something, ignore above logic and use that directly. + if [[ "${GIT_FIXED_WORKDIR}" != "" ]]; then + display_alert "GIT_FIXED_WORKDIR is set to" "${GIT_FIXED_WORKDIR}" "debug" + git_work_dir="${SRC}/cache/sources/${GIT_FIXED_WORKDIR}" +@@ -83,11 +89,15 @@ fetch_from_repo() { + exit_with_error "Remote URL does not match. Stopping!" "${git_work_dir} $dir $ref_name" "warn" + fi + ++ local do_warmup_remote="no" do_cold_bundle="no" do_add_origin="no" ++ + if [[ "$(git rev-parse --git-dir)" != ".git" ]]; then + display_alert "Creating local copy" "$dir $ref_name" +- improved_git init -q --initial-branch="armbian_unused_initial_branch" . +- improved_git remote add origin "${url}" +- offline=false # Force online, we'll need to fetch. ++ regular_git init -q --initial-branch="armbian_unused_initial_branch" . ++ offline=false # Force online, we'll need to fetch. ++ do_add_origin="yes" # Just created the repo, it needs an origin later. ++ do_warmup_remote="yes" # Just created the repo, mark it as ready to receive the warm remote if exists. ++ do_cold_bundle="yes" # Just created the repo, mark it as ready to receive a cold bundle if that is available. + fi + + local changed=false +@@ -129,61 +139,12 @@ fetch_from_repo() { + fi # offline + + if [[ "${changed}" == "true" ]]; then ++ git_handle_cold_and_warm_bundle_remotes # Delegate to function to find or create cache if appropriate. + +- # If there's a cold bundle URL specified: +- # - if there's already a cold_bundle_xxx remote, move on. +- # - grab the bundle via http/https first, and fetch from that, into "cold_bundle_xxx" remote. +- # - do nothing else with this, it'll be used internally by git to avoid a huge fetch later. +- # - but, after this, the wanted branch will be fetched. signal has_fetched_from_bundle=1 for later. +- local has_fetched_from_bundle=0 +- if [[ "${GIT_COLD_BUNDLE_URL}" != "" ]]; then +- local git_cold_bundle_id git_cold_bundle_cache_dir git_cold_bundle_cache_file git_cold_bundle_remote_id git_cold_bundle_fetched_marker_file +- # calculate the id, dir and name of local file and remote +- git_cold_bundle_cache_dir="${SRC}/cache/gitbundles" +- mkdir -p "${git_cold_bundle_cache_dir}" +- git_cold_bundle_id="$(echo -n "${GIT_COLD_BUNDLE_URL}" | md5sum | awk '{print $1}')" # md5 of the URL. +- git_cold_bundle_cache_file="${git_cold_bundle_cache_dir}/${git_cold_bundle_id}.gitbundle" +- git_cold_bundle_remote_id="cold_bundle_${git_cold_bundle_id}" +- git_cold_bundle_fetched_marker_file=".git/fetched-from-bundle-${git_cold_bundle_id}" +- +- display_alert "There's a " "${GIT_COLD_BUNDLE_URL} -- ${git_cold_bundle_id} -- file: ${git_cold_bundle_cache_file}" "debug" +- +- # Don't do if already done before for this bundle. +- if [[ ! -f "${git_cold_bundle_fetched_marker_file}" ]]; then +- +- # Download the bundle file if it does not exist. +- if [[ ! -f "${git_cold_bundle_cache_file}" ]]; then +- display_alert "Downloading cold bundle from remote server" "${GIT_COLD_BUNDLE_URL}" "debug" +- run_host_command_logged wget --continue --output-document="${git_cold_bundle_cache_file}" "${GIT_COLD_BUNDLE_URL}" +- else +- display_alert "Cold bundle file exists, using it" "${git_cold_bundle_cache_file}" "debug" +- fi +- +- # Make sure bundle is valid. +- improved_git bundle verify "${git_cold_bundle_cache_file}" +- +- # Get a list of remotes in the repo; add remote to bundle if it does not exist, and fetch from it. +- # This should be done only once per workdir, so I use a marker file to denote completion. +- if git remote get-url "${git_cold_bundle_remote_id}" 2> /dev/null; then +- display_alert "Git already has bundle remote" "incomplete fetch? ${git_cold_bundle_id}" "debug" +- else +- improved_git remote add "${git_cold_bundle_remote_id}" "${git_cold_bundle_cache_file}" # Add the remote pointing to the cold bundle file +- fi +- +- display_alert "Fetching from git bundle, wait" "${git_cold_bundle_id}" "info" +- improved_git_fetch --no-tags "${git_cold_bundle_remote_id}" # Fetch it! (all refs!) +- has_fetched_from_bundle=1 # marker for pruning logic below +- echo "${remote_hash}" > "${git_cold_bundle_fetched_marker_file}" # marker for future invocation +- display_alert "Bundle fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull +- +- fi ++ if [[ "${do_add_origin}" == "yes" ]]; then ++ regular_git remote add origin "${url}" + fi + +- # @TODO: If there's a warmup remote specified: (for u-boot and others) +- # - if there's already a warmup remote, move on. +- # - if there's a cached warmup bundle file, add it as remote and fetch from it, and move on. +- # - add the warmup as remote, fetch from it; export it as a cached bundle for next time. +- + # remote was updated, fetch and check out updates, but not tags; tags pull their respective commits too, making it a huge fetch. + display_alert "Fetching updates from origin" "$dir $ref_name" + case $ref_type in +@@ -194,25 +155,14 @@ fetch_from_repo() { + display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size again + + display_alert "Checking out" "$dir $ref_name" +- improved_git checkout -f -q FETCH_HEAD +- improved_git clean -q -d -f ++ regular_git checkout -f -q FETCH_HEAD ++ regular_git clean -q -d -f + display_alert "After checkout, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull + +- # @TODO: find fork point, shallow from there, repack, and export bundle for that version; +- # would need a mainline reference to to this (eg: find 5.10.0, export 5.10 bundle from there) +- if [[ $has_fetched_from_bundle -gt 0 ]]; then +- display_alert "Pre-pruning, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull +- display_alert "@TODO" "export bundle after full fetch" "warn" +- # echo -n "${remote_hash}" > .git/shallow # commit to keep for shallowing, can be something else. for now is full prune. +- # improved_git remote remove "${git_cold_bundle_remote_id}" +- # improved_git reflog expire --expire=0 --all +- # improved_git gc --prune=all +- fi +- + elif [[ -n $(git status -uno --porcelain --ignore-submodules=all) ]]; then # if not changed, but dirty... + display_alert "Cleaning git dir" "$(git status -s | wc -l) files" # working directory is not clean, show it +- improved_git checkout -f -q HEAD # Return the files that are tracked by git to the initial state. +- improved_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. ++ regular_git checkout -f -q HEAD # Return the files that are tracked by git to the initial state. ++ regular_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. + else # not changed, not dirty. + display_alert "Up to date" "$dir $ref_name at revision ${local_hash}" # working directory is clean, nothing to do + fi +@@ -236,3 +186,170 @@ fetch_from_repo() { + done + fi + } ++ ++function git_fetch_from_bundle_file() { ++ local bundle_file="${1}" remote_name="${2}" shallow_file="${3}" ++ regular_git bundle verify "${bundle_file}" # Make sure bundle is valid. ++ regular_git remote add "${remote_name}" "${bundle_file}" # Add the remote pointing to the cold bundle file ++ if [[ -f "${shallow_file}" ]]; then ++ display_alert "Bundle is shallow" "${shallow_file}" "debug" ++ cp -p "${shallow_file}" ".git/shallow" ++ fi ++ improved_git_fetch --tags "${remote_name}" # Fetch it! (including tags!) ++ display_alert "Bundle fetch '${remote_name}' completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" ++} ++ ++function download_git_bundle_from_http() { ++ local bundle_file="${1}" bundle_url="${2}" ++ if [[ ! -f "${git_cold_bundle_cache_file}" ]]; then # Download the bundle file if it does not exist. ++ display_alert "Downloading cold bundle from remote server" "${bundle_url}" "debug" # This gonna take a while. And waste bandwidth ++ run_host_command_logged wget --continue --output-document="${bundle_file}" "${bundle_url}" # @TODO: progress giga? ++ else ++ display_alert "Cold bundle file exists, using it" "${bundle_file}" "debug" ++ fi ++} ++ ++function git_remove_cold_and_warm_bundle_remotes() { ++ # Remove the cold bundle remote, otherwise it holds references that impede the shallow to actually work. ++ if [[ ${has_git_cold_remote} -gt 0 ]]; then ++ regular_git remote remove "${git_cold_bundle_remote_name}" ++ has_git_cold_remote=0 ++ fi ++ ++ # Remove the warmup remote, otherwise it holds references forever. ++ if [[ ${has_git_warm_remote} -gt 0 ]]; then ++ regular_git remote remove "${GIT_WARM_REMOTE_NAME}" ++ has_git_warm_remote=0 ++ fi ++} ++ ++function git_handle_cold_and_warm_bundle_remotes() { ++ ++ local has_git_cold_remote=0 ++ local has_git_warm_remote=0 ++ local git_warm_remote_bundle_file git_warm_remote_bundle_cache_dir git_warm_remote_bundle_file_shallowfile ++ local git_warm_remote_bundle_extra_fn="" ++ ++ # First check the warm remote bundle cache. If that exists, use that, and skip the cold bundle. ++ if [[ "${do_warmup_remote}" == "yes" ]]; then ++ if [[ "${GIT_WARM_REMOTE_NAME}" != "" ]] && [[ "${GIT_WARM_REMOTE_BUNDLE}" != "" ]]; then ++ # Add extras to filename, for shallow by tag or revision ++ if [[ "${GIT_WARM_REMOTE_SHALLOW_REVISION}" != "" ]]; then ++ git_warm_remote_bundle_extra_fn="-shallow-rev-${GIT_WARM_REMOTE_SHALLOW_REVISION}" ++ elif [[ "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" != "" ]]; then ++ git_warm_remote_bundle_extra_fn="-shallow-tag-${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" ++ fi ++ git_warm_remote_bundle_cache_dir="${SRC}/cache/gitbundles/warm" # calculate the id, dir and name of local file and remote ++ git_warm_remote_bundle_file="${git_warm_remote_bundle_cache_dir}/${GIT_WARM_REMOTE_BUNDLE}${git_warm_remote_bundle_extra_fn}.gitbundle" # final filename of bundle ++ git_warm_remote_bundle_file_shallowfile="${git_warm_remote_bundle_file}.shallow" # it can be there's a shallow revision ++ if [[ -f "${git_warm_remote_bundle_file}" ]]; then ++ display_alert "Fetching from Warm git bundle, wait" "${GIT_WARM_REMOTE_BUNDLE}" "info" # This is gonna take a long while... ++ git_fetch_from_bundle_file "${git_warm_remote_bundle_file}" "${GIT_WARM_REMOTE_NAME}" "${git_warm_remote_bundle_file_shallowfile}" ++ do_cold_bundle="no" # Skip the cold bundle, below. ++ do_warmup_remote="no" # Skip the warm bundle creation, below, too. ++ has_git_warm_remote=1 # mark warm remote as added. ++ else ++ display_alert "Could not find warm bundle file" "${git_warm_remote_bundle_file}" "debug" ++ fi ++ fi ++ fi ++ ++ if [[ "${do_cold_bundle}" == "yes" ]]; then ++ # If there's a cold bundle URL specified: ++ # - if there's already a cold_bundle_xxx remote, move on. ++ # - grab the bundle via http/https first, and fetch from that, into "cold_bundle_xxx" remote. ++ # - do nothing else with this, it'll be used internally by git to avoid a huge fetch later. ++ # - but, after this, the wanted branch will be fetched. signal has_git_cold_remote=1 for later. ++ if [[ "${GIT_COLD_BUNDLE_URL}" != "" ]]; then ++ display_alert "There's a " "${GIT_COLD_BUNDLE_URL} -- ${git_cold_bundle_id} -- file: ${git_cold_bundle_cache_file}" "debug" # @TODO: remove ++ local git_cold_bundle_id git_cold_bundle_cache_dir git_cold_bundle_cache_file git_cold_bundle_remote_name ++ git_cold_bundle_cache_dir="${SRC}/cache/gitbundles/cold" # calculate the id, dir and name of local file and remote ++ git_cold_bundle_id="$(echo -n "${GIT_COLD_BUNDLE_URL}" | md5sum | awk '{print $1}')" # md5 of the URL. ++ git_cold_bundle_cache_file="${git_cold_bundle_cache_dir}/${git_cold_bundle_id}.gitbundle" # final filename of bundle ++ git_cold_bundle_remote_name="cold_bundle_${git_cold_bundle_id}" # name of the remote that will point to bundle ++ mkdir -p "${git_cold_bundle_cache_dir}" # make sure directory exists before downloading ++ download_git_bundle_from_http "${git_cold_bundle_cache_file}" "${GIT_COLD_BUNDLE_URL}" ++ display_alert "Fetching from cold git bundle, wait" "${git_cold_bundle_id}" "info" # This is gonna take a long while... ++ git_fetch_from_bundle_file "${git_cold_bundle_cache_file}" "${git_cold_bundle_remote_name}" ++ has_git_cold_remote=1 # marker for pruning logic below ++ fi ++ fi ++ ++ # If there's a warmup remote specified. ++ # - if there's a cached warmup bundle file, add it as remote and fetch from it, and move on. ++ # - add the warmup as remote, fetch from it; export it as a cached bundle for next time. ++ if [[ "${do_warmup_remote}" == "yes" ]]; then ++ if [[ "${GIT_WARM_REMOTE_NAME}" != "" ]] && [[ "${GIT_WARM_REMOTE_URL}" != "" ]] && [[ "${GIT_WARM_REMOTE_BRANCH}" != "" ]]; then ++ ++ display_alert "Using Warmup Remote before origin fetch" "${GIT_WARM_REMOTE_NAME} - ${GIT_WARM_REMOTE_BRANCH}" "debug" ++ regular_git remote add "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_URL}" # Add the remote to the warmup source ++ has_git_warm_remote=1 # mark as done. Will export the bundle! ++ ++ improved_git_fetch --no-tags "${GIT_WARM_REMOTE_NAME}" "${GIT_WARM_REMOTE_BRANCH}" # Fetch the remote branch, but no tags ++ display_alert "After warm bundle, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ ++ # Checkout that to a branch. We wanna have a local reference to what has been fetched. ++ # @TODO: could be a param instead of FETCH_HEAD; would drop commits after that rev ++ local git_warm_branch_name="warm__${GIT_WARM_REMOTE_BRANCH}" ++ regular_git branch "${git_warm_branch_name}" FETCH_HEAD || true ++ ++ improved_git_fetch "${GIT_WARM_REMOTE_NAME}" "'refs/tags/${GIT_WARM_REMOTE_FETCH_TAGS}:refs/tags/${GIT_WARM_REMOTE_FETCH_TAGS}'" || true # Fetch the remote branch, but no tags ++ display_alert "After warm bundle tags, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ ++ # Lookup the tag (at the warm remote directly) to find the rev to shallow to. ++ if [[ "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" != "" ]]; then ++ display_alert "GIT_WARM_REMOTE_SHALLOW_AT_TAG" "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}" "debug" ++ GIT_WARM_REMOTE_SHALLOW_AT_DATE="$(git tag --list --format="%(creatordate)" "${GIT_WARM_REMOTE_SHALLOW_AT_TAG}")" ++ display_alert "GIT_WARM_REMOTE_SHALLOW_AT_TAG ${GIT_WARM_REMOTE_SHALLOW_AT_TAG} resulted in GIT_WARM_REMOTE_SHALLOW_AT_DATE" "Date: ${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" "debug" ++ fi ++ ++ # At this stage, we might wanna make the local copy shallow and re-pack it. ++ if [[ "${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" != "" ]]; then ++ display_alert "Making working copy shallow" "before date ${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" "debug" ++ ++ # 'git clone' is the only consistent, usable thing we can do to do this. ++ # it does require a temporary dir, though. use one. ++ ++ local temp_git_dir="${git_work_dir}.making.shallow.temp" ++ rm -rf "${temp_git_dir}" ++ ++ regular_git clone --no-checkout --progress --verbose \ ++ --single-branch --branch="${git_warm_branch_name}" \ ++ --tags --shallow-since="${GIT_WARM_REMOTE_SHALLOW_AT_DATE}" \ ++ "file://${git_work_dir}" "${temp_git_dir}" ++ ++ display_alert "After shallow clone, temp_git_dir" "$(du -h -s "${temp_git_dir}" | awk '{print $1}')" "debug" # Show size after shallow ++ ++ # Get rid of original, replace with new. Move cwd so no warnings are produced. ++ cd "${SRC}" || exit_with_error "Failed to move cwd away so we can remove" "${git_work_dir}" ++ rm -rf "${git_work_dir}" ++ mv -v "${temp_git_dir}" "${git_work_dir}" ++ cd "${git_work_dir}" || exit_with_error "Failed to get new dir after clone" "${git_work_dir}" ++ ++ # dir switched, no more the original remotes. but origin is leftover, remove it ++ regular_git remote remove origin || true ++ has_git_cold_remote=0 ++ has_git_warm_remote=0 ++ ++ display_alert "After shallow, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after shallow ++ fi ++ ++ # Now git working copy has a precious state we might wanna preserve (export the bundle). ++ if [[ "${GIT_WARM_REMOTE_BUNDLE}" != "" ]]; then ++ mkdir -p "${git_warm_remote_bundle_cache_dir}" ++ display_alert "Exporting warm remote bundle" "${git_warm_remote_bundle_file}" "debug" ++ regular_git bundle create "${git_warm_remote_bundle_file}" --all ++ ++ rm -f "${git_warm_remote_bundle_file_shallowfile}" # not shallow at first... ++ if [[ -f ".git/shallow" ]]; then ++ display_alert "Exported bundle is shallow" "Will copy to ${git_warm_remote_bundle_file_shallowfile}" "debug" ++ cp -p ".git/shallow" "${git_warm_remote_bundle_file_shallowfile}" ++ fi ++ ++ fi ++ fi ++ fi ++ ++ # Make sure to remove the cold and warm bundle remote, otherwise it holds references for no good reason. ++ git_remove_cold_and_warm_bundle_remotes ++} +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 618f4eb9c..56616cff6 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -160,22 +160,8 @@ function prepare_and_config_main_build_single() { + fi + + export BOOTSOURCEDIR="${BOOTDIR}/$(branch2dir "${BOOTBRANCH}")" +- export LINUXSOURCEDIR="${KERNELDIR}/$(branch2dir "${KERNELBRANCH}")" + [[ -n $ATFSOURCE ]] && export ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")" + +- # So for kernel full cached rebuilds. +- # We wanna be able to rebuild kernels very fast. so it only makes sense to use a dir for each built kernel. +- # That is the "default" layout; there will be as many source dirs as there are built kernel debs. +- # But, it really makes much more sense if the major.minor (such as 5.10, 5.15, or 4.4) of kernel has its own +- # tree. So in the end: +- # -[-] +- # So we gotta explictly know the major.minor to be able to do that scheme. +- # If we don't know, we could use BRANCH as reference, but that changes over time, and leads to wastage. +- if [[ "x${KERNEL_MAJOR_MINOR}x" == "xx" ]]; then +- exit_with_error "BAD config, missing" "KERNEL_MAJOR_MINOR" "err" +- fi +- export LINUXSOURCEDIR="kernel/${ARCH}__${KERNEL_MAJOR_MINOR}__${LINUXFAMILY}" +- + export BSP_CLI_PACKAGE_NAME="armbian-bsp-cli-${BOARD}${EXTRA_BSP_NAME}" + export BSP_CLI_PACKAGE_FULLNAME="${BSP_CLI_PACKAGE_NAME}_${REVISION}_${ARCH}" + export BSP_DESKTOP_PACKAGE_NAME="armbian-bsp-desktop-${BOARD}${EXTRA_BSP_NAME}" +@@ -186,7 +172,41 @@ function prepare_and_config_main_build_single() { + export CHOSEN_ROOTFS=${BSP_CLI_PACKAGE_NAME} + export CHOSEN_DESKTOP=armbian-${RELEASE}-desktop-${DESKTOP_ENVIRONMENT} + export CHOSEN_KSRC=linux-source-${BRANCH}-${LINUXFAMILY} +- export CHOSEN_KERNEL_WITH_ARCH=${CHOSEN_KERNEL}-${ARCH} # Only for reporting purposes. ++ ++ # So for kernel full cached rebuilds. ++ # We wanna be able to rebuild kernels very fast. so it only makes sense to use a dir for each built kernel. ++ # That is the "default" layout; there will be as many source dirs as there are built kernel debs. ++ # But, it really makes much more sense if the major.minor (such as 5.10, 5.15, or 4.4) of kernel has its own ++ # tree. So in the end: ++ # -[-] ++ # So we gotta explictly know the major.minor to be able to do that scheme. ++ # If we don't know, we could use BRANCH as reference, but that changes over time, and leads to wastage. ++ if [[ -n "${KERNELSOURCE}" ]]; then ++ export ARMBIAN_WILL_BUILD_KERNEL="${CHOSEN_KERNEL}-${ARCH}" ++ if [[ "x${KERNEL_MAJOR_MINOR}x" == "xx" ]]; then ++ exit_with_error "BAD config, missing" "KERNEL_MAJOR_MINOR" "err" ++ fi ++ # Parse/validate the the major, bail if no match ++ if linux-version compare "${KERNEL_MAJOR_MINOR}" ge "5.4"; then # We support 5.x from 5.4; 5.10+ brings unified packaging. ++ export KERNEL_MAJOR=5 ++ export KERNEL_MAJOR_SHALLOW_TAG="v${KERNEL_MAJOR_MINOR}-rc1" ++ elif linux-version compare "${KERNEL_MAJOR_MINOR}" ge "4.4" && linux-version compare "${KERNEL_MAJOR_MINOR}" lt "5.0"; then ++ export KERNEL_MAJOR=4 # We support 4.x from 4.4; all require custom packaging. ++ export KERNEL_MAJOR_SHALLOW_TAG="v${KERNEL_MAJOR_MINOR}-rc1" ++ else ++ exit_with_error "Kernel series unsupported" "'${KERNEL_MAJOR_MINOR}' is unsupported, or bad config" ++ fi ++ ++ export LINUXSOURCEDIR="kernel/${ARCH}__${KERNEL_MAJOR_MINOR}__${LINUXFAMILY}" ++ else ++ export ARMBIAN_WILL_BUILD_KERNEL=no ++ fi ++ ++ if [[ -n "${BOOTCONFIG}" ]] && [[ "${BOOTCONFIG}" != "none" ]]; then ++ export ARMBIAN_WILL_BUILD_UBOOT=yes ++ else ++ export ARMBIAN_WILL_BUILD_UBOOT=no ++ fi + + display_alert "Done with prepare_and_config_main_build_single" "${BOARD}.${BOARD_TYPE}" "info" + } +diff --git a/lib/tools/info.py b/lib/tools/info.py +index 088d4738a..6319a1427 100755 +--- a/lib/tools/info.py ++++ b/lib/tools/info.py +@@ -44,7 +44,8 @@ def map_to_armbian_params(map_params): + + def run_armbian_compile_and_parse(path_to_compile_sh, compile_params): + exec_cmd = ([path_to_compile_sh] + map_to_armbian_params(compile_params)) +- # print(exec_cmd) ++ result = None ++ logs = ["Not available"] + try: + result = subprocess.run( + exec_cmd, +@@ -62,7 +63,11 @@ def run_armbian_compile_and_parse(path_to_compile_sh, compile_params): + compile_params, e.returncode, e.stderr + ) + ) +- raise e ++ return {"in": compile_params, "out": {}, "logs": e.stderr.split("\n"), "config_ok": False} ++ ++ if result is not None: ++ if result.stderr: ++ logs = result.stderr.split("\n") + + # Now parse it with regex-power! + # regex = r"^declare (..) (.*?)=\"(.*?)\"$" # old multiline version +@@ -83,11 +88,7 @@ def run_armbian_compile_and_parse(path_to_compile_sh, compile_params): + + all_keys[key] = value + +- logs = ["Not available"] +- if result.stderr: +- logs = result.stderr.split("\n") +- +- return {"in": compile_params, "out": all_keys, "logs": logs} ++ return {"in": compile_params, "out": all_keys, "logs": logs, "config_ok": True} + + + # Find the location of compile.sh, relative to this Python script. +@@ -160,7 +161,7 @@ def get_info_for_one_board(board_file, board_name, common_params, board_info): + return parsed | board_info + except: + eprint("Failed get info for board '{}'".format(board_name)) +- return None ++ return board_info | {"ARMBIAN_CONFIG_OK": False} + + + if True: +diff --git a/lib/tools/json2csv.py b/lib/tools/json2csv.py +index 7933ed9d6..68c1decb0 100755 +--- a/lib/tools/json2csv.py ++++ b/lib/tools/json2csv.py +@@ -33,6 +33,8 @@ for obj in flat: + value = obj[key] + if type(value) == str: + columns_map[key] = True ++ if type(value) == bool: ++ columns_map[key] = True + + columns = columns_map.keys() + + +From 8eca261f5e3e41d7f363514a79b4fd764c3e9b71 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Feb 2022 17:39:40 +0100 +Subject: [PATCH] armbian-next: `KERNELDIR` is out, `KERNEL_MAJOR_MINOR` is in + for all `meson64`, `rpi4b` and `uefi` + +--- + config/sources/families/bcm2711.conf | 3 ++- + config/sources/families/include/meson64_common.inc | 7 ++++--- + config/sources/families/include/uefi_common.inc | 8 ++++---- + extensions/grub.sh | 1 - + 4 files changed, 10 insertions(+), 9 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 0dc25fc3f..a5a0bff7f 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -3,7 +3,6 @@ export LINUXFAMILY=bcm2711 + export ARCH=arm64 + export UEFI_FS_LABEL="RPICFG" # Windows/Mac users will see this if they mount the SD card. Configurable, but should be uppercase always + export SKIP_BOOTSPLASH="yes" # video is init-ed before us +-export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. + export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration + export FK__KERNEL_PACKAGES="" + export RASPI_ROOT_FS_LABEL="armbian" +@@ -20,6 +19,7 @@ case "${BRANCH}" in + current) + export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. For mainline caching. + export KERNELBRANCH="branch:rpi-5.15.y" + export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" + export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" +@@ -28,6 +28,7 @@ case "${BRANCH}" in + edge) + export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. For mainline caching. + export KERNELBRANCH="branch:rpi-5.16.y" + export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" + export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index f69669a5f..ea4363e81 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -24,17 +24,18 @@ case $BRANCH in + + legacy) + KERNELSOURCE='https://github.com/hardkernel/linux' +- #KERNELBRANCH='branch:odroidg12-4.9.y' +- KERNELBRANCH='tag:4.9.277-122' +- KERNELDIR='linux-odroid' ++ export KERNEL_MAJOR_MINOR="4.9" # Major and minor versions of this kernel. For mainline caching. ++ KERNELBRANCH='branch:odroidg12-4.9.y' + ;; + + current) ++ export KERNEL_MAJOR_MINOR="5.10" # Major and minor versions of this kernel. For mainline caching. + KERNELBRANCH='branch:linux-5.10.y' + KERNELPATCHDIR='meson64-current' + ;; + + edge) ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. For mainline caching. + KERNELBRANCH='branch:linux-5.15.y' + KERNELPATCHDIR='meson64-edge' + ;; +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index 7d6c97e0a..b362bcba0 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -14,16 +14,16 @@ case "${BRANCH}" in + current) + export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" +- export KERNELBRANCH="branch:linux-5.15.y" ++ export KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:linux-5.15.y" # Branch or tag to build from. It should match MAJOR_MINOR + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. +- export KERNELDIR="linux-uefi-${LINUXFAMILY}" # Avoid sharing a source tree with others, until we know it's safe. + ;; + + edge) + export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" +- export KERNELBRANCH="branch:linux-5.16.y" ++ export KERNEL_MAJOR_MINOR="5.16" # Major and minor versions of this kernel. For mainline caching. ++ export KERNELBRANCH="branch:linux-5.16.y" # Branch or tag to build from. It should match MAJOR_MINOR + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. +- export KERNELDIR="linux-uefi-${LINUXFAMILY}" # Avoid sharing a source tree with others, until we know it's safe. + ;; + esac +diff --git a/extensions/grub.sh b/extensions/grub.sh +index 3f0478454..e1b20a87e 100644 +--- a/extensions/grub.sh ++++ b/extensions/grub.sh +@@ -53,7 +53,6 @@ function extension_prepare_config__prepare_flash_kernel() { + unset KERNELSOURCE # This should make Armbian skip most stuff. At least, I hacked it to. + export INSTALL_ARMBIAN_FIRMWARE=no # Should skip build and install of Armbian-firmware. + else +- export KERNELDIR="linux-uefi-${LINUXFAMILY}" # Avoid sharing a source tree with others, until we know it's safe. + # Don't install anything. Armbian handles everything. + DISTRO_KERNEL_PACKAGES="" + DISTRO_FIRMWARE_PACKAGES="" + +From 6f046c4f36a156468666b8c7bfff995934c44264 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Feb 2022 17:37:10 +0100 +Subject: [PATCH] armbian-next: new kernel workdir layout: + cache/sources/kernel/-- + +- `GIT_FIXED_WORKDIR` is used to ignore 2nd param and use a specific dir +- this now REQUIRES `KERNEL_MAJOR_MINOR` to be set. +- prepare some `WARM_REMOTE_NAME` and related, based on it +--- + lib/functions/compilation/kernel.sh | 41 ++++++++++++++++++++---------------- + lib/functions/general/git.sh | 7 +++++- + lib/functions/main/config-prepare.sh | 13 ++++++++++++ + lib/functions/main/default-build.sh | 2 +- + 4 files changed, 43 insertions(+), 20 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index f429110d2..9deb439eb 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -43,34 +43,39 @@ function run_kernel_make_long_running() { + } + + function compile_kernel() { ++ local kernel_work_dir="${SRC}/cache/sources/${LINUXSOURCEDIR}" ++ + if [[ -n $KERNELSOURCE ]]; then + display_alert "Downloading sources" "kernel" "git" +- GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ +- fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" ++ GIT_FIXED_WORKDIR="${LINUXSOURCEDIR}" \ ++ WARM_REMOTE_NAME="kernel-stable-${KERNEL_MAJOR_MINOR}" \ ++ WARM_REMOTE_URL="${MAINLINE_KERNEL_SOURCE}" \ ++ WARM_REMOTE_BRANCH="branch:linux-${KERNEL_MAJOR_MINOR}.y" \ ++ GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ ++ fetch_from_repo "$KERNELSOURCE" "unused:set via GIT_FIXED_WORKDIR" "$KERNELBRANCH" "yes" + fi + + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$LINUXSOURCEDIR" "info" + ( +- cd "${SRC}/cache/sources/${LINUXSOURCEDIR}" ++ cd "${kernel_work_dir}" + make ARCH="${ARCHITECTURE}" clean > /dev/null 2>&1 + ) + fi + fasthash_debug "post git clean" + +- local kerneldir="$SRC/cache/sources/$LINUXSOURCEDIR" + if [[ $USE_OVERLAYFS == yes ]]; then + display_alert "Using overlayfs_wrapper" "kernel_${LINUXFAMILY}_${BRANCH}" "debug" +- kerneldir=$(overlayfs_wrapper "wrap" "$SRC/cache/sources/$LINUXSOURCEDIR" "kernel_${LINUXFAMILY}_${BRANCH}") ++ kernel_work_dir=$(overlayfs_wrapper "wrap" "$SRC/cache/sources/$LINUXSOURCEDIR" "kernel_${LINUXFAMILY}_${BRANCH}") + fi +- cd "${kerneldir}" || exit ++ cd "${kernel_work_dir}" || exit + + # @TODO: why would we delete localversion? + rm -f localversion + + # read kernel version + local version hash pre_patch_version +- version=$(grab_version "$kerneldir") ++ version=$(grab_version "$kernel_work_dir") + pre_patch_version="${version}" + display_alert "Pre-patch kernel version" "${pre_patch_version}" "debug" + +@@ -81,14 +86,14 @@ function compile_kernel() { + fi + + # read kernel git hash +- hash=$(git --git-dir="$kerneldir"/.git rev-parse HEAD) ++ hash=$(git --git-dir="$kernel_work_dir"/.git rev-parse HEAD) + + ## Start kernel patching process. + ## There's a few objectives here: + ## - (always) produce a fasthash: represents "what would be done" (eg: md5 of a patch, crc32 of description). + ## - (optionally) execute modification against living tree (eg: apply a patch, copy a file, etc). only if `DO_MODIFY=yes` + ## - (always) call mark_change_commit with the description of what was done and fasthash. +- initialize_fasthash "kernel" "${hash}" "${pre_patch_version}" "${kerneldir}" ++ initialize_fasthash "kernel" "${hash}" "${pre_patch_version}" "${kernel_work_dir}" + fasthash_debug "init" + + # Apply a series of patches if a series file exists +@@ -96,17 +101,17 @@ function compile_kernel() { + if test -f "${series_conf}"; then + display_alert "series.conf file visible. Apply" + fasthash_branch "patches-${KERNELPATCHDIR}-series.conf" +- apply_patch_series "${kerneldir}" "${series_conf}" # applies a series of patches, read from a file. calls process_patch_file ++ apply_patch_series "${kernel_work_dir}" "${series_conf}" # applies a series of patches, read from a file. calls process_patch_file + fi + + # mostly local-based packaging fixes. + fasthash_branch "packaging-patches" +- apply_kernel_patches_for_packaging "${kerneldir}" "${version}" # calls process_patch_file and other stuff. ++ apply_kernel_patches_for_packaging "${kernel_work_dir}" "${version}" # calls process_patch_file and other stuff. + + # applies a humongous amount of patches coming from github repos. + # it's mostly conditional, and very complex. + # @TODO: re-enable after finishing converting it with fasthash magic +- # apply_kernel_patches_for_drivers "${kerneldir}" "${version}" # calls process_patch_file and other stuff. there is A LOT of it. ++ # apply_kernel_patches_for_drivers "${kernel_work_dir}" "${version}" # calls process_patch_file and other stuff. there is A LOT of it. + + # applies a series of patches, in directory order, from multiple directories (default/"user" patches) + # @TODO: I believe using the $BOARD here is the most confusing thing in the whole of Armbian. It should be disabled. +@@ -123,7 +128,7 @@ function compile_kernel() { + + # re-read kernel version after patching + local version +- version=$(grab_version "$kerneldir") ++ version=$(grab_version "$kernel_work_dir") + + display_alert "Compiling $BRANCH kernel" "$version" "info" + +@@ -172,8 +177,8 @@ function compile_kernel() { + + # hack for OdroidXU4. Copy firmare files + if [[ $BOARD == odroidxu4 ]]; then +- mkdir -p "${kerneldir}/firmware/edid" +- cp "${SRC}"/packages/blobs/odroidxu4/*.bin "${kerneldir}/firmware/edid" ++ mkdir -p "${kernel_work_dir}/firmware/edid" ++ cp "${SRC}"/packages/blobs/odroidxu4/*.bin "${kernel_work_dir}/firmware/edid" + fi + + # hack for deb builder. To pack what's missing in headers pack. +@@ -236,7 +241,7 @@ function compile_kernel() { + fi + + # Check for built kernel image file file; can override default with KERNEL_IMAGE_TYPE_PATH +- local check_built_kernel_file="${kerneldir}/${KERNEL_IMAGE_TYPE_PATH:-"arch/${ARCHITECTURE}/boot/${KERNEL_IMAGE_TYPE}"}" ++ local check_built_kernel_file="${kernel_work_dir}/${KERNEL_IMAGE_TYPE_PATH:-"arch/${ARCHITECTURE}/boot/${KERNEL_IMAGE_TYPE}"}" + if [[ ! -f "${check_built_kernel_file}" ]]; then + exit_with_error "Kernel was not built" "${check_built_kernel_file}" + fi +@@ -292,8 +297,8 @@ create_linux-source_package() { + xz < .config > "${sources_pkg_dir}/usr/src/${LINUXCONFIG}_${version}_${REVISION}_config.xz" + + display_alert "Compressing sources for the linux-source package" +- tar cp --directory="$kerneldir" --exclude='.git' --owner=root . | +- pv -N "$(logging_echo_prefix_for_pv "compress_kernel_sources") $display_name" -p -b -r -s "$(du -sb "$kerneldir" --exclude=='.git' | cut -f1)" | ++ tar cp --directory="$kernel_work_dir" --exclude='.git' --owner=root . | ++ pv -N "$(logging_echo_prefix_for_pv "compress_kernel_sources") $display_name" -p -b -r -s "$(du -sb "$kernel_work_dir" --exclude=='.git' | cut -f1)" | + pixz -0 > "${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.xz" # @TODO: .deb will compress this later. -0 for now, but should be a plain tar + cp COPYING "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}/LICENSE" + +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 81b64586b..15a5cbbd2 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -67,6 +67,11 @@ fetch_from_repo() { + + git_work_dir="${SRC}/cache/sources/${workdir}" + ++ if [[ "${GIT_FIXED_WORKDIR}" != "" ]]; then ++ display_alert "GIT_FIXED_WORKDIR is set to" "${GIT_FIXED_WORKDIR}" "debug" ++ git_work_dir="${SRC}/cache/sources/${GIT_FIXED_WORKDIR}" ++ fi ++ + mkdir -p "${git_work_dir}" || exit_with_error "No path or no write permission" "${git_work_dir}" + + cd "${git_work_dir}" || exit +@@ -82,7 +87,7 @@ fetch_from_repo() { + display_alert "Creating local copy" "$dir $ref_name" + improved_git init -q --initial-branch="armbian_unused_initial_branch" . + improved_git remote add origin "${url}" +- offline=false # Force only, we'll need to fetch. ++ offline=false # Force online, we'll need to fetch. + fi + + local changed=false +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index bb3831889..618f4eb9c 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -163,6 +163,19 @@ function prepare_and_config_main_build_single() { + export LINUXSOURCEDIR="${KERNELDIR}/$(branch2dir "${KERNELBRANCH}")" + [[ -n $ATFSOURCE ]] && export ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")" + ++ # So for kernel full cached rebuilds. ++ # We wanna be able to rebuild kernels very fast. so it only makes sense to use a dir for each built kernel. ++ # That is the "default" layout; there will be as many source dirs as there are built kernel debs. ++ # But, it really makes much more sense if the major.minor (such as 5.10, 5.15, or 4.4) of kernel has its own ++ # tree. So in the end: ++ # -[-] ++ # So we gotta explictly know the major.minor to be able to do that scheme. ++ # If we don't know, we could use BRANCH as reference, but that changes over time, and leads to wastage. ++ if [[ "x${KERNEL_MAJOR_MINOR}x" == "xx" ]]; then ++ exit_with_error "BAD config, missing" "KERNEL_MAJOR_MINOR" "err" ++ fi ++ export LINUXSOURCEDIR="kernel/${ARCH}__${KERNEL_MAJOR_MINOR}__${LINUXFAMILY}" ++ + export BSP_CLI_PACKAGE_NAME="armbian-bsp-cli-${BOARD}${EXTRA_BSP_NAME}" + export BSP_CLI_PACKAGE_FULLNAME="${BSP_CLI_PACKAGE_NAME}_${REVISION}_${ARCH}" + export BSP_DESKTOP_PACKAGE_NAME="armbian-bsp-desktop-${BOARD}${EXTRA_BSP_NAME}" +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 5430e9e97..112628729 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -75,7 +75,7 @@ main_default_build_single() { + fi + fi + if [[ "${exit_after_kernel_build}" == "yes" ]]; then +- display "Only building kernel and exiting" "NOW" "debug" ++ display_alert "Only building kernel and exiting" "NOW" "debug" + exit 0 + fi + fi + +From e736b5233c440555fa8a1a654f1c3ac9ae664580 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Feb 2022 16:01:19 +0100 +Subject: [PATCH] armbian-next: JUST_KERNEL=yes (opposed to KERNEL_ONLY=yes) is + really just the kernel build + +--- + lib/functions/main/default-build.sh | 56 ++++++++++++++++++++++++++----------- + 1 file changed, 39 insertions(+), 17 deletions(-) + +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 94c202aff..5430e9e97 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -23,38 +23,60 @@ main_default_build_single() { + 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" do_host_tools="yes" ++ if [[ "${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 +- LOG_SECTION="fetch_and_build_host_tools" do_with_logging fetch_and_build_host_tools ++ ++ # 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 option in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do + if [[ $option != sources ]]; then + LOG_SECTION="cleaning" do_with_logging cleaning "$option" +- fasthash_debug "main_cleaning_armbian" ++ #fasthash_debug "main_cleaning_armbian" + fi + done + fi + +- # 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 ++ 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 + fi + + # Compile kernel if packed .deb does not exist or use the one from repository +- if [[ ! -f ${DEB_STORAGE}/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb ]]; then +- export KDEB_CHANGELOG_DIST=$RELEASE +- if [[ -n $KERNELSOURCE ]] && [[ "${REPOSITORY_INSTALL}" != *kernel* ]]; then +- LOG_SECTION="compile_kernel" do_with_logging compile_kernel ++ 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 ++ LOG_SECTION="compile_kernel" do_with_logging compile_kernel ++ fi ++ fi ++ if [[ "${exit_after_kernel_build}" == "yes" ]]; then ++ display "Only building kernel and exiting" "NOW" "debug" ++ exit 0 + fi + fi + + +From df90ffa11bff94bcb3b90b3460bacd7ed102a567 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Feb 2022 14:40:47 +0100 +Subject: [PATCH] armbian-next: fetch_from_repos now done when actually + compiling atf/uboot/kernel, not before + +- lib regen after removing empty files (sources.sh and errors.sh are now gone) +--- + lib/functions/compilation/atf.sh | 5 +++++ + lib/functions/compilation/kernel.sh | 6 ++++++ + lib/functions/compilation/sources.sh | 17 ----------------- + lib/functions/compilation/uboot.sh | 5 +++++ + lib/functions/logging/errors.sh | 10 ---------- + lib/functions/main/default-build.sh | 2 +- + lib/library-functions.sh | 18 ------------------ + 7 files changed, 17 insertions(+), 46 deletions(-) + +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index f5e9aa691..7f20028da 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -1,4 +1,9 @@ + compile_atf() { ++ if [[ -n "${ATFSOURCE}" && "${ATFSOURCE}" != "none" ]]; then ++ display_alert "Downloading sources" "atf" "git" ++ fetch_from_repo "$ATFSOURCE" "$ATFDIR" "$ATFBRANCH" "yes" ++ fi ++ + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$ATFSOURCEDIR" "info" + ( +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 3b2219579..f429110d2 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -43,6 +43,12 @@ function run_kernel_make_long_running() { + } + + function compile_kernel() { ++ if [[ -n $KERNELSOURCE ]]; then ++ display_alert "Downloading sources" "kernel" "git" ++ GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ ++ fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" ++ fi ++ + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$LINUXSOURCEDIR" "info" + ( +diff --git a/lib/functions/compilation/sources.sh b/lib/functions/compilation/sources.sh +deleted file mode 100644 +index 377d4510b..000000000 +--- a/lib/functions/compilation/sources.sh ++++ /dev/null +@@ -1,17 +0,0 @@ +-function fetch_sources_kernel_uboot_atf() { +- if [[ -n $KERNELSOURCE ]]; then +- display_alert "Downloading sources" "kernel" "git" +- GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ +- fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" +- fi +- +- if [[ -n $BOOTSOURCE ]] && [[ "${BOOTSOURCE}" != "none" ]]; then +- display_alert "Downloading sources" "u-boot" "git" +- fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo +- fi +- +- if [[ -n "${ATFSOURCE}" && "${ATFSOURCE}" != "none" ]]; then +- display_alert "Downloading sources" "atf" "git" +- fetch_from_repo "$ATFSOURCE" "$ATFDIR" "$ATFBRANCH" "yes" +- fi +-} +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 053312875..33415c2e2 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -96,6 +96,11 @@ function compile_uboot_target() { + } + + compile_uboot() { ++ if [[ -n $BOOTSOURCE ]] && [[ "${BOOTSOURCE}" != "none" ]]; then ++ display_alert "Downloading sources" "u-boot" "git" ++ fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo ++ fi ++ + # not optimal, but extra cleaning before overlayfs_wrapper should keep sources directory clean + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$BOOTSOURCEDIR" "info" +diff --git a/lib/functions/logging/errors.sh b/lib/functions/logging/errors.sh +deleted file mode 100644 +index 29263306c..000000000 +--- a/lib/functions/logging/errors.sh ++++ /dev/null +@@ -1,10 +0,0 @@ +-#!/bin/bash +-# +-# Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com +-# +-# This file is licensed under the terms of the GNU General Public +-# License version 2. This program is licensed "as is" without any +-# warranty of any kind, whether express or implied. +- +-# This file is a part of the Armbian build script +-# https://github.com/armbian/build/ +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 5b80314ef..94c202aff 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -22,9 +22,9 @@ main_default_build_single() { + if [[ $CLEAN_LEVEL == *sources* ]]; then + cleaning "sources" + fi ++ + # ignore updates help on building all images - for internal purposes + if [[ $IGNORE_UPDATES != yes ]]; then +- LOG_SECTION="fetch_sources_kernel_uboot_atf" do_with_logging fetch_sources_kernel_uboot_atf + LOG_SECTION="fetch_and_build_host_tools" do_with_logging fetch_and_build_host_tools + + for option in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 2e720a66f..cec0c0fc7 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -118,15 +118,6 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/patch/kernel-pkg.sh + source "${SRC}"/lib/functions/compilation/patch/kernel-pkg.sh + +-# no errors tolerated. invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/sources.sh +-# shellcheck source=lib/functions/compilation/sources.sh +-source "${SRC}"/lib/functions/compilation/sources.sh +- + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +@@ -316,15 +307,6 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/logging/capture.sh + source "${SRC}"/lib/functions/logging/capture.sh + +-# no errors tolerated. invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/logging/errors.sh +-# shellcheck source=lib/functions/logging/errors.sh +-source "${SRC}"/lib/functions/logging/errors.sh +- + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + +From a44e91752d1005daa5bba5eb0b0114654199e3e5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 21 Feb 2022 01:50:16 +0100 +Subject: [PATCH] armbian-next: linux: back to Torvalds bundle, no tags; + reminder about export + +--- + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/general/git.sh | 25 ++++++++++++++----------- + 2 files changed, 15 insertions(+), 12 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 722371f3e..883550d79 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -115,7 +115,7 @@ function do_main_configuration() { + # URL for the git bundle used to "bootstrap" local git copies without too much server load. This applies independently of git mirror below. + export MAINLINE_KERNEL_TORVALDS_BUNDLE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle" # this is plain torvalds, single branch + export MAINLINE_KERNEL_STABLE_BUNDLE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/clone.bundle" # this is all stable branches. with tags! +- export MAINLINE_KERNEL_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL:-$MAINLINE_KERNEL_STABLE_BUNDLE_URL}" # default to stable. it's bigger but more useful for developers. ++ export MAINLINE_KERNEL_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL:-${MAINLINE_KERNEL_TORVALDS_BUNDLE_URL}}" # default to Torvalds; everything else is small enough with this + + case $MAINLINE_MIRROR in + google) +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 51f658d31..81b64586b 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -166,7 +166,7 @@ fetch_from_repo() { + fi + + display_alert "Fetching from git bundle, wait" "${git_cold_bundle_id}" "info" +- improved_git_fetch --tags "${git_cold_bundle_remote_id}" # Fetch it! and all its tags, too. ++ improved_git_fetch --no-tags "${git_cold_bundle_remote_id}" # Fetch it! (all refs!) + has_fetched_from_bundle=1 # marker for pruning logic below + echo "${remote_hash}" > "${git_cold_bundle_fetched_marker_file}" # marker for future invocation + display_alert "Bundle fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull +@@ -182,9 +182,9 @@ fetch_from_repo() { + # remote was updated, fetch and check out updates, but not tags; tags pull their respective commits too, making it a huge fetch. + display_alert "Fetching updates from origin" "$dir $ref_name" + case $ref_type in +- branch | commit) improved_git_fetch --tags origin "${ref_name}" ;; +- tag) improved_git_fetch --tags origin tags/"${ref_name}" ;; +- head) improved_git_fetch --tags origin HEAD ;; ++ branch | commit) improved_git_fetch --no-tags origin "${ref_name}" ;; ++ tag) improved_git_fetch --no-tags origin tags/"${ref_name}" ;; ++ head) improved_git_fetch --no-tags origin HEAD ;; + esac + display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size again + +@@ -193,13 +193,16 @@ fetch_from_repo() { + improved_git clean -q -d -f + display_alert "After checkout, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull + +- #if [[ $has_fetched_from_bundle -gt 0 ]]; then +- # display_alert "Pre-pruning, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull +- # echo -n "${remote_hash}" > .git/shallow # commit to keep for shallowing, can be something else. for now is full prune. +- # improved_git remote remove "${git_cold_bundle_remote_id}" +- # improved_git reflog expire --expire=0 --all +- # improved_git gc --prune=all +- #fi ++ # @TODO: find fork point, shallow from there, repack, and export bundle for that version; ++ # would need a mainline reference to to this (eg: find 5.10.0, export 5.10 bundle from there) ++ if [[ $has_fetched_from_bundle -gt 0 ]]; then ++ display_alert "Pre-pruning, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ display_alert "@TODO" "export bundle after full fetch" "warn" ++ # echo -n "${remote_hash}" > .git/shallow # commit to keep for shallowing, can be something else. for now is full prune. ++ # improved_git remote remove "${git_cold_bundle_remote_id}" ++ # improved_git reflog expire --expire=0 --all ++ # improved_git gc --prune=all ++ fi + + elif [[ -n $(git status -uno --porcelain --ignore-submodules=all) ]]; then # if not changed, but dirty... + display_alert "Cleaning git dir" "$(git status -s | wc -l) files" # working directory is not clean, show it + +From 9acef6be57519029f5e4eeccabac183e27e3f845 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 19 Feb 2022 02:29:27 +0100 +Subject: [PATCH] armbian-next: full cached kernel build; refactor all make's + in a single place, even for packaging + +- 2nd+ runs build in less than a minute +- kernel: compile and package in a single step, more efficient? +- KERNEL_BUILD_DTBS yes/no to build or not dtbs, replaces KERNEL_EXTRA_TARGETS +- dtbs_install, modules_install and headers_install now called by Armbian, not packaging +- kernel with split, but identical, build and install makes for modules/headers/dtbs +- make mkdebian and builddeb idempotent as possible +- keep a lot more cache, specially 'debian' folder +- filtering logging of install stuff +- might be a few leftovers, revisit gains with packaging later + - keeping the arm64 makefile Image.gz vs Image hack + - fix order of packaging patch byteshift, but still there + - cleaning of scripts tools on cross compile removed (!) +--- + config/sources/amd64.conf | 4 +- + lib/functions/compilation/kernel.sh | 138 +++++++------ + lib/functions/compilation/patch/apply.sh | 10 + + lib/functions/compilation/patch/fasthash.sh | 40 +++- + lib/functions/compilation/patch/kernel-pkg.sh | 16 +- + lib/functions/compilation/sources.sh | 4 +- + lib/functions/main/default-build.sh | 4 +- + packages/armbian/builddeb | 218 ++++++++------------- + packages/armbian/mkdebian | 268 +++++++++++++------------- + 9 files changed, 352 insertions(+), 350 deletions(-) + +diff --git a/config/sources/amd64.conf b/config/sources/amd64.conf +index 510d1b6b6..cc1b4b256 100644 +--- a/config/sources/amd64.conf ++++ b/config/sources/amd64.conf +@@ -3,8 +3,8 @@ export ARCHITECTURE=x86_64 # "kernel" arch + export QEMU_BINARY="qemu-x86_64-static" # Hopefully you have this installed. + export KERNEL_COMPILER=' ' # hack: use single space for host gcc. won't work on arm64 hosts + export KERNEL_USE_GCC=' ' # more hacks. +-export KERNEL_IMAGE_TYPE="bzImage" # Ubuntu Standard +-export KERNEL_EXTRA_TARGETS=" " # default is "dtbs" but x86_64 has no DTB. use a space for no target ++export KERNEL_IMAGE_TYPE="bzImage" # Passed to kernel's `make` ++export KERNEL_BUILD_DTBS="no" # amd64 has no DTBs. that I know of. + #export INITRD_ARCH=amd64 # Used by u-boot for mkimage in initramfs. No u-boot for x86 yet. + + export UBOOT_USE_GCC="none" # required by configuration.sh +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index c6591d5cc..3b2219579 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -5,25 +5,30 @@ function run_kernel_make() { + common_make_envs=( + "CCACHE_BASEDIR=\"$(pwd)\"" # Base directory for ccache, for cache reuse + "PATH=\"${toolchain}:${PATH}\"" # Insert the toolchain first into the PATH. ++ "DPKG_COLORS=always" # Use colors for dpkg + ) + + common_make_params_quoted=( +- "$CTHREADS" # Parallel compile, "-j X" for X cpus +- "LOCALVERSION=-${LINUXFAMILY}" # Kernel param +- "KDEB_PKGVERSION=${REVISION}" # deb package version +- "KDEB_COMPRESS=${DEB_COMPRESS}" # dpkg compression for deb +- "BRANCH=${BRANCH}" # @TODO: rpardini: Wonder what BRANCH is used for during packaging? +- "ARCH=${ARCHITECTURE}" # Why? +- "KBUILD_DEBARCH=${ARCH}" # Where used? +- "DEBFULLNAME=${MAINTAINER}" # For changelog generation +- "DEBEMAIL=${MAINTAINERMAIL}" # idem +- "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. ++ "$CTHREADS" # Parallel compile, "-j X" for X cpus ++ "LOCALVERSION=-${LINUXFAMILY}" # Kernel param ++ "KDEB_PKGVERSION=${REVISION}" # deb package version ++ "KDEB_COMPRESS=${DEB_COMPRESS}" # dpkg compression for deb ++ "BRANCH=${BRANCH}" # @TODO: rpardini: Wonder what BRANCH is used for during packaging? ++ "INSTALL_HDR_PATH=debian/hdrtmp/usr" # For packaging headers_install used for headers ++ "INSTALL_MOD_PATH=debian/tmp" # For packaging modules for image package ++ "INSTALL_DTBS_PATH=debian/dtbtmp/boot/dtbs_install" # For packaging DTBs for dtb package ++ "ARCH=${ARCHITECTURE}" # Why? ++ "KBUILD_DEBARCH=${ARCH}" # Where used? ++ "DEBFULLNAME=${MAINTAINER}" # For changelog generation ++ "DEBEMAIL=${MAINTAINERMAIL}" # idem ++ "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. + ) + + common_make_params_quoted+=("KCFLAGS=-fdiagnostics-color=always") # Force GCC colored messages. + + # last statement, so it passes the result to calling function. +- full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" make "$@" "${common_make_params_quoted[@]@Q}") ++ full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" ++ make "$@" "${common_make_params_quoted[@]@Q}" "${make_filter}") + "${full_command[@]}" # and exit with it's code, since it's the last statement + } + +@@ -32,7 +37,9 @@ function run_kernel_make_dialog() { + } + + function run_kernel_make_long_running() { ++ local seconds_start=${SECONDS} # Bash has a builtin SECONDS that is seconds since start of script + KERNEL_MAKE_RUNNER="run_host_command_logged_long_running" run_kernel_make "$@" ++ display_alert "Kernel Make '$*' took" "$((SECONDS - seconds_start)) seconds" "debug" + } + + function compile_kernel() { +@@ -43,6 +50,7 @@ function compile_kernel() { + make ARCH="${ARCHITECTURE}" clean > /dev/null 2>&1 + ) + fi ++ fasthash_debug "post git clean" + + local kerneldir="$SRC/cache/sources/$LINUXSOURCEDIR" + if [[ $USE_OVERLAYFS == yes ]]; then +@@ -51,6 +59,7 @@ function compile_kernel() { + fi + cd "${kerneldir}" || exit + ++ # @TODO: why would we delete localversion? + rm -f localversion + + # read kernel version +@@ -59,6 +68,12 @@ function compile_kernel() { + pre_patch_version="${version}" + display_alert "Pre-patch kernel version" "${pre_patch_version}" "debug" + ++ # different packaging for 4.3+ ++ local kernel_packaging_target="deb-pkg" ++ if linux-version compare "${version}" ge 4.3; then ++ kernel_packaging_target="bindeb-pkg" ++ fi ++ + # read kernel git hash + hash=$(git --git-dir="$kerneldir"/.git rev-parse HEAD) + +@@ -68,7 +83,7 @@ function compile_kernel() { + ## - (optionally) execute modification against living tree (eg: apply a patch, copy a file, etc). only if `DO_MODIFY=yes` + ## - (always) call mark_change_commit with the description of what was done and fasthash. + initialize_fasthash "kernel" "${hash}" "${pre_patch_version}" "${kerneldir}" +- declare -a fast_hash_list=() ++ fasthash_debug "init" + + # Apply a series of patches if a series file exists + local series_conf="${SRC}"/patch/kernel/${KERNELPATCHDIR}/series.conf +@@ -94,6 +109,7 @@ function compile_kernel() { + fasthash_branch "patches-${KERNELPATCHDIR}-$BRANCH" + advanced_patch "kernel" "$KERNELPATCHDIR" "$BOARD" "" "$BRANCH" "$LINUXFAMILY-$BRANCH" # calls process_patch_file, "target" is empty there + ++ fasthash_debug "finish" + finish_fasthash "kernel" # this reports the final hash and creates git branch to build ID. All modifications commited. + + # create patch for manual source changes in debug mode +@@ -137,6 +153,10 @@ function compile_kernel() { + fi + fi + ++ # Store the .config modification date at this time, for restoring later. Otherwise rebuilds. ++ local kernel_config_mtime ++ kernel_config_mtime=$(get_file_modification_time ".config") ++ + call_extension_method "custom_kernel_config" <<- 'CUSTOM_KERNEL_CONFIG' + *Kernel .config is in place, still clean from git version* + Called after ${LINUXCONFIG}.config is put in place (.config). +@@ -156,12 +176,7 @@ function compile_kernel() { + display_alert "Kernel configuration" "${LINUXCONFIG}" "info" + + if [[ $KERNEL_CONFIGURE != yes ]]; then +- if [[ $BRANCH == default ]]; then +- run_kernel_make silentoldconfig # This will exit with generic error if it fails. +- else +- # TODO: check if required +- run_kernel_make olddefconfig +- fi ++ run_kernel_make olddefconfig # @TODO: what is this? does it fuck up dates? + else + display_alert "Starting kernel oldconfig+menuconfig" "${LINUXCONFIG}" "debug" + +@@ -170,6 +185,9 @@ function compile_kernel() { + # No logging for this. this is UI piece + run_kernel_make_dialog "${KERNEL_MENUCONFIG:-menuconfig}" + ++ # Capture new date. Otherwise changes not detected by make. ++ kernel_config_mtime=$(get_file_modification_time ".config") ++ + # store kernel config in easily reachable place + display_alert "Exporting new kernel config" "$DEST/config/$LINUXCONFIG.config" "info" + cp .config "${DEST}/config/${LINUXCONFIG}.config" +@@ -185,6 +203,9 @@ function compile_kernel() { + fi + fi + ++ # Restore the date of .config. Above delta is a pure function, theoretically. ++ set_files_modification_time "${kernel_config_mtime}" ".config" ++ + # create linux-source package - with already patched sources + # We will build this package first and clear the memory. + if [[ $BUILD_KSRC != no ]]; then +@@ -192,65 +213,62 @@ function compile_kernel() { + create_linux-source_package + fi + +- display_alert "Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" +- run_kernel_make_long_running "${KERNEL_IMAGE_TYPE}" modules "${KERNEL_EXTRA_TARGETS:-dtbs}" +- #run_kernel_make "${KERNEL_IMAGE_TYPE}" modules "${KERNEL_EXTRA_TARGETS:-dtbs}" ++ local -a build_targets=("headers") ++ [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]] && build_targets+=("dtbs") ++ build_targets+=("${KERNEL_IMAGE_TYPE}" modules) + +- if [[ ! -f arch/$ARCHITECTURE/boot/$KERNEL_IMAGE_TYPE ]]; then +- exit_with_error "Kernel was not built" "arch/$ARCHITECTURE/boot/$KERNEL_IMAGE_TYPE" ++ display_alert "Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" ++ fasthash_debug "pre-compile" ++ run_kernel_make_long_running "${build_targets[@]}" ++ fasthash_debug "post-compile" ++ ++ if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then ++ display_alert "DOUBLE Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" ++ fasthash_debug "pre-double-compile" ++ run_kernel_make_long_running "${build_targets[@]}" ++ fasthash_debug "post-double-compile" + fi + +- # different packaging for 4.3+ +- if linux-version compare "${version}" ge 4.3; then +- local kernel_packaging_target="bindeb-pkg" +- else +- local kernel_packaging_target="deb-pkg" ++ # Check for built kernel image file file; can override default with KERNEL_IMAGE_TYPE_PATH ++ local check_built_kernel_file="${kerneldir}/${KERNEL_IMAGE_TYPE_PATH:-"arch/${ARCHITECTURE}/boot/${KERNEL_IMAGE_TYPE}"}" ++ if [[ ! -f "${check_built_kernel_file}" ]]; then ++ exit_with_error "Kernel was not built" "${check_built_kernel_file}" + fi + +- display_alert "Creating kernel packages" "${LINUXCONFIG} $kernel_packaging_target" "info" ++ local -a prepackage_targets=(modules_install headers_install) ++ [[ "${KERNEL_BUILD_DTBS:-yes}" == "yes" ]] && prepackage_targets+=("dtbs_install") ++ ++ display_alert "Packaging Kernel" "${LINUXCONFIG} $kernel_packaging_target" "info" ++ ++ # Prepare for packaging, using the exact same options as original compile. ++ display_alert "Installing kernel headers and modules for packaging" "${LINUXCONFIG} ${prepackage_targets[*]}" "info" ++ fasthash_debug "pre-prepackage" ++ make_filter="| grep --line-buffered -v -e 'INSTALL' -e 'SIGN'" run_kernel_make_long_running "${prepackage_targets[@]}" ++ fasthash_debug "post-prepackage" + + # produce deb packages: image, headers, firmware, dtb ++ # This mostly only does ++ fasthash_debug "pre-packaging" + run_kernel_make_long_running $kernel_packaging_target ++ fasthash_debug "post-packaging" ++ ++ if [[ "${DOUBLE_COMPILE_KERNEL}" == "yes" ]]; then ++ display_alert "DOUBLE Packaging Kernel, Headers and DTBs" "${LINUXCONFIG} $kernel_packaging_target" "info" ++ fasthash_debug "pre-double-packaging" ++ run_kernel_make_long_running $kernel_packaging_target ++ fasthash_debug "post-double-packaging" ++ fi + + display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" + ++ display_alert "Done with" "kernel compile" "debug" ++ + cd .. || exit + # remove firmware image packages here - easier than patching ~40 packaging scripts at once + rm -f linux-firmware-image-*.deb + + rsync --remove-source-files -rq ./*.deb "${DEB_STORAGE}/" || exit_with_error "Failed moving kernel DEBs" + +- if [[ "a" == "b" ]]; then # @TODO DISABLED! TOO CRAZY +- display_alert "Update Kernel hashes" "${LINUXCONFIG} $kernel_packaging_target" +- +- # store git hash to the file and create a change log +- HASHTARGET="${SRC}/cache/hash$([[ ${BETA} == yes ]] && echo "-beta" || true)/linux-image-${BRANCH}-${LINUXFAMILY}" +- OLDHASHTARGET=$(head -1 "${HASHTARGET}.githash" 2> /dev/null || true) +- +- git -C ${kerneldir} cat-file -t ${OLDHASHTARGET} > /dev/null 2>&1 && OLDHASHTARGET=$(git -C ${kerneldir} rev-list --max-parents=0 HEAD) +- +- [[ -z ${KERNELPATCHDIR} ]] && KERNELPATCHDIR=$LINUXFAMILY-$BRANCH +- [[ -z ${LINUXCONFIG} ]] && LINUXCONFIG=linux-$LINUXFAMILY-$BRANCH +- +- # calculate URL +- if [[ "$KERNELSOURCE" == *"github.com"* ]]; then +- URL="${KERNELSOURCE/git:/https:}/commit/${HASH}" +- elif [[ "$KERNELSOURCE" == *"kernel.org"* ]]; then +- URL="${KERNELSOURCE/git:/https:}/commit/?h=$(echo $KERNELBRANCH | cut -d":" -f2)&id=${HASH}" +- else +- URL="${KERNELSOURCE}/+/$HASH" +- fi +- +- # create change log +- git --no-pager -C ${kerneldir} log --abbrev-commit --oneline --no-patch --no-merges --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(black bold)%ad%Creset%C(auto) | %s | <%an> | %H' ${OLDHASHTARGET}..${hash} > "${HASHTARGET}.gitlog" +- +- echo "${hash}" > "${HASHTARGET}.githash" +- hash_watch_1=$(LC_COLLATE=C find -L "${SRC}/patch/kernel/${KERNELPATCHDIR}"/ -name '*.patch' -mindepth 1 -maxdepth 1 -printf '%s %P\n' 2> /dev/null | LC_COLLATE=C sort -n) +- hash_watch_2=$(cat "${SRC}/config/kernel/${LINUXCONFIG}.config") +- echo "${hash_watch_1}${hash_watch_2}" | git hash-object --stdin >> "${HASHTARGET}.githash" +- +- display_alert "Finished updating kernel hashes" "${LINUXCONFIG} $kernel_packaging_target" "info" +- fi + return 0 + } + +diff --git a/lib/functions/compilation/patch/apply.sh b/lib/functions/compilation/patch/apply.sh +index 3387c061a..32351d1b8 100644 +--- a/lib/functions/compilation/patch/apply.sh ++++ b/lib/functions/compilation/patch/apply.sh +@@ -83,13 +83,23 @@ advanced_patch() { + process_patch_file() { + local patch=$1 + local status=$2 ++ local patch_date ++ ++ # get the modification date of the patch. make it not less than MIN_PATCH_AGE, if set. ++ # [[CC]YY]MMDDhhmm[.ss] time format ++ patch_date=$(get_file_modification_time "${patch}") + + # detect and remove files which patch will create + lsdiff -s --strip=1 "${patch}" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' + ++ # store an array of the files that patch will modify, we'll set their modification times after the fact ++ declare -a patched_files ++ mapfile -t patched_files < <(lsdiff -s --strip=1 "${patch}" | awk '{print $2}') ++ + # @TODO: try patching with `git am` first, so git contains the patch commit info/msg. -- For future git-based hashing. + # shellcheck disable=SC2015 # noted, thanks. I need to handle exit code here. + patch --batch -p1 -N < "${patch}" && { ++ set_files_modification_time "${patch_date}" "${patched_files[@]}" + display_alert "* $status $(basename "${patch}")" "" "info" + } || { + display_alert "* $status $(basename "${patch}")" "failed" "wrn" +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +index 306966d38..a01fe7664 100644 +--- a/lib/functions/compilation/patch/fasthash.sh ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -1,5 +1,6 @@ + function report_fashtash_should_execute() { +- display_alert "report_fashtash_should_execute" "$*" "debug" ++ report_fasthash "$@" ++ # @TODO: if fasthash only, return 1 + return 0 + } + +@@ -9,13 +10,18 @@ function mark_fasthash_done() { + } + + function report_fasthash() { +- display_alert "report_fasthash" "$*" "debug" ++ local type="${1}" ++ local obj="${2}" ++ local desc="${3}" ++ display_alert "report_fasthash" "${type}: ${desc}" "debug" + return 0 + } + + function initialize_fasthash() { + display_alert "initialize_fasthash" "$*" "debug" + return 0 ++ declare -a fast_hash_list=() ++ + } + + function fasthash_branch() { +@@ -27,3 +33,33 @@ function finish_fasthash() { + display_alert "finish_fasthash" "$*" "debug" + return 0 + } ++ ++function fasthash_debug() { ++ display_alert "fasthash_debug" "$*" "debug" ++ find . -type f -printf '%T@ %p\n' | ++ grep -v -e "\.ko" -e "\.o" -e "\.cmd" -e "\.mod" -e "\.a" -e "\.tmp" -e "\.dtb" -e ".scr" -e "\.\/debian" | ++ sort -n | tail -n 10 1>&2 ++} ++ ++function get_file_modification_time() { ++ local file_date ++ if [[ ! -f "${1}" ]]; then ++ exit_with_error "Can't get modification time of nonexisting file" "${1}" ++ fi ++ ++ # [[CC]YY]MMDDhhmm[ss] - it is a valid integer ++ file_date=$(date +%Y%m%d%H%M.%S -r "${1}") ++ display_alert "Got date ${file_date} for file" "${1}" "debug" ++ ++ # @TODO: if MIN_PATCH_AGE ++ echo -n "${file_date}" ++ ++ return 0 ++} ++ ++function set_files_modification_time() { ++ local mtime="${1}" ++ shift ++ display_alert "Setting date ${mtime} " "${*}" "debug" ++ touch -m -t "${mtime}" "${@}" ++} +diff --git a/lib/functions/compilation/patch/kernel-pkg.sh b/lib/functions/compilation/patch/kernel-pkg.sh +index 11d7d4244..e1653a66e 100644 +--- a/lib/functions/compilation/patch/kernel-pkg.sh ++++ b/lib/functions/compilation/patch/kernel-pkg.sh +@@ -1,5 +1,4 @@ + function apply_kernel_patches_for_packaging() { +- set -x + local kerneldir="${1}" + local version="${2}" + # Packaging patch for modern kernels should be one for all. +@@ -13,15 +12,16 @@ function apply_kernel_patches_for_packaging() { + local mkdebian="packages/armbian/mkdebian" + local kernel_package_dir="${kerneldir}/scripts/package" + if report_fashtash_should_execute text "$(cat "${SRC}/${builddeb}" "${SRC}/${mkdebian}")" "armbian builddeb and mkdebian replace"; then +- rm -rf "${kerneldir}/debian"/* +- +- # @TODO: is this idempotent? +- # shellcheck disable=SC2016 +- sed -i -e 's/^KBUILD_IMAGE := \$(boot)\/Image\.gz$/KBUILD_IMAGE := \$(boot)\/Image/' "${kerneldir}/arch/arm64/Makefile" ++ # Read mtime, then sed, then restore it ++ local arm64_makefile="${kerneldir}/arch/arm64/Makefile" arm64_makefile_mtime ++ arm64_makefile_mtime="$(get_file_modification_time "${arm64_makefile}")" ++ # shellcheck disable=SC2016 # this should be a .patch? ++ sed -i -e 's/^KBUILD_IMAGE := \$(boot)\/Image\.gz$/KBUILD_IMAGE := \$(boot)\/Image/' "${arm64_makefile}" ++ set_files_modification_time "${arm64_makefile_mtime}" "${arm64_makefile}" + + # cp with -p to preserve the original dates +- cp -p "${SRC}/${builddeb}" "${kernel_package_dir}/builddeb" +- cp -p "${SRC}/${mkdebian}" "${kernel_package_dir}/mkdebian" ++ cp -pv "${SRC}/${builddeb}" "${kernel_package_dir}/builddeb" ++ cp -pv "${SRC}/${mkdebian}" "${kernel_package_dir}/mkdebian" + + chmod 755 "${kernel_package_dir}/builddeb" "${kernel_package_dir}/mkdebian" + mark_fasthash_done # will do git commit, associate fasthash to real hash. +diff --git a/lib/functions/compilation/sources.sh b/lib/functions/compilation/sources.sh +index b4dd11c17..377d4510b 100644 +--- a/lib/functions/compilation/sources.sh ++++ b/lib/functions/compilation/sources.sh +@@ -5,12 +5,12 @@ function fetch_sources_kernel_uboot_atf() { + fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" + fi + +- if [[ -n $BOOTSOURCE ]]; then ++ if [[ -n $BOOTSOURCE ]] && [[ "${BOOTSOURCE}" != "none" ]]; then + display_alert "Downloading sources" "u-boot" "git" + fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo + fi + +- if [[ -n $ATFSOURCE ]]; then ++ if [[ -n "${ATFSOURCE}" && "${ATFSOURCE}" != "none" ]]; then + display_alert "Downloading sources" "atf" "git" + fetch_from_repo "$ATFSOURCE" "$ATFDIR" "$ATFBRANCH" "yes" + fi +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 7fc46c3d6..5b80314ef 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -13,7 +13,6 @@ main_default_build_single() { + + start=$(date +%s) + # Check and install dependencies, directory structure and settings +- # The OFFLINE_WORK variable inside the function + LOG_SECTION="prepare_host" do_with_logging prepare_host + + if [[ "${JUST_INIT}" == "yes" ]]; then +@@ -31,6 +30,7 @@ main_default_build_single() { + for option in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do + if [[ $option != sources ]]; then + LOG_SECTION="cleaning" do_with_logging cleaning "$option" ++ fasthash_debug "main_cleaning_armbian" + fi + done + fi +@@ -40,7 +40,7 @@ main_default_build_single() { + # @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}" && "${REPOSITORY_INSTALL}" != *u-boot* ]]; 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. +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +index d57ba1d76..631380a0c 100755 +--- a/packages/armbian/builddeb ++++ b/packages/armbian/builddeb +@@ -1,4 +1,4 @@ +-#!/bin/sh ++#!/usr/bin/bash + # + # builddeb 1.3 + # Copyright 2003 Wichert Akkerman +@@ -45,11 +45,13 @@ create_package() { + local pname="$1" pdir="$2" + local dpkg_deb_opts + ++ echo "Armbian kernel packaging: ${pname} ${pdir}" ++ + mkdir -m 755 -p "$pdir/DEBIAN" + mkdir -p "$pdir/usr/share/doc/$pname" +- cp debian/copyright "$pdir/usr/share/doc/$pname/" +- cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" +- gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" ++ cp -pv debian/copyright "$pdir/usr/share/doc/$pname/" ++ cp -pv debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" ++ gzip --force -9 "$pdir/usr/share/doc/$pname/changelog.Debian" + sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ + | xargs -r0 md5sum > DEBIAN/md5sums" + +@@ -114,13 +116,14 @@ create_package() { + + # Create the package + dpkg-gencontrol -p$pname -P"$pdir" ++ echo "Building deb package with compression '$KDEB_COMPRESS'" 1>&2 + dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. + } + + deploy_kernel_headers() { +- pdir=$1 ++ pdir=$1 # kernel_headers_dir + +- rm -rf $pdir ++ echo "Armbian deploy_kernel_headers: ${pdir}" + + destdir=$pdir/usr/src/linux-headers-$version + mkdir -p $destdir +@@ -128,15 +131,14 @@ deploy_kernel_headers() { + ( + cd $srctree + find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl +- find arch/*/include include scripts -type f -o -type l ++ find arch/*/include include scripts -type f -o -type l # @TODO: could strip off some stuff? + find security/*/include -type f + find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform + find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f +- ) > debian/hdrsrcfiles ++ ) | grep -v "^\/debian" > debian/hdrsrcfiles + + { + if is_enabled CONFIG_STACK_VALIDATION; then +- # echo tools/objtool/objtool + find tools/objtool -type f -executable + fi + +@@ -145,147 +147,77 @@ deploy_kernel_headers() { + if is_enabled CONFIG_GCC_PLUGINS; then + find scripts/gcc-plugins -name \*.so -o -name gcc-common.h + fi +- } > debian/hdrobjfiles ++ } | grep -v "^\/debian" > debian/hdrobjfiles ++ ++ echo "Headers copying over..." ++ tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir # Copy over using tar pipes, sources ++ tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir # Copy over using tar pipes, object files ++ rm -f debian/hdrsrcfiles debian/hdrobjfiles # remove file lists + ++ # After copying over, apply patch; + if is_native; then + echo "info: Build native: Skip headers-debian-byteshift.patch" >&2 + elif is_build_on_amd64; then + ( + cd $destdir +- patch -p1 < /tmp/headers-debian-byteshift.patch ++ # detect and remove files which patch will create ++ lsdiff -s --strip=1 "/tmp/headers-debian-byteshift.patch" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' ++ patch --batch -p1 < "/tmp/headers-debian-byteshift.patch" + ) + fi + +- tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir +- tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir +- rm -f debian/hdrsrcfiles debian/hdrobjfiles +- + # copy .config manually to be where it's expected to be +- cp $KCONFIG_CONFIG $destdir/.config ++ cp -pv $KCONFIG_CONFIG $destdir/.config + + mkdir -p $pdir/lib/modules/$version/ ++ rm -f $pdir/lib/modules/$version/build + ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build + } + + deploy_libc_headers() { + pdir=$1 +- +- rm -rf $pdir +- +- $MAKE -f $srctree/Makefile headers +- $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr +- + # move asm headers to /usr/include//asm to match the structure + # used by Debian-based distros (to support multi-arch) + host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) +- mkdir $pdir/usr/include/$host_arch +- mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ ++ mkdir -p $pdir/usr/include/$host_arch ++ [ -d $pdir/usr/include/asm ] && cp -rv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ ++ return 0 + } + +-version=$KERNELRELEASE ++# set -x ++echo "Armbian builddeb starting: ${KERNELRELEASE}..." ++ ++version=${KERNELRELEASE} + tmpdir="debian/tmp" + kernel_headers_dir="debian/hdrtmp" +-libc_headers_dir="debian/headertmp" ++libc_headers_dir="debian/libc_header_tmp" + dbg_dir="debian/dbgtmp" + dtb_dir="debian/dtbtmp" +-packagename=linux-image-"$BRANCH$LOCALVERSION" +-kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +-dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" ++packagename=linux-image-"${BRANCH}${LOCALVERSION}" ++kernel_headers_packagename=linux-headers-"${BRANCH}${LOCALVERSION}" ++dtb_packagename=linux-dtb-"${BRANCH}${LOCALVERSION}" + libc_headers_packagename=linux-libc-dev +-dbg_packagename=$packagename-dbg +- +-if [ "$ARCH" = "um" ]; then +- packagename=user-mode-linux-$version +-fi +- +-# Not all arches have the same installed path in debian +-# XXX: have each arch Makefile export a variable of the canonical image install +-# path instead +-case $ARCH in +- ++aarch64|arm64) +- image_name=Image +- installed_image_path="boot/vmlinuz-$version" +- ;; +- arm*) +- image_name=zImage +- installed_image_path="boot/vmlinuz-$version" +- ;; +- um) +- installed_image_path="usr/bin/linux-$version" +- ;; +- parisc|mips|powerpc) +- installed_image_path="boot/vmlinux-$version" +- ;; +- *) +- image_name=vmlinuz +- installed_image_path="boot/vmlinuz-$version" +- ;; +-esac ++dbg_packagename=${packagename}-dbg ++installed_image_path="boot/vmlinuz-$version" # for all arches + + BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) + +-# Setup the directory structure +-rm -rf "$tmpdir" "$dbg_dir" "$dtb_dir" debian/files ++# Complement the directory structure + mkdir -m 755 -p "$tmpdir/DEBIAN" + mkdir -p "$tmpdir/lib" "$tmpdir/boot" + mkdir -m 755 -p "$dtb_dir/DEBIAN" +-mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" ++mkdir -p "$dtb_dir/usr/share/doc/$dtb_packagename" + mkdir -m 755 -p "$kernel_headers_dir/lib/modules/$version/" + mkdir -m 755 -p "$libc_headers_dir/DEBIAN" + +-# Install the kernel +-if [ "$ARCH" = "um" ]; then +- mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" +- $MAKE linux +- cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" +- cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" +- gzip "$tmpdir/usr/share/doc/$packagename/config" +-else +- cp System.map "$tmpdir/boot/System.map-$version" +- cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" +-fi +-cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" +- +-if is_enabled CONFIG_OF_EARLY_FLATTREE; then +- # Only some architectures with OF support have this target +- if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then +- $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/linux-image-$version" dtbs_install +- fi +-fi ++# Install the kernel's System.map and config ++cp -pv System.map "$tmpdir/boot/System.map-$version" ++cp -pv $KCONFIG_CONFIG "$tmpdir/boot/config-$version" + +-if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG; then +- #mkdir -p "$tmpdir/boot/dtb" +- INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +-fi +- +-if is_enabled CONFIG_MODULES; then +- INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install +- rm -f "$tmpdir/lib/modules/$version/build" +- rm -f "$tmpdir/lib/modules/$version/source" +- +- if [ "$ARCH" = "um" ]; then +- mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" +- rmdir "$tmpdir/lib/modules/$version" +- fi +- +- if [ -n "$BUILD_DEBUG" ]; then +- for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do +- module=lib/modules/$module +- mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) +- # only keep debug symbols in the debug file +- $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module +- # strip original module from debug symbols +- $OBJCOPY --strip-debug $tmpdir/$module +- # then add a link to those +- $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module +- done +- +- # resign stripped modules +- if is_enabled CONFIG_MODULE_SIG_ALL; then +- INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign +- fi +- fi +-fi ++# Get the image from the makefile and install it as vmlinuz ++image_name_from_makefile="$($MAKE -s -f "$srctree/Makefile" image_name)" ++cp -pv "${image_name_from_makefile}" "$tmpdir/$installed_image_path" ++image_name="$(basename "${image_name_from_makefile}")" # Just the file name + + # Install the maintainer scripts + # Note: hook scripts under /etc/kernel are also executed by official Debian +@@ -297,7 +229,7 @@ for script in postinst postrm preinst prerm; do + mkdir -p "$tmpdir$debhookdir/$script.d" + cat <<- EOF > "$tmpdir/DEBIAN/$script" + #!/bin/bash +- ++ set -x + set -e + + # Pass maintainer script parameters to hook scripts +@@ -330,12 +262,12 @@ cat >> $tmpdir/DEBIAN/preinst <<- EOT + # exit if we are running chroot + if [ "\$(stat -c %d:%i /)" != "\$(stat -c %d:%i /proc/1/root/.)" ]; then exit 0; fi + +- check_boot_dev (){ ++ check_and_unmount (){ + boot_device=\$(mountpoint -d /boot) + + for file in /dev/* ; do + CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file)) +- if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then ++ if [ "\$CURRENT_DEVICE" = "\$boot_device" ]; then + boot_partition=\$file + break + fi +@@ -343,41 +275,43 @@ cat >> $tmpdir/DEBIAN/preinst <<- EOT + + bootfstype=\$(blkid -s TYPE -o value \$boot_partition) + if [ "\$bootfstype" = "vfat" ]; then ++ umount /boot + rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/$image_name /boot/uImage + fi + } +- mountpoint -q /boot && check_boot_dev ++ mountpoint -q /boot && check_and_unmount + exit 0 + EOT + + create_package "$packagename" "$tmpdir" + +-if [ "$ARCH" != "um" ]; then ++# Put the DTBs, installed by kernel make at "$dtb_dir/boot/dtbs_install", at "$dtb_dir/boot/dtb-$version" ++if [ -d "$dtb_dir/boot/dtbs_install" ]; then ++ echo "Armbian: DTB " "$dtb_dir/boot/dtbs_install" "exists, moving to" "$dtb_dir/boot/dtb-$version" ++ [ -d "$dtb_dir/boot/dtb-$version" ] && rm -rf "$dtb_dir/boot/dtb-$version" ++ mv -v "$dtb_dir/boot/dtbs_install" "$dtb_dir/boot/dtb-$version" ++ create_package "$dtb_packagename" "$dtb_dir" "dtb" ++fi + +- if [ "$(cat debian/arch)" != "amd64" ]; then # No DTB for amd64 target +- create_package "$dtb_packagename" "$dtb_dir" "dtb" +- fi ++deploy_libc_headers ${libc_headers_dir} ++create_package $libc_headers_packagename $libc_headers_dir + +- deploy_libc_headers $libc_headers_dir +- create_package $libc_headers_packagename $libc_headers_dir +- +- if is_enabled CONFIG_MODULES; then +- if is_native; then +- # echo "Skip scripts folder cleaning" >&2 +- # echo "Skip creating postinst prerm scripts for headers" >&2 +- deploy_kernel_headers $kernel_headers_dir +- create_package $kernel_headers_packagename $kernel_headers_dir +- else +- # Clean up the executables that are left over from +- # cross-compilation for a different host architecture. +- #( +- # cd $srctree +- # make M=scripts clean +- #) +- echo "-- NOT CLEANING before packaging headers. " 1>&2 +- deploy_kernel_headers $kernel_headers_dir +- create_package $kernel_headers_packagename $kernel_headers_dir "headers" +- fi ++if is_enabled CONFIG_MODULES; then ++ if is_native; then ++ # echo "Skip scripts folder cleaning" >&2 ++ # echo "Skip creating postinst prerm scripts for headers" >&2 ++ deploy_kernel_headers $kernel_headers_dir ++ create_package $kernel_headers_packagename $kernel_headers_dir # no "headers" here, no postinst ++ else ++ # Clean up the executables that are left over from ++ # cross-compilation for a different host architecture. ++ #( ++ # cd $srctree ++ # make M=scripts clean ++ #) ++ echo "-- NOT CLEANING before packaging headers. " 1>&2 ++ deploy_kernel_headers $kernel_headers_dir ++ create_package $kernel_headers_packagename $kernel_headers_dir "headers" + fi + + fi +@@ -387,7 +321,7 @@ if [ -n "$BUILD_DEBUG" ]; then + # Different tools want the image in different locations + # perf + mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ +- cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ ++ cp -pv vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ + # systemtap + mkdir -p $dbg_dir/usr/lib/debug/boot/ + ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version +diff --git a/packages/armbian/mkdebian b/packages/armbian/mkdebian +index 003195372..83a37b99d 100755 +--- a/packages/armbian/mkdebian ++++ b/packages/armbian/mkdebian +@@ -1,4 +1,4 @@ +-#!/bin/sh ++#!/usr/bin/bash + # + # Copyright 2003 Wichert Akkerman + # +@@ -19,57 +19,64 @@ if_enabled_echo() { + } + + set_debarch() { +- if [ -n "$KBUILD_DEBARCH" ] ; then ++ if [ -n "$KBUILD_DEBARCH" ]; then + debarch="$KBUILD_DEBARCH" + return + fi + + # Attempt to find the correct Debian architecture + case "$UTS_MACHINE" in +- i386|ia64|alpha|m68k|riscv*) +- debarch="$UTS_MACHINE" ;; +- x86_64) +- debarch=amd64 ;; +- sparc*) +- debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;; +- s390*) +- debarch=s390x ;; +- ppc*) +- if is_enabled CONFIG_64BIT; then +- debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) +- else +- debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) +- fi +- ;; +- parisc*) +- debarch=hppa ;; +- mips*) +- if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then +- debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el +- elif is_enabled CONFIG_CPU_MIPSR6; then +- debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 +- else +- debarch=mips +- fi +- ;; +- aarch64|arm64) +- debarch=arm64 ;; +- arm*) +- if is_enabled CONFIG_AEABI; then +- debarch=arm$(if_enabled_echo CONFIG_VFP hf el) +- else +- debarch=arm +- fi +- ;; +- openrisc) +- debarch=or1k ;; +- sh) +- if is_enabled CONFIG_CPU_SH3; then +- debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) +- elif is_enabled CONFIG_CPU_SH4; then +- debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) +- fi +- ;; ++ i386 | ia64 | alpha | m68k | riscv*) ++ debarch="$UTS_MACHINE" ++ ;; ++ x86_64) ++ debarch=amd64 ++ ;; ++ sparc*) ++ debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ++ ;; ++ s390*) ++ debarch=s390x ++ ;; ++ ppc*) ++ if is_enabled CONFIG_64BIT; then ++ debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) ++ else ++ debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) ++ fi ++ ;; ++ parisc*) ++ debarch=hppa ++ ;; ++ mips*) ++ if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then ++ debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el ++ elif is_enabled CONFIG_CPU_MIPSR6; then ++ debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 ++ else ++ debarch=mips ++ fi ++ ;; ++ aarch64 | arm64) ++ debarch=arm64 ++ ;; ++ arm*) ++ if is_enabled CONFIG_AEABI; then ++ debarch=arm$(if_enabled_echo CONFIG_VFP hf el) ++ else ++ debarch=arm ++ fi ++ ;; ++ openrisc) ++ debarch=or1k ++ ;; ++ sh) ++ if is_enabled CONFIG_CPU_SH3; then ++ debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) ++ elif is_enabled CONFIG_CPU_SH4; then ++ debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) ++ fi ++ ;; + esac + if [ -z "$debarch" ]; then + debarch=$(dpkg-architecture -qDEB_HOST_ARCH) +@@ -84,6 +91,9 @@ set_debarch() { + fi + } + ++#set -x ++echo "Armbian mkdebian starting..." ++ + # Some variables and settings used throughout the script + KDEB_SOURCENAME=linux-$KERNELRELEASE + version=$KERNELRELEASE +@@ -91,7 +101,7 @@ if [ -n "$KDEB_PKGVERSION" ]; then + packageversion=$KDEB_PKGVERSION + revision=${packageversion##*-} + else +- revision=$(cat .version 2>/dev/null||echo 1) ++ revision=$(cat .version 2> /dev/null || echo 1) + packageversion=$version-$revision + fi + sourcename=$KDEB_SOURCENAME +@@ -101,10 +111,6 @@ libc_headers_packagename=linux-libc-dev + dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" + dbg_packagename=$packagename-dbg + +-if [ "$ARCH" = "um" ] ; then +- packagename=user-mode-linux-$version +-fi +- + debarch= + set_debarch + +@@ -118,7 +124,7 @@ else + user=${KBUILD_BUILD_USER-$(id -nu)} + name=${DEBFULLNAME-$user} + if [ -z "$email" ]; then +- buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)} ++ buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2> /dev/null || hostname)} + email="$user@$buildhost" + fi + maintainer="$name <$email>" +@@ -126,14 +132,14 @@ fi + + # Try to determine distribution + if [ -n "$KDEB_CHANGELOG_DIST" ]; then +- distribution=$KDEB_CHANGELOG_DIST ++ distribution=$KDEB_CHANGELOG_DIST + # In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog +-elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then +- : # nothing to do in this case ++elif distribution=$(lsb_release -cs 2> /dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then ++ : # nothing to do in this case + else +- distribution="unstable" +- echo >&2 "Using default distribution of 'unstable' in the changelog" +- echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" ++ distribution="unstable" ++ echo >&2 "Using default distribution of 'unstable' in the changelog" ++ echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" + fi + + mkdir -p debian/source/ +@@ -144,111 +150,109 @@ extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)" + extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)" + + # Generate a simple changelog template +-cat < debian/changelog +-$sourcename ($packageversion) $distribution; urgency=low ++cat <<- EOF > debian/changelog ++ $sourcename ($packageversion) $distribution; urgency=low + +- * Armbian built Linux kernel. $BRANCH ++ * Armbian built Linux kernel. $BRANCH + +- -- $maintainer $(date -R) ++ -- $maintainer $(date -R) + EOF + + # Generate copyright file +-cat < debian/copyright +-This is a packacked armbian patches version of the Linux kernel. ++cat <<- EOF > debian/copyright ++ This is a packacked armbian patches version of the Linux kernel. + +-The sources may be found at most Linux archive sites, including: +-https://www.kernel.org/pub/linux/kernel ++ The sources may be found at most Linux archive sites, including: ++ https://www.kernel.org/pub/linux/kernel + +-Copyright: 1991 - 2018 Linus Torvalds and others. ++ Copyright: 1991 - 2018 Linus Torvalds and others. + +-The git repository for mainline kernel development is at: +-git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ++ The git repository for mainline kernel development is at: ++ git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; version 2 dated June, 1991. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; version 2 dated June, 1991. + +-On Debian GNU/Linux systems, the complete text of the GNU General Public +-License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. ++ On Debian GNU/Linux systems, the complete text of the GNU General Public ++ License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. + EOF + + # Generate a control file +-cat < debian/control +-Source: $sourcename +-Section: kernel +-Priority: optional +-Maintainer: $maintainer +-Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends +-Homepage: https://www.kernel.org/ +- +-Package: $packagename +-Architecture: $debarch +-Provides: linux-image, linux-image-armbian, armbian-$BRANCH +-Description: Linux kernel, armbian version $version $BRANCH +- This package contains the Linux kernel, modules and corresponding other +- files, version: $version. +- +-Package: $libc_headers_packagename +-Section: devel +-Provides: linux-kernel-headers +-Conflicts: linux-kernel-headers +-Replaces: linux-kernel-headers +-Architecture: $debarch +-Description: Armbian Linux support headers for userspace development +- This package provides userspaces headers from the Linux kernel. These headers +- are used by the installed headers for GNU glibc and other system libraries. +-Multi-Arch: same +- +-Package: $dtb_packagename +-Architecture: $debarch +-Provides: linux-dtb, linux-dtb-armbian, armbian-$BRANCH +-Description: Armbian Linux DTB, version $version $BRANCH +- This package contains device blobs from the Linux kernel, version $version ++cat <<- EOF > debian/control ++ Source: $sourcename ++ Section: kernel ++ Priority: optional ++ Maintainer: $maintainer ++ Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends ++ Homepage: https://www.kernel.org/ ++ ++ Package: $packagename ++ Architecture: $debarch ++ Provides: linux-image, linux-image-armbian, armbian-$BRANCH ++ Description: Linux kernel, armbian version $version $BRANCH ++ This package contains the Linux kernel, modules and corresponding other ++ files, version: $version. ++ ++ Package: $libc_headers_packagename ++ Section: devel ++ Provides: linux-kernel-headers ++ Conflicts: linux-kernel-headers ++ Replaces: linux-kernel-headers ++ Architecture: $debarch ++ Description: Armbian Linux support headers for userspace development ++ This package provides userspaces headers from the Linux kernel. These headers ++ are used by the installed headers for GNU glibc and other system libraries. ++ Multi-Arch: same ++ ++ Package: $dtb_packagename ++ Architecture: $debarch ++ Provides: linux-dtb, linux-dtb-armbian, armbian-$BRANCH ++ Description: Armbian Linux DTB, version $version $BRANCH ++ This package contains device blobs from the Linux kernel, version $version + EOF + + if is_enabled CONFIG_MODULES; then +-cat <> debian/control +- +-Package: $kernel_headers_packagename +-Section: devel +-Architecture: $debarch +-Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH +-Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +-Description: Linux kernel headers for $version on $debarch $BRANCH +- This package provides kernel header files for $version on $debarch +- . +- This is useful for people who need to build external modules +-EOF ++ cat <<- EOF >> debian/control ++ ++ Package: $kernel_headers_packagename ++ Section: devel ++ Architecture: $debarch ++ Provides: linux-headers, linux-headers-armbian, armbian-$BRANCH ++ Depends: make, gcc, libc6-dev, bison, flex, libssl-dev ++ Description: Linux kernel headers for $version on $debarch $BRANCH ++ This package provides kernel header files for $version on $debarch ++ . ++ This is useful for people who need to build external modules ++ EOF + fi + + if is_enabled CONFIG_DEBUG_INFO; then +-cat <> debian/control +- +-Package: $dbg_packagename +-Section: debug +-Architecture: $debarch +-Description: Linux kernel debugging symbols for $version +- This package will come in handy if you need to debug the kernel. It provides +- all the necessary debug symbols for the kernel and its modules. +-EOF ++ cat <<- EOF >> debian/control ++ ++ Package: $dbg_packagename ++ Section: debug ++ Architecture: $debarch ++ Description: Linux kernel debugging symbols for $version ++ This package will come in handy if you need to debug the kernel. It provides ++ all the necessary debug symbols for the kernel and its modules. ++ EOF + fi + +-cat < debian/rules ++cat << EOF > debian/rules + #!$(command -v $MAKE) -f + + srctree ?= . + + build: +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ +- KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile ++ echo "Kernel should be built, headers and modules installed before calling this." + + binary-arch: +- \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ +- KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg ++ echo "Armbian: Calling builddep via make intdeb-pkg" ++ \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg + + clean: + rm -rf debian/*tmp debian/files +- \$(MAKE) clean + + binary: binary-arch + EOF + +From 0e26d1439e8e6ad7ae331247a618db4ea4a4130c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 19 Feb 2022 01:06:32 +0100 +Subject: [PATCH] armbian-next: minor stylistic changes that I end up doing + while working on other stuff + +- I am `OFFLINE_WORK`'ing, I don't wanna waste 3 seconds, thanks +- OCD-fix of double `local` declarations +--- + lib/functions/cli/cli-entrypoint.sh | 8 ++------ + lib/functions/general/git.sh | 22 ++++++++++------------ + 2 files changed, 12 insertions(+), 18 deletions(-) + +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index d9da56acc..22de78eb4 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -17,7 +17,6 @@ function bla() { + #exit 0 # exit without error + } + +- + function cli_entrypoint() { + if [[ "${ARMBIAN_ENABLE_CALL_TRACING}" == "yes" ]]; then + set -T # inherit return/debug traps +@@ -42,12 +41,9 @@ function cli_entrypoint() { + fi + + # The only way to get this is via ENV var... +- if [ "$OFFLINE_WORK" == "yes" ]; then +- echo -e "\n" +- display_alert "* " "You are working offline." ++ if [ "${OFFLINE_WORK}" == "yes" ]; then ++ display_alert "* " "You are working offline!" + display_alert "* " "Sources, time and host will not be checked" +- echo -e "\n" +- sleep 3s + else + # check and install the basic utilities here # @TODO: logging? + prepare_host_basic +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 6b043832b..51f658d31 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -47,18 +47,15 @@ fetch_from_repo() { + url=${url//'https://github.com/'/$GITHUB_SOURCE} + + # The 'offline' variable must always be set to 'true' or 'false' +- if [ "$OFFLINE_WORK" == "yes" ]; then +- local offline=true +- else +- local offline=false ++ local offline=false ++ if [[ "${OFFLINE_WORK}" == "yes" ]]; then ++ offline=true + fi + + [[ -z $ref || ($ref != tag:* && $ref != branch:* && $ref != head && $ref != commit:*) ]] && exit_with_error "Error in configuration" +- local ref_type=${ref%%:*} ++ local ref_type=${ref%%:*} ref_name=${ref##*:} + if [[ $ref_type == head ]]; then +- local ref_name=HEAD +- else +- local ref_name=${ref##*:} ++ ref_name=HEAD + fi + + display_alert "Getting sources from Git" "$dir $ref_name" "info" +@@ -76,7 +73,6 @@ fetch_from_repo() { + + display_alert "Git working dir" "${git_work_dir}" "debug" + +- + # "Sanity check" since we only support one "origin" + if [[ "$(git rev-parse --git-dir)" == ".git" && "$url" != *"$(git remote get-url origin | sed 's/^.*@//' | sed 's/^.*\/\///')" ]]; then + exit_with_error "Remote URL does not match. Stopping!" "${git_work_dir} $dir $ref_name" "warn" +@@ -91,10 +87,12 @@ fetch_from_repo() { + + local changed=false + ++ # get local hash; might fail ++ local local_hash ++ local_hash=$(git rev-parse @ 2> /dev/null || true) # Don't fail nor output anything if failure ++ + # when we work offline we simply return the sources to their original state + if ! $offline; then +- local local_hash +- local_hash=$(git rev-parse @ 2> /dev/null || true) # Don't fail nor output anything if failure + + case $ref_type in + branch) +@@ -125,7 +123,7 @@ fetch_from_repo() { + + fi # offline + +- if [[ $changed == true ]]; then ++ if [[ "${changed}" == "true" ]]; then + + # If there's a cold bundle URL specified: + # - if there's already a cold_bundle_xxx remote, move on. + +From 1b0d604efc56025a1dfd8a2d9ef3485799fbbe1b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 18 Feb 2022 04:26:28 +0100 +Subject: [PATCH] [giga-wip] rework patching, introducing fasthash + +--- + lib/functions/compilation/kernel.sh | 41 +++-- + .../compilation/{patching.sh => patch/apply.sh} | 85 +++++---- + lib/functions/compilation/patch/fasthash.sh | 29 ++++ + .../compilation/patch/kernel-bootsplash.sh | 34 ++++ + .../{extra-drivers.sh => patch/kernel-drivers.sh} | 189 ++++----------------- + lib/functions/compilation/patch/kernel-pkg.sh | 92 ++++++++++ + lib/functions/compilation/sources.sh | 10 +- + lib/library-functions.sh | 45 ++++- + 8 files changed, 303 insertions(+), 222 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index d33c18f9f..c6591d5cc 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -44,11 +44,10 @@ function compile_kernel() { + ) + fi + ++ local kerneldir="$SRC/cache/sources/$LINUXSOURCEDIR" + if [[ $USE_OVERLAYFS == yes ]]; then +- local kerneldir ++ display_alert "Using overlayfs_wrapper" "kernel_${LINUXFAMILY}_${BRANCH}" "debug" + kerneldir=$(overlayfs_wrapper "wrap" "$SRC/cache/sources/$LINUXSOURCEDIR" "kernel_${LINUXFAMILY}_${BRANCH}") +- else +- local kerneldir="$SRC/cache/sources/$LINUXSOURCEDIR" + fi + cd "${kerneldir}" || exit + +@@ -63,19 +62,39 @@ function compile_kernel() { + # read kernel git hash + hash=$(git --git-dir="$kerneldir"/.git rev-parse HEAD) + ++ ## Start kernel patching process. ++ ## There's a few objectives here: ++ ## - (always) produce a fasthash: represents "what would be done" (eg: md5 of a patch, crc32 of description). ++ ## - (optionally) execute modification against living tree (eg: apply a patch, copy a file, etc). only if `DO_MODIFY=yes` ++ ## - (always) call mark_change_commit with the description of what was done and fasthash. ++ initialize_fasthash "kernel" "${hash}" "${pre_patch_version}" "${kerneldir}" ++ declare -a fast_hash_list=() ++ + # Apply a series of patches if a series file exists +- if test -f "${SRC}"/patch/kernel/"${KERNELPATCHDIR}"/series.conf; then ++ local series_conf="${SRC}"/patch/kernel/${KERNELPATCHDIR}/series.conf ++ if test -f "${series_conf}"; then + display_alert "series.conf file visible. Apply" +- series_conf="${SRC}"/patch/kernel/${KERNELPATCHDIR}/series.conf +- +- # apply_patch_series +- apply_patch_series "${kerneldir}" "$series_conf" ++ fasthash_branch "patches-${KERNELPATCHDIR}-series.conf" ++ apply_patch_series "${kerneldir}" "${series_conf}" # applies a series of patches, read from a file. calls process_patch_file + fi + +- # build 3rd party drivers; # @TODO: does it build? or only patch? +- prepare_extra_kernel_drivers ++ # mostly local-based packaging fixes. ++ fasthash_branch "packaging-patches" ++ apply_kernel_patches_for_packaging "${kerneldir}" "${version}" # calls process_patch_file and other stuff. ++ ++ # applies a humongous amount of patches coming from github repos. ++ # it's mostly conditional, and very complex. ++ # @TODO: re-enable after finishing converting it with fasthash magic ++ # apply_kernel_patches_for_drivers "${kerneldir}" "${version}" # calls process_patch_file and other stuff. there is A LOT of it. ++ ++ # applies a series of patches, in directory order, from multiple directories (default/"user" patches) ++ # @TODO: I believe using the $BOARD here is the most confusing thing in the whole of Armbian. It should be disabled. ++ # @TODO: Armbian built kernels dont't vary per-board, but only per "$ARCH-$LINUXFAMILY-$BRANCH" ++ # @TODO: allowing for board-specific kernel patches creates insanity. uboot is enough. ++ fasthash_branch "patches-${KERNELPATCHDIR}-$BRANCH" ++ advanced_patch "kernel" "$KERNELPATCHDIR" "$BOARD" "" "$BRANCH" "$LINUXFAMILY-$BRANCH" # calls process_patch_file, "target" is empty there + +- advanced_patch "kernel" "$KERNELPATCHDIR" "$BOARD" "" "$BRANCH" "$LINUXFAMILY-$BRANCH" ++ finish_fasthash "kernel" # this reports the final hash and creates git branch to build ID. All modifications commited. + + # create patch for manual source changes in debug mode + [[ $CREATE_PATCHES == yes ]] && userpatch_create "kernel" +diff --git a/lib/functions/compilation/patching.sh b/lib/functions/compilation/patch/apply.sh +similarity index 71% +rename from lib/functions/compilation/patching.sh +rename to lib/functions/compilation/patch/apply.sh +index 7ebcef3ac..3387c061a 100644 +--- a/lib/functions/compilation/patching.sh ++++ b/lib/functions/compilation/patch/apply.sh +@@ -97,54 +97,49 @@ process_patch_file() { + } + return 0 # short-circuit above, avoid exiting with error + } ++function new_process_patch_file() { ++ local patch="$1" # full filename ++ local status="$2" # message, may contain ANSI ++ local relative_patch="${patch##"${SRC}"/}" # ${FOO##prefix} remove prefix from FOO ++ ++ # report_fashtash_should_execute is report_fasthash returns true only if we're supposed to apply the patch on disk. ++ if report_fashtash_should_execute file "${patch}" "Apply patch ${relative_patch}"; then ++ # detect and remove files which patch will create ++ lsdiff -s --strip=1 "${patch}" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' ++ ++ # @TODO: try patching with `git am` first, so git contains the patch commit info/msg. -- For future git-based hashing. ++ # shellcheck disable=SC2015 # noted, thanks. I need to handle exit code here. ++ patch --batch -p1 -N < "${patch}" && { ++ display_alert "* ${status} ${relative_patch}" "" "info" || true ++ } || { ++ display_alert "* ${status} ${relative_patch}" "failed" "wrn" ++ [[ $EXIT_PATCHING_ERROR == yes ]] && exit_with_error "Aborting due to EXIT_PATCHING_ERROR" "Patch ${relative_patch} failed" ++ } ++ mark_fasthash_done # will do git commit, associate fasthash to real hash. ++ fi + +-# apply_patch_series +-apply_patch_series() { +- local t_dir="${1}" +- local series="${2}" +- local bzdir="$(dirname $series)" +- local flag +- local err_pt=$(mktemp /tmp/apply_patch_series_XXXXX) # @OTODO: rpardini: hmm, why is this different from all others? +- +- list=$(awk '$0 !~ /^#.*|^-.*|^$/' "${series}") +- skiplist=$(awk '$0 ~ /^-.*/{print $NF}' "${series}") +- +- display_alert "apply a series of " "[$(echo $list | wc -w)] patches" +- display_alert "skip [$(echo $skiplist | wc -w)] patches" +- +- cd "${t_dir}" || exit 1 +- for p in $list; do +- # Detect and remove files as '*.patch' which patch will create. +- # So we need to delete the file before applying the patch if it exists. +- lsdiff -s --strip=1 "$bzdir/$p" | +- awk '$0 ~ /^+.*patch$/{print $2}' | +- xargs -I % sh -c 'rm -f %' +- +- set +e # has to tolerate error here to catch them +- patch --batch --silent --no-backup-if-mismatch -p1 -N < $bzdir/"$p" >> $err_pt 2>&1 +- flag=$? +- set -e # back to normal, errors cause stop. ++ return 0 # short-circuit above, avoid exiting with error ++} + +- case $flag in +- 0) +- printf "[\033[32m done \033[0m] %s\n" "${p}" +- printf "[ done ] %s\n" "${p}" >> "${DEST}"/debug/patching.log +- ;; +- 1) +- printf "[\033[33m FAILED \033[0m] %s\n" "${p}" +- echo -e "[ FAILED ] For ${p} \t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log +- cat $err_pt >> "${DEST}"/debug/patching.log +- ;; +- 2) +- printf "[\033[31m Patch wrong \033[0m] %s\n" "${p}" +- echo -e "Patch wrong ${p}\t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log +- cat $err_pt >> "${DEST}"/debug/patching.log +- ;; +- esac +- echo "" > $err_pt ++# apply_patch_series ++apply_patch_series() { ++ local target_dir="${1}" ++ local series_file_full_path="${2}" ++ local included_list skip_list skip_count counter=1 base_dir ++ base_dir="$(dirname "${series_file_full_path}")" ++ included_list="$(awk '$0 !~ /^#.*|^-.*|^$/' "${series_file_full_path}")" ++ included_count=$(echo -n "${included_list}" | wc -w) ++ skip_list="$(awk '$0 ~ /^-.*/{print $NF}' "${series_file_full_path}")" ++ skip_count=$(echo -n "${skip_list}" | wc -w) ++ display_alert "apply a series of " "[$(echo -n "$included_list" | wc -w)] patches" "info" ++ [[ ${skip_count} -gt 0 ]] && display_alert "skipping" "[${skip_count}] patches" "warn" ++ cd "${target_dir}" || exit 1 ++ ++ for p in $included_list; do ++ process_patch_file "${base_dir}/${p}" "${counter}/${included_count}" ++ counter=$((counter + 1)) + done +- echo "" >> "${DEST}"/debug/patching.log +- rm $err_pt ++ display_alert "done applying patch series " "[$(echo -n "$included_list" | wc -w)] patches" "info" + } + + userpatch_create() { +diff --git a/lib/functions/compilation/patch/fasthash.sh b/lib/functions/compilation/patch/fasthash.sh +new file mode 100644 +index 000000000..306966d38 +--- /dev/null ++++ b/lib/functions/compilation/patch/fasthash.sh +@@ -0,0 +1,29 @@ ++function report_fashtash_should_execute() { ++ display_alert "report_fashtash_should_execute" "$*" "debug" ++ return 0 ++} ++ ++function mark_fasthash_done() { ++ display_alert "mark_fasthash_done" "$*" "debug" ++ return 0 ++} ++ ++function report_fasthash() { ++ display_alert "report_fasthash" "$*" "debug" ++ return 0 ++} ++ ++function initialize_fasthash() { ++ display_alert "initialize_fasthash" "$*" "debug" ++ return 0 ++} ++ ++function fasthash_branch() { ++ display_alert "fasthash_branch" "$*" "debug" ++ return 0 ++} ++ ++function finish_fasthash() { ++ display_alert "finish_fasthash" "$*" "debug" ++ return 0 ++} +diff --git a/lib/functions/compilation/patch/kernel-bootsplash.sh b/lib/functions/compilation/patch/kernel-bootsplash.sh +new file mode 100644 +index 000000000..e5d279110 +--- /dev/null ++++ b/lib/functions/compilation/patch/kernel-bootsplash.sh +@@ -0,0 +1,34 @@ ++# ++# Linux splash file ++# ++function apply_kernel_patches_for_bootsplash() { ++ # previously: if linux-version compare "${version}" ge 5.10 && [ $SKIP_BOOTSPLASH != yes ]; then ++ [[ "${SKIP_BOOTSPLASH}" == "yes" ]] && return 0 ++ linux-version compare "${version}" le 5.10 && return 0 ++ ++ display_alert "Adding" "Kernel bootsplash patch" "info" ++ ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" ++ ++ if linux-version compare "${version}" ge 5.15; then ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0002-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" ++ fi ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0003-Revert-vgacon-remove-software-scrollback-support.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0004-Revert-drivers-video-fbcon-fix-NULL-dereference-in-f.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0005-Revert-fbcon-remove-no-op-fbcon_set_origin.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0006-Revert-fbcon-remove-now-unusued-softback_lines-curso.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0007-Revert-fbcon-remove-soft-scrollback-code.patch" "applying" ++ ++ process_patch_file "${SRC}/patch/misc/0001-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0002-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0003-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0004-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0005-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0006-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0007-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0008-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0009-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0010-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0011-bootsplash.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/0012-bootsplash.patch" "applying" ++} +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/patch/kernel-drivers.sh +similarity index 75% +rename from lib/functions/compilation/extra-drivers.sh +rename to lib/functions/compilation/patch/kernel-drivers.sh +index f731b4319..61f1cb630 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/patch/kernel-drivers.sh +@@ -9,125 +9,7 @@ + # This file is a part of the Armbian build script + # https://github.com/armbian/build/ + +-prepare_extra_kernel_drivers() { +- +- # Packaging patch for modern kernels should be one for all. +- # Currently we have it per kernel family since we can't have one +- # Maintaining one from central location starting with 5.3+ +- # Temporally set for new "default->legacy,next->current" family naming +- +- if linux-version compare "${version}" ge 5.10; then +- +- if test -d ${kerneldir}/debian; then +- rm -rf ${kerneldir}/debian/* +- fi +- sed -i -e ' +- s/^KBUILD_IMAGE := \$(boot)\/Image\.gz$/KBUILD_IMAGE := \$(boot)\/Image/ +- ' ${kerneldir}/arch/arm64/Makefile +- +- rm -f ${kerneldir}/scripts/package/{builddeb,mkdebian} +- +- cp ${SRC}/packages/armbian/builddeb ${kerneldir}/scripts/package/builddeb +- cp ${SRC}/packages/armbian/mkdebian ${kerneldir}/scripts/package/mkdebian +- +- chmod 755 ${kerneldir}/scripts/package/{builddeb,mkdebian} +- +- elif linux-version compare "${version}" ge 5.8.17 && +- linux-version compare "${version}" le 5.9 || +- linux-version compare "${version}" ge 5.9.2; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-5.8-9.y.patch" "applying" +- elif linux-version compare "${version}" ge 5.6; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-5.6.y.patch" "applying" +- elif linux-version compare "${version}" ge 5.3; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-5.3.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == sunxi* || "$LINUXFAMILY" == meson64 || +- "$LINUXFAMILY" == mvebu64 || "$LINUXFAMILY" == mt7623 || "$LINUXFAMILY" == mvebu ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == rk35xx ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y-rk35xx.patch" "applying" +- fi +- +- if [[ "${version}" == "4.14."* ]] && [[ "$LINUXFAMILY" == s5p6818 || "$LINUXFAMILY" == mvebu64 || +- "$LINUXFAMILY" == imx7d || "$LINUXFAMILY" == odroidxu4 || "$LINUXFAMILY" == mvebu ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.14.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.4."* || "${version}" == "4.9."* ]] && +- [[ "$LINUXFAMILY" == rockpis || "$LINUXFAMILY" == rk3399 ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rk3399.patch" "applying" +- fi +- +- if [[ "${version}" == "4.4."* ]] && +- [[ "$LINUXFAMILY" == rockchip64 || "$LINUXFAMILY" == station* ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rockchip64.patch" "applying" +- fi +- +- if [[ "${version}" == "4.4."* ]] && [[ "$LINUXFAMILY" == rockchip || "$LINUXFAMILY" == rk322x ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y.patch" "applying" +- fi +- +- if [[ "${version}" == "4.9."* ]] && [[ "$LINUXFAMILY" == meson64 || "$LINUXFAMILY" == odroidc4 ]]; then +- display_alert "Adjusting" "packaging" "info" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/patch/misc/general-packaging-4.9.y.patch" "applying" +- fi +- +- # +- # Linux splash file +- # +- +- if linux-version compare "${version}" ge 5.10 && [ $SKIP_BOOTSPLASH != yes ]; then +- +- display_alert "Adding" "Kernel splash file" "info" +- +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" +- +- if linux-version compare "${version}" ge 5.15; then +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0002-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" +- fi +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0003-Revert-vgacon-remove-software-scrollback-support.patch" "applying" +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0004-Revert-drivers-video-fbcon-fix-NULL-dereference-in-f.patch" "applying" +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0005-Revert-fbcon-remove-no-op-fbcon_set_origin.patch" "applying" +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0006-Revert-fbcon-remove-now-unusued-softback_lines-curso.patch" "applying" +- process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0007-Revert-fbcon-remove-soft-scrollback-code.patch" "applying" +- +- process_patch_file "${SRC}/patch/misc/0001-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0002-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0003-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0004-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0005-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0006-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0007-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0008-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0009-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0010-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0011-bootsplash.patch" "applying" +- process_patch_file "${SRC}/patch/misc/0012-bootsplash.patch" "applying" +- +- fi +- ++function prepare_extra_kernel_drivers() { + # + # mac80211 wireless driver injection features from Kali Linux + # +@@ -150,45 +32,35 @@ prepare_extra_kernel_drivers() { + # Older versions have AUFS support with a patch + + if linux-version compare "${version}" ge 5.1 && linux-version compare "${version}" le 5.12 && [ "$AUFS" == yes ]; then +- +- # attach to specifics tag or branch +- local aufstag +- aufstag=$(echo "${version}" | cut -f 1-2 -d ".") ++ # @TODO: Fasthash for this whole block is only the git hash of revision we'd apply from Mr. Okajima ++ local aufs_tag # attach to specifics tag or branch ++ aufs_tag=$(echo "${version}" | cut -f 1-2 -d ".") + + # manual overrides +- if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5; then aufstag="5.4.3"; fi +- if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufstag="5.10.82"; fi +- if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufstag="5.15.5"; fi +- +- # check if Mr. Okajima already made a branch for this version +- improved_git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufstag}" > /dev/null +- +- if [ "$?" -ne "0" ]; then +- # then use rc branch +- aufstag="5.x-rcN" +- # @TODO: this does not do what you think it does; nonzero explode always +- improved_git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufstag}" > /dev/null +- fi +- +- if [ "$?" -eq "0" ]; then +- +- display_alert "Adding" "AUFS ${aufstag}" "info" +- local aufsver="branch:aufs${aufstag}" +- fetch_from_repo "https://github.com/sfjro/aufs5-standalone" "aufs5" "branch:${aufsver}" "yes" +- cd "$kerneldir" || exit +- process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-kbuild.patch" "applying" +- process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-base.patch" "applying" +- process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-mmap.patch" "applying" +- process_patch_file "${SRC}/cache/sources/aufs5/${aufsver#*:}/aufs5-standalone.patch" "applying" +- cp -R "${SRC}/cache/sources/aufs5/${aufsver#*:}"/{Documentation,fs} . +- cp "${SRC}/cache/sources/aufs5/${aufsver#*:}"/include/uapi/linux/aufs_type.h include/uapi/linux/ +- +- fi ++ if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5; then aufs_tag="5.4.3"; fi ++ if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufs_tag="5.10.82"; fi ++ if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufs_tag="5.15.5"; fi ++ ++ # check if Mr. Okajima already made a branch for this version, otherwise use RC. ++ git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufs_tag}" > /dev/null || { ++ aufs_tag="5.x-rcN" # then use rc branch ++ git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufs_tag}" > /dev/null ++ } ++ display_alert "Adding" "AUFS ${aufs_tag}" "info" ++ local aufs_branch="branch:aufs${aufs_tag}" ++ fetch_from_repo "https://github.com/sfjro/aufs5-standalone" "aufs5" "branch:${aufs_branch}" "yes" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-kbuild.patch" "applying" ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-base.patch" "applying" ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-mmap.patch" "applying" ++ process_patch_file "${SRC}/cache/sources/aufs5/${aufs_branch#*:}/aufs5-standalone.patch" "applying" ++ cp -R "${SRC}/cache/sources/aufs5/${aufs_branch#*:}"/{Documentation,fs} . ++ cp "${SRC}/cache/sources/aufs5/${aufs_branch#*:}"/include/uapi/linux/aufs_type.h include/uapi/linux/ + fi + + # WireGuard VPN for Linux 3.10 - 5.5 + if linux-version compare "${version}" ge 3.10 && linux-version compare "${version}" le 5.5 && [ "${WIREGUARD}" == yes ]; then +- ++ # @TODO: fasthash for this is... ? remote git hash? + # attach to specifics tag or branch + local wirever="branch:master" + +@@ -218,6 +90,7 @@ prepare_extra_kernel_drivers() { + # Updated USB network drivers for RTL8152/RTL8153 based dongles that also support 2.5Gbs variants + + if linux-version compare "${version}" ge 5.4 && linux-version compare "${version}" le 5.12 && [ $LINUXFAMILY != mvebu64 ] && [ $LINUXFAMILY != rk322x ] && [ $LINUXFAMILY != odroidxu4 ] && [ $EXTRAWIFI == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8152ver="branch:master" +@@ -232,6 +105,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8189ES chipsets + + if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8189esver="branch:master" +@@ -264,6 +138,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8189FS chipsets + + if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8189fsver="branch:rtl8189fs" +@@ -296,6 +171,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8192EU chipsets + + if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8192euver="branch:realtek-4.4.x" +@@ -328,6 +204,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8811, 8812, 8814 and 8821 chipsets + + if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8812auver="branch:v5.6.4.2" +@@ -358,6 +235,7 @@ prepare_extra_kernel_drivers() { + + # Wireless drivers for Xradio XR819 chipsets + if linux-version compare "${version}" ge 4.19 && [[ "$LINUXFAMILY" == sunxi* ]] && [[ "$EXTRAWIFI" == yes ]]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + display_alert "Adding" "Wireless drivers for Xradio XR819 chipsets" "info" + +@@ -391,6 +269,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek RTL8811CU and RTL8821C chipsets + + if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8811cuver="commit:2bebdb9a35c1d9b6e6a928e371fa39d5fcec8a62" +@@ -440,6 +319,7 @@ prepare_extra_kernel_drivers() { + if linux-version compare "${version}" ge 3.14 && + linux-version compare "${version}" lt 5.15 && + [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8188euver="branch:v5.7.6.1" +@@ -481,6 +361,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 88x2bu chipsets + + if linux-version compare "${version}" ge 5.0 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl88x2buver="branch:5.8.7.1_35809.20191129_COEX20191120-7777" +@@ -517,6 +398,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 88x2cs chipsets + + if linux-version compare "${version}" ge 5.9 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl88x2csver="branch:tune_for_jethub" +@@ -564,6 +446,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8723DS chipsets + + if linux-version compare "${version}" ge 5.0 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + local rtl8723dsver="branch:master" +@@ -600,6 +483,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8723DU chipsets + + if linux-version compare $version ge 5.0 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + if linux-version compare $version ge 5.12; then +@@ -636,6 +520,7 @@ prepare_extra_kernel_drivers() { + # Wireless drivers for Realtek 8822BS chipsets + + if linux-version compare "${version}" ge 4.4 && [ "$EXTRAWIFI" == yes ]; then ++ # @TODO: fasthash for this is... ? remote git hash? + + # attach to specifics tag or branch + display_alert "Adding" "Wireless drivers for Realtek 8822BS chipsets ${rtl8822bsver}" "info" +diff --git a/lib/functions/compilation/patch/kernel-pkg.sh b/lib/functions/compilation/patch/kernel-pkg.sh +new file mode 100644 +index 000000000..11d7d4244 +--- /dev/null ++++ b/lib/functions/compilation/patch/kernel-pkg.sh +@@ -0,0 +1,92 @@ ++function apply_kernel_patches_for_packaging() { ++ set -x ++ local kerneldir="${1}" ++ local version="${2}" ++ # Packaging patch for modern kernels should be one for all. ++ # Currently we have it per kernel family since we can't have one ++ # Maintaining one from central location starting with 5.3+ ++ # Temporally set for new "default->legacy,next->current" family naming ++ ++ if linux-version compare "${version}" ge 5.10; then ++ # This case is special: it does not use process_patch_file. fasthash manually. ++ local builddeb="packages/armbian/builddeb" ++ local mkdebian="packages/armbian/mkdebian" ++ local kernel_package_dir="${kerneldir}/scripts/package" ++ if report_fashtash_should_execute text "$(cat "${SRC}/${builddeb}" "${SRC}/${mkdebian}")" "armbian builddeb and mkdebian replace"; then ++ rm -rf "${kerneldir}/debian"/* ++ ++ # @TODO: is this idempotent? ++ # shellcheck disable=SC2016 ++ sed -i -e 's/^KBUILD_IMAGE := \$(boot)\/Image\.gz$/KBUILD_IMAGE := \$(boot)\/Image/' "${kerneldir}/arch/arm64/Makefile" ++ ++ # cp with -p to preserve the original dates ++ cp -p "${SRC}/${builddeb}" "${kernel_package_dir}/builddeb" ++ cp -p "${SRC}/${mkdebian}" "${kernel_package_dir}/mkdebian" ++ ++ chmod 755 "${kernel_package_dir}/builddeb" "${kernel_package_dir}/mkdebian" ++ mark_fasthash_done # will do git commit, associate fasthash to real hash. ++ fi ++ ++ elif linux-version compare "${version}" ge 5.8.17 && ++ linux-version compare "${version}" le 5.9 || ++ linux-version compare "${version}" ge 5.9.2; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-5.8-9.y.patch" "applying" ++ elif linux-version compare "${version}" ge 5.6; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-5.6.y.patch" "applying" ++ elif linux-version compare "${version}" ge 5.3; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-5.3.y.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == sunxi* || "$LINUXFAMILY" == meson64 || ++ "$LINUXFAMILY" == mvebu64 || "$LINUXFAMILY" == mt7623 || "$LINUXFAMILY" == mvebu ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == rk35xx ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y-rk35xx.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.14."* ]] && [[ "$LINUXFAMILY" == s5p6818 || "$LINUXFAMILY" == mvebu64 || ++ "$LINUXFAMILY" == imx7d || "$LINUXFAMILY" == odroidxu4 || "$LINUXFAMILY" == mvebu ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.14.y.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.4."* || "${version}" == "4.9."* ]] && ++ [[ "$LINUXFAMILY" == rockpis || "$LINUXFAMILY" == rk3399 ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rk3399.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.4."* ]] && ++ [[ "$LINUXFAMILY" == rockchip64 || "$LINUXFAMILY" == station* ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rockchip64.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.4."* ]] && [[ "$LINUXFAMILY" == rockchip || "$LINUXFAMILY" == rk322x ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y.patch" "applying" ++ fi ++ ++ if [[ "${version}" == "4.9."* ]] && [[ "$LINUXFAMILY" == meson64 || "$LINUXFAMILY" == odroidc4 ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.9.y.patch" "applying" ++ fi ++ ++} +diff --git a/lib/functions/compilation/sources.sh b/lib/functions/compilation/sources.sh +index 1fcacf8a3..b4dd11c17 100644 +--- a/lib/functions/compilation/sources.sh ++++ b/lib/functions/compilation/sources.sh +@@ -1,15 +1,15 @@ + function fetch_sources_kernel_uboot_atf() { +- if [[ -n $BOOTSOURCE ]]; then +- display_alert "Downloading sources" "u-boot" "git" +- fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo +- fi +- + if [[ -n $KERNELSOURCE ]]; then + display_alert "Downloading sources" "kernel" "git" + GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ + fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" + fi + ++ if [[ -n $BOOTSOURCE ]]; then ++ display_alert "Downloading sources" "u-boot" "git" ++ fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes" # fetch_from_repo ++ fi ++ + if [[ -n $ATFSOURCE ]]; then + display_alert "Downloading sources" "atf" "git" + fetch_from_repo "$ATFSOURCE" "$ATFDIR" "$ATFBRANCH" "yes" +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 39792dbe5..2e720a66f 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -69,27 +69,54 @@ source "${SRC}"/lib/functions/compilation/debs.sh + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/extra-drivers.sh +-# shellcheck source=lib/functions/compilation/extra-drivers.sh +-source "${SRC}"/lib/functions/compilation/extra-drivers.sh ++### lib/functions/compilation/kernel.sh ++# shellcheck source=lib/functions/compilation/kernel.sh ++source "${SRC}"/lib/functions/compilation/kernel.sh + + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/kernel.sh +-# shellcheck source=lib/functions/compilation/kernel.sh +-source "${SRC}"/lib/functions/compilation/kernel.sh ++### lib/functions/compilation/patch/apply.sh ++# shellcheck source=lib/functions/compilation/patch/apply.sh ++source "${SRC}"/lib/functions/compilation/patch/apply.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/patch/fasthash.sh ++# shellcheck source=lib/functions/compilation/patch/fasthash.sh ++source "${SRC}"/lib/functions/compilation/patch/fasthash.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/patch/kernel-bootsplash.sh ++# shellcheck source=lib/functions/compilation/patch/kernel-bootsplash.sh ++source "${SRC}"/lib/functions/compilation/patch/kernel-bootsplash.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/patch/kernel-drivers.sh ++# shellcheck source=lib/functions/compilation/patch/kernel-drivers.sh ++source "${SRC}"/lib/functions/compilation/patch/kernel-drivers.sh + + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/patching.sh +-# shellcheck source=lib/functions/compilation/patching.sh +-source "${SRC}"/lib/functions/compilation/patching.sh ++### lib/functions/compilation/patch/kernel-pkg.sh ++# shellcheck source=lib/functions/compilation/patch/kernel-pkg.sh ++source "${SRC}"/lib/functions/compilation/patch/kernel-pkg.sh + + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + +From 8939a9142a7e08f0dae8bc866811687119501c5e Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 18 Feb 2022 04:17:22 +0100 +Subject: [PATCH] [wip] git: experiment with stable kernel bundle, and all + tags. nice, but for what? + +- also: never delete working copy, exit with error instead. +--- + lib/functions/configuration/main-config.sh | 6 ++++-- + lib/functions/general/git.sh | 34 +++++++++++++----------------- + 2 files changed, 19 insertions(+), 21 deletions(-) + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 800845483..722371f3e 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -112,8 +112,10 @@ function do_main_configuration() { + # used by multiple sources - reduce code duplication + [[ $USE_MAINLINE_GOOGLE_MIRROR == yes ]] && MAINLINE_MIRROR=google + +- # URL for the git bundle used to "bootstrap" local git copies. +- export MAINLINE_KERNEL_COLD_BUNDLE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle" ++ # URL for the git bundle used to "bootstrap" local git copies without too much server load. This applies independently of git mirror below. ++ export MAINLINE_KERNEL_TORVALDS_BUNDLE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle" # this is plain torvalds, single branch ++ export MAINLINE_KERNEL_STABLE_BUNDLE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/clone.bundle" # this is all stable branches. with tags! ++ export MAINLINE_KERNEL_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL:-$MAINLINE_KERNEL_STABLE_BUNDLE_URL}" # default to stable. it's bigger but more useful for developers. + + case $MAINLINE_MIRROR in + google) +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index e6a2fe521..6b043832b 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -76,15 +76,10 @@ fetch_from_repo() { + + display_alert "Git working dir" "${git_work_dir}" "debug" + +- # check if existing remote URL for the repo or branch does not match current one +- # may not be supported by older git versions +- # Check the folder as a git repository. +- # Then the target URL matches the local URL. + ++ # "Sanity check" since we only support one "origin" + if [[ "$(git rev-parse --git-dir)" == ".git" && "$url" != *"$(git remote get-url origin | sed 's/^.*@//' | sed 's/^.*\/\///')" ]]; then +- display_alert "Remote URL does not match, removing existing local copy" "$dir $ref_name" "warn" +- rm -rf "${git_work_dir}" +- mkdir -p "${git_work_dir}" ++ exit_with_error "Remote URL does not match. Stopping!" "${git_work_dir} $dir $ref_name" "warn" + fi + + if [[ "$(git rev-parse --git-dir)" != ".git" ]]; then +@@ -187,25 +182,26 @@ fetch_from_repo() { + # - add the warmup as remote, fetch from it; export it as a cached bundle for next time. + + # remote was updated, fetch and check out updates, but not tags; tags pull their respective commits too, making it a huge fetch. +- display_alert "Fetching updates from origin" "$dir $ref_name " ++ display_alert "Fetching updates from origin" "$dir $ref_name" + case $ref_type in +- branch | commit) improved_git_fetch origin "${ref_name}" ;; +- tag) improved_git_fetch origin tags/"${ref_name}" ;; +- head) improved_git_fetch origin HEAD ;; ++ branch | commit) improved_git_fetch --tags origin "${ref_name}" ;; ++ tag) improved_git_fetch --tags origin tags/"${ref_name}" ;; ++ head) improved_git_fetch --tags origin HEAD ;; + esac + display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size again + + display_alert "Checking out" "$dir $ref_name" + improved_git checkout -f -q FETCH_HEAD + improved_git clean -q -d -f +- +- if [[ $has_fetched_from_bundle -gt 0 ]]; then +- display_alert "Pre-pruning, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull +- echo -n "${remote_hash}" > .git/shallow # commit to keep for shallowing, can be something else. for now is full prune. +- improved_git remote remove "${git_cold_bundle_remote_id}" +- improved_git reflog expire --expire=0 --all +- improved_git gc --prune=all +- fi ++ display_alert "After checkout, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ ++ #if [[ $has_fetched_from_bundle -gt 0 ]]; then ++ # display_alert "Pre-pruning, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ # echo -n "${remote_hash}" > .git/shallow # commit to keep for shallowing, can be something else. for now is full prune. ++ # improved_git remote remove "${git_cold_bundle_remote_id}" ++ # improved_git reflog expire --expire=0 --all ++ # improved_git gc --prune=all ++ #fi + + elif [[ -n $(git status -uno --porcelain --ignore-submodules=all) ]]; then # if not changed, but dirty... + display_alert "Cleaning git dir" "$(git status -s | wc -l) files" # working directory is not clean, show it + +From b853358ccab458dce0efca486ec5a15fda4ec193 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 18 Feb 2022 04:09:37 +0100 +Subject: [PATCH] [wip] disable make clean during packaging. I wanna rebuild + fast, always [NO PR?] + +--- + packages/armbian/builddeb | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +index 0163d401a..d57ba1d76 100755 +--- a/packages/armbian/builddeb ++++ b/packages/armbian/builddeb +@@ -370,10 +370,11 @@ if [ "$ARCH" != "um" ]; then + else + # Clean up the executables that are left over from + # cross-compilation for a different host architecture. +- ( +- cd $srctree +- make M=scripts clean +- ) ++ #( ++ # cd $srctree ++ # make M=scripts clean ++ #) ++ echo "-- NOT CLEANING before packaging headers. " 1>&2 + deploy_kernel_headers $kernel_headers_dir + create_package $kernel_headers_packagename $kernel_headers_dir "headers" + fi + +From d61b6ddd982f316604bdedd82a0907beef7cfa0b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Feb 2022 22:21:33 +0100 +Subject: [PATCH] armbian-next: export CHOSEN_KERNEL_WITH_ARCH for reporting + info + +- fix info gathering, parse all boards first, and stop if some failed +- fix KERNEL_TARGET regex by including optional "export " +- add export from info to CSV, very basic stuff, but works +--- + lib/functions/main/config-prepare.sh | 1 + + lib/tools/info.py | 21 +++++++++------ + lib/tools/json2csv.py | 51 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 65 insertions(+), 8 deletions(-) + +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index b416b1302..bb3831889 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -173,6 +173,7 @@ function prepare_and_config_main_build_single() { + export CHOSEN_ROOTFS=${BSP_CLI_PACKAGE_NAME} + export CHOSEN_DESKTOP=armbian-${RELEASE}-desktop-${DESKTOP_ENVIRONMENT} + export CHOSEN_KSRC=linux-source-${BRANCH}-${LINUXFAMILY} ++ export CHOSEN_KERNEL_WITH_ARCH=${CHOSEN_KERNEL}-${ARCH} # Only for reporting purposes. + + display_alert "Done with prepare_and_config_main_build_single" "${BOARD}.${BOARD_TYPE}" "info" + } +diff --git a/lib/tools/info.py b/lib/tools/info.py +index af932eefa..088d4738a 100755 +--- a/lib/tools/info.py ++++ b/lib/tools/info.py +@@ -135,8 +135,8 @@ def parse_board_file_for_static_info(board_file, board_id): + hw_desc_clean = hw_desc_line.strip("# ").strip("\n") + + # Parse KERNEL_TARGET line. +- kernel_target_matches = re.findall(r"^KERNEL_TARGET=\"(.*)\"", "\n".join(file_lines), re.MULTILINE) +- kernel_targets = kernel_target_matches[0].split(",") ++ kernel_target_matches = re.findall(r"^(export )?KERNEL_TARGET=\"(.*)\"", "\n".join(file_lines), re.MULTILINE) ++ kernel_targets = kernel_target_matches[0][1].split(",") + eprint("Possible kernel branches for board: ", board_id, " : ", kernel_targets) + + return { +@@ -167,16 +167,21 @@ if True: + all_boards = get_all_boards_list_from_armbian(armbian_src_path) + # eprint(json.dumps(all_boards, indent=4, sort_keys=True)) + ++ # first, gather the board_info for every board. if any fail, stop. ++ info_for_board = {} ++ for board in all_boards.keys(): ++ try: ++ board_info = parse_board_file_for_static_info(all_boards[board], board) ++ info_for_board[board] = board_info ++ except BaseException as e: ++ eprint("** Failed to parse board file {} static: {}".format(board, e)) ++ raise e ++ # now loop over gathered infos + every_info = [] + with concurrent.futures.ProcessPoolExecutor(max_workers=32) as executor: + every_future = [] + for board in all_boards.keys(): +- try: +- board_info = parse_board_file_for_static_info(all_boards[board], board) +- except: +- eprint("** Failed to parse board file {} static.".format(board)) +- continue +- ++ board_info = info_for_board[board] + for possible_branch in board_info["BOARD_POSSIBLE_BRANCHES"]: + all_params = common_compile_params | board_compile_params | {"BRANCH": possible_branch} + eprint("Submitting future for board {} with BRANCH={}".format(board, possible_branch)) +diff --git a/lib/tools/json2csv.py b/lib/tools/json2csv.py +new file mode 100755 +index 000000000..7933ed9d6 +--- /dev/null ++++ b/lib/tools/json2csv.py +@@ -0,0 +1,51 @@ ++#!/usr/bin/env python3 ++import collections.abc ++import json ++import sys ++ ++ ++def eprint(*args, **kwargs): ++ print(*args, file=sys.stderr, **kwargs) ++ ++ ++def flatten(d, parent_key='', sep='_'): ++ items = [] ++ for k, v in d.items(): ++ new_key = parent_key + sep + k if parent_key else k ++ if isinstance(v, collections.abc.MutableMapping): ++ items.extend(flatten(v, new_key, sep=sep).items()) ++ else: ++ items.append((new_key, v)) ++ return dict(items) ++ ++ ++json_object = json.load(sys.stdin) ++eprint("Loaded {} objects from stdin...".format(len(json_object))) ++ ++flat = [] ++for obj in json_object: ++ flat.append(flatten(obj, '', '.')) ++ ++columns_map = {} ++for obj in flat: ++ # get the string keys ++ for key in obj.keys(): ++ value = obj[key] ++ if type(value) == str: ++ columns_map[key] = True ++ ++columns = columns_map.keys() ++ ++eprint("columns: {}".format(columns_map)) ++ ++eprint("columns: {}".format(columns)) ++ ++import csv ++ ++with open('boards_vs_branches.csv', 'w', newline='') as csvfile: ++ fieldnames = columns ++ writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore') ++ ++ writer.writeheader() ++ for obj in flat: ++ writer.writerow(obj) + +From dcf101ccbcb61fb4bf0af97f8592f6f166a20b92 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Feb 2022 21:47:02 +0100 +Subject: [PATCH] [squash] remove ddk bullshit from KERNEL_TARGET + +--- + config/boards/rpi4b.wip | 2 +- + config/boards/uefi-arm64.conf | 2 +- + config/boards/uefi-x86.conf | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/config/boards/rpi4b.wip b/config/boards/rpi4b.wip +index b471e3421..c78b14060 100644 +--- a/config/boards/rpi4b.wip ++++ b/config/boards/rpi4b.wip +@@ -1,7 +1,7 @@ + # Broadcom BCM2711 quad core 1-8Gb RAM SoC USB3 GBE USB-C WiFi/BT + export BOARD_NAME="Raspberry Pi 4" + export BOARDFAMILY="bcm2711" +-export KERNEL_TARGET="ddk,current,edge" ++export KERNEL_TARGET="legacy,current,edge" + export FK__MACHINE_MODEL="Raspberry Pi 4 Model B" # this is passed to flash-kernel. + export ASOUND_STATE="asound.state.rpi" + +diff --git a/config/boards/uefi-arm64.conf b/config/boards/uefi-arm64.conf +index 523e488ce..8f5e201f7 100644 +--- a/config/boards/uefi-arm64.conf ++++ b/config/boards/uefi-arm64.conf +@@ -1,4 +1,4 @@ + # aarch64 via UEFI for all UEFI-enabled boards + export BOARD_NAME="UEFI arm64" + export BOARDFAMILY="uefi-arm64" +-export KERNEL_TARGET="ddk,current,edge" ++export KERNEL_TARGET="legacy,current,edge" +diff --git a/config/boards/uefi-x86.conf b/config/boards/uefi-x86.conf +index 186e5fdba..7ff375bb8 100644 +--- a/config/boards/uefi-x86.conf ++++ b/config/boards/uefi-x86.conf +@@ -1,4 +1,4 @@ + # x86_64 via UEFI/BIOS for all boards + export BOARD_NAME="UEFI x86" + export BOARDFAMILY="uefi-x86" +-export KERNEL_TARGET="ddk,current,edge" ++export KERNEL_TARGET="legacy,current,edge" + +From 7183b3290b9df1c4fce8307813702c23846be817 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Feb 2022 15:49:27 +0100 +Subject: [PATCH] armbian-next: remove file logging of aggregation stuff. + config phase can't touch disk anymore. + +--- + lib/functions/configuration/aggregation.sh | 46 ------------------------------ + lib/functions/configuration/main-config.sh | 11 ------- + 2 files changed, 57 deletions(-) + +diff --git a/lib/functions/configuration/aggregation.sh b/lib/functions/configuration/aggregation.sh +index e89275995..0dc729544 100644 +--- a/lib/functions/configuration/aggregation.sh ++++ b/lib/functions/configuration/aggregation.sh +@@ -5,22 +5,12 @@ + # Write to variables : + # - aggregated_content + aggregate_content() { +- [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] && return 0 # Don't write to disk in this case. +- LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/potential-paths.log" +- echo -e "Potential paths :" >> "${LOG_OUTPUT_FILE}" +- show_checklist_variables potential_paths + for filepath in ${potential_paths}; do + if [[ -f "${filepath}" ]]; then +- echo -e "${filepath/"$SRC"\//} yes" >> "${LOG_OUTPUT_FILE}" + aggregated_content+=$(cat "${filepath}") + aggregated_content+="${separator}" +- # else +- # echo -e "${filepath/"$SRC"\//} no\n" >> "${LOG_OUTPUT_FILE}" + fi +- + done +- echo "" >> "${LOG_OUTPUT_FILE}" +- unset LOG_OUTPUT_FILE + } + + get_all_potential_paths() { +@@ -35,14 +25,6 @@ get_all_potential_paths() { + done + done + done +- # for ppath in ${potential_paths}; do +- # echo "Checking for ${ppath}" +- # if [[ -f "${ppath}" ]]; then +- # echo "OK !|" +- # else +- # echo "Nope|" +- # fi +- # done + } + + # Environment variables expected : +@@ -110,31 +92,3 @@ cleanup_list() { + list_to_clean="${list_to_clean%"${list_to_clean##*[![:space:]]}"}" + echo ${list_to_clean} + } +- +-# is a formatted output of the values of variables +-# from the list at the place of the function call. +-# +-# The LOG_OUTPUT_FILE variable must be defined in the calling function +-# before calling the `show_checklist_variables` function and unset after. +-# +-show_checklist_variables() { +- [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] && return 0 # Don't write to disk in this case. +- local checklist=$* +- local var pval +- local log_file=${LOG_OUTPUT_FILE:-"${SRC}"/output/${LOG_SUBPATH}/trash.log} +- local _line=${BASH_LINENO[0]} +- local _function=${FUNCNAME[1]} +- local _file=$(basename "${BASH_SOURCE[1]}") +- +- echo -e "Show variables in function: $_function" "[$_file:$_line]\n" >> $log_file +- +- for var in $checklist; do +- eval pval=\$$var +- echo -e "\n$var =:" >> $log_file +- if [ $(echo "$pval" | gawk -F"/" '{print NF}') -ge 4 ]; then +- printf "%s\n" $pval >> $log_file +- else +- printf "%-30s %-30s %-30s %-30s\n" $pval >> $log_file +- fi +- done +-} +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index e21bb2de9..800845483 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -388,7 +388,6 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + PACKAGE_LIST_ADDITIONAL="$(one_line aggregate_all_cli "packages.additional" " ")" + + LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/debootstrap-list.log" +- show_checklist_variables "DEBOOTSTRAP_LIST DEBOOTSTRAP_COMPONENTS PACKAGE_LIST PACKAGE_LIST_ADDITIONAL PACKAGE_LIST_UNINSTALL" + + # Dependent desktop packages + # Myy : Sources packages from file here +@@ -397,7 +396,6 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + if [[ $BUILD_DESKTOP == "yes" ]]; then + PACKAGE_LIST_DESKTOP+="$(one_line aggregate_all_desktop "packages" " ")" + echo -e "\nGroups selected ${DESKTOP_APPGROUPS_SELECTED} -> PACKAGES :" >> "${LOG_OUTPUT_FILE}" +- show_checklist_variables PACKAGE_LIST_DESKTOP + fi + unset LOG_OUTPUT_FILE + +@@ -509,8 +507,6 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + PACKAGE_MAIN_LIST="$(echo ${PACKAGE_MAIN_LIST})" + fi + +- [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] || write_deboostrap_list_debug_log +- + # Give the option to configure DNS server used in the chroot during the build process + [[ -z $NAMESERVER ]] && NAMESERVER="1.0.0.1" # default is cloudflare alternate + +@@ -527,13 +523,6 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + display_alert "Done with main-config.sh" "do_main_configuration" "debug" + } + +-function write_deboostrap_list_debug_log() { +- LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/debootstrap-list.log" +- echo -e "\nVariables after manual configuration" >> $LOG_OUTPUT_FILE +- show_checklist_variables "DEBOOTSTRAP_COMPONENTS DEBOOTSTRAP_LIST PACKAGE_LIST PACKAGE_MAIN_LIST" +- unset LOG_OUTPUT_FILE +-} +- + function write_config_summary_output_file() { + local build_script_env_file="${DEST}/${LOG_SUBPATH}/output.log" + local debug_dpkg_arch debug_uname debug_virt debug_src_mount debug_src_perms debug_src_temp_perms + +From 4f858ace7b8674c8d5555e311bd053819555648a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 17 Feb 2022 03:24:08 +0100 +Subject: [PATCH] [WiP] git cold bundle; no: shallow clones/fetched; yes: + locally packed repo + +--- + config/sources/families/include/sunxi64_common.inc | 80 ++--- + config/sources/families/include/sunxi_common.inc | 81 ++--- + lib/functions/compilation/debs.sh | 4 +- + lib/functions/compilation/extra-drivers.sh | 1 + + lib/functions/compilation/kernel.sh | 11 +- + lib/functions/compilation/patching.sh | 2 + + lib/functions/compilation/sources.sh | 3 +- + lib/functions/compilation/uboot.sh | 4 +- + lib/functions/configuration/main-config.sh | 7 +- + lib/functions/general/git.sh | 338 ++++++++------------- + lib/functions/multi/build-all.sh | 2 +- + 11 files changed, 194 insertions(+), 339 deletions(-) + +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index 6a570b341..c7a3e0a20 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -1,44 +1,42 @@ + enable_extension "sunxi-tools" +-ARCH=arm64 +-ATF_TARGET_MAP="PLAT=$ATF_PLAT DEBUG=1 bl31;;build/$ATF_PLAT/debug/bl31.bin" +-BOOTDELAY=1 +- +-BOOTPATCHDIR='u-boot-sunxi' +-BOOTENV_FILE='sunxi.txt' +-UBOOT_TARGET_MAP=';;u-boot-sunxi-with-spl.bin' +-BOOTSCRIPT='boot-sun50i-next.cmd:boot.cmd' +-LINUXFAMILY=sunxi64 ++export ARCH=arm64 ++export ATF_TARGET_MAP="PLAT=$ATF_PLAT DEBUG=1 bl31;;build/$ATF_PLAT/debug/bl31.bin" ++export BOOTDELAY=1 ++ ++export BOOTPATCHDIR='u-boot-sunxi' ++export BOOTENV_FILE='sunxi.txt' ++export UBOOT_TARGET_MAP=';;u-boot-sunxi-with-spl.bin' ++export BOOTSCRIPT='boot-sun50i-next.cmd:boot.cmd' ++export LINUXFAMILY=sunxi64 ++export KERNELSOURCE=$MAINLINE_KERNEL_SOURCE ++export KERNELPATCHDIR='sunxi-'$BRANCH + + case $BRANCH in + +- legacy) KERNEL_VERSION_LEVEL="5.10" ;; +- +- current) KERNEL_VERSION_LEVEL="5.15" ;; +- +- edge) KERNEL_VERSION_LEVEL="5.16" ;; +-esac +- +-case "$KERNEL_VERSION_LEVEL" in ++ legacy) ++ export KERNELBRANCH="branch:linux-5.10.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.10" ++ ;; + +- 5.10 | 5.15 | 5.16) +- KERNELSOURCE=$MAINLINE_KERNEL_SOURCE +- KERNELSOURCENAME='name=origin' +- KERNELBRANCH="branch:linux-${KERNEL_VERSION_LEVEL}.y" ++ current) ++ export KERNELBRANCH="branch:linux-5.15.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.15" + ;; + +- *) +- KERNELSOURCE="https://github.com/megous/linux" +- KERNELSOURCENAME='name=megous' +- KERNELBRANCH="branch:orange-pi-$KERNEL_VERSION_LEVEL" ++ edge) ++ export KERNELBRANCH="branch:linux-5.16.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.16" + ;; + esac + +-KERNELPATCHDIR='sunxi-'$BRANCH ++# Hack for easily using megous for tests. ++if [[ "$USE_MEGOUS" == "yes" ]]; then ++ display_alert "Using megous/linux for kernel" "USE_MEGOUS: ${USE_MEGOUS}" "debug" ++ export KERNELSOURCE="https://github.com/megous/linux" ++ export KERNELBRANCH="${KERNELBRANCH_MEGOUS}" ++fi + +-# An optional parameter for switching to a git object such as a tag, commit, +-# or a specific branch. The object must exist in the local repository. +-# KERNELSWITCHOBJ="" +-# tag|obj|commit=v5.10.15|megous/$branch|$hash ++unset KERNELBRANCH_MEGOUS + + family_tweaks() { + # execute specific tweaks function if present +@@ -71,25 +69,3 @@ setup_write_uboot_platform() { + [[ -n $dev && $dev == mmcblk* ]] && DEVICE="/dev/$dev" + fi + } +- +-# default settings for kernel variables of the original kernel +-# VAR_SHALLOW_ORIGINAL=var_origin_kernel +-# Note: rpardini: this is called via VAR_SHALLOW_ORIGINAL during fetch_from_repo via waiter_local_repo +-var_origin_kernel() { +- url=$MAINLINE_KERNEL_SOURCE +- name='origin' +- branch="linux-${KERNEL_VERSION_LEVEL}.y" +- start_tag="v$KERNEL_VERSION_LEVEL" +- +- # checking the reachability of the initial tag +- if [ "$(git ls-remote --tags $url $start_tag | awk -F'/' '{if (NR == 1) print $NF}' || true)" != "$start_tag" ]; then +- exit 177 +- fi +- +- # Exceptions to the rule are when the desired tag is not +- # a bifurcation point at which all previous merge branches converge. +- # This is due to the subsequent extraction of `megous` +- [ "$KERNEL_VERSION_LEVEL" == "5.12" ] && start_tag="v5.12-rc7" +- +- return 0 # don't fail due to short-circuit above +-} +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index c84c45186..c450fecbd 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -1,44 +1,43 @@ + enable_extension "sunxi-tools" +-ARCH=armhf +-BOOTDELAY=1 +-BOOTPATCHDIR='u-boot-sunxi' +-UBOOT_TARGET_MAP=';;u-boot-sunxi-with-spl.bin' +-BOOTSCRIPT="boot-sunxi.cmd:boot.cmd" +-BOOTENV_FILE='sunxi.txt' +-LINUXFAMILY=sunxi +-UBOOT_FW_ENV='0x88000,0x20000' # /etc/fw_env.config offset and env size +-ASOUND_STATE='asound.state.sunxi-next' +-GOVERNOR=ondemand ++export ARCH=armhf ++export BOOTDELAY=1 ++export BOOTPATCHDIR='u-boot-sunxi' ++export UBOOT_TARGET_MAP=';;u-boot-sunxi-with-spl.bin' ++export BOOTSCRIPT="boot-sunxi.cmd:boot.cmd" ++export BOOTENV_FILE='sunxi.txt' ++export LINUXFAMILY=sunxi ++export UBOOT_FW_ENV='0x88000,0x20000' # /etc/fw_env.config offset and env size ++export ASOUND_STATE='asound.state.sunxi-next' ++export GOVERNOR=ondemand ++export KERNELSOURCE=$MAINLINE_KERNEL_SOURCE ++export KERNELPATCHDIR='sunxi-'$BRANCH + + case $BRANCH in + +- legacy) KERNEL_VERSION_LEVEL="5.10" ;; +- current) KERNEL_VERSION_LEVEL="5.15" ;; +- edge) KERNEL_VERSION_LEVEL="5.16" ;; +- +-esac +- +-case "$KERNEL_VERSION_LEVEL" in ++ legacy) ++ export KERNELBRANCH="branch:linux-5.10.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.10" ++ ;; + +- 5.10 | 5.15 | 5.16) +- KERNELSOURCE=$MAINLINE_KERNEL_SOURCE +- KERNELSOURCENAME='name=origin' +- KERNELBRANCH="branch:linux-${KERNEL_VERSION_LEVEL}.y" ++ current) ++ export KERNELBRANCH="branch:linux-5.15.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.15" + ;; + +- *) +- KERNELSOURCE="https://github.com/megous/linux" +- KERNELSOURCENAME='name=megous' +- KERNELBRANCH="branch:orange-pi-$KERNEL_VERSION_LEVEL" ++ edge) ++ export KERNELBRANCH="branch:linux-5.16.y" ++ export KERNELBRANCH_MEGOUS="branch:orange-pi-5.16" + ;; + esac + +-KERNELPATCHDIR='sunxi-'$BRANCH ++# Hack for easily using megous for tests. ++if [[ "$USE_MEGOUS" == "yes" ]]; then ++ display_alert "Using megous/linux for kernel" "USE_MEGOUS: ${USE_MEGOUS}" "debug" ++ export KERNELSOURCE="https://github.com/megous/linux" ++ export KERNELBRANCH="${KERNELBRANCH_MEGOUS}" ++fi + +-# An optional parameter for switching to a git object such as a tag, commit, +-# or a specific branch. The object must exist in the local repository. +-# KERNELSWITCHOBJ="tag=v5.10.15" +-# tag|obj|commit=v5.10.15|megous/$branch|$hash ++unset KERNELBRANCH_MEGOUS + + family_tweaks() { + # execute specific tweaks function if present +@@ -78,25 +77,3 @@ setup_write_uboot_platform() { + done + fi + } +- +-# default settings for kernel variables of the original kernel +-# VAR_SHALLOW_ORIGINAL=var_origin_kernel +-# Note: rpardini: this is called via VAR_SHALLOW_ORIGINAL during fetch_from_repo via waiter_local_repo +-var_origin_kernel() { +- url=$MAINLINE_KERNEL_SOURCE +- name='origin' +- branch="linux-${KERNEL_VERSION_LEVEL}.y" +- start_tag="v$KERNEL_VERSION_LEVEL" +- +- # checking the reachability of the initial tag +- if [ "$(git ls-remote --tags $url $start_tag | awk -F'/' '{if (NR == 1) print $NF}' || true)" != "$start_tag" ]; then +- exit 177 +- fi +- +- # Exceptions to the rule are when the desired tag is not +- # a bifurcation point at which all previous merge branches converge. +- # This is due to the subsequent extraction of `megous` +- [ "$KERNEL_VERSION_LEVEL" == "5.12" ] && start_tag="v5.12-rc7" +- +- return 0 # don't fail due to short-circuit above +-} +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index b00d12c60..a48bd3058 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -180,13 +180,13 @@ compile_xilinx_bootgen() { + + # Compile and install only if git commit hash changed + # need to check if /usr/local/bin/bootgen to detect new Docker containers with old cached sources +- if [[ ! -f .commit_id || $(improved_git rev-parse @ 2> /dev/null) != $(< .commit_id) || ! -f /usr/local/bin/bootgen ]]; then ++ if [[ ! -f .commit_id || $(git rev-parse @ 2> /dev/null) != $(< .commit_id) || ! -f /usr/local/bin/bootgen ]]; then + display_alert "Compiling" "xilinx-bootgen" "info" + make -s clean > /dev/null + make -s -j$(nproc) bootgen > /dev/null + mkdir -p /usr/local/bin/ + install bootgen /usr/local/bin > /dev/null 2>&1 +- improved_git rev-parse @ 2> /dev/null > .commit_id ++ git rev-parse @ 2> /dev/null > .commit_id + fi + + popd +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/extra-drivers.sh +index d41be6307..f731b4319 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/extra-drivers.sh +@@ -166,6 +166,7 @@ prepare_extra_kernel_drivers() { + if [ "$?" -ne "0" ]; then + # then use rc branch + aufstag="5.x-rcN" ++ # @TODO: this does not do what you think it does; nonzero explode always + improved_git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufstag}" > /dev/null + fi + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index e2232659d..d33c18f9f 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -61,7 +61,7 @@ function compile_kernel() { + display_alert "Pre-patch kernel version" "${pre_patch_version}" "debug" + + # read kernel git hash +- hash=$(improved_git --git-dir="$kerneldir"/.git rev-parse HEAD) ++ hash=$(git --git-dir="$kerneldir"/.git rev-parse HEAD) + + # Apply a series of patches if a series file exists + if test -f "${SRC}"/patch/kernel/"${KERNELPATCHDIR}"/series.conf; then +@@ -208,12 +208,7 @@ function compile_kernel() { + HASHTARGET="${SRC}/cache/hash$([[ ${BETA} == yes ]] && echo "-beta" || true)/linux-image-${BRANCH}-${LINUXFAMILY}" + OLDHASHTARGET=$(head -1 "${HASHTARGET}.githash" 2> /dev/null || true) + +- # check if OLDHASHTARGET commit exists otherwise use oldest +- if [[ -z ${KERNEL_VERSION_LEVEL} ]]; then +- git -C ${kerneldir} cat-file -t ${OLDHASHTARGET} > /dev/null 2>&1 && OLDHASHTARGET=$(git -C ${kerneldir} show HEAD~199 --pretty=format:"%H" --no-patch) +- else +- git -C ${kerneldir} cat-file -t ${OLDHASHTARGET} > /dev/null 2>&1 && OLDHASHTARGET=$(git -C ${kerneldir} rev-list --max-parents=0 HEAD) +- fi ++ git -C ${kerneldir} cat-file -t ${OLDHASHTARGET} > /dev/null 2>&1 && OLDHASHTARGET=$(git -C ${kerneldir} rev-list --max-parents=0 HEAD) + + [[ -z ${KERNELPATCHDIR} ]] && KERNELPATCHDIR=$LINUXFAMILY-$BRANCH + [[ -z ${LINUXCONFIG} ]] && LINUXCONFIG=linux-$LINUXFAMILY-$BRANCH +@@ -233,7 +228,7 @@ function compile_kernel() { + echo "${hash}" > "${HASHTARGET}.githash" + hash_watch_1=$(LC_COLLATE=C find -L "${SRC}/patch/kernel/${KERNELPATCHDIR}"/ -name '*.patch' -mindepth 1 -maxdepth 1 -printf '%s %P\n' 2> /dev/null | LC_COLLATE=C sort -n) + hash_watch_2=$(cat "${SRC}/config/kernel/${LINUXCONFIG}.config") +- echo "${hash_watch_1}${hash_watch_2}" | improved_git hash-object --stdin >> "${HASHTARGET}.githash" ++ echo "${hash_watch_1}${hash_watch_2}" | git hash-object --stdin >> "${HASHTARGET}.githash" + + display_alert "Finished updating kernel hashes" "${LINUXCONFIG} $kernel_packaging_target" "info" + fi +diff --git a/lib/functions/compilation/patching.sh b/lib/functions/compilation/patching.sh +index 99cb31719..7ebcef3ac 100644 +--- a/lib/functions/compilation/patching.sh ++++ b/lib/functions/compilation/patching.sh +@@ -120,8 +120,10 @@ apply_patch_series() { + awk '$0 ~ /^+.*patch$/{print $2}' | + xargs -I % sh -c 'rm -f %' + ++ set +e # has to tolerate error here to catch them + patch --batch --silent --no-backup-if-mismatch -p1 -N < $bzdir/"$p" >> $err_pt 2>&1 + flag=$? ++ set -e # back to normal, errors cause stop. + + case $flag in + 0) +diff --git a/lib/functions/compilation/sources.sh b/lib/functions/compilation/sources.sh +index 67fbad040..1fcacf8a3 100644 +--- a/lib/functions/compilation/sources.sh ++++ b/lib/functions/compilation/sources.sh +@@ -6,7 +6,8 @@ function fetch_sources_kernel_uboot_atf() { + + if [[ -n $KERNELSOURCE ]]; then + display_alert "Downloading sources" "kernel" "git" +- fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" ++ GIT_COLD_BUNDLE_URL="${MAINLINE_KERNEL_COLD_BUNDLE_URL}" \ ++ fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes" + fi + + if [[ -n $ATFSOURCE ]]; then +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index d2d6447a2..053312875 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -9,7 +9,7 @@ function compile_uboot_target() { + + # needed for multiple targets and for calling compile_uboot directly + display_alert "${uboot_prefix} Checking out to clean sources" "{$BOOTSOURCEDIR} for ${target_make}" +- improved_git checkout -f -q HEAD ++ git checkout -f -q HEAD + + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "${uboot_prefix}Cleaning" "${BOOTSOURCEDIR}" "info" +@@ -116,7 +116,7 @@ compile_uboot() { + # read uboot version + local version hash + version=$(grab_version "$ubootdir") +- hash=$(improved_git --git-dir="$ubootdir"/.git rev-parse HEAD) ++ hash=$(git --git-dir="$ubootdir"/.git rev-parse HEAD) + + display_alert "Compiling u-boot" "$version ${ubootdir}" "info" + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 25dd263a5..e21bb2de9 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -44,8 +44,8 @@ function do_main_configuration() { + cd "${SRC}" || exit + [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=14 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 +- BUILD_REPOSITORY_URL=$(improved_git remote get-url $(improved_git remote 2> /dev/null | grep origin) 2> /dev/null) +- BUILD_REPOSITORY_COMMIT=$(improved_git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) ++ BUILD_REPOSITORY_URL=$(git remote get-url "$(git remote 2> /dev/null | grep origin)" 2> /dev/null) ++ BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) + ROOTFS_CACHE_MAX=200 # max number of rootfs cache, older ones will be cleaned up + + if [[ $BETA == yes ]]; then +@@ -112,6 +112,9 @@ function do_main_configuration() { + # used by multiple sources - reduce code duplication + [[ $USE_MAINLINE_GOOGLE_MIRROR == yes ]] && MAINLINE_MIRROR=google + ++ # URL for the git bundle used to "bootstrap" local git copies. ++ export MAINLINE_KERNEL_COLD_BUNDLE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle" ++ + case $MAINLINE_MIRROR in + google) + MAINLINE_KERNEL_SOURCE='https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable' +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 37aff6b3c..e6a2fe521 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -2,159 +2,24 @@ + # This function retries Git operations to avoid failure in case remote is borked + # + improved_git() { +- local realgit=$(command -v git) ++ local real_git ++ real_git="$(command -v git)" + local retries=3 + local delay=10 +- local count=1 ++ local count=0 + while [ $count -lt $retries ]; do +- $realgit "$@" 2>&1 +- if [[ $? -eq 0 || -f .git/index.lock ]]; then +- retries=0 +- break +- fi +- let count=$count+1 ++ run_host_command_logged_raw "$real_git" --no-pager "$@" && return 0 # this gobbles up errors, but returns if OK, so everything after is error ++ count=$((count + 1)) ++ display_alert "improved_git try $count failed, retrying in ${delay} seconds" "git $*" "warn" + sleep $delay + done ++ display_alert "improved_git, too many retries" "git $*" "err" ++ return 17 # explode with error if this is reached, "too many retries" + } + +-clean_up_repo() { +- local target_dir=$1 +- +- # Files that are not tracked by git and were added +- # when the patch was applied must be removed. +- improved_git -C $target_dir clean -qdf +- +- # Return the files that are tracked by git to the initial state. +- improved_git -C $target_dir checkout -qf HEAD +-} +- +-# used : waiter_local_repo arg1='value' arg2:'value' +-# waiter_local_repo \ +-# url='https://github.com/megous/linux' \ +-# name='megous' \ +-# dir='linux-mainline/5.14' \ +-# branch='orange-pi-5.14' \ +-# obj= or tag:$tag ... +-waiter_local_repo() { +- for arg in $@; do +- +- case $arg in +- url=* | https://* | git://*) +- eval "local url=${arg/url=/}" +- ;; +- dir=* | /*/*/*) +- eval "local dir=${arg/dir=/}" +- ;; +- *=* | *:*) +- eval "local ${arg/:/=}" +- ;; +- esac +- +- done +- +- # Required variables cannot be empty. +- for var in url name dir branch; do +- [ "${var#*=}" == "" ] && exit_with_error "Error in configuration" +- done +- +- local reachability +- +- # The 'offline' variable must always be set to 'true' or 'false' +- if [ "$OFFLINE_WORK" == "yes" ]; then +- local offline=true +- else +- local offline=false +- fi +- +- local work_dir="$(realpath ${SRC}/cache/sources)/$dir" +- mkdir -p $work_dir +- cd $work_dir || exit_with_error +- +- display_alert "Checking git sources" "$dir $url$name/$branch" "info" +- +- if [ "$(git rev-parse --git-dir 2> /dev/null)" != ".git" ]; then +- git init -q . +- +- # Run in the sub shell to avoid mixing environment variables. +- if [ -n "$VAR_SHALLOW_ORIGINAL" ]; then +- ( +- $VAR_SHALLOW_ORIGINAL +- +- display_alert "Add original git sources" "$dir $url$name/$branch" "info" +- if [ "$(git ls-remote -h $url $branch | +- awk -F'/' '{if (NR == 1) print $NF}')" != "$branch" ]; then +- display_alert "Bad $branch for $url in $VAR_SHALLOW_ORIGINAL" +- exit 177 +- fi +- +- git remote add -t $branch $name $url +- +- # Handle an exception if the initial tag is the top of the branch +- # As v5.16 == HEAD +- if [ "${start_tag}.1" == "$(git ls-remote -t $url ${start_tag}.1 | +- awk -F'/' '{ print $NF }')" ]; then +- git fetch --shallow-exclude=$start_tag $name +- else +- git fetch --depth 1 $name +- fi +- git fetch --deepen=1 $name +- # For a shallow clone, this works quickly and saves space. +- git gc +- ) +- +- [ "$?" == "177" ] && exit +- fi +- fi +- +- files_for_clean="$(git status -s | wc -l)" +- if [ "$files_for_clean" != "0" ]; then +- display_alert " Cleaning .... " "$files_for_clean files" +- clean_up_repo $work_dir +- fi +- +- if [ "$name" != "$(git remote show | grep $name || true)" ]; then +- git remote add -t $branch $name $url +- fi +- +- if ! $offline; then +- for t_name in $(git remote show); do +- git fetch $t_name +- done +- fi +- +- # When switching, we use the concept of only "detached branch". Therefore, +- # we extract the hash from the tag, the branch name, or from the hash itself. +- # This serves as a check of the reachability of the extraction. +- # We do not use variables that characterize the current state of the git, +- # such as `HEAD` and `FETCH_HEAD`. +- reachability=false +- for var in obj tag commit branch; do +- eval pval=\$$var +- +- if [ -n "$pval" ] && [ "$pval" != *HEAD ]; then +- case $var in +- obj | tag | commit) obj=$pval ;; +- branch) obj=${name}/$branch ;; +- esac +- +- if t_hash=$(git rev-parse $obj 2> /dev/null); then +- reachability=true +- break +- else +- display_alert "Variable $var=$obj unreachable for extraction" +- fi +- fi +- done +- +- if $reachability && [ "$t_hash" != "$(git rev-parse @ 2> /dev/null)" ]; then +- # Switch "detached branch" as hash +- display_alert "Switch $obj = $t_hash" +- git checkout -qf $t_hash +- else +- # the working directory corresponds to the target commit, +- # nothing needs to be done +- display_alert "Up to date" +- fi ++# avoid repeating myself too much ++function improved_git_fetch() { ++ improved_git fetch --progress --verbose --no-auto-maintenance "$@" + } + + # fetch_from_repo +@@ -171,23 +36,16 @@ waiter_local_repo() { + # : "yes" to create subdirectory for tag or branch name + # + fetch_from_repo() { ++ display_alert "fetch_from_repo" "$*" "debug" + local url=$1 + local dir=$2 + local ref=$3 + local ref_subdir=$4 ++ local git_work_dir + + # Set GitHub mirror before anything else touches $url + url=${url//'https://github.com/'/$GITHUB_SOURCE} + +- if [ "$dir" == "linux-mainline" ] && [[ "$LINUXFAMILY" == sunxi* ]]; then +- unset LINUXSOURCEDIR +- LINUXSOURCEDIR="linux-mainline/$KERNEL_VERSION_LEVEL" +- VAR_SHALLOW_ORIGINAL=var_origin_kernel +- waiter_local_repo "url=$url $KERNELSOURCENAME $KERNELBRANCH dir=$LINUXSOURCEDIR $KERNELSWITCHOBJ" +- unset VAR_SHALLOW_ORIGINAL +- return +- fi +- + # The 'offline' variable must always be set to 'true' or 'false' + if [ "$OFFLINE_WORK" == "yes" ]; then + local offline=true +@@ -203,40 +61,37 @@ fetch_from_repo() { + local ref_name=${ref##*:} + fi + +- display_alert "Checking git sources" "$dir $ref_name" "info" +- +- # get default remote branch name without cloning +- # local ref_name=$(git ls-remote --symref $url HEAD | grep -o 'refs/heads/\S*' | sed 's%refs/heads/%%') +- # for git:// protocol comparing hashes of "git ls-remote -h $url" and "git ls-remote --symref $url HEAD" is needed ++ display_alert "Getting sources from Git" "$dir $ref_name" "info" + ++ local workdir=$dir + if [[ $ref_subdir == yes ]]; then +- local workdir=$dir/$ref_name +- else +- local workdir=$dir ++ workdir=$dir/$ref_name + fi + +- mkdir -p "${SRC}/cache/sources/${workdir}" 2> /dev/null || +- exit_with_error "No path or no write permission" "${SRC}/cache/sources/${workdir}" ++ git_work_dir="${SRC}/cache/sources/${workdir}" ++ ++ mkdir -p "${git_work_dir}" || exit_with_error "No path or no write permission" "${git_work_dir}" ++ ++ cd "${git_work_dir}" || exit + +- cd "${SRC}/cache/sources/${workdir}" || exit ++ display_alert "Git working dir" "${git_work_dir}" "debug" + + # check if existing remote URL for the repo or branch does not match current one + # may not be supported by older git versions + # Check the folder as a git repository. + # Then the target URL matches the local URL. + +- if [[ "$(improved_git rev-parse --git-dir 2> /dev/null)" == ".git" && +- "$url" != *"$(improved_git remote get-url origin | sed 's/^.*@//' | sed 's/^.*\/\///' 2> /dev/null)" ]]; then +- display_alert "Remote URL does not match, removing existing local copy" "$dir $ref_name" +- rm -rf .git ./* ++ if [[ "$(git rev-parse --git-dir)" == ".git" && "$url" != *"$(git remote get-url origin | sed 's/^.*@//' | sed 's/^.*\/\///')" ]]; then ++ display_alert "Remote URL does not match, removing existing local copy" "$dir $ref_name" "warn" ++ rm -rf "${git_work_dir}" ++ mkdir -p "${git_work_dir}" + fi + +- if [[ "$(improved_git rev-parse --git-dir 2> /dev/null)" != ".git" ]]; then ++ if [[ "$(git rev-parse --git-dir)" != ".git" ]]; then + display_alert "Creating local copy" "$dir $ref_name" +- improved_git init -q . ++ improved_git init -q --initial-branch="armbian_unused_initial_branch" . + improved_git remote add origin "${url}" +- # Here you need to upload from a new address +- offline=false ++ offline=false # Force only, we'll need to fetch. + fi + + local changed=false +@@ -244,26 +99,26 @@ fetch_from_repo() { + # when we work offline we simply return the sources to their original state + if ! $offline; then + local local_hash +- local_hash=$(git rev-parse @ 2> /dev/null || true) ++ local_hash=$(git rev-parse @ 2> /dev/null || true) # Don't fail nor output anything if failure + + case $ref_type in + branch) + # TODO: grep refs/heads/$name + local remote_hash +- remote_hash=$(improved_git ls-remote -h "${url}" "$ref_name" | head -1 | cut -f1) +- [[ -z $local_hash || "${local_hash}" != "${remote_hash}" ]] && changed=true ++ remote_hash=$(git ls-remote -h "${url}" "$ref_name" | head -1 | cut -f1) ++ [[ -z $local_hash || "${local_hash}" != "a${remote_hash}" ]] && changed=true + ;; + tag) + local remote_hash +- remote_hash=$(improved_git ls-remote -t "${url}" "$ref_name" | cut -f1) ++ remote_hash=$(git ls-remote -t "${url}" "$ref_name" | cut -f1) + if [[ -z $local_hash || "${local_hash}" != "${remote_hash}" ]]; then +- remote_hash=$(improved_git ls-remote -t "${url}" "$ref_name^{}" | cut -f1) ++ remote_hash=$(git ls-remote -t "${url}" "$ref_name^{}" | cut -f1) + [[ -z $remote_hash || "${local_hash}" != "${remote_hash}" ]] && changed=true + fi + ;; + head) + local remote_hash +- remote_hash=$(improved_git ls-remote "${url}" HEAD | cut -f1) ++ remote_hash=$(git ls-remote "${url}" HEAD | cut -f1) + [[ -z $local_hash || "${local_hash}" != "${remote_hash}" ]] && changed=true + ;; + commit) +@@ -271,60 +126,105 @@ fetch_from_repo() { + ;; + esac + ++ display_alert "Git local_hash vs remote_hash" "${local_hash} vs ${remote_hash}" "debug" ++ + fi # offline + + if [[ $changed == true ]]; then +- # remote was updated, fetch and check out updates +- display_alert "Fetching updates" "$dir $ref_name" +- case $ref_type in +- branch) improved_git fetch --depth 200 origin "${ref_name}" ;; +- tag) improved_git fetch --depth 200 origin tags/"${ref_name}" ;; +- head) improved_git fetch --depth 200 origin HEAD ;; +- esac + +- # commit type needs support for older git servers that doesn't support fetching id directly +- if [[ $ref_type == commit ]]; then +- improved_git fetch --depth 200 origin "${ref_name}" ++ # If there's a cold bundle URL specified: ++ # - if there's already a cold_bundle_xxx remote, move on. ++ # - grab the bundle via http/https first, and fetch from that, into "cold_bundle_xxx" remote. ++ # - do nothing else with this, it'll be used internally by git to avoid a huge fetch later. ++ # - but, after this, the wanted branch will be fetched. signal has_fetched_from_bundle=1 for later. ++ local has_fetched_from_bundle=0 ++ if [[ "${GIT_COLD_BUNDLE_URL}" != "" ]]; then ++ local git_cold_bundle_id git_cold_bundle_cache_dir git_cold_bundle_cache_file git_cold_bundle_remote_id git_cold_bundle_fetched_marker_file ++ # calculate the id, dir and name of local file and remote ++ git_cold_bundle_cache_dir="${SRC}/cache/gitbundles" ++ mkdir -p "${git_cold_bundle_cache_dir}" ++ git_cold_bundle_id="$(echo -n "${GIT_COLD_BUNDLE_URL}" | md5sum | awk '{print $1}')" # md5 of the URL. ++ git_cold_bundle_cache_file="${git_cold_bundle_cache_dir}/${git_cold_bundle_id}.gitbundle" ++ git_cold_bundle_remote_id="cold_bundle_${git_cold_bundle_id}" ++ git_cold_bundle_fetched_marker_file=".git/fetched-from-bundle-${git_cold_bundle_id}" ++ ++ display_alert "There's a " "${GIT_COLD_BUNDLE_URL} -- ${git_cold_bundle_id} -- file: ${git_cold_bundle_cache_file}" "debug" ++ ++ # Don't do if already done before for this bundle. ++ if [[ ! -f "${git_cold_bundle_fetched_marker_file}" ]]; then ++ ++ # Download the bundle file if it does not exist. ++ if [[ ! -f "${git_cold_bundle_cache_file}" ]]; then ++ display_alert "Downloading cold bundle from remote server" "${GIT_COLD_BUNDLE_URL}" "debug" ++ run_host_command_logged wget --continue --output-document="${git_cold_bundle_cache_file}" "${GIT_COLD_BUNDLE_URL}" ++ else ++ display_alert "Cold bundle file exists, using it" "${git_cold_bundle_cache_file}" "debug" ++ fi ++ ++ # Make sure bundle is valid. ++ improved_git bundle verify "${git_cold_bundle_cache_file}" ++ ++ # Get a list of remotes in the repo; add remote to bundle if it does not exist, and fetch from it. ++ # This should be done only once per workdir, so I use a marker file to denote completion. ++ if git remote get-url "${git_cold_bundle_remote_id}" 2> /dev/null; then ++ display_alert "Git already has bundle remote" "incomplete fetch? ${git_cold_bundle_id}" "debug" ++ else ++ improved_git remote add "${git_cold_bundle_remote_id}" "${git_cold_bundle_cache_file}" # Add the remote pointing to the cold bundle file ++ fi ++ ++ display_alert "Fetching from git bundle, wait" "${git_cold_bundle_id}" "info" ++ improved_git_fetch --tags "${git_cold_bundle_remote_id}" # Fetch it! and all its tags, too. ++ has_fetched_from_bundle=1 # marker for pruning logic below ++ echo "${remote_hash}" > "${git_cold_bundle_fetched_marker_file}" # marker for future invocation ++ display_alert "Bundle fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull + +- # cover old type +- if [[ $? -ne 0 ]]; then +- display_alert "Commit checkout not supported on this repository. Doing full clone." "" "wrn" +- improved_git pull +- improved_git checkout -fq "${ref_name}" +- display_alert "Checkout out to" "$(improved_git --no-pager log -2 --pretty=format:"$ad%s [%an]" | head -1)" "info" +- else +- display_alert "Checking out" "$dir $ref_name" +- improved_git checkout -f -q FETCH_HEAD +- improved_git clean -qdf + fi +- else +- display_alert "Checking out" "$dir $ref_name" +- improved_git checkout -f -q FETCH_HEAD +- improved_git clean -qdf + fi +- elif [[ -n $(improved_git status -uno --porcelain --ignore-submodules=all) ]]; then +- # working directory is not clean +- display_alert " Cleaning .... " "$(improved_git status -s | wc -l) files" + +- # Return the files that are tracked by git to the initial state. +- improved_git checkout -f -q HEAD ++ # @TODO: If there's a warmup remote specified: (for u-boot and others) ++ # - if there's already a warmup remote, move on. ++ # - if there's a cached warmup bundle file, add it as remote and fetch from it, and move on. ++ # - add the warmup as remote, fetch from it; export it as a cached bundle for next time. + +- # Files that are not tracked by git and were added +- # when the patch was applied must be removed. +- improved_git clean -qdf +- else +- # working directory is clean, nothing to do +- display_alert "Up to date" "$dir $ref_name" ++ # remote was updated, fetch and check out updates, but not tags; tags pull their respective commits too, making it a huge fetch. ++ display_alert "Fetching updates from origin" "$dir $ref_name " ++ case $ref_type in ++ branch | commit) improved_git_fetch origin "${ref_name}" ;; ++ tag) improved_git_fetch origin tags/"${ref_name}" ;; ++ head) improved_git_fetch origin HEAD ;; ++ esac ++ display_alert "Origin fetch completed, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size again ++ ++ display_alert "Checking out" "$dir $ref_name" ++ improved_git checkout -f -q FETCH_HEAD ++ improved_git clean -q -d -f ++ ++ if [[ $has_fetched_from_bundle -gt 0 ]]; then ++ display_alert "Pre-pruning, working copy size" "$(du -h -s | awk '{print $1}')" "debug" # Show size after bundle pull ++ echo -n "${remote_hash}" > .git/shallow # commit to keep for shallowing, can be something else. for now is full prune. ++ improved_git remote remove "${git_cold_bundle_remote_id}" ++ improved_git reflog expire --expire=0 --all ++ improved_git gc --prune=all ++ fi ++ ++ elif [[ -n $(git status -uno --porcelain --ignore-submodules=all) ]]; then # if not changed, but dirty... ++ display_alert "Cleaning git dir" "$(git status -s | wc -l) files" # working directory is not clean, show it ++ improved_git checkout -f -q HEAD # Return the files that are tracked by git to the initial state. ++ improved_git clean -q -d -f # Files that are not tracked by git and were added when the patch was applied must be removed. ++ else # not changed, not dirty. ++ display_alert "Up to date" "$dir $ref_name at revision ${local_hash}" # working directory is clean, nothing to do + fi + ++ display_alert "Final working copy size" "$(du -h -s | awk '{print $1}')" "debug" ++ + if [[ -f .gitmodules ]]; then + display_alert "Updating submodules" "" "ext" + # FML: http://stackoverflow.com/a/17692710 +- for i in $(improved_git config -f .gitmodules --get-regexp path | awk '{ print $2 }'); do +- cd "${SRC}/cache/sources/${workdir}" || exit ++ for i in $(git config -f .gitmodules --get-regexp path | awk '{ print $2 }'); do ++ cd "${git_work_dir}" || exit + local surl sref +- surl=$(improved_git config -f .gitmodules --get "submodule.$i.url") +- sref=$(improved_git config -f .gitmodules --get "submodule.$i.branch") ++ surl=$(git config -f .gitmodules --get "submodule.$i.url") ++ sref=$(git config -f .gitmodules --get "submodule.$i.branch") + if [[ -n $sref ]]; then + sref="branch:$sref" + else +diff --git a/lib/functions/multi/build-all.sh b/lib/functions/multi/build-all.sh +index 5f8496157..762a588d7 100644 +--- a/lib/functions/multi/build-all.sh ++++ b/lib/functions/multi/build-all.sh +@@ -101,7 +101,7 @@ unset_all() { + CRYPTROOT_SSH_UNLOCK_PORT CRYPTROOT_SSH_UNLOCK_KEY_NAME ROOT_MAPPER NETWORK HDMI USB WIRELESS ARMBIANMONITOR FORCE_BOOTSCRIPT_UPDATE \ + UBOOT_TOOLCHAIN2 toolchain2 BUILD_REPOSITORY_URL BUILD_REPOSITORY_COMMIT BUILD_TARGET HOST BUILD_IMAGE DEB_STORAGE REPO_STORAGE REPO_CONFIG \ + REPOSITORY_UPDATE PACKAGE_LIST_RELEASE LOCAL_MIRROR COMPILE_ATF PACKAGE_LIST_BOARD PACKAGE_LIST_FAMILY PACKAGE_LIST_DESKTOP_BOARD \ +- PACKAGE_LIST_DESKTOP_FAMILY ATF_COMPILE ATFPATCHDIR OFFSET BOOTSOURCEDIR KERNEL_VERSION_LEVEL KERNELSOURCENAME \ ++ PACKAGE_LIST_DESKTOP_FAMILY ATF_COMPILE ATFPATCHDIR OFFSET BOOTSOURCEDIR \ + BOOT_SOC DDR_BLOB MINILOADER_BLOB BL31_BLOB BOOT_SCENARIO BOOT_SUPPORT_SPI OFFLINE_WORK VAR_SHALLOW_ORIGINAL KERNELSWITCHOBJ \ + IMAGE_PARTITION_TABLE BOOT_LOGO UBOOT_REPO_VERSION FORCED_MONTH_OFFSET PACKAGE_LIST_BOARD_REMOVE PACKAGE_LIST_FAMILY_REMOVE PACKAGE_LIST_DESKTOP \ + PACKAGE_LIST_DESKTOP_BOARD_REMOVE PACKAGE_LIST_DESKTOP_FAMILY_REMOVE BOOTCONFIG_EDGE DESKTOP_ENVIRONMENT DESKTOP_ENVIRONMENT_CONFIG_NAME \ + +From 134877c13df20aa7403185b41d75ee3db95c4485 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Feb 2022 23:06:37 +0100 +Subject: [PATCH] armbian-next: reorder functions in file, they have a ~logical + call-tree order + +--- + lib/functions/logging/runners.sh | 50 ++++++++++++++++++++-------------------- + 1 file changed, 25 insertions(+), 25 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 8bd8845f1..a85914f55 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -86,6 +86,31 @@ function host_apt_get() { + run_host_command_logged DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" + } + ++# For host-side invocations of binaries we _know_ are x86-only. ++# Determine if we're building on non-amd64, and if so, which qemu binary to use. ++function run_host_x86_binary_logged() { ++ local -a qemu_invocation target_bin_arch ++ target_bin_arch="unknown - file util missing" ++ if [[ -f /usr/bin/file ]]; then ++ target_bin_arch="$(file -b "$1" | cut -d "," -f 1,2 | xargs echo -n)" # obtain the ELF name from the binary using 'file' ++ fi ++ qemu_invocation=("$@") # Default to calling directly, without qemu. ++ if [[ "$(uname -m)" != "x86_64" ]]; then # If we're NOT on x86... ++ if [[ -f /usr/bin/qemu-x86_64-static ]]; then ++ display_alert "Using qemu-x86_64-static for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" ++ qemu_invocation=("/usr/bin/qemu-x86_64-static" "-L" "/usr/x86_64-linux-gnu" "$@") ++ elif [[ -f /usr/bin/qemu-x86_64 ]]; then ++ display_alert "Using qemu-x86_64 (non-static) for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" ++ qemu_invocation=("/usr/bin/qemu-x86_64" "-L" "/usr/x86_64-linux-gnu" "$@") ++ else ++ exit_with_error "Can't find appropriate qemu binary for running '$1' on $(uname -m), missing packages?" ++ fi ++ else ++ display_alert "Not using qemu for running x86 binary on $(uname -m)" "$1 (${target_bin_arch})" "debug" ++ fi ++ run_host_command_logged "${qemu_invocation[@]}" # Exit with this result code ++} ++ + # run_host_command_logged is the very basic, should be used for everything, but, please use helpers above, this is very low-level. + function run_host_command_logged() { + run_host_command_logged_raw /bin/bash -e -c "$*" +@@ -130,28 +155,3 @@ function run_host_command_logged_raw() { + run_on_sdcard() { + chroot_sdcard "${@}" + } +- +-# For host-side invocations of binaries we _know_ are x86-only. +-# Determine if we're building on non-amd64, and if so, which qemu binary to use. +-function run_host_x86_binary_logged() { +- local -a qemu_invocation target_bin_arch +- target_bin_arch="unknown - file util missing" +- if [[ -f /usr/bin/file ]]; then +- target_bin_arch="$(file -b "$1" | cut -d "," -f 1,2 | xargs echo -n)" # obtain the ELF name from the binary using 'file' +- fi +- qemu_invocation=("$@") # Default to calling directly, without qemu. +- if [[ "$(uname -m)" != "x86_64" ]]; then # If we're NOT on x86... +- if [[ -f /usr/bin/qemu-x86_64-static ]]; then +- display_alert "Using qemu-x86_64-static for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" +- qemu_invocation=("/usr/bin/qemu-x86_64-static" "-L" "/usr/x86_64-linux-gnu" "$@") +- elif [[ -f /usr/bin/qemu-x86_64 ]]; then +- display_alert "Using qemu-x86_64 (non-static) for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" +- qemu_invocation=("/usr/bin/qemu-x86_64" "-L" "/usr/x86_64-linux-gnu" "$@") +- else +- exit_with_error "Can't find appropriate qemu binary for running '$1' on $(uname -m), missing packages?" +- fi +- else +- display_alert "Not using qemu for running x86 binary on $(uname -m)" "$1 (${target_bin_arch})" "debug" +- fi +- run_host_command_logged "${qemu_invocation[@]}" # Exit with this result code +-} + +From f148d9aa6b42c96ee1fe9c58053886d693a5c58e Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Feb 2022 23:05:28 +0100 +Subject: [PATCH] armbian-next: move `fingerprint_image()` out of `git.sh` into + its own file + +--- + lib/functions/general/fingerprint.sh | 47 +++++++++++++++++++++++++++++++++++ + lib/functions/general/git.sh | 48 ------------------------------------ + lib/library-functions.sh | 9 +++++++ + lib/tools/gen-library.sh | 1 + + 4 files changed, 57 insertions(+), 48 deletions(-) + +diff --git a/lib/functions/general/fingerprint.sh b/lib/functions/general/fingerprint.sh +new file mode 100644 +index 000000000..566f76faf +--- /dev/null ++++ b/lib/functions/general/fingerprint.sh +@@ -0,0 +1,47 @@ ++#-------------------------------------------------------------------------------------------------------------------------------- ++# fingerprint_image [image_filename] ++# Saving build summary to the image ++#-------------------------------------------------------------------------------------------------------------------------------- ++fingerprint_image() { ++ cat <<- EOF > "${1}" ++ -------------------------------------------------------------------------------- ++ Title: ${VENDOR} $REVISION ${BOARD^} $BRANCH ++ Kernel: Linux $VER ++ Build date: $(date +'%d.%m.%Y') ++ Maintainer: $MAINTAINER <$MAINTAINERMAIL> ++ Authors: https://www.armbian.com/authors ++ Sources: https://github.com/armbian/ ++ Support: https://forum.armbian.com/ ++ Changelog: https://www.armbian.com/logbook/ ++ Documantation: https://docs.armbian.com/ ++ EOF ++ ++ if [ -n "$2" ]; then ++ cat <<- EOF >> "${1}" ++ -------------------------------------------------------------------------------- ++ Partitioning configuration: $IMAGE_PARTITION_TABLE offset: $OFFSET ++ Boot partition type: ${BOOTFS_TYPE:-(none)} ${BOOTSIZE:+"(${BOOTSIZE} MB)"} ++ Root partition type: $ROOTFS_TYPE ${FIXED_IMAGE_SIZE:+"(${FIXED_IMAGE_SIZE} MB)"} ++ ++ CPU configuration: $CPUMIN - $CPUMAX with $GOVERNOR ++ -------------------------------------------------------------------------------- ++ Verify GPG signature: ++ gpg --verify $2.img.asc ++ ++ Verify image file integrity: ++ sha256sum --check $2.img.sha ++ ++ Prepare SD card (four methodes): ++ zcat $2.img.gz | pv | dd of=/dev/mmcblkX bs=1M ++ dd if=$2.img of=/dev/mmcblkX bs=1M ++ balena-etcher $2.img.gz -d /dev/mmcblkX ++ balena-etcher $2.img -d /dev/mmcblkX ++ EOF ++ fi ++ ++ cat <<- EOF >> "${1}" ++ -------------------------------------------------------------------------------- ++ $(cat "${SRC}"/LICENSE) ++ -------------------------------------------------------------------------------- ++ EOF ++} +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index a02faa1f2..37aff6b3c 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -333,52 +333,4 @@ fetch_from_repo() { + fetch_from_repo "$surl" "$workdir/$i" "$sref" + done + fi +-} ############################################################################# +- +-#-------------------------------------------------------------------------------------------------------------------------------- +-# fingerprint_image [image_filename] +-# Saving build summary to the image +-#-------------------------------------------------------------------------------------------------------------------------------- +-fingerprint_image() { +- cat <<- EOF > "${1}" +- -------------------------------------------------------------------------------- +- Title: ${VENDOR} $REVISION ${BOARD^} $BRANCH +- Kernel: Linux $VER +- Build date: $(date +'%d.%m.%Y') +- Maintainer: $MAINTAINER <$MAINTAINERMAIL> +- Authors: https://www.armbian.com/authors +- Sources: https://github.com/armbian/ +- Support: https://forum.armbian.com/ +- Changelog: https://www.armbian.com/logbook/ +- Documantation: https://docs.armbian.com/ +- EOF +- +- if [ -n "$2" ]; then +- cat <<- EOF >> "${1}" +- -------------------------------------------------------------------------------- +- Partitioning configuration: $IMAGE_PARTITION_TABLE offset: $OFFSET +- Boot partition type: ${BOOTFS_TYPE:-(none)} ${BOOTSIZE:+"(${BOOTSIZE} MB)"} +- Root partition type: $ROOTFS_TYPE ${FIXED_IMAGE_SIZE:+"(${FIXED_IMAGE_SIZE} MB)"} +- +- CPU configuration: $CPUMIN - $CPUMAX with $GOVERNOR +- -------------------------------------------------------------------------------- +- Verify GPG signature: +- gpg --verify $2.img.asc +- +- Verify image file integrity: +- sha256sum --check $2.img.sha +- +- Prepare SD card (four methodes): +- zcat $2.img.gz | pv | dd of=/dev/mmcblkX bs=1M +- dd if=$2.img of=/dev/mmcblkX bs=1M +- balena-etcher $2.img.gz -d /dev/mmcblkX +- balena-etcher $2.img -d /dev/mmcblkX +- EOF +- fi +- +- cat <<- EOF >> "${1}" +- -------------------------------------------------------------------------------- +- $(cat "${SRC}"/LICENSE) +- -------------------------------------------------------------------------------- +- EOF + } +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 00f05c37a..39792dbe5 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -208,6 +208,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/general/downloads.sh + source "${SRC}"/lib/functions/general/downloads.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/fingerprint.sh ++# shellcheck source=lib/functions/general/fingerprint.sh ++source "${SRC}"/lib/functions/general/fingerprint.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +diff --git a/lib/tools/gen-library.sh b/lib/tools/gen-library.sh +index 3b851fe67..11de9946f 100755 +--- a/lib/tools/gen-library.sh ++++ b/lib/tools/gen-library.sh +@@ -16,6 +16,7 @@ cat <<- AUTOGEN_INCLUDES_HEADER > "${TARGET_SH}" + # This file is/was autogenerated by ${0}; don't modify manually + + AUTOGEN_INCLUDES_HEADER ++cd "${SRC}" + + find lib/functions -type f -name \*.sh | sort -h | while read -r path; do + ref="$(echo -n "${path}")" + +From 9f774b4dac5b1c1808c2a57b2cb7b7ed2dd2e308 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Feb 2022 12:02:32 +0100 +Subject: [PATCH] logging: fix for double stderr redirect during + `fakeroot_dpkg_deb_build` + +--- + lib/functions/logging/runners.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 2ea496cbe..8bd8845f1 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -51,7 +51,7 @@ function chroot_custom() { + # for deb building. + function fakeroot_dpkg_deb_build() { + display_alert "Building .deb package" "$(basename "${3:-${2:-${1}}}" || true)" "debug" +- run_host_command_logged_raw fakeroot dpkg-deb -b "-Z${DEB_COMPRESS}" "$@" 2>&1 ++ run_host_command_logged_raw fakeroot dpkg-deb -b "-Z${DEB_COMPRESS}" "$@" + } + + # for long-running, host-side expanded bash invocations. + +From 8164916306b8b4bc06cd8dca5f7d937d0bfee368 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Feb 2022 11:47:38 +0100 +Subject: [PATCH] logging: subdued "command" logging for debugging low level + cmd invocations ("frog") + +--- + lib/functions/compilation/kernel.sh | 2 -- + lib/functions/logging/logging.sh | 19 ++++++++++++------- + lib/functions/logging/runners.sh | 2 +- + 3 files changed, 13 insertions(+), 10 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 3bf77ae1b..e2232659d 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -24,8 +24,6 @@ function run_kernel_make() { + + # last statement, so it passes the result to calling function. + full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" make "$@" "${common_make_params_quoted[@]@Q}") +- display_alert "Kernel make" "${full_command[*]}" "debug" +- # echo "${full_command[@]}" >&2 # last-resort bash-quoting debugging + "${full_command[@]}" # and exit with it's code, since it's the last statement + } + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index bd19b8e10..368d0a8d6 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -6,6 +6,10 @@ function logging_init() { + export normal_color="\x1B[0m" gray_color="\e[1;30m" # "bright black", which is grey + declare -i logging_section_counter=0 # -i: integer + export logging_section_counter ++ export tool_color="${gray_color}" # default to gray... (should be ok on terminals) ++ if [[ "${CI}" == "true" ]]; then # ... but that is too dark for Github Actions ++ export tool_color="${normal_color}" ++ fi + } + + function logging_error_show_log() { +@@ -54,10 +58,6 @@ function do_with_logging() { + local exit_code=176 # fail by default... + if [[ "${SHOW_LOG}" == "yes" ]]; then + local prefix_sed_contents +- local tool_color="${gray_color}" # default to gray... (should be ok on terminals) +- if [[ "${CI}" == "true" ]]; then # ... but that is too dark for Github Actions +- tool_color="${normal_color}" +- fi + prefix_sed_contents="$(logging_echo_prefix_for_pv "tool") $(echo -n -e "${tool_color}")" + local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" + +@@ -123,17 +123,22 @@ function display_alert() { + ;; + + info) +- level_indicator="🌱" # "🌴" 🥑 ++ level_indicator="🌱" + inline_logs_color="\e[0;32m" + ;; + + debug | deprecation) +- level_indicator="✨" # "🌴" 🥑 ++ level_indicator="✨" + inline_logs_color="\e[1;33m" + ;; + ++ command) ++ level_indicator="🐸" ++ inline_logs_color="${tool_color}" # either gray or normal, a bit subdued. ++ ;; ++ + *) +- level_indicator="🌿" # "✨" 🌿 🪵 ++ level_indicator="🌿" + inline_logs_color="\e[1;37m" + ;; + esac +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index af60b1950..2ea496cbe 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -103,7 +103,7 @@ function run_host_command_logged_raw() { + echo " " >> "${CURRENT_LOGFILE}" # blank line for reader's benefit + echo "-->" "$*" " <- at $(date --utc)" >> "${CURRENT_LOGFILE}" + else +- display_alert "Running at host: " "$*" "debug" ++ display_alert "Command debug" "$*" "command" # A special 'command' level. + fi + + # uncomment when desperate to understand what's going on + +From b173dbe20aff3996a3ad8b32860d001336eaa34c Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Feb 2022 02:23:16 +0100 +Subject: [PATCH] armbian-next: when showing log, emit all host-side + invocations as `debug` too. + +--- + lib/functions/logging/runners.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index cdce6ead3..af60b1950 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -102,6 +102,8 @@ function run_host_command_logged_raw() { + if [[ -f "${CURRENT_LOGFILE}" ]]; then + echo " " >> "${CURRENT_LOGFILE}" # blank line for reader's benefit + echo "-->" "$*" " <- at $(date --utc)" >> "${CURRENT_LOGFILE}" ++ else ++ display_alert "Running at host: " "$*" "debug" + fi + + # uncomment when desperate to understand what's going on + +From 550e748f1a27d875cf9badfa85d6f1c251fa52aa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 16:49:58 +0100 +Subject: [PATCH] [WiP] trap handler abstraction, somewhat works! + +--- + compile.sh | 11 ++- + lib/extensions.sh | 33 +++++-- + lib/functions/cli/cli-entrypoint.sh | 48 ++++++---- + lib/functions/image/rootfs-to-image.sh | 6 +- + lib/functions/logging/errors.sh | 44 --------- + lib/functions/logging/logging.sh | 17 +--- + lib/functions/logging/stacktraces.sh | 2 +- + lib/functions/logging/traps.sh | 162 ++++++++++++++++++++++----------- + lib/functions/main/default-build.sh | 22 ++--- + lib/functions/main/rootfs-image.sh | 30 +++++- + lib/functions/rootfs/create-cache.sh | 4 +- + 11 files changed, 220 insertions(+), 159 deletions(-) + +diff --git a/compile.sh b/compile.sh +index 64fcfb4f1..fcd9046a0 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -44,8 +44,13 @@ fi + # shellcheck source=lib/single.sh + source "${SRC}"/lib/single.sh + +-# hook up the error handler early, we wanna see stack for all errors. +-trap 'main_error_monitor "$?"' ERR EXIT ++# initialize logging variables. ++logging_init + +-# And execute the main entrypoint. ++# initialize the traps ++traps_init ++ ++# Execute the main CLI entrypoint. + cli_entrypoint "$@" ++ ++echo "-- very last thing" 1>&2 +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 737656a38..9cbc4b78b 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -69,6 +69,9 @@ initialize_extension_manager() { + export EXTENSION_MANAGER_LOG_FILE="${EXTENSION_MANAGER_TMP_DIR}/extensions.log" + [[ "${WRITE_EXTENSIONS_METADATA:-yes}" == "no" ]] && echo -n "" > "${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt" + ++ # Add trap handler to cleanup and not leave garbage behind when exiting. ++ add_cleanup_handler cleanup_handler_extensions ++ + # globally initialize the extensions log. + echo "-- lib/extensions.sh included. logs will be below, followed by the debug generated by the initialize_extension_manager() function." > "${EXTENSION_MANAGER_LOG_FILE}" + +@@ -252,18 +255,32 @@ initialize_extension_manager() { + cleanup_extension_manager() { + if [[ -f "${fragment_manager_cleanup_file}" ]]; then + display_alert "Cleaning up" "extension manager" "info" +- # this will unset all the functions. + # shellcheck disable=SC1090 # dynamic source, thanks, shellcheck +- source "${fragment_manager_cleanup_file}" +- # file is removed together with EXTENSION_MANAGER_TMP_DIR below. ++ source "${fragment_manager_cleanup_file}" # this will unset all the functions. ++ rm -f "${fragment_manager_cleanup_file}" # also remove the file. ++ unset fragment_manager_cleanup_file # and unset the var. ++ fi ++ ++ # reset/unset the variables used ++ initialize_extension_manager_counter=0 ++ unset extension_function_info defined_hook_point_functions hook_point_function_trace_sources hook_point_function_trace_lines fragment_manager_cleanup_file ++} ++ ++function cleanup_handler_extensions() { ++ echo "-- yeah the extensions trap handler..." 1>&2 ++ cleanup_extension_manager ++ ++ # Move temporary log file over to final destination. ++ if [[ -f "${EXTENSION_MANAGER_LOG_FILE}" ]]; then ++ mv "${EXTENSION_MANAGER_LOG_FILE}" "${DEST}/${LOG_SUBPATH:-debug}/extensions.log" + fi ++ unset EXTENSION_MANAGER_LOG_FILE ++ + # cleanup our tmpdir. + if [[ -d "${EXTENSION_MANAGER_TMP_DIR}" ]]; then + rm -rf "${EXTENSION_MANAGER_TMP_DIR}" + fi +- # reset/unset the variables used +- initialize_extension_manager_counter=0 +- unset extension_function_info defined_hook_point_functions hook_point_function_trace_sources hook_point_function_trace_lines fragment_manager_cleanup_file ++ unset EXTENSION_MANAGER_TMP_DIR + } + + # why not eat our own dog food? +@@ -290,10 +307,6 @@ run_after_build__999_finish_extension_manager() { + - `${hook_point_function_trace_lines}` is the same, but BASH_LINENO info. + After this hook is done, the `${EXTENSION_MANAGER_TMP_DIR}` will be removed. + EXTENSION_METADATA_READY +- +- # Move temporary log file over to final destination, and start writing to it instead (although 999 is pretty late in the game) +- mv "${EXTENSION_MANAGER_LOG_FILE}" "${DEST}/${LOG_SUBPATH:-debug}/extensions.log" +- export EXTENSION_MANAGER_LOG_FILE="${DEST}/${LOG_SUBPATH:-debug}/extensions.log" + } + + # This is called by call_extension_method(). To say the truth, this should be in an extension. But then it gets too meta for anyone's head. +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 587348b01..d9da56acc 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -1,3 +1,23 @@ ++function bla_cleanup1() { ++ echo "-- bla cleanup1" 1>&2 ++} ++function bla_cleanup2() { ++ echo "-- bla cleanup2" 1>&2 ++} ++ ++function bla() { ++ display_alert "bla starting" "bla is here! PID: $$ - BASHPID: $BASHPID" "debug" ++ add_cleanup_handler bla_cleanup1 ++ add_cleanup_handler bla_cleanup2 ++ ++ #sleep 10 ++ #explode_here ++ #exit 66 # exit with error ++ exit_with_error "something" "wrong" ++ #exit 0 # exit without error ++} ++ ++ + function cli_entrypoint() { + if [[ "${ARMBIAN_ENABLE_CALL_TRACING}" == "yes" ]]; then + set -T # inherit return/debug traps +@@ -6,8 +26,6 @@ function cli_entrypoint() { + trap 'echo "${BASH_LINENO[@]}|${BASH_SOURCE[@]}|${FUNCNAME[@]}" >> ${SRC}/output/debug/calls.txt ;' RETURN + fi + +- logging_init # initialize logging. +- + check_args "$@" + do_update_src "$@" + +@@ -108,27 +126,23 @@ function cli_entrypoint() { + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + +- if [[ "${BUILD_ALL}" == "yes" || "${BUILD_ALL}" == "demo" ]]; then +- do_main_build_all_ng +- else +- # configuration etc - it initializes the extension manager. +- do_capturing_defs prepare_and_config_main_build_single # this sets CAPTURED_VARS +- +- if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then +- echo "${CAPTURED_VARS}" # to stdout! +- cleanup_extension_manager # manually cleanup extension manager before exiting +- return 0 +- else +- unset CAPTURED_VARS +- fi ++ # configuration etc - it initializes the extension manager. ++ do_capturing_defs prepare_and_config_main_build_single # this sets CAPTURED_VARS + ++ if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then ++ echo "${CAPTURED_VARS}" # to stdout! ++ else ++ unset CAPTURED_VARS + # Allow for custom user-invoked functions, or do the default build. + if [[ -z $1 ]]; then +- main_default_build_single # this cleans up the extension manager ++ main_default_build_single + else + # @TODO: check this with extensions usage? + eval "$@" + fi +- + fi ++ ++ # Build done, run the cleanup handlers explicitly. ++ # This zeroes out the list of cleanups, so it's not done again when the main script exits. ++ run_cleanup_handlers + } +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 898a7372b..77d61fc2c 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -78,7 +78,7 @@ create_image_from_sdcard_rootfs() { + Called before unmounting both `/root` and `/boot`. + PRE_UMOUNT_FINAL_IMAGE + +- # unmount /boot/efi first, then /boot, rootfs third, image file last ++ # unmount /boot/efi first, then /boot, rootfs third, image file last # @TODO: why using lazy unmount? + sync + [[ $UEFISIZE != 0 ]] && umount -l "${MOUNT}${UEFI_MOUNT_POINT}" + [[ $BOOTSIZE != 0 ]] && umount -l $MOUNT/boot +@@ -90,7 +90,7 @@ PRE_UMOUNT_FINAL_IMAGE + Called after unmounting both `/root` and `/boot`. + POST_UMOUNT_FINAL_IMAGE + +- # to make sure its unmounted ++ # to make sure its unmounted # @TODO: maybe use the recursive unmount we have now + while grep -Eq '(${MOUNT}|${DESTIMG})' /proc/mounts; do + display_alert "Wait for unmount" "${MOUNT}" "info" + sleep 5 +@@ -98,6 +98,8 @@ PRE_UMOUNT_FINAL_IMAGE + + display_alert "Freeing loop device" "${LOOP}" "wrn" + losetup -d "${LOOP}" ++ unset LOOP # unset so cleanup handler does not try it again ++ + # Don't delete $DESTIMG here, extensions might have put nice things there already. + rm -rf --one-file-system $MOUNT + +diff --git a/lib/functions/logging/errors.sh b/lib/functions/logging/errors.sh +index f3766399d..29263306c 100644 +--- a/lib/functions/logging/errors.sh ++++ b/lib/functions/logging/errors.sh +@@ -8,47 +8,3 @@ + + # This file is a part of the Armbian build script + # https://github.com/armbian/build/ +- +-# exit_with_error +-# +-# a way to terminate build process +-# with verbose error message +-# +- +-function exit_with_error() { +- local _file +- local _line=${BASH_LINENO[0]} +- local _function=${FUNCNAME[1]} +- local _description=$1 +- local _highlight=$2 +- _file=$(basename "${BASH_SOURCE[1]}") +- local stacktrace logfile +- stacktrace="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}" || true)" +- +- local logfile_to_show="${CURRENT_LOGFILE}" # store it +- unset CURRENT_LOGFILE # stop logging, otherwise crazy +- +- display_alert "ERROR in function $_function" "$stacktrace" "err" +- display_alert "$_description" "$_highlight" "err" +- +- # delegate to logging to make it pretty +- logging_error_show_log "$_description" "$_highlight" "${stacktrace}" "${logfile_to_show}" +- +- if [[ "${ERROR_DEBUG_SHELL}" == "yes" ]]; then +- display_alert "MOUNT" "${MOUNT}" "err" +- display_alert "SDCARD" "${SDCARD}" "err" +- display_alert "Here's a shell." "debug it" "err" +- bash < /dev/tty || true +- fi +- +- display_alert "Build terminating... wait for cleanups..." "" "err" +- +- overlayfs_wrapper "cleanup" +- # unlock loop device access in case of starvation # @TODO: hmm, say that again? +- exec {FD}> /var/lock/armbian-debootstrap-losetup +- flock -u "${FD}" +- +- export ALREADY_EXITING_WITH_ERROR=yes # marker for future trap handlers. avoid showing errors twice. +- exit 43 +- display_alert "Never to be seen" "after exit and traps" "bye" +-} +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 8c3bfa315..bd19b8e10 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -9,18 +9,13 @@ function logging_init() { + } + + function logging_error_show_log() { +- # Do nothing if we're already showing the log on stderr. +- [[ "${SHOW_LOG}" == "yes" ]] && return 0 +- +- # Close opened CI group, even if there is none; errors would be buried otherwise. +- if [[ "${CI}" == "true" ]]; then ++ local logfile_to_show="${CURRENT_LOGFILE}" # store current logfile in separate var ++ unset CURRENT_LOGFILE # stop logging, otherwise crazy ++ [[ "${SHOW_LOG}" == "yes" ]] && return 0 # Do nothing if we're already showing the log on stderr. ++ if [[ "${CI}" == "true" ]]; then # Close opened CI group, even if there is none; errors would be buried otherwise. + echo "::endgroup::" + fi + +- local message="$1" +- local stacktrace="$3" +- local logfile_to_show="$4" +- + if [[ -f "${logfile_to_show}" ]]; then + local prefix_sed_contents="${normal_color}${left_marker}${padding}👉${padding}${right_marker} " + local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" +@@ -28,10 +23,8 @@ function logging_error_show_log() { + # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. + cat "${logfile_to_show}" | grep -v -e "^$" | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! + display_alert " 👆👆👆 Showing logfile above 👆👆👆" "${logfile_to_show}" "err" +- display_alert "🦞 Error Msg" "$message" "err" +- display_alert "🐞 Error stacktrace" "$stacktrace" "err" + else +- display_alert "✋ Error Log not Available" "${logfile_to_show}" "err" ++ display_alert "✋ Error log not available at this stage of build" "check messages above" "debug" + fi + return 0 + } +diff --git a/lib/functions/logging/stacktraces.sh b/lib/functions/logging/stacktraces.sh +index 14e74171f..3ab2900ef 100644 +--- a/lib/functions/logging/stacktraces.sh ++++ b/lib/functions/logging/stacktraces.sh +@@ -37,7 +37,7 @@ function show_caller_full() { + while caller $i; do + ((i++)) + done | while read -r line_no function_name file_name; do +- local padded_function_name=$(printf "%30s" "$function_name") ++ local padded_function_name=$(printf "%30s" "$function_name()") + local short_file_name="${file_name/"${SRC}/"/"./"}" + echo -e "$padded_function_name --> $short_file_name:$line_no" + done +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index f403547c9..fb294e06e 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -1,65 +1,121 @@ +-# unmount_on_exit - used during rootfs building, to avoid leaving mounted stuff behind +-# +-unmount_on_exit() { +- set +e # we just wanna plow through this, ignoring errors. +- trap - INT TERM EXIT # remove the trap ++# Initialize and prepare the trap managers, one for each of ERR, INT, TERM and EXIT traps. ++# Bash goes insane regarding line numbers and other stuff if we try to overwrite the traps. ++# This also implements the custom "cleanup" handlers, which always run at the end of build, or when exiting prematurely for any reason. ++function traps_init() { ++ # shellcheck disable=SC2034 # Array of cleanup handlers. ++ declare -a trap_manager_cleanup_handlers=() ++ # shellcheck disable=SC2034 # Global to avoid doubly reporting ERR/EXIT pairs. ++ declare -a trap_manager_error_handled=0 ++ trap 'main_trap_handler "ERR" "$?"' ERR ++ trap 'main_trap_handler "EXIT" "$?"' EXIT ++ trap 'main_trap_handler "INT" "$?"' INT ++ trap 'main_trap_handler "TERM" "$?"' TERM ++} + +- local stack_here +- stack_here="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}" || true)" +- display_alert "trap caught, shutting down" "${stack_here}" "err" +- if [[ "${ERROR_DEBUG_SHELL}" == "yes" ]]; then +- ERROR_DEBUG_SHELL=no # dont do it twice +- display_alert "MOUNT" "${MOUNT}" "err" +- display_alert "SDCARD" "${SDCARD}" "err" +- display_alert "ERROR_DEBUG_SHELL=yes, starting a shell." "ERROR_DEBUG_SHELL" "err" +- bash < /dev/tty >&2 || true +- fi ++# This is setup early in compile.sh as a trap handler for ERR, EXIT and INT signals. ++# There are arrays trap_manager_error_handlers=() trap_manager_exit_handlers=() trap_manager_int_handlers=() ++# that will receive the actual handlers. ++# First param is the type of trap, the second is the value of "$?" ++# In order of occurrence. ++# 1) Ctrl-C causes INT [stack unreliable], then ERR, then EXIT with trap_exit_code > 0 ++# 2) Stuff failing causes ERR [stack OK], then EXIT with trap_exit_code > 0 ++# 3) exit_with_error causes EXIT [stack OK, with extra frame] directly with trap_exit_code == 43 ++# 4) EXIT can also be called directly [stack unreliable], with trap_exit_code == 0 if build successful. ++# So the EXIT trap will do: ++# - show stack, if not previously shown (trap_manager_error_handled==0), and if trap_exit_code > 0 ++# - allow for debug shell, if trap_exit_code > 0 ++# - call all the cleanup functions (always) ++function main_trap_handler() { ++ local trap_type="${1}" ++ local trap_exit_code="${2}" ++ local stack_caller short_stack ++ stack_caller="$(show_caller_full)" ++ short_stack="${BASH_SOURCE[1]}:${BASH_LINENO[0]}" + +- cd "${SRC}" || echo "Failed to cwd to ${SRC}" # Move pwd away, so unmounts work +- # those will loop until they're unmounted. +- umount_chroot_recursive "${SDCARD}/" +- umount_chroot_recursive "${MOUNT}/" ++ echo "-- main_trap_handler: ${trap_type} and ${trap_exit_code} trap_manager_error_handled:${trap_manager_error_handled} " 1>&2 + +- mountpoint -q "${SRC}"/cache/toolchain && umount -l "${SRC}"/cache/toolchain >&2 # @TODO: why does Igor uses lazy umounts? nfs? +- mountpoint -q "${SRC}"/cache/rootfs && umount -l "${SRC}"/cache/rootfs >&2 +- [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose "${ROOT_MAPPER}" >&2 ++ case "${trap_type}" in ++ TERM | INT) ++ display_alert "Build interrupted" "Build interrupted by SIG${trap_type}" "warn" ++ trap_manager_error_handled=1 ++ return # Nothing else to do here. Let the ERR trap show the stack, and the EXIT trap do cleanups. ++ ;; + +- # shellcheck disable=SC2153 # global var. also a local 'loop' in another function. sorry. +- if [[ -b "${LOOP}" ]]; then +- display_alert "Freeing loop" "unmount_on_exit ${LOOP}" "wrn" +- losetup -d "${LOOP}" >&2 +- fi ++ ERR) ++ logging_error_show_log ++ display_alert "Error occurred" "code ${trap_exit_code} at ${short_stack}\n${stack_caller}\n" "err" ++ trap_manager_error_handled=1 ++ return # Nothing else to do here, let the EXIT trap do the cleanups. ++ ;; + +- [[ -d "${SDCARD}" ]] && rm -rf --one-file-system "${SDCARD}" +- [[ -d "${MOUNT}" ]] && rm -rf --one-file-system "${MOUNT}" ++ EXIT) ++ if [[ ${trap_manager_error_handled} -lt 1 ]] && [[ ${trap_exit_code} -gt 0 ]]; then ++ logging_error_show_log ++ display_alert "Exit with error detected" "${trap_exit_code} at ${short_stack} -\n${stack_caller}\n" "err" ++ trap_manager_error_handled=1 ++ fi + +- # if we've been called by exit_with_error itself, don't recurse. +- if [[ "${ALREADY_EXITING_WITH_ERROR:-no}" != "yes" ]]; then +- exit_with_error "generic error during build_rootfs_image: ${stack_here}" || true # but don't trigger error again +- fi ++ if [[ ${trap_exit_code} -gt 0 ]] && [[ "${ERROR_DEBUG_SHELL}" == "yes" ]]; then ++ export ERROR_DEBUG_SHELL=no # dont do it twice ++ display_alert "MOUNT" "${MOUNT}" "debug" ++ display_alert "SDCARD" "${SDCARD}" "debug" ++ display_alert "ERROR_DEBUG_SHELL=yes, starting a shell." "ERROR_DEBUG_SHELL; exit to cleanup." "debug" ++ bash < /dev/tty >&2 || true ++ fi + +- return 49 # trap returns error. ++ # Run the cleanup handlers, always. ++ run_cleanup_handlers || true ++ ;; ++ esac + } + +-# added by main_default_build_single to show details about errors when they happen and exit. exit might trigger the above. +-function main_error_monitor() { +- if [[ "${ALREADY_EXITING_WITH_ERROR}" == "yes" ]]; then +- return 46 ++# Run the cleanup handlers, if any, and clean the cleanup list. ++function run_cleanup_handlers() { ++ echo "-- run_cleanup_handlers! list: ${trap_manager_cleanup_handlers[*]}" 1>&2 ++ if [[ ${#trap_manager_cleanup_handlers[@]} -lt 1 ]]; then ++ return 0 # No handlers set, just return. ++ else ++ display_alert "Cleaning up" "please wait for cleanups to finish" "debug" + fi +- local errcode="${1}" +- # If there's no error, do nothing. +- if [[ $errcode -eq 0 ]]; then +- return 0 +- fi +- local stack_caller="$(show_caller_full)" +- if [[ "${ALREADY_EXITING_WITH_ERROR}" != "yes" ]]; then # Don't do this is exit_with_error already did it. +- local logfile_to_show="${CURRENT_LOGFILE}" # store it +- unset CURRENT_LOGFILE # stop logging, otherwise crazy +- logging_error_show_log "main_error_monitor unknown error" "main_error_monitor unknown highlight" "${stack_caller}" "${logfile_to_show}" +- fi +- display_alert "main_error_monitor: error code ${errcode}" "\n${stack_caller}\n" "err" ++ # Loop over the handlers, execute one by one. Ignore errors. ++ local one_cleanup_handler ++ for one_cleanup_handler in "${trap_manager_cleanup_handlers[@]}"; do ++ display_alert "Running cleanup handler" "${one_cleanup_handler}" "debug" ++ "${one_cleanup_handler}" || true ++ done ++ # Clear the cleanup handler list, so they don't accidentally run again. ++ trap_manager_cleanup_handlers=() ++} ++ ++# Adds a callback for trap types; first argument is function name; extra params are the types to add for. ++function add_cleanup_handler() { ++ local callback="$1" ++ echo "-- Add callback ${callback} as cleanup handler" 1>&2 ++ trap_manager_cleanup_handlers+=("$callback") ++} ++ ++function remove_all_trap_handlers() { ++ echo "-- Will remove ALL trap handlers, for a clean exit..." 1>&2 ++} ++ ++# exit_with_error ++# a way to terminate build process with verbose error message ++function exit_with_error() { ++ # Log the error and exit. ++ # Everything else will be done by shared trap handling, above. ++ local _file="${BASH_SOURCE[1]}" ++ local _function=${FUNCNAME[1]} ++ local _line="${BASH_LINENO[0]}" ++ ++ display_alert "error: ${1}" "${2} in ${_function}() at ${_file}:${_line}" "err" ++ ++ # @TODO: move this into trap handler ++ # @TODO: integrate both overlayfs and the FD locking with cleanup logic ++ display_alert "Build terminating... wait for cleanups..." "" "err" ++ overlayfs_wrapper "cleanup" ++ # unlock loop device access in case of starvation # @TODO: hmm, say that again? ++ exec {FD}> /var/lock/armbian-debootstrap-losetup ++ flock -u "${FD}" + +- ALREADY_EXITING_WITH_ERROR=yes +- exit 45 +- return 44 ++ exit 43 + } +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 3e81d7cd5..7fc46c3d6 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -7,8 +7,9 @@ main_default_build_single() { + # 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}" +- # @todo: handle this in the exit trap, don't leave garbage behind when exiting. + + start=$(date +%s) + # Check and install dependencies, directory structure and settings +@@ -132,16 +133,6 @@ main_default_build_single() { + - *NOTE:* this will run only if there were no errors during build process. + RUN_AFTER_BUILD + +- # Cleanup. Remove the WORKDIR, unset the TMPDIR +- unset TMPDIR +- if [[ -d "${WORKDIR}" ]]; then +- display_alert "Cleaning up WORKDIR" "$(du -h -s "$WORKDIR")" "debug" +- rm -rf "${WORKDIR}" +- fi +- +- # cleanup the extension manager, that was initialized during prepare_and_config_main_build_single +- cleanup_extension_manager +- + end=$(date +%s) + runtime=$(((end - start) / 60)) + display_alert "Runtime" "$runtime min" "info" +@@ -163,3 +154,12 @@ main_default_build_single() { + display_alert "Repeat Build Options" "${repeat_args[*]}" "ext" # * = expand array, space delimited, single-word. + + } ++ ++function trap_handler_cleanup_workdir() { ++ echo "-- cleanup handler: Should cleanup $WORKDIR WORKDIR here" 1>&2 ++ unset TMPDIR ++ if [[ -d "${WORKDIR}" ]]; then ++ display_alert "Cleaning up WORKDIR" "$(du -h -s "$WORKDIR")" "debug" ++ rm -rf "${WORKDIR}" ++ fi ++} +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index e31c319fb..db8fe5b40 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -13,8 +13,8 @@ function build_rootfs_and_image() { + + [[ $ROOTFS_TYPE != ext4 ]] && display_alert "Assuming $BOARD $BRANCH kernel supports $ROOTFS_TYPE" "" "wrn" + +- # trap to unmount stuff in case of error/manual interruption +- trap unmount_on_exit INT TERM EXIT ++ # add handler to cleanup when done or if something fails or is interrupted. ++ add_cleanup_handler trap_handler_cleanup_rootfs_and_image + + # stage: clean and create directories + rm -rf $SDCARD $MOUNT +@@ -98,6 +98,28 @@ function build_rootfs_and_image() { + fi + rm -rf $SDCARD + +- # remove exit trap +- trap - INT TERM EXIT ++ # No need to remove the cleanup handler here, it's automatic. ++ return 0 ++} ++ ++function trap_handler_cleanup_rootfs_and_image() { ++ echo "-- trap_handler_cleanup_rootfs_and_image cleaning up..." 1>&2 ++ ++ cd "${SRC}" || echo "Failed to cwd to ${SRC}" # Move pwd away, so unmounts work ++ # those will loop until they're unmounted. ++ umount_chroot_recursive "${SDCARD}/" || true ++ umount_chroot_recursive "${MOUNT}/" || true ++ ++ mountpoint -q "${SRC}"/cache/toolchain && umount -l "${SRC}"/cache/toolchain >&2 # @TODO: why does Igor uses lazy umounts? nfs? ++ mountpoint -q "${SRC}"/cache/rootfs && umount -l "${SRC}"/cache/rootfs >&2 ++ [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose "${ROOT_MAPPER}" >&2 ++ ++ # shellcheck disable=SC2153 # global var. ++ if [[ -b "${LOOP}" ]]; then ++ display_alert "Freeing loop" "trap_handler_cleanup_rootfs_and_image ${LOOP}" "wrn" ++ losetup -d "${LOOP}" >&2 || true ++ fi ++ ++ [[ -d "${SDCARD}" ]] && rm -rf --one-file-system "${SDCARD}" ++ [[ -d "${MOUNT}" ]] && rm -rf --one-file-system "${MOUNT}" + } +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index acadbf6e3..eec9f2fa3 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -61,7 +61,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + umount --lazy "$SDCARD" + rm -rf $SDCARD + # remove exit trap +- trap - INT TERM EXIT ++ remove_all_trap_handlers INT TERM EXIT + exit + fi + +@@ -87,7 +87,7 @@ get_or_create_rootfs_cache_chroot_sdcard() { + umount --lazy "$SDCARD" + rm -rf $SDCARD + # remove exit trap +- trap - INT TERM EXIT ++ remove_all_trap_handlers INT TERM EXIT + exit + fi + + +From 7f06253437a0ae20d4570e09e8babe3302bb8350 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 16 Feb 2022 00:01:54 +0100 +Subject: [PATCH] armbian-next: manual merge (10) of all lib/*.sh changes + between revisions a4ae3a22703a66f1e383a193d74655533ff96c3a and + 3305d45b8175dbdd647dc1dc53fa6f0a522920c7 - but NOT the git unshallow stuff, + that will be rewritten + +--- + config/sources/families/bcm2711.conf | 9 ++++++++- + config/sources/families/include/uefi_common.inc | 14 ++++++++++--- + lib/functions/configuration/main-config.sh | 5 +---- + lib/functions/image/partitioning.sh | 27 +++++++------------------ + packages/armbian/builddeb | 9 --------- + 5 files changed, 27 insertions(+), 37 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 2198c490c..0dc25fc3f 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -57,7 +57,14 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + Kernel-Flavors: any + EOD + +- ## DTB compatibility has been moved to symlink done in packages/armbian/builddeb ++ ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. ++ local oneDTB dtbBase ++ for oneDTB in "${MOUNT}"/boot/dtb/broadcom/*.dtb; do ++ dtbBase=$(basename "${oneDTB}") ++ cp "${MOUNT}"/boot/dtb/broadcom/"${dtbBase}" "${MOUNT}"/etc/flash-kernel/dtbs/"${dtbBase}" ++ done ++ ++ rm -rf "${MOUNT}"/boot/dtb* || true + + # @TODO: rpardini: packaging could maybe already use the correct names? I can't figure out how. + ln -s ./Image "${MOUNT}"/boot/vmlinuz +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index 907e55ad1..7d6c97e0a 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -3,19 +3,27 @@ export SERIALCON="tty1" # Cant reasonably expect UEFI s + export SKIP_BOOTSPLASH="yes" # No splash. + export UEFI_GRUB_TIMEOUT=${UEFI_GRUB_TIMEOUT:-3} # Default 3-seconds timeout for GRUB menu. + export BOARD_FIRMWARE_INSTALL="-full" # Install full firmware for UEFI boards +-export DISTRO_GENERIC_KERNEL=no # no, build from source; yes: use distro + case "${BRANCH}" in + +- current | ddk) ++ legacy | ddk) + # This will force `unset KERNELSOURCE` later; no kernel will be built. + # Instead, the distro's default linux-generic kernel will be installed. + export DISTRO_GENERIC_KERNEL=yes + ;; + +- edge) ++ current) ++ export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" + export KERNELBRANCH="branch:linux-5.15.y" + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. + export KERNELDIR="linux-uefi-${LINUXFAMILY}" # Avoid sharing a source tree with others, until we know it's safe. + ;; ++ ++ edge) ++ export DISTRO_GENERIC_KERNEL=no ++ export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" ++ export KERNELBRANCH="branch:linux-5.16.y" ++ export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. ++ export KERNELDIR="linux-uefi-${LINUXFAMILY}" # Avoid sharing a source tree with others, until we know it's safe. ++ ;; + esac +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 06eb888fd..25dd263a5 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -151,14 +151,11 @@ function do_main_configuration() { + + case $GITHUB_MIRROR in + fastgit) +- GITHUB_SOURCE='https://hub.fastgit.org/' ++ GITHUB_SOURCE='https://hub.fastgit.xyz/' + ;; + gitclone) + GITHUB_SOURCE='https://gitclone.com/github.com/' + ;; +- cnpmjs) +- GITHUB_SOURCE='https://github.com.cnpmjs.org/' +- ;; + *) + GITHUB_SOURCE='https://github.com/' + ;; +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 0e075132a..2387f37e0 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -134,26 +134,13 @@ prepare_partitions() { + fi + else + local imagesize=$(($rootfs_size + $OFFSET + $BOOTSIZE + $UEFISIZE + $EXTRA_ROOTFS_MIB_SIZE)) # MiB +- case $ROOTFS_TYPE in +- btrfs) +- # Used for server images, currently no swap functionality, so disk space +- if [[ $BTRFS_COMPRESSION == none ]]; then +- local sdsize=$(bc -l <<< "scale=0; (($imagesize * 1.25) / 4 + 1) * 4") +- else +- # requirements are rather low since rootfs gets filled with compress-force=zlib +- local sdsize=$(bc -l <<< "scale=0; (($imagesize * 0.8) / 4 + 1) * 4") +- fi +- ;; +- *) +- # Hardcoded overhead +25% is needed for desktop images, +- # for CLI it could be lower. Align the size up to 4MiB +- if [[ $BUILD_DESKTOP == yes ]]; then +- local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.30) / 1 + 0) / 4 + 1) * 4") +- else +- local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.25) / 1 + 0) / 4 + 1) * 4") +- fi +- ;; +- esac ++ # Hardcoded overhead +25% is needed for desktop images, ++ # for CLI it could be lower. Align the size up to 4MiB ++ if [[ $BUILD_DESKTOP == yes ]]; then ++ local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.30) / 1 + 0) / 4 + 1) * 4") ++ else ++ local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.25) / 1 + 0) / 4 + 1) * 4") ++ fi + fi + + # stage: create blank image +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +index 0209f3528..0163d401a 100755 +--- a/packages/armbian/builddeb ++++ b/packages/armbian/builddeb +@@ -74,23 +74,14 @@ create_package() { + exit 0 + EOT + +- # for Ubuntu/Debian compatiblity, copy DTBs to /lib/firmware/$version/device-tree + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /boot + ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb +- mkdir -p /lib/firmware/$version +- rm -rf /lib/firmware/$version/device-tree +- cp -rp /boot/dtb-$version /lib/firmware/$version/device-tree + exit 0 + EOT + +- cat >> $pdir/DEBIAN/postrm <<- EOT +- rm -rf /lib/firmware/$version +- EOT +- + chmod 775 $pdir/DEBIAN/preinst + chmod 775 $pdir/DEBIAN/postinst +- chmod 775 $pdir/DEBIAN/postrm + fi + + # Create postinst prerm script for headers + +From dcbc1fa8d159e9a7423e82c5bc81b223c20dfbc1 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 14:35:36 +0100 +Subject: [PATCH] armbian-next: trapmanager pt1, identifying spots for trap + manager intervention + +--- + lib/functions/bsp/bsp-cli.sh | 2 +- + lib/functions/bsp/bsp-desktop.sh | 4 ++-- + lib/functions/compilation/atf.sh | 2 +- + lib/functions/compilation/debs.sh | 6 +++--- + lib/functions/compilation/kernel.sh | 2 +- + lib/functions/compilation/uboot.sh | 2 +- + 6 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index a4e6db654..ee557963c 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -1,7 +1,7 @@ + create_board_package() { + display_alert "Creating board support package for CLI" "$CHOSEN_ROOTFS" "info" + +- bsptempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ bsptempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + chmod 700 ${bsptempdir} + + local destination=${bsptempdir}/${BSP_CLI_PACKAGE_FULLNAME} +diff --git a/lib/functions/bsp/bsp-desktop.sh b/lib/functions/bsp/bsp-desktop.sh +index 7ccba50c2..54259fc4a 100644 +--- a/lib/functions/bsp/bsp-desktop.sh ++++ b/lib/functions/bsp/bsp-desktop.sh +@@ -32,7 +32,7 @@ create_desktop_package() { + PACKAGE_LIST_PREDEPENDS=${PACKAGE_LIST_PREDEPENDS//[[:space:]]/} + + local destination tmp_dir +- tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + destination=${tmp_dir}/${BOARD}/${CHOSEN_DESKTOP}_${REVISION}_all + rm -rf "${destination}" + mkdir -p "${destination}"/DEBIAN +@@ -97,7 +97,7 @@ create_bsp_desktop_package() { + local package_name="${BSP_DESKTOP_PACKAGE_FULLNAME}" + + local destination tmp_dir +- tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + destination=${tmp_dir}/${BOARD}/${BSP_DESKTOP_PACKAGE_FULLNAME} + rm -rf "${destination}" + mkdir -p "${destination}"/DEBIAN +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index 857c1744f..f5e9aa691 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -57,7 +57,7 @@ compile_atf() { + + [[ $(type -t atf_custom_postprocess) == function ]] && atf_custom_postprocess 2>&1 + +- atftempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ atftempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + chmod 700 ${atftempdir} + + # copy files to temp directory +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index f491715a3..b00d12c60 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -3,7 +3,7 @@ compile_firmware() { + + local firmwaretempdir plugin_dir + +- firmwaretempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ firmwaretempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + chmod 700 ${firmwaretempdir} + + plugin_dir="armbian-firmware${FULL}" +@@ -50,7 +50,7 @@ compile_firmware() { + compile_armbian-zsh() { + + local tmp_dir armbian_zsh_dir +- tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + chmod 700 ${tmp_dir} + + armbian_zsh_dir=armbian-zsh_${REVISION}_all +@@ -124,7 +124,7 @@ compile_armbian-zsh() { + compile_armbian-config() { + + local tmp_dir armbian_config_dir +- tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + chmod 700 ${tmp_dir} + + armbian_config_dir=armbian-config_${REVISION}_all +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 306fbb839..3bf77ae1b 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -245,7 +245,7 @@ function compile_kernel() { + create_linux-source_package() { + ts=$(date +%s) + local sources_pkg_dir tmp_src_dir +- tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + + sources_pkg_dir=${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all + mkdir -p "${sources_pkg_dir}"/usr/src/ \ +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 051dbfdb7..d2d6447a2 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -142,7 +142,7 @@ compile_uboot() { + local uboot_name="${CHOSEN_UBOOT}_${REVISION}_${ARCH}" + + # create directory structure for the .deb package +- uboottempdir="$(mktemp -d)" # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ uboottempdir="$(mktemp -d)" # subject to TMPDIR/WORKDIR, so is protected by single/common error trapmanager to clean-up. + chmod 700 "${uboottempdir}" + mkdir -p "$uboottempdir/$uboot_name/usr/lib/u-boot" "$uboottempdir/$uboot_name/usr/lib/$uboot_name" "$uboottempdir/$uboot_name/DEBIAN" + + +From d2c3f332f9e9a04ff68d2bf1e694a223999e3304 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 13:42:44 +0100 +Subject: [PATCH] armbian-next: `install_pkg_deb` -> + `install_host_side_packages` which is completely rewritten version + +- much simplified; compare installed packages vs wanted, and only update if some missing +--- + lib/functions/general/host.sh | 141 ++++++++------------------------------- + lib/functions/logging/runners.sh | 14 +++- + 2 files changed, 40 insertions(+), 115 deletions(-) + +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 2f24d4826..34f17a38e 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -157,9 +157,8 @@ prepare_host() { + # don't prompt for apt cacher selection + sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections + +- LOG_OUTPUT_FILE="${DEST}"/${LOG_SUBPATH}/hostdeps.log +- install_pkg_deb "$hostdeps" +- unset LOG_OUTPUT_FILE ++ # This handles the wanted list in $hostdeps, updates apt only if needed ++ install_host_side_packages "$hostdeps" + + update-ccache-symlinks + +@@ -308,119 +307,33 @@ function fetch_and_build_host_tools() { + + } + +-# Installing debian packages in the armbian build system. +-# The function accepts four optional parameters: +-# autoupdate - If the installation list is not empty then update first. +-# upgrade, clean - the same name for apt +-# verbose - detailed log for the function +-# +-# list="pkg1 pkg2 pkg3 pkgbadname pkg-1.0 | pkg-2.0 pkg5 (>= 9)" +-# install_pkg_deb upgrade verbose $list +-# or +-# install_pkg_deb autoupdate $list +-# +-# If the package has a bad name, we will see it in the log file. +-# If there is an LOG_OUTPUT_FILE variable and it has a value as +-# the full real path to the log file, then all the information will be there. +-# +-# The LOG_OUTPUT_FILE variable must be defined in the calling function +-# before calling the install_pkg_deb function and unset after. +-# +-install_pkg_deb() { +- local list="" +- local log_file +- local for_install +- local need_autoup=false +- local need_upgrade=false +- local need_clean=false +- local need_verbose=false +- local _line=${BASH_LINENO[0]} +- local _function=${FUNCNAME[1]} +- local _file=$(basename "${BASH_SOURCE[1]}") +- local tmp_file=$(mktemp /tmp/install_log_XXXXX) # @TODO: rpardini: hmm. why? lets use TMPDIR just like everyone else. +- export DEBIAN_FRONTEND=noninteractive +- +- list=$( +- for p in $*; do +- case $p in +- autoupdate) +- need_autoup=true +- continue +- ;; +- upgrade) +- need_upgrade=true +- continue +- ;; +- clean) +- need_clean=true +- continue +- ;; +- verbose) +- need_verbose=true +- continue +- ;; +- \| | \(* | *\)) continue ;; +- esac +- echo " $p" +- done +- ) +- +- if [ -d $(dirname $LOG_OUTPUT_FILE) ]; then +- log_file=${LOG_OUTPUT_FILE} +- else +- log_file="${SRC}/output/${LOG_SUBPATH}/install.log" +- fi +- +- # This is necessary first when there is no apt cache. +- if $need_upgrade; then +- apt-get -q update || echo "apt cannot update" >> $tmp_file +- apt-get -y upgrade || echo "apt cannot upgrade" >> $tmp_file +- fi +- +- # If the package is not installed, check the latest +- # up-to-date version in the apt cache. +- # Exclude bad package names and send a message to the log. +- for_install=$( +- for p in $list; do +- if $(dpkg-query -W -f '${db:Status-Abbrev}' $p |& awk '/ii/{exit 1}'); then +- apt-cache show $p -o APT::Cache::AllVersions=no |& +- awk -v p=$p -v tmp_file=$tmp_file \ +- '/^Package:/{print $2} /^E:/{print "Bad package name: ",p >>tmp_file}' +- fi +- done +- ) +- +- # This information should be logged. +- if [ -s $tmp_file ]; then +- echo -e "\nInstalling packages in function: $_function" "[$_file:$_line]" \ +- >> $log_file +- echo -e "\nIncoming list:" >> $log_file +- printf "%-30s %-30s %-30s %-30s\n" $list >> $log_file +- echo "" >> $log_file +- cat $tmp_file >> $log_file +- fi +- +- if [ -n "$for_install" ]; then +- if $need_autoup; then +- apt-get -q update +- apt-get -y upgrade ++# Install the whitespace-delimited packages listed in the first parameter, in the host (not chroot). ++# It handles correctly the case where all wanted packages are already installed, and in that case does nothing. ++# If packages are to be installed, it does an apt-get update first. ++function install_host_side_packages() { ++ declare wanted_packages_string ++ declare -a currently_installed_packages missing_packages ++ wanted_packages_string=${*} ++ missing_packages=() ++ # shellcheck disable=SC2207 # I wanna split, thanks. ++ currently_installed_packages=($(dpkg-query --show --showformat='${Package} ')) ++ for PKG_TO_INSTALL in ${wanted_packages_string}; do ++ # shellcheck disable=SC2076 # I wanna match literally, thanks. ++ if [[ ! " ${currently_installed_packages[*]} " =~ " ${PKG_TO_INSTALL} " ]]; then ++ display_alert "Should install package" "${PKG_TO_INSTALL}" ++ missing_packages+=("${PKG_TO_INSTALL}") + fi +- apt-get install -qq -y --no-install-recommends $for_install +- echo -e "\nPackages installed:" >> $log_file +- dpkg-query -W \ +- -f '${binary:Package;-27} ${Version;-23}\n' \ +- $for_install >> $log_file +- +- fi ++ done + +- # We will show the status after installation all listed +- if $need_verbose; then +- echo -e "\nstatus after installation:" >> $log_file +- dpkg-query -W \ +- -f '${binary:Package;-27} ${Version;-23} [ ${Status} ]\n' \ +- $list >> $log_file ++ if [[ ${#missing_packages[@]} -gt 0 ]]; then ++ display_alert "Updating apt host-side for installing packages" "${#missing_packages[@]} packages" "info" ++ host_apt_get update ++ display_alert "Installing host-side packages" "${missing_packages[*]}" "info" ++ host_apt_get_install "${missing_packages[@]}" ++ else ++ display_alert "All host-side dependencies/packages already installed." "Skipping host-hide install" "debug" + fi + +- if $need_clean; then apt-get clean; fi +- rm $tmp_file ++ unset currently_installed_packages ++ return 0 + } +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 66bd54015..cdce6ead3 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -8,8 +8,8 @@ function chroot_sdcard_apt_get() { + [[ $NO_APT_CACHER != yes ]] && apt_params+=( + -o "Acquire::http::Proxy=\"http://${APT_PROXY_ADDR:-localhost:3142}\"" + -o "Acquire::http::Proxy::localhost=\"DIRECT\"" +- -o "Dpkg::Use-Pty=0" # Please be quiet + ) ++ apt_params+=(-o "Dpkg::Use-Pty=0") # Please be quiet + # IMPORTANT: this function returns the exit code of last statement, in this case chroot (which gets its result from bash which calls apt-get) + chroot_sdcard DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" + } +@@ -74,6 +74,18 @@ function run_host_command_logged_long_running() { + run_host_command_logged_raw /bin/bash -e -c "$*" + } + ++# For installing packages host-side. Not chroot! ++function host_apt_get_install() { ++ host_apt_get --no-install-recommends install "$@" ++} ++ ++# For running apt-get stuff host-side. Not chroot! ++function host_apt_get() { ++ local -a apt_params=("-${APT_OPTS:-y}") ++ apt_params+=(-o "Dpkg::Use-Pty=0") # Please be quiet ++ run_host_command_logged DEBIAN_FRONTEND=noninteractive apt-get "${apt_params[@]}" "$@" ++} ++ + # run_host_command_logged is the very basic, should be used for everything, but, please use helpers above, this is very low-level. + function run_host_command_logged() { + run_host_command_logged_raw /bin/bash -e -c "$*" + +From 3b2d026b59d86cd463119876a9b69b02fd6ecf45 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 13:27:31 +0100 +Subject: [PATCH] armbian-next: force u-boot and kernel's gcc to output colors + to make easy to spot warnings and errors + +--- + lib/functions/compilation/kernel.sh | 4 +--- + lib/functions/compilation/uboot.sh | 4 ++-- + 2 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index e10c5af72..306fbb839 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -20,9 +20,7 @@ function run_kernel_make() { + "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. + ) + +- #if [[ "${SHOW_LOG}" == "yes" ]]; then +- common_make_params_quoted+=("KCFLAGS=-fdiagnostics-color=always") # Force GCC colored messages. +- #fi ++ common_make_params_quoted+=("KCFLAGS=-fdiagnostics-color=always") # Force GCC colored messages. + + # last statement, so it passes the result to calling function. + full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" make "$@" "${common_make_params_quoted[@]@Q}") +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index ca56fbfa1..051dbfdb7 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -32,7 +32,7 @@ function compile_uboot_target() { + display_alert "${uboot_prefix}Preparing u-boot config" "${version} ${target_make}" "info" + export MSG_IF_ERROR="${uboot_prefix}Failed to configure u-boot ${version} $BOOTCONFIG ${target_make}" + run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ +- make "$CTHREADS" "$BOOTCONFIG" "CROSS_COMPILE=\"$CCACHE $UBOOT_COMPILER\"" ++ make "$CTHREADS" "$BOOTCONFIG" "CROSS_COMPILE=\"$CCACHE $UBOOT_COMPILER\"" "KCFLAGS=-fdiagnostics-color=always" + + # armbian specifics u-boot settings + [[ -f .config ]] && sed -i 's/CONFIG_LOCALVERSION=""/CONFIG_LOCALVERSION="-armbian"/g' .config +@@ -66,7 +66,7 @@ function compile_uboot_target() { + + display_alert "${uboot_prefix}Compiling u-boot" "${version} ${target_make}" "info" + export MSG_IF_ERROR="${uboot_prefix}Failed to build u-boot ${version} ${target_make}" +- run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" make "$target_make" "$CTHREADS" "${cross_compile}" ++ run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" make "$target_make" "$CTHREADS" "${cross_compile}" "KCFLAGS=-fdiagnostics-color=always" + + if [[ $(type -t uboot_custom_postprocess) == function ]]; then + display_alert "${uboot_prefix}Postprocessing u-boot" "${version} ${target_make}" + +From fb4be3fa4a0d19043ee8d7ff1304ec3ccdf618cb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 13:23:51 +0100 +Subject: [PATCH] docker: pass the `CI` env var through Docker invocation, for + GitHub Actions + +--- + config/templates/config-docker.conf | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/config/templates/config-docker.conf b/config/templates/config-docker.conf +index 54f655b59..0a59dfb28 100644 +--- a/config/templates/config-docker.conf ++++ b/config/templates/config-docker.conf +@@ -90,6 +90,9 @@ DOCKER_FLAGS+=(-v=${SRC}/cache:/root/armbian/cache -v=armbian-ccache:/root/.ccac + + DOCKER_FLAGS+=(-e COLUMNS="`tput cols`" -e LINES="`tput lines`") + ++# Pass the "CI" env variable that comes from Github Actions. ++DOCKER_FLAGS+=(-e CI="${CI}") ++ + # pass other command line arguments like KERNEL_ONLY=yes, KERNEL_CONFIGURE=yes, etc. + # pass "docker-guest" as an additional config name that will be sourced in the container if exists + if [[ $SHELL_ONLY == yes ]]; then + +From 3db36a4fd3e6ad8c1b2d47d88d664936274bb875 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 13:23:09 +0100 +Subject: [PATCH] armbian-next: avoid warning if "file" utility not installed + +- should not happen, but better safe than sorry +--- + lib/functions/logging/runners.sh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 01bc1c8cd..66bd54015 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -121,9 +121,12 @@ run_on_sdcard() { + # Determine if we're building on non-amd64, and if so, which qemu binary to use. + function run_host_x86_binary_logged() { + local -a qemu_invocation target_bin_arch +- target_bin_arch="$(file -b "$1" | cut -d "," -f 1,2 | xargs echo -n)" # obtain the ELF name from the binary using 'file' +- qemu_invocation=("$@") # Default to calling directly, without qemu. +- if [[ "$(uname -m)" != "x86_64" ]]; then # If we're NOT on x86... ++ target_bin_arch="unknown - file util missing" ++ if [[ -f /usr/bin/file ]]; then ++ target_bin_arch="$(file -b "$1" | cut -d "," -f 1,2 | xargs echo -n)" # obtain the ELF name from the binary using 'file' ++ fi ++ qemu_invocation=("$@") # Default to calling directly, without qemu. ++ if [[ "$(uname -m)" != "x86_64" ]]; then # If we're NOT on x86... + if [[ -f /usr/bin/qemu-x86_64-static ]]; then + display_alert "Using qemu-x86_64-static for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" + qemu_invocation=("/usr/bin/qemu-x86_64-static" "-L" "/usr/x86_64-linux-gnu" "$@") + +From d986cbc68bc926d9dc8fca44cbe9b5a19d6a88b6 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 13:22:33 +0100 +Subject: [PATCH] armbian-next: disable long_running `pv` progress bar for + custom case too + +- will rework later, for now pipe causes subshell and caos +--- + lib/functions/logging/runners.sh | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 9cf069834..01bc1c8cd 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -27,15 +27,19 @@ function chroot_sdcard_with_stdout() { + function chroot_custom_long_running() { + local target=$1 + shift +- local _exit_code=1 +- if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then +- TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" +- _exit_code=$? +- else +- TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" +- _exit_code=$? +- fi +- return $_exit_code ++ ++ # @TODO: disabled, the pipe causes the left-hand side to subshell and caos ensues. ++ # local _exit_code=1 ++ # if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then ++ # TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++ # _exit_code=$? ++ # else ++ # TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" ++ # _exit_code=$? ++ # fi ++ # return $_exit_code ++ ++ TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" + } + + function chroot_custom() { + +From 7d49d5f6a72be78fa8afcd362fe7984e34d28614 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 13 Feb 2022 13:21:12 +0100 +Subject: [PATCH] armbian-next: if `CI=true` then `SHOW_LOG=yes` always + +--- + compile.sh | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/compile.sh b/compile.sh +index 3a5052989..64fcfb4f1 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -36,6 +36,11 @@ if [[ ! -f "${SRC}"/lib/single.sh ]]; then + exit 255 + fi + ++# Most CI runners, GitHub Actions included, pass env var "CI=true". In this case, force full logging. ++if [[ "${CI}" == "true" ]]; then ++ export SHOW_LOG=yes ++fi ++ + # shellcheck source=lib/single.sh + source "${SRC}"/lib/single.sh + + +From a803a9dbbb8b86301ca930214675c1365e9125a7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 23:18:05 +0100 +Subject: [PATCH] docker: add arm64 toolchain to Dockerfile; warn, but don't + break, on modprobe failure + +--- + config/templates/Dockerfile | 2 ++ + lib/functions/general/host.sh | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/config/templates/Dockerfile b/config/templates/Dockerfile +index 06f873cf1..9a56ca2e9 100644 +--- a/config/templates/Dockerfile ++++ b/config/templates/Dockerfile +@@ -53,6 +53,8 @@ RUN apt-get update \ + gcc-arm-linux-gnueabihf \ + gcc-arm-linux-gnueabi \ + gcc-arm-none-eabi \ ++ gcc-aarch64-linux-gnu \ ++ g++-aarch64-linux-gnu \ + gdisk \ + git \ + imagemagick \ +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 94409fafd..2f24d4826 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -244,7 +244,7 @@ prepare_host() { + + # enable arm binary format so that the cross-architecture chroot environment will work + if [[ $KERNEL_ONLY != yes ]]; then +- modprobe -q binfmt_misc ++ modprobe -q binfmt_misc || display_alert "Failed to modprobe" "binfmt_misc" "warn" + mountpoint -q /proc/sys/fs/binfmt_misc/ || mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc + if [[ "$(arch)" != "aarch64" ]]; then + test -e /proc/sys/fs/binfmt_misc/qemu-arm || update-binfmts --enable qemu-arm + +From aaed9afade2dda38d9e92a7054f3477801468760 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 21:52:01 +0100 +Subject: [PATCH] armbian-next: docker: use ubuntu:rolling, fix deps, use + `$SRC/cache` as container's cache dir + +--- + config/templates/Dockerfile | 7 ++----- + config/templates/config-docker.conf | 4 ++-- + 2 files changed, 4 insertions(+), 7 deletions(-) + +diff --git a/config/templates/Dockerfile b/config/templates/Dockerfile +index 3666170d1..06f873cf1 100644 +--- a/config/templates/Dockerfile ++++ b/config/templates/Dockerfile +@@ -1,7 +1,4 @@ +-ARG BASE_IMAGE=ubuntu:jammy +-FROM $BASE_IMAGE as armbian_builder +-ARG CUSTOM_PACKAGES='g++-11-arm-linux-gnueabihf libssl3' +-ENV CUSTOM_PACKAGES $CUSTOM_PACKAGES ++FROM ubuntu:rolling + ARG DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get -y dist-upgrade && apt-get -y install \ + joe \ +@@ -23,7 +20,6 @@ RUN sh -c " \ + RUN apt-get update \ + && apt-get -y dist-upgrade \ + && apt-get install -y --no-install-recommends \ +- $CUSTOM_PACKAGES \ + acl \ + aptly \ + aria2 \ +@@ -51,6 +47,7 @@ RUN apt-get update \ + fakeroot \ + fdisk \ + flex \ ++ g++-arm-linux-gnueabihf \ + gawk \ + gcc-aarch64-linux-gnu \ + gcc-arm-linux-gnueabihf \ +diff --git a/config/templates/config-docker.conf b/config/templates/config-docker.conf +index 60b9a22ac..54f655b59 100644 +--- a/config/templates/config-docker.conf ++++ b/config/templates/config-docker.conf +@@ -83,10 +83,10 @@ fi + #DOCKER_FLAGS+=(-v /dev/bus/usb:/dev/bus/usb:ro) + + # map source to Docker Working dir. +-DOCKER_FLAGS+=(-v=$SRC/:/root/armbian/) ++DOCKER_FLAGS+=(-v=${SRC}/:/root/armbian/) + + # mount 2 named volumes - for cacheable data and compiler cache +-DOCKER_FLAGS+=(-v=armbian-cache:/root/armbian/cache -v=armbian-ccache:/root/.ccache) ++DOCKER_FLAGS+=(-v=${SRC}/cache:/root/armbian/cache -v=armbian-ccache:/root/.ccache) + + DOCKER_FLAGS+=(-e COLUMNS="`tput cols`" -e LINES="`tput lines`") + + +From 6e52c4d1b50f4bff209d7536573329f7ea9e5e47 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 23:17:20 +0100 +Subject: [PATCH] armbian-next: logging fixes (padding, don't show error more + than once, don't remove trap) + +--- + lib/functions/logging/logging.sh | 1 - + lib/functions/logging/stacktraces.sh | 2 +- + lib/functions/logging/traps.sh | 4 +--- + 3 files changed, 2 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 65ad6db33..8c3bfa315 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -22,7 +22,6 @@ function logging_error_show_log() { + local logfile_to_show="$4" + + if [[ -f "${logfile_to_show}" ]]; then +- + local prefix_sed_contents="${normal_color}${left_marker}${padding}👉${padding}${right_marker} " + local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" + display_alert " 👇👇👇 Showing logfile below 👇👇👇" "${logfile_to_show}" "err" +diff --git a/lib/functions/logging/stacktraces.sh b/lib/functions/logging/stacktraces.sh +index a1c256bb5..14e74171f 100644 +--- a/lib/functions/logging/stacktraces.sh ++++ b/lib/functions/logging/stacktraces.sh +@@ -37,7 +37,7 @@ function show_caller_full() { + while caller $i; do + ((i++)) + done | while read -r line_no function_name file_name; do +- local padded_function_name=$(printf "%20s" "$function_name") ++ local padded_function_name=$(printf "%30s" "$function_name") + local short_file_name="${file_name/"${SRC}/"/"./"}" + echo -e "$padded_function_name --> $short_file_name:$line_no" + done +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index 7891db338..f403547c9 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -44,8 +44,7 @@ unmount_on_exit() { + # added by main_default_build_single to show details about errors when they happen and exit. exit might trigger the above. + function main_error_monitor() { + if [[ "${ALREADY_EXITING_WITH_ERROR}" == "yes" ]]; then +- display_alert "second run detected" "ERR trap" "err" +- #exit 46 ++ return 46 + fi + local errcode="${1}" + # If there's no error, do nothing. +@@ -61,7 +60,6 @@ function main_error_monitor() { + display_alert "main_error_monitor: error code ${errcode}" "\n${stack_caller}\n" "err" + + ALREADY_EXITING_WITH_ERROR=yes +- trap - EXIT # remove EXIT trap, we're gonna exit... + exit 45 + return 44 + } + +From 5022af1c97af824af73d6e79bee988a3bf3773d1 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 21:50:37 +0100 +Subject: [PATCH] armbian-next: fixes for early error handling and logging + +- split stacktrace-related functions into their own lib file +- simplify the traps +- some stacktrace formatting for readability +--- + compile.sh | 3 ++- + lib/extensions.sh | 45 ------------------------------------ + lib/functions/logging/stacktraces.sh | 45 ++++++++++++++++++++++++++++++++++++ + lib/functions/logging/traps.sh | 8 +++---- + lib/library-functions.sh | 10 ++++++++ + 5 files changed, 60 insertions(+), 51 deletions(-) + +diff --git a/compile.sh b/compile.sh +index 5e92ddefe..3a5052989 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -15,6 +15,7 @@ + + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -e + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + # Important, go read http://mywiki.wooledge.org/BashFAQ/105 NOW! +@@ -39,7 +40,7 @@ fi + source "${SRC}"/lib/single.sh + + # hook up the error handler early, we wanna see stack for all errors. +-trap 'main_error_monitor "$?" "$(show_caller_full)" "$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")"' ERR EXIT ++trap 'main_error_monitor "$?"' ERR EXIT + + # And execute the main entrypoint. + cli_entrypoint "$@" +diff --git a/lib/extensions.sh b/lib/extensions.sh +index c9f9cc9c4..737656a38 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -314,51 +314,6 @@ write_hook_point_metadata() { + echo "${main_hook_point_name}" >> "${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt" + } + +-# Helper function, to get clean "stack traces" that do not include the hook/extension infrastructure code. +-get_extension_hook_stracktrace() { +- local sources_str="$1" # Give this ${BASH_SOURCE[*]} - expanded +- local lines_str="$2" # And this # Give this ${BASH_LINENO[*]} - expanded +- local sources lines index final_stack="" +- IFS=' ' read -r -a sources <<< "${sources_str}" +- IFS=' ' read -r -a lines <<< "${lines_str}" +- for index in "${!sources[@]}"; do +- local source="${sources[index]}" line="${lines[((index - 1))]}" +- # skip extension infrastructure sources, these only pollute the trace and add no insight to users +- [[ ${source} == */.tmp/extension_function_definition.sh ]] && continue +- [[ ${source} == *lib/extensions.sh ]] && continue +- [[ ${source} == *lib/functions/logging.sh ]] && continue +- [[ ${source} == */compile.sh ]] && continue +- [[ ${line} -lt 1 ]] && continue +- # relativize the source, otherwise too long to display +- source="${source#"${SRC}/"}" +- # remove 'lib/'. hope this is not too confusing. +- source="${source#"lib/functions/"}" +- source="${source#"lib/"}" +- # add to the list +- # shellcheck disable=SC2015 # i know. thanks. I won't write an if here +- arrow="$([[ "$final_stack" != "" ]] && echo "-> " || true)" +- final_stack="${source}:${line} ${arrow} ${final_stack} " +- done +- # output the result, no newline +- # shellcheck disable=SC2086 # I wanna suppress double spacing, thanks +- echo -n $final_stack +-} +- +-show_caller_full() { +- { +- local i=0 +- local line_no +- local function_name +- local file_name +- echo "" # line break +- while caller $i; do +- ((i++)) +- done | while read -r line_no function_name file_name; do +- echo -e "\t$file_name:$line_no\tat\t$function_name" +- done +- } || true # always success +-} +- + # can be called by board, family, config or user to make sure an extension is included. + # single argument is the extension name. + # will look for it in /userpatches/extensions first. +diff --git a/lib/functions/logging/stacktraces.sh b/lib/functions/logging/stacktraces.sh +new file mode 100644 +index 000000000..a1c256bb5 +--- /dev/null ++++ b/lib/functions/logging/stacktraces.sh +@@ -0,0 +1,45 @@ ++# Helper function, to get clean "stack traces" that do not include the hook/extension infrastructure code. ++function get_extension_hook_stracktrace() { ++ local sources_str="$1" # Give this ${BASH_SOURCE[*]} - expanded ++ local lines_str="$2" # And this # Give this ${BASH_LINENO[*]} - expanded ++ local sources lines index final_stack="" ++ IFS=' ' read -r -a sources <<< "${sources_str}" ++ IFS=' ' read -r -a lines <<< "${lines_str}" ++ for index in "${!sources[@]}"; do ++ local source="${sources[index]}" line="${lines[((index - 1))]}" ++ # skip extension infrastructure sources, these only pollute the trace and add no insight to users ++ [[ ${source} == */extension_function_definition.sh ]] && continue ++ [[ ${source} == *lib/extensions.sh ]] && continue ++ [[ ${source} == *lib/functions/logging.sh ]] && continue ++ [[ ${source} == */compile.sh ]] && continue ++ [[ ${line} -lt 1 ]] && continue ++ # relativize the source, otherwise too long to display ++ source="${source#"${SRC}/"}" ++ # remove 'lib/'. hope this is not too confusing. ++ source="${source#"lib/functions/"}" ++ source="${source#"lib/"}" ++ # add to the list ++ # shellcheck disable=SC2015 # i know. thanks. I won't write an if here ++ arrow="$([[ "$final_stack" != "" ]] && echo "-> " || true)" ++ final_stack="${source}:${line} ${arrow} ${final_stack} " ++ done ++ # output the result, no newline ++ # shellcheck disable=SC2086 # I wanna suppress double spacing, thanks ++ echo -n $final_stack ++} ++ ++function show_caller_full() { ++ { ++ local i=1 # skip the first frame ++ local line_no ++ local function_name ++ local file_name ++ while caller $i; do ++ ((i++)) ++ done | while read -r line_no function_name file_name; do ++ local padded_function_name=$(printf "%20s" "$function_name") ++ local short_file_name="${file_name/"${SRC}/"/"./"}" ++ echo -e "$padded_function_name --> $short_file_name:$line_no" ++ done ++ } || true # always success ++} +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index faf9d8192..7891db338 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -47,23 +47,21 @@ function main_error_monitor() { + display_alert "second run detected" "ERR trap" "err" + #exit 46 + fi +- #trap - ERR # remove this trap + local errcode="${1}" + # If there's no error, do nothing. + if [[ $errcode -eq 0 ]]; then + return 0 + fi +- local stack_caller="${2}" +- local full_stack_caller="${3}" ++ local stack_caller="$(show_caller_full)" + if [[ "${ALREADY_EXITING_WITH_ERROR}" != "yes" ]]; then # Don't do this is exit_with_error already did it. + local logfile_to_show="${CURRENT_LOGFILE}" # store it + unset CURRENT_LOGFILE # stop logging, otherwise crazy + logging_error_show_log "main_error_monitor unknown error" "main_error_monitor unknown highlight" "${stack_caller}" "${logfile_to_show}" + fi +- display_alert "main_error_monitor: ${errcode}! stack:" "${stack_caller}" "err" +- display_alert "main_error_monitor: ${errcode}! full:" "${full_stack_caller}" "err" ++ display_alert "main_error_monitor: error code ${errcode}" "\n${stack_caller}\n" "err" + + ALREADY_EXITING_WITH_ERROR=yes ++ trap - EXIT # remove EXIT trap, we're gonna exit... + exit 45 + return 44 + } +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index f7a679dcc..00f05c37a 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -307,6 +307,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/logging/runners.sh + source "${SRC}"/lib/functions/logging/runners.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/logging/stacktraces.sh ++# shellcheck source=lib/functions/logging/stacktraces.sh ++source "${SRC}"/lib/functions/logging/stacktraces.sh ++ + # no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +@@ -424,6 +433,7 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/rootfs/rootfs-desktop.sh + source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh + ++ + # no errors tolerated. one last time for the win! + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + +From a94d0cf61be12647c9ce5ce05440b6fe44b53cb4 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 21:45:05 +0100 +Subject: [PATCH] armbian-next: fix: don't `trap` `ERR` twice, it causes bash + to go bananas regarding `caller` + +--- + lib/extensions.sh | 17 ----------------- + 1 file changed, 17 deletions(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 8b7ba183c..c9f9cc9c4 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -420,29 +420,12 @@ enable_extension() { + # store a list of existing functions at this point, before sourcing the extension. + before_function_list="$(compgen -A function)" + +- # error handling during a 'source' call is quite insane in bash after 4.3. +- # to be able to catch errors in sourced scripts the only way is to trap +- declare -i extension_source_generated_error=0 +- trap 'extension_source_generated_error=1;' ERR +- +- # source the file. extensions are not supposed to do anything except export variables and define functions, so nothing should happen here. +- # there is no way to enforce it though, short of static analysis. +- # we could punish the extension authors who violate it by removing some essential variables temporarily from the environment during this source, and restore them later. + # shellcheck disable=SC1090 + source "${extension_file}" + +- # remove the trap we set. +- trap - ERR +- + # decrement the recurse counter, so calls to this method are allowed again. + enable_extension_recurse_counter=$((enable_extension_recurse_counter - 1)) + +- # test if it fell into the trap, and abort immediately with an error. +- if [[ $extension_source_generated_error != 0 ]]; then +- display_alert "Extension failed to load" "${extension_file}" "err" +- exit 4 +- fi +- + # get a new list of functions after sourcing the extension + after_function_list="$(compgen -A function)" + + +From 54ce1b35ffac8eb5933a147b264352ac7ceb026a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 17:01:00 +0100 +Subject: [PATCH] armbian-next: `UPSTEM_VER` -> `UBOOT_REPO_VERSION` and + related fixes + +--- + lib/functions/image/loop.sh | 4 ++-- + lib/functions/image/rootfs-to-image.sh | 6 ++---- + lib/functions/multi/build-all.sh | 2 +- + lib/functions/rootfs/distro-agnostic.sh | 2 +- + 4 files changed, 6 insertions(+), 8 deletions(-) + +diff --git a/lib/functions/image/loop.sh b/lib/functions/image/loop.sh +index 296697b44..97ee1891e 100644 +--- a/lib/functions/image/loop.sh ++++ b/lib/functions/image/loop.sh +@@ -34,8 +34,8 @@ write_uboot_to_loop_image() { + TEMP_DIR=$(mktemp -d) # set-e is in effect. no need to exit on errors explicitly + chmod 700 ${TEMP_DIR} + revision=${REVISION} +- if [[ -n $UPSTREM_VER ]]; then +- revision=${UPSTREM_VER} ++ if [[ -n $UBOOT_REPO_VERSION ]]; then ++ revision=${UBOOT_REPO_VERSION} + dpkg -x "${DEB_STORAGE}/linux-u-boot-${BOARD}-${BRANCH}_${revision}_${ARCH}.deb" ${TEMP_DIR}/ 2>&1 + else + dpkg -x "${DEB_STORAGE}/${CHOSEN_UBOOT}_${revision}_${ARCH}.deb" ${TEMP_DIR}/ 2>&1 +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index b39ab161a..898a7372b 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -66,10 +66,8 @@ create_image_from_sdcard_rootfs() { + + # stage: write u-boot, unless the deb is not there, which would happen if BOOTCONFIG=none + # exception: if we use the one from repository, install version which was downloaded from repo +- if [[ -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]]; then +- write_uboot $LOOP +- elif [[ "${UPSTREM_VER}" ]]; then +- write_uboot $LOOP ++ if [[ -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]] || [[ -n $UBOOT_REPO_VERSION ]]; then ++ write_uboot_to_loop_image $LOOP + fi + + # fix wrong / permissions +diff --git a/lib/functions/multi/build-all.sh b/lib/functions/multi/build-all.sh +index 5f33ecffa..5f8496157 100644 +--- a/lib/functions/multi/build-all.sh ++++ b/lib/functions/multi/build-all.sh +@@ -103,7 +103,7 @@ unset_all() { + REPOSITORY_UPDATE PACKAGE_LIST_RELEASE LOCAL_MIRROR COMPILE_ATF PACKAGE_LIST_BOARD PACKAGE_LIST_FAMILY PACKAGE_LIST_DESKTOP_BOARD \ + PACKAGE_LIST_DESKTOP_FAMILY ATF_COMPILE ATFPATCHDIR OFFSET BOOTSOURCEDIR KERNEL_VERSION_LEVEL KERNELSOURCENAME \ + BOOT_SOC DDR_BLOB MINILOADER_BLOB BL31_BLOB BOOT_SCENARIO BOOT_SUPPORT_SPI OFFLINE_WORK VAR_SHALLOW_ORIGINAL KERNELSWITCHOBJ \ +- IMAGE_PARTITION_TABLE BOOT_LOGO UPSTREM_VER FORCED_MONTH_OFFSET PACKAGE_LIST_BOARD_REMOVE PACKAGE_LIST_FAMILY_REMOVE PACKAGE_LIST_DESKTOP \ ++ IMAGE_PARTITION_TABLE BOOT_LOGO UBOOT_REPO_VERSION FORCED_MONTH_OFFSET PACKAGE_LIST_BOARD_REMOVE PACKAGE_LIST_FAMILY_REMOVE PACKAGE_LIST_DESKTOP \ + PACKAGE_LIST_DESKTOP_BOARD_REMOVE PACKAGE_LIST_DESKTOP_FAMILY_REMOVE BOOTCONFIG_EDGE DESKTOP_ENVIRONMENT DESKTOP_ENVIRONMENT_CONFIG_NAME \ + DESKTOP_APPGROUPS_SELECTED DESKTOP_APT_FLAGS_SELECTED DESKTOP_ENVIRONMENT_DIRPATH DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH UBOOT_TARGET_MAP \ + DESKTOP_ENVIRONMENT_DIRPATH DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH DESKTOP_CONFIG_PREFIX DESKTOP_CONFIGS_DIR DESKTOP_APPGROUPS_DIR \ +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 31d7f4c62..7732a5b80 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -283,7 +283,7 @@ install_distribution_agnostic() { + install_deb_chroot "${DEB_STORAGE}/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb" + else + install_deb_chroot "linux-u-boot-${BOARD}-${BRANCH}" "remote" "yes" +- UPSTREM_VER=$(dpkg-deb -f "${SDCARD}"/var/cache/apt/archives/linux-u-boot-${BOARD}-${BRANCH}*_${ARCH}.deb Version) ++ UBOOT_REPO_VERSION=$(dpkg-deb -f "${SDCARD}"/var/cache/apt/archives/linux-u-boot-${BOARD}-${BRANCH}*_${ARCH}.deb Version) + fi + } + + +From e4d30f131db7f9ab15759e4fa7fe5f18117cccd6 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 16:06:30 +0100 +Subject: [PATCH] armbian-next: oops, fix some non-lib changes I missed, up to + revision ff4346c4682e260be3137a2301ac7a69b97c044d + +--- + .../deepin/armbian/create_desktop_package.sh | 2 +- + .../sources/families/include/rockchip64_common.inc | 31 ++++++++++++++++++---- + config/sources/families/include/sunxi64_common.inc | 8 +++--- + config/sources/families/include/sunxi_common.inc | 6 ++--- + config/sources/families/jetson-nano.conf | 13 +++++---- + config/sources/families/mvebu64.conf | 6 ++--- + config/sources/families/odroidxu4.conf | 2 +- + config/sources/families/rk322x.conf | 4 +-- + config/sources/families/rk35xx.conf | 23 +++++++--------- + config/sources/families/rockchip64.conf | 2 +- + config/templates/config-example.conf | 2 +- + packages/armbian/builddeb | 5 ++-- + 12 files changed, 62 insertions(+), 42 deletions(-) + +diff --git a/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh b/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh +index d25ffd974..78f4d23be 100755 +--- a/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh ++++ b/config/desktop/focal/environments/deepin/armbian/create_desktop_package.sh +@@ -22,7 +22,7 @@ mkdir -p "${destination}"/usr/share/pixmaps/armbian + cp "${SRC}"/packages/blobs/desktop/icons/armbian.png "${destination}"/usr/share/pixmaps/armbian + + #generate wallpaper list for background changer +-mkdir -p "${destination}"/usr/sharedeepin-background-properties ++mkdir -p "${destination}"/usr/share/deepin-background-properties + cat << EOF > "${destination}"/usr/share/deepin-background-properties/armbian.xml + + +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index a6cc52133..0f0000d26 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -15,18 +15,27 @@ BOOTPATCHDIR="u-boot-rockchip64" + PACKAGE_LIST_FAMILY="ethtool" + + RKBIN_DIR="$SRC/cache/sources/rkbin-tools" ++ + BOOT_SOC=$(expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*') + ++CPUMIN=${CPUMIN:="408000"} ++ + if [[ $BOOT_SOC == rk3399 ]]; then + +- CPUMIN=${CPUMIN:="408000"} + CPUMAX=${CPUMAX:="2016000"} + +-else # rk3308, rk3328 ++elif [[ $BOOT_SOC == rk3328 || $BOOT_SOC == rk3308 ]]; then + +- CPUMIN=${CPUMIN:="408000"} + CPUMAX=${CPUMAX:="1296000"} + ++elif [[ "${BOOT_SOC}" == rk3566 ]]; then ++ ++ CPUMAX=${CPUMAX:="1800000"} ++ ++elif [[ "${BOOT_SOC}" == rk3568 ]]; then ++ ++ CPUMAX=${CPUMAX:="1992000"} ++ + fi + + if [[ $BOOT_SOC == rk3328 ]]; then +@@ -50,6 +59,18 @@ elif [[ $BOOT_SOC == rk3399pro ]]; then + MINILOADER_BLOB='rk33/rk3399pro_miniloader_v1.26.bin' + BL31_BLOB='rk33/rk3399pro_bl31_v1.35.elf' + ++elif [[ $BOOT_SOC == rk3566 ]]; then ++ ++ BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" ++ DDR_BLOB='rk35/rk3566_ddr_1056MHz_v1.10.bin' ++ BL31_BLOB='rk35/rk3568_bl31_v1.29.elf' ++ ++elif [[ $BOOT_SOC == rk3568 ]]; then ++ ++ BOOT_SCENARIO="${BOOT_SCENARIO:=spl-blobs}" ++ DDR_BLOB='rk35/rk3568_ddr_1560MHz_v1.10.bin' ++ BL31_BLOB='rk35/rk3568_bl31_v1.29.elf' ++ + elif [[ $BOARD == rockpi-s ]]; then + + BOOT_SCENARIO="${BOOT_SCENARIO:=only-blobs}" +@@ -274,8 +295,8 @@ family_tweaks_bsp() { + cat <<- EOF > "$destination"/etc/X11/xorg.conf.d/02-driver.conf + # set fbdev as default driver. + Section "Device" +- Identifier "NOGPU" +- Driver "fbdev" ++ Identifier "NOGPU" ++ Driver "fbdev" + EndSection + EOF + fi +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index 4c44d37bf..6a570b341 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -11,16 +11,16 @@ LINUXFAMILY=sunxi64 + + case $BRANCH in + +- legacy) KERNEL_VERSION_LEVEL="5.4" ;; ++ legacy) KERNEL_VERSION_LEVEL="5.10" ;; + +- current) KERNEL_VERSION_LEVEL="5.10" ;; ++ current) KERNEL_VERSION_LEVEL="5.15" ;; + +- edge) KERNEL_VERSION_LEVEL="5.15" ;; ++ edge) KERNEL_VERSION_LEVEL="5.16" ;; + esac + + case "$KERNEL_VERSION_LEVEL" in + +- 5.10 | 5.15) ++ 5.10 | 5.15 | 5.16) + KERNELSOURCE=$MAINLINE_KERNEL_SOURCE + KERNELSOURCENAME='name=origin' + KERNELBRANCH="branch:linux-${KERNEL_VERSION_LEVEL}.y" +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index eabacf86b..c84c45186 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -12,9 +12,9 @@ GOVERNOR=ondemand + + case $BRANCH in + +- legacy) KERNEL_VERSION_LEVEL="5.4" ;; +- current) KERNEL_VERSION_LEVEL="5.10" ;; +- edge) KERNEL_VERSION_LEVEL="5.15" ;; ++ legacy) KERNEL_VERSION_LEVEL="5.10" ;; ++ current) KERNEL_VERSION_LEVEL="5.15" ;; ++ edge) KERNEL_VERSION_LEVEL="5.16" ;; + + esac + +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +index 03717a673..fbc14d5af 100644 +--- a/config/sources/families/jetson-nano.conf ++++ b/config/sources/families/jetson-nano.conf +@@ -1,11 +1,8 @@ + ARCH=arm64 + KERNEL_IMAGE_TYPE=Image ++BOOTCONFIG=none + ATF_COMPILE="no" + OFFSET=16 +-BOOTDELAY=0 +-BOOTBRANCH="tag:v2021.07" +-BOOTPATCHDIR="u-boot-rockchip64" +-UBOOT_TARGET_MAP=";;u-boot.bin" + + CPUMIN=504000 + CPUMAX=2132000 +@@ -18,7 +15,9 @@ case $BRANCH in + KERNELSOURCE='https://github.com/150balbes/Jetson-Nano' + KERNELBRANCH='branch:4.9.201' + EXTRAWIFI="no" +- BOOT_FDT_FILE="tegra210-p3448-0000-p3449-0000-a02.dtb" ++ BOOT_FDT_FILE="none" ++ SRC_CMDLINE='console=ttyS0,115200n8 console=tty0 tegraid=21.1.2.0.0 ddr_die=4096M@2048M section=512M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb debug_uartport=lsport,4 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=0x1000@0xff780000 core_edp_mv=1075 core_edp_ma=4000 tegra_fbmem=0x800000@0x92ca9000 is_hdmi_initialised=1 earlycon=uart8250,mmio32,0x70006000 fbcon=map:0' ++ MODULES_INITRD="jetson-nano-legacy" + ;; + + current) +@@ -26,6 +25,7 @@ case $BRANCH in + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH ++ MODULES_INITRD="jetson-nano-current" + ;; + + edge) +@@ -34,6 +34,7 @@ case $BRANCH in + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH ++ MODULES_INITRD="jetson-nano-edge" + ;; + + esac +@@ -44,6 +45,8 @@ write_uboot_platform() { + + family_tweaks() { + ++ install -m 755 $SRC/packages/blobs/jetson/jetson.sh $SDCARD/etc/initramfs-tools/hooks/jetson.sh ++ + if [[ $BRANCH == legacy ]]; then + install -m 755 $SRC/packages/blobs/jetson/tegra21x_xusb_firmware $SDCARD/lib/firmware/tegra21x_xusb_firmware + install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf.tegrahda +diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf +index 0a0979287..58d66ab98 100644 +--- a/config/sources/families/mvebu64.conf ++++ b/config/sources/families/mvebu64.conf +@@ -1,6 +1,6 @@ + enable_extension "marvell-tools" + ARCH=arm64 +-BOOTBRANCH='branch:v2021.01' ++BOOTBRANCH='branch:v2022.01' + BOOTENV_FILE='mvebu64.txt' + ATFSOURCE='https://github.com/MarvellEmbeddedProcessors/atf-marvell' + ATFDIR='arm-trusted-firmware-espressobin' +@@ -36,12 +36,12 @@ case $BRANCH in + + current) + +- KERNELBRANCH='branch:linux-5.10.y' ++ KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) +- KERNELBRANCH='branch:linux-5.15.y' ++ KERNELBRANCH='branch:linux-5.16.y' + ;; + + esac +diff --git a/config/sources/families/odroidxu4.conf b/config/sources/families/odroidxu4.conf +index 76edb26d6..ee4a32af5 100644 +--- a/config/sources/families/odroidxu4.conf ++++ b/config/sources/families/odroidxu4.conf +@@ -23,7 +23,7 @@ case $BRANCH in + ;; + + edge) +- KERNELBRANCH='branch:linux-5.15.y' ++ KERNELBRANCH='branch:linux-5.16.y' + ;; + + esac +diff --git a/config/sources/families/rk322x.conf b/config/sources/families/rk322x.conf +index 637527d36..1a8ba863f 100644 +--- a/config/sources/families/rk322x.conf ++++ b/config/sources/families/rk322x.conf +@@ -19,13 +19,13 @@ case $BRANCH in + + current) + +- KERNELBRANCH='branch:linux-5.10.y' ++ KERNELBRANCH='branch:linux-5.15.y' + + ;; + + edge) + +- KERNELBRANCH='branch:linux-5.15.y' ++ KERNELBRANCH='branch:linux-5.16.y' + + ;; + +diff --git a/config/sources/families/rk35xx.conf b/config/sources/families/rk35xx.conf +index bdcf9c6a4..acc5ffc16 100644 +--- a/config/sources/families/rk35xx.conf ++++ b/config/sources/families/rk35xx.conf +@@ -5,16 +5,6 @@ BOOTBRANCH='branch:stable-4.19-rock3' + BOOTPATCHDIR="u-boot-rk35xx" + OVERLAY_PREFIX='rk35xx' + +-if [[ "${BOOT_SOC}" == rk3566 ]]; then +- CPUMAX=1800000 +- DDR_BLOB='rk35/rk3566_ddr_1056MHz_v1.10.bin' +- BL31_BLOB='rk35/rk3568_bl31_v1.29.elf' +-elif [[ "${BOOT_SOC}" == rk3568 ]]; then +- CPUMAX=1992000 +- DDR_BLOB='rk35/rk3568_ddr_1056MHz_v1.10.bin' +- BL31_BLOB='rk35/rk3568_bl31_v1.29.elf' +-fi +- + case $BRANCH in + + legacy) +@@ -31,14 +21,19 @@ case $BRANCH in + + ;; + ++ # temporary until kernel 5.16 is well supported for rockchip64 ++ edge) ++ KERNELBRANCH="branch:linux-5.16.y" ++ KERNELPATCHDIR='rk35xx-'$BRANCH ++ SKIP_BOOTSPLASH="yes" ++ LINUXCONFIG='linux-rk35xx-'$BRANCH ++ ++ ;; ++ + esac + + prepare_boot_configuration + +-uboot_custom_postprocess() { +- tools/mkimage -n rk356x -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img +-} +- + family_tweaks_bsp() { + : + } +diff --git a/config/sources/families/rockchip64.conf b/config/sources/families/rockchip64.conf +index 729c47315..6790c35b7 100644 +--- a/config/sources/families/rockchip64.conf ++++ b/config/sources/families/rockchip64.conf +@@ -3,9 +3,9 @@ source "${BASH_SOURCE%/*}/include/rockchip64_common.inc" + case $BRANCH in + + legacy) ++ KERNELDIR='linux-rockchip64' + KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' + KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' +- KERNELDIR='linux-rockchip64' + KERNELPATCHDIR='rockchip64-'$BRANCH + ;; + +diff --git a/config/templates/config-example.conf b/config/templates/config-example.conf +index 41578ea32..b75e4b44b 100644 +--- a/config/templates/config-example.conf ++++ b/config/templates/config-example.conf +@@ -19,6 +19,6 @@ DEST_LANG="en_US.UTF-8" # sl_SI.UTF-8, en_US.UTF-8 + EXTERNAL_NEW="prebuilt" # compile and install or install prebuilt additional packages + INSTALL_HEADERS="" # install kernel headers package + LIB_TAG="master" # change to "branchname" to use any branch currently available. +-USE_TORRENT="yes" # use torrent network for faster toolchain and cache download ++USE_TORRENT="no" # use torrent network for faster toolchain and cache download + DOWNLOAD_MIRROR="" # set to "china" to use mirrors.tuna.tsinghua.edu.cn + CARD_DEVICE="" # device name /dev/sdx of your SD card to burn directly to the card when done +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +index 0080bb87c..0209f3528 100755 +--- a/packages/armbian/builddeb ++++ b/packages/armbian/builddeb +@@ -74,12 +74,13 @@ create_package() { + exit 0 + EOT + +- # for Ubuntu/Debian compatiblity, symlink in /lib/firmware/$version/device-tree ++ # for Ubuntu/Debian compatiblity, copy DTBs to /lib/firmware/$version/device-tree + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /boot + ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb + mkdir -p /lib/firmware/$version +- [ ! -L /lib/firmware/$version/device-tree ] && ln -s /boot/dtb-$version /lib/firmware/$version/device-tree ++ rm -rf /lib/firmware/$version/device-tree ++ cp -rp /boot/dtb-$version /lib/firmware/$version/device-tree + exit 0 + EOT + + +From 326548a2fb5909159b84ad75d11c714b4dbe42b3 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 15:46:09 +0100 +Subject: [PATCH] armbian-next: manual merge (9) of all lib/*.sh changes + between revisions 3b7f5b1f3418b7ad7a7c03f2af6d8da66f20bcb9 and + ff4346c4682e260be3137a2301ac7a69b97c044d + +--- + lib/functions/compilation/extra-drivers.sh | 26 ++++++++++++++------------ + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/image/partitioning.sh | 2 +- + lib/functions/image/rootfs-to-image.sh | 7 ++++++- + lib/functions/rootfs/distro-agnostic.sh | 10 +++++----- + 5 files changed, 27 insertions(+), 20 deletions(-) + +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/extra-drivers.sh +index b466c940b..d41be6307 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/extra-drivers.sh +@@ -98,21 +98,20 @@ prepare_extra_kernel_drivers() { + # Linux splash file + # + +- if linux-version compare "${version}" ge 5.8.10 && [ $SKIP_BOOTSPLASH != yes ]; then ++ if linux-version compare "${version}" ge 5.10 && [ $SKIP_BOOTSPLASH != yes ]; then + + display_alert "Adding" "Kernel splash file" "info" + +- if linux-version compare "${version}" ge 5.13; then +- process_patch_file "${SRC}/patch/misc/bootsplash-5.10.y-0001-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" +- fi ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0001-Revert-fbcon-Add-option-to-enable-legacy-hardware-ac.patch" "applying" + +- process_patch_file "${SRC}/patch/misc/bootsplash-5.8.10-0001-Revert-vgacon-remove-software-scrollback-support.patch" "applying" +- process_patch_file "${SRC}/patch/misc/bootsplash-5.8.10-0002-Revert-fbcon-remove-now-unusued-softback_lines-curso.patch" "applying" +- if linux-version compare "${version}" ge 5.10; then +- process_patch_file "${SRC}/patch/misc/bootsplash-5.10.y-0003-Revert-fbcon-remove-soft-scrollback-code.patch" "applying" +- else +- process_patch_file "${SRC}/patch/misc/bootsplash-5.8.10-0003-Revert-fbcon-remove-soft-scrollback-code.patch" "applying" ++ if linux-version compare "${version}" ge 5.15; then ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0002-Revert-vgacon-drop-unused-vga_init_done.patch" "applying" + fi ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0003-Revert-vgacon-remove-software-scrollback-support.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0004-Revert-drivers-video-fbcon-fix-NULL-dereference-in-f.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0005-Revert-fbcon-remove-no-op-fbcon_set_origin.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0006-Revert-fbcon-remove-now-unusued-softback_lines-curso.patch" "applying" ++ process_patch_file "${SRC}/patch/misc/bootsplash-5.16.y-0007-Revert-fbcon-remove-soft-scrollback-code.patch" "applying" + + process_patch_file "${SRC}/patch/misc/0001-bootsplash.patch" "applying" + process_patch_file "${SRC}/patch/misc/0002-bootsplash.patch" "applying" +@@ -159,6 +158,7 @@ prepare_extra_kernel_drivers() { + # manual overrides + if linux-version compare "${version}" ge 5.4.3 && linux-version compare "${version}" le 5.5; then aufstag="5.4.3"; fi + if linux-version compare "${version}" ge 5.10.82 && linux-version compare "${version}" le 5.11; then aufstag="5.10.82"; fi ++ if linux-version compare "${version}" ge 5.15.5 && linux-version compare "${version}" le 5.16; then aufstag="5.15.5"; fi + + # check if Mr. Okajima already made a branch for this version + improved_git ls-remote --exit-code --heads https://github.com/sfjro/aufs5-standalone "aufs${aufstag}" > /dev/null +@@ -436,14 +436,16 @@ prepare_extra_kernel_drivers() { + + # Wireless drivers for Realtek 8188EU 8188EUS and 8188ETV chipsets + +- if linux-version compare "${version}" ge 3.14 && [ "$EXTRAWIFI" == yes ]; then ++ if linux-version compare "${version}" ge 3.14 && ++ linux-version compare "${version}" lt 5.15 && ++ [ "$EXTRAWIFI" == yes ]; then + + # attach to specifics tag or branch + local rtl8188euver="branch:v5.7.6.1" + + display_alert "Adding" "Wireless drivers for Realtek 8188EU 8188EUS and 8188ETV chipsets ${rtl8188euver}" "info" + +- fetch_from_repo "https://github.com/aircrack-ng/rtl8188eus" "rtl8188eu" "${rtl8188euver}" "yes" ++ fetch_from_repo "$GITHUB_SOURCE/aircrack-ng/rtl8188eus" "rtl8188eu" "${rtl8188euver}" "yes" + cd "$kerneldir" || exit + rm -rf "$kerneldir/drivers/net/wireless/rtl8188eu" + mkdir -p "$kerneldir/drivers/net/wireless/rtl8188eu/" +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 1457e6bca..06eb888fd 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -63,7 +63,7 @@ function do_main_configuration() { + if [[ "${MAKE_FOLDERS}" == yes ]]; then + + if [[ "$RC" == yes ]]; then +- FINALDEST=$DEST/images/"${BOARD}"/RC ++ FINALDEST=$DEST/images/"${BOARD}"/rc + elif [[ "$BETA" == yes ]]; then + FINALDEST=$DEST/images/"${BOARD}"/nightly + else +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index b8b6e0595..0e075132a 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -351,7 +351,7 @@ prepare_partitions() { + + # create extlinux config + if [[ -f $SDCARD/boot/extlinux/extlinux.conf ]]; then +- echo " APPEND root=$rootfs $SRC_CMDLINE $MAIN_CMDLINE" >> $SDCARD/boot/extlinux/extlinux.conf ++ echo " append root=$rootfs $SRC_CMDLINE $MAIN_CMDLINE" >> $SDCARD/boot/extlinux/extlinux.conf + [[ -f $SDCARD/boot/armbianEnv.txt ]] && rm $SDCARD/boot/armbianEnv.txt + fi + +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index c0aace136..b39ab161a 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -65,7 +65,12 @@ create_image_from_sdcard_rootfs() { + display_alert "Mount point" "$(echo -e "$freespace" | grep $MOUNT | head -1 | awk '{print $5}')" "info" + + # stage: write u-boot, unless the deb is not there, which would happen if BOOTCONFIG=none +- [[ -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]] && write_uboot_to_loop_image $LOOP ++ # exception: if we use the one from repository, install version which was downloaded from repo ++ if [[ -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]]; then ++ write_uboot $LOOP ++ elif [[ "${UPSTREM_VER}" ]]; then ++ write_uboot $LOOP ++ fi + + # fix wrong / permissions + chmod 755 $MOUNT +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index e3c9e41aa..31d7f4c62 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -154,16 +154,16 @@ install_distribution_agnostic() { + if [[ $SRC_EXTLINUX == yes ]]; then + mkdir -p $SDCARD/boot/extlinux + cat <<- EOF > "$SDCARD/boot/extlinux/extlinux.conf" +- LABEL ${VENDOR} +- LINUX /boot/$NAME_KERNEL +- INITRD /boot/$NAME_INITRD ++ label ${VENDOR} ++ kernel /boot/$NAME_KERNEL ++ initrd /boot/$NAME_INITRD + EOF + if [[ -n $BOOT_FDT_FILE ]]; then + if [[ $BOOT_FDT_FILE != "none" ]]; then +- echo " FDT /boot/dtb/$BOOT_FDT_FILE" >> "$SDCARD/boot/extlinux/extlinux.conf" ++ echo " fdt /boot/dtb/$BOOT_FDT_FILE" >> "$SDCARD/boot/extlinux/extlinux.conf" + fi + else +- echo " FDTDIR /boot/dtb/" >> "$SDCARD/boot/extlinux/extlinux.conf" ++ echo " fdtdir /boot/dtb/" >> "$SDCARD/boot/extlinux/extlinux.conf" + fi + else + + +From 8180b79f136be27a79d225ade02faa823012923f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 10:18:32 +0100 +Subject: [PATCH] armbian-next: more error handling fixes. avoid shortcircuits. + +- store previous error message in `MSG_IF_ERROR` (still to be actually shown somewhere during error) +--- + lib/functions/compilation/atf.sh | 2 +- + lib/functions/compilation/uboot.sh | 10 ++++------ + lib/functions/image/partitioning.sh | 19 ++++++++++--------- + lib/functions/rootfs/apt.sh | 5 ++--- + lib/functions/rootfs/create-cache.sh | 31 +++++++++++-------------------- + lib/functions/rootfs/distro-agnostic.sh | 5 +---- + 6 files changed, 29 insertions(+), 43 deletions(-) + +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index 91ca8aaf1..857c1744f 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -51,7 +51,7 @@ compile_atf() { + # Check: https://github.com/armbian/build/issues/1157 + CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ + make ENABLE_BACKTRACE="0" $target_make $CTHREADS \ +- CROSS_COMPILE="$CCACHE $ATF_COMPILER" 2>&1 || { ++ CROSS_COMPILE="$CCACHE $ATF_COMPILER" 2>&1 || { # HANDLED SHORTCIRCUIT: direct command invocation; @TODO: replace with runner + exit_with_error "ATF compilation failed" + } + +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 188c062d6..ca56fbfa1 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -30,10 +30,9 @@ function compile_uboot_target() { + fi + + display_alert "${uboot_prefix}Preparing u-boot config" "${version} ${target_make}" "info" ++ export MSG_IF_ERROR="${uboot_prefix}Failed to configure u-boot ${version} $BOOTCONFIG ${target_make}" + run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ +- make "$CTHREADS" "$BOOTCONFIG" "CROSS_COMPILE=\"$CCACHE $UBOOT_COMPILER\"" || { +- exit_with_error "${uboot_prefix}Failed to configure u-boot ${version} $BOOTCONFIG ${target_make}" +- } ++ make "$CTHREADS" "$BOOTCONFIG" "CROSS_COMPILE=\"$CCACHE $UBOOT_COMPILER\"" + + # armbian specifics u-boot settings + [[ -f .config ]] && sed -i 's/CONFIG_LOCALVERSION=""/CONFIG_LOCALVERSION="-armbian"/g' .config +@@ -66,9 +65,8 @@ function compile_uboot_target() { + [[ -n $UBOOT_TOOLCHAIN2 ]] && cross_compile="ARMBIAN=foe" # empty parameter is not allowed + + display_alert "${uboot_prefix}Compiling u-boot" "${version} ${target_make}" "info" +- run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" make "$target_make" "$CTHREADS" "${cross_compile}" || { +- exit_with_error "${uboot_prefix}Failed to build u-boot ${version} ${target_make}" +- } ++ export MSG_IF_ERROR="${uboot_prefix}Failed to build u-boot ${version} ${target_make}" ++ run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" make "$target_make" "$CTHREADS" "${cross_compile}" + + if [[ $(type -t uboot_custom_postprocess) == function ]]; then + display_alert "${uboot_prefix}Postprocessing u-boot" "${version} ${target_make}" +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 36683314d..b8b6e0595 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -199,22 +199,22 @@ prepare_partitions() { + parted -s ${SDCARD}.raw -- mkpart efi fat32 ${uefistart}s ${uefiend}s + parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + # transpose so BIOS is in sda14; EFI is in sda15 and root in sda1; requires sgdisk, parted cant do numbers +- sgdisk --transpose 1:14 ${SDCARD}.raw &> /dev/null || echo "*** TRANSPOSE 1:14 FAILED" +- sgdisk --transpose 2:15 ${SDCARD}.raw &> /dev/null || echo "*** TRANSPOSE 2:15 FAILED" +- sgdisk --transpose 3:1 ${SDCARD}.raw &> /dev/null || echo "*** TRANSPOSE 3:1 FAILED" ++ sgdisk --transpose 1:14 ${SDCARD}.raw ++ sgdisk --transpose 2:15 ${SDCARD}.raw ++ sgdisk --transpose 3:1 ${SDCARD}.raw + # set the ESP (efi) flag on 15 +- parted -s ${SDCARD}.raw -- set 14 bios_grub on || echo "*** SETTING bios_grub ON 14 FAILED" +- parted -s ${SDCARD}.raw -- set 15 esp on || echo "*** SETTING ESP ON 15 FAILED" ++ parted -s ${SDCARD}.raw -- set 14 bios_grub on ++ parted -s ${SDCARD}.raw -- set 15 esp on + else + display_alert "Creating partitions" "UEFI+rootfs (no BIOS)" "info" + # Simple EFI + root partition on GPT, no BIOS. + parted -s ${SDCARD}.raw -- mkpart efi fat32 ${bootstart}s ${bootend}s + parted -s ${SDCARD}.raw -- mkpart rootfs ${parttype[$ROOTFS_TYPE]} ${rootstart}s "100%" + # transpose so EFI is in sda15 and root in sda1; requires sgdisk, parted cant do numbers +- sgdisk --transpose 1:15 ${SDCARD}.raw &> /dev/null || echo "*** TRANSPOSE 1:15 FAILED" +- sgdisk --transpose 2:1 ${SDCARD}.raw &> /dev/null || echo "*** TRANSPOSE 2:1 FAILED" ++ sgdisk --transpose 1:15 ${SDCARD}.raw ++ sgdisk --transpose 2:1 ${SDCARD}.raw + # set the ESP (efi) flag on 15 +- parted -s ${SDCARD}.raw -- set 15 esp on || echo "*** SETTING ESP ON 15 FAILED" ++ parted -s ${SDCARD}.raw -- set 15 esp on + fi + else + parted -s ${SDCARD}.raw -- mkpart primary fat32 ${bootstart}s ${bootend}s +@@ -238,7 +238,8 @@ prepare_partitions() { + exec {FD}> /var/lock/armbian-debootstrap-losetup + flock -x $FD + +- export LOOP=$(losetup -f) || exit_with_error "Unable to find free loop device" ++ export LOOP ++ LOOP=$(losetup -f) || exit_with_error "Unable to find free loop device" + display_alert "Allocated loop device" "LOOP=${LOOP}" "wrn" + + check_loop_device "$LOOP" +diff --git a/lib/functions/rootfs/apt.sh b/lib/functions/rootfs/apt.sh +index 29833851a..768636fc9 100644 +--- a/lib/functions/rootfs/apt.sh ++++ b/lib/functions/rootfs/apt.sh +@@ -29,9 +29,8 @@ install_deb_chroot() { + [[ $BUILD_ALL == yes && ${variant} == remote ]] && chroot_sdcard_apt_get update + + # install in chroot via apt-get, not dpkg, so dependencies are also installed from repo if needed. +- chroot_sdcard_apt_get --no-install-recommends install "${name}" || { +- exit_with_error "Installation of $name failed" "${BOARD} ${RELEASE} ${BUILD_DESKTOP} ${LINUXFAMILY}" +- } ++ export MSG_IF_ERROR="Installation of $name failed ${BOARD} ${RELEASE} ${BUILD_DESKTOP} ${LINUXFAMILY}" ++ chroot_sdcard_apt_get --no-install-recommends install "${name}" + + # @TODO: mysterious. store installed/downloaded packages in deb storage. only used for u-boot deb. why? + [[ ${variant} == remote && ${transfer} == yes ]] && rsync -rq "${SDCARD}"/var/cache/apt/archives/*.deb "${DEB_STORAGE}"/ +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index c83cdaf99..acadbf6e3 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -126,9 +126,8 @@ function create_new_rootfs_cache() { + cp /usr/share/keyrings/*-archive-keyring.gpg "${SDCARD}/usr/share/keyrings/" + + display_alert "Installing base system" "Stage 2/2" "info" +- chroot_sdcard LC_ALL=C LANG=C /debootstrap/debootstrap --second-stage 2>&1 || { # invoke inside chroot/qemu, stderr to stdout. +- exit_with_error "Debootstrap second stage failed" "${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" +- } ++ export MSG_IF_ERROR="Debootstrap second stage failed ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL}" ++ chroot_sdcard LC_ALL=C LANG=C /debootstrap/debootstrap --second-stage + [[ ! -f "${SDCARD}/bin/bash" ]] && exit_with_error "Debootstrap first stage did not produce /bin/bash" + + mount_chroot "${SDCARD}" +@@ -171,15 +170,11 @@ function create_new_rootfs_cache() { + + # stage: update packages list + display_alert "Updating package list" "$RELEASE" "info" +- chroot_sdcard_apt_get update || { +- display_alert "Updating package lists" "failed" "wrn" +- } ++ chroot_sdcard_apt_get update + + # stage: upgrade base packages from xxx-updates and xxx-backports repository branches + display_alert "Upgrading base packages" "Armbian" "info" +- chroot_sdcard_apt_get upgrade || { +- display_alert "Upgrading packages" "failed" "wrn" +- } ++ chroot_sdcard_apt_get upgrade + + # Myy: Dividing the desktop packages installation steps into multiple + # ones. We first install the "ADDITIONAL_PACKAGES" in order to get +@@ -189,9 +184,8 @@ function create_new_rootfs_cache() { + + # stage: install additional packages + display_alert "Installing the main packages for" "Armbian" "info" +- chroot_sdcard_apt_get_install "$PACKAGE_MAIN_LIST" || { +- exit_with_error "Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" +- } ++ export MSG_IF_ERROR="Installation of Armbian main packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" ++ chroot_sdcard_apt_get_install "$PACKAGE_MAIN_LIST" + + if [[ $BUILD_DESKTOP == "yes" ]]; then + # FIXME Myy : Are we keeping this only for Desktop users, +@@ -213,22 +207,19 @@ function create_new_rootfs_cache() { + fi + + display_alert "Installing the desktop packages for" "Armbian" "info" +- chroot_sdcard_apt_get install ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP || { +- exit_with_error "Installation of Armbian desktop packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" +- } ++ MSG_IF_ERROR="Installation of Armbian desktop packages for ${BRANCH} ${BOARD} ${RELEASE} ${DESKTOP_APPGROUPS_SELECTED} ${DESKTOP_ENVIRONMENT} ${BUILD_MINIMAL} failed" ++ chroot_sdcard_apt_get install ${apt_desktop_install_flags} $PACKAGE_LIST_DESKTOP + fi + + # Remove packages from packages.uninstall + display_alert "Uninstall packages" "$PACKAGE_LIST_UNINSTALL" "info" + # shellcheck disable=SC2086 +- chroot_sdcard_apt_get purge $PACKAGE_LIST_UNINSTALL || exit_with_error "Un-Installation of packages failed" ++ chroot_sdcard_apt_get purge $PACKAGE_LIST_UNINSTALL + + # stage: purge residual packages + display_alert "Purging residual packages for" "Armbian" "info" + PURGINGPACKAGES=$(chroot $SDCARD /bin/bash -c "dpkg -l | grep \"^rc\" | awk '{print \$2}' | tr \"\n\" \" \"") +- chroot_sdcard_apt_get remove --purge $PURGINGPACKAGES || { +- exit_with_error "Purging of residual Armbian packages failed" +- } ++ chroot_sdcard_apt_get remove --purge $PURGINGPACKAGES + + # stage: remove downloaded packages + chroot_sdcard_apt_get autoremove +@@ -280,7 +271,7 @@ get_package_list_hash() { + local list_content + read -ra package_arr <<< "${DEBOOTSTRAP_LIST} ${PACKAGE_LIST}" + read -ra exclude_arr <<< "${PACKAGE_LIST_EXCLUDE}" +- ( ++ ( + ( + printf "%s\n" "${package_arr[@]}" + printf -- "-%s\n" "${exclude_arr[@]}" +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index ef8c40720..e3c9e41aa 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -249,10 +249,7 @@ install_distribution_agnostic() { + _pkg_list=${PACKAGE_LIST_BOARD} + display_alert "Installing PACKAGE_LIST_BOARD packages" "${_pkg_list}" + # shellcheck disable=SC2086 # we need to expand. +- chroot_sdcard_apt_get_install ${_pkg_list} || { +- # exit_with_error will collaborate with logging to show the current log before exiting. +- exit_with_error "Failed to install PACKAGE_LIST_BOARD" "${_pkg_list}" "err" +- } ++ chroot_sdcard_apt_get_install ${_pkg_list} + fi + + # remove family packages + +From f549907b967be0199cb10b995f8aa3449e0de8ad Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 12 Feb 2022 09:17:38 +0100 +Subject: [PATCH] armbian-next: more error handling fixes. avoid subshells, + shortcircuits, and pipes + +- add `CFLAGS=-fdiagnostics-color=always` to kernel compile; would need also for u-boot soon +--- + lib/functions/compilation/kernel.sh | 24 +++++++++++------------- + lib/functions/logging/logging.sh | 2 +- + lib/functions/logging/runners.sh | 31 +++++++++++++++++++------------ + lib/functions/logging/traps.sh | 6 ++++++ + 4 files changed, 37 insertions(+), 26 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index dc357ee93..e10c5af72 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -1,4 +1,5 @@ + function run_kernel_make() { ++ set -e + declare -a common_make_params_quoted common_make_envs full_command + + common_make_envs=( +@@ -19,6 +20,10 @@ function run_kernel_make() { + "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. + ) + ++ #if [[ "${SHOW_LOG}" == "yes" ]]; then ++ common_make_params_quoted+=("KCFLAGS=-fdiagnostics-color=always") # Force GCC colored messages. ++ #fi ++ + # last statement, so it passes the result to calling function. + full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" make "$@" "${common_make_params_quoted[@]@Q}") + display_alert "Kernel make" "${full_command[*]}" "debug" +@@ -34,7 +39,7 @@ function run_kernel_make_long_running() { + KERNEL_MAKE_RUNNER="run_host_command_logged_long_running" run_kernel_make "$@" + } + +-compile_kernel() { ++function compile_kernel() { + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$LINUXSOURCEDIR" "info" + ( +@@ -140,9 +145,7 @@ compile_kernel() { + run_kernel_make silentoldconfig # This will exit with generic error if it fails. + else + # TODO: check if required +- run_kernel_make olddefconfig || { +- exit_with_error "Error kernel olddefconfig" +- } ++ run_kernel_make olddefconfig + fi + else + display_alert "Starting kernel oldconfig+menuconfig" "${LINUXCONFIG}" "debug" +@@ -150,9 +153,7 @@ compile_kernel() { + run_kernel_make oldconfig + + # No logging for this. this is UI piece +- run_kernel_make_dialog "${KERNEL_MENUCONFIG:-menuconfig}" || { +- exit_with_error "Error kernel menuconfig failed" +- } ++ run_kernel_make_dialog "${KERNEL_MENUCONFIG:-menuconfig}" + + # store kernel config in easily reachable place + display_alert "Exporting new kernel config" "$DEST/config/$LINUXCONFIG.config" "info" +@@ -177,9 +178,8 @@ compile_kernel() { + fi + + display_alert "Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" +- run_kernel_make_long_running "${KERNEL_IMAGE_TYPE}" modules "${KERNEL_EXTRA_TARGETS:-dtbs}" || { +- exit_with_error "Failure during kernel compile" "@host" +- } ++ run_kernel_make_long_running "${KERNEL_IMAGE_TYPE}" modules "${KERNEL_EXTRA_TARGETS:-dtbs}" ++ #run_kernel_make "${KERNEL_IMAGE_TYPE}" modules "${KERNEL_EXTRA_TARGETS:-dtbs}" + + if [[ ! -f arch/$ARCHITECTURE/boot/$KERNEL_IMAGE_TYPE ]]; then + exit_with_error "Kernel was not built" "arch/$ARCHITECTURE/boot/$KERNEL_IMAGE_TYPE" +@@ -195,9 +195,7 @@ compile_kernel() { + display_alert "Creating kernel packages" "${LINUXCONFIG} $kernel_packaging_target" "info" + + # produce deb packages: image, headers, firmware, dtb +- run_kernel_make_long_running $kernel_packaging_target || { +- exit_with_error "Failure during kernel packaging" "@host" +- } ++ run_kernel_make_long_running $kernel_packaging_target + + display_alert "Package building done" "${LINUXCONFIG} $kernel_packaging_target" "info" + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 90a376608..65ad6db33 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -97,7 +97,7 @@ function do_with_logging() { + return $exit_code + } + +-display_alert() { ++function display_alert() { + # We'll be writing to stderr (" >&2"), so also write the message to the generic logfile, for context. + if [[ -f "${CURRENT_LOGFILE}" ]]; then + echo "--> A: [" "$@" "]" >> "${CURRENT_LOGFILE}" +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 64f463648..9cf069834 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -24,7 +24,6 @@ function chroot_sdcard_with_stdout() { + TMPDIR="" chroot "${SDCARD}" "$@" + } + +- + function chroot_custom_long_running() { + local target=$1 + shift +@@ -56,15 +55,19 @@ function fakeroot_dpkg_deb_build() { + # the raw version is already redirect stderr to stdout, and we'll be running under do_with_logging, + # so: _the stdout must flow_!!! + function run_host_command_logged_long_running() { +- local _exit_code=1 +- if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then +- run_host_command_logged_raw /bin/bash -e -c "$*" +- _exit_code=$? +- else +- run_host_command_logged_raw /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}") " --progress --timer --line-mode --force --cursor --delay-start 0 -i "2" +- _exit_code=$? +- fi +- return $_exit_code ++ # @TODO: disabled. The Pipe used for "pv" causes the left-hand side to run in a subshell. ++ #local _exit_code=1 ++ #if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then ++ # run_host_command_logged_raw /bin/bash -e -c "$*" ++ # _exit_code=$? ++ #else ++ # run_host_command_logged_raw /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}") " --progress --timer --line-mode --force --cursor --delay-start 0 -i "2" ++ # _exit_code=$? ++ #fi ++ #return $_exit_code ++ ++ # Run simple and exit with it's code. Sorry. ++ run_host_command_logged_raw /bin/bash -e -c "$*" + } + + # run_host_command_logged is the very basic, should be used for everything, but, please use helpers above, this is very low-level. +@@ -88,15 +91,19 @@ function run_host_command_logged_raw() { + # uncomment when desperate to understand what's going on + # echo "cmd about to run" "$@" >&2 + ++ # In this case I wanna KNOW exactly what failed, thus disable errexit, then re-enable immediately after running. ++ set +e + local exit_code=666 + "$@" 2>&1 # redirect stderr to stdout. $* is NOT $@! + exit_code=$? ++ set -e + if [[ -f "${CURRENT_LOGFILE}" ]]; then + echo "--> cmd exited with code ${exit_code} at $(date --utc)" >> "${CURRENT_LOGFILE}" + fi + if [[ $exit_code != 0 ]]; then +- display_alert "cmd exited with code ${exit_code}" "$*" "wrn" +- display_alert "stacktrace for failed command" "$(show_caller_full)" "wrn" ++ # This is very specific; remove CURRENT_LOGFILE's value when calling display_alert here otherwise logged twice. ++ CURRENT_LOGFILE="" display_alert "cmd exited with code ${exit_code}" "$*" "wrn" ++ CURRENT_LOGFILE="" display_alert "stacktrace for failed command" "$(show_caller_full)" "wrn" + fi + return $exit_code + } +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index 47878a0b0..faf9d8192 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -55,8 +55,14 @@ function main_error_monitor() { + fi + local stack_caller="${2}" + local full_stack_caller="${3}" ++ if [[ "${ALREADY_EXITING_WITH_ERROR}" != "yes" ]]; then # Don't do this is exit_with_error already did it. ++ local logfile_to_show="${CURRENT_LOGFILE}" # store it ++ unset CURRENT_LOGFILE # stop logging, otherwise crazy ++ logging_error_show_log "main_error_monitor unknown error" "main_error_monitor unknown highlight" "${stack_caller}" "${logfile_to_show}" ++ fi + display_alert "main_error_monitor: ${errcode}! stack:" "${stack_caller}" "err" + display_alert "main_error_monitor: ${errcode}! full:" "${full_stack_caller}" "err" ++ + ALREADY_EXITING_WITH_ERROR=yes + exit 45 + return 44 + +From 6e3a035ec4ba55378e61e0229fb0290f3b0cdf99 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 31 Jan 2022 20:03:34 +0100 +Subject: [PATCH] WiP: indexing JSON into OpenSearch, all-hardcoded version + +--- + lib/tools/index-opensearch.py | 52 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 52 insertions(+) + +diff --git a/lib/tools/index-opensearch.py b/lib/tools/index-opensearch.py +new file mode 100755 +index 000000000..b6b82a2d2 +--- /dev/null ++++ b/lib/tools/index-opensearch.py +@@ -0,0 +1,52 @@ ++#!/usr/bin/env python3 ++import json ++import sys ++ ++from opensearchpy import OpenSearch # pip install opensearch-py ++ ++ ++def eprint(*args, **kwargs): ++ print(*args, file=sys.stderr, **kwargs) ++ ++ ++# info = get_info_for_one_board(board, all_params) ++print(json.dumps({}, indent=4, sort_keys=True)) ++ ++eprint("Hello") ++ ++# Read JSON from stdin ++# - should be array of objects ++# - loop over array and index each obj into OS in to the passed index ++# read_from_stdin = sys.stdin.read() ++ ++json_object = json.load(sys.stdin) ++ ++eprint("Loaded {} objects from stdin...".format(len(json_object))) ++ ++host = '192.168.66.55' ++port = 31920 ++ ++# Create the OpenSearch client. ++client = OpenSearch(hosts=[{'host': host, 'port': port}], http_compress=False, use_ssl=False) ++ ++# Create an index with non-default settings. ++index_name = 'board-vars-build' ++index_body = {'settings': {'index': {'number_of_shards': 1, 'number_of_replicas': 0}}} ++ ++# Delete the index; remove old data. ++try: ++ response = client.indices.delete(index=index_name) ++ print('\nDeleting index:') ++ print(response) ++except: ++ eprint("Failed to delete index {}".format(index_name)) ++ ++response = client.indices.create(index_name, body=index_body) ++print('\nCreating index:') ++print(response) ++ ++for obj in json_object: ++ # print(obj) ++ response = client.index(index=index_name, body=obj, refresh=True) ++ print('\nAdding document:') ++ print(response) + +From a1e81b3a46d9511962246ff6852ae9549b154fb9 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 6 Feb 2022 01:57:09 +0100 +Subject: [PATCH] rpi: add DTB symlink in Debian/Ubuntu standard location + /lib/firmware/$version/device-tree; remove build-time-only hacks + +- this allows us to remove the most horrible hack +- should allow for correctly working DTB upgrades +- should NOT impact other families, although a new symlink will be created, nothing uses it. +--- + config/sources/families/bcm2711.conf | 9 +-------- + packages/armbian/builddeb | 8 ++++++++ + 2 files changed, 9 insertions(+), 8 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 0dc25fc3f..2198c490c 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -57,14 +57,7 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + Kernel-Flavors: any + EOD + +- ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. +- local oneDTB dtbBase +- for oneDTB in "${MOUNT}"/boot/dtb/broadcom/*.dtb; do +- dtbBase=$(basename "${oneDTB}") +- cp "${MOUNT}"/boot/dtb/broadcom/"${dtbBase}" "${MOUNT}"/etc/flash-kernel/dtbs/"${dtbBase}" +- done +- +- rm -rf "${MOUNT}"/boot/dtb* || true ++ ## DTB compatibility has been moved to symlink done in packages/armbian/builddeb + + # @TODO: rpardini: packaging could maybe already use the correct names? I can't figure out how. + ln -s ./Image "${MOUNT}"/boot/vmlinuz +diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb +index 0163d401a..0080bb87c 100755 +--- a/packages/armbian/builddeb ++++ b/packages/armbian/builddeb +@@ -74,14 +74,22 @@ create_package() { + exit 0 + EOT + ++ # for Ubuntu/Debian compatiblity, symlink in /lib/firmware/$version/device-tree + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /boot + ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb ++ mkdir -p /lib/firmware/$version ++ [ ! -L /lib/firmware/$version/device-tree ] && ln -s /boot/dtb-$version /lib/firmware/$version/device-tree + exit 0 + EOT + ++ cat >> $pdir/DEBIAN/postrm <<- EOT ++ rm -rf /lib/firmware/$version ++ EOT ++ + chmod 775 $pdir/DEBIAN/preinst + chmod 775 $pdir/DEBIAN/postinst ++ chmod 775 $pdir/DEBIAN/postrm + fi + + # Create postinst prerm script for headers + +From e665d2fb3e9a25b2e9e927e3749ff14065f29ffb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 5 Feb 2022 23:37:01 +0100 +Subject: [PATCH] rpi: fix: flash-kernel fix to ignore kernel 'flavour' for all + raspi's + +--- + config/sources/families/bcm2711.conf | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 0a1322ac3..0dc25fc3f 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -52,8 +52,8 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + mkdir -p "${MOUNT}"/etc/flash-kernel/dtbs + + cat <<- EOD >> "${MOUNT}"/etc/flash-kernel/db +- # Armbian kernels have a different flavour than expected. +- Machine: ${FK__MACHINE_MODEL} ++ # Armbian kernels don't have a 'flavour'. Ignore flavors for all rpi revisions. ++ Machine: Raspberry Pi * + Kernel-Flavors: any + EOD + + +From acb9b1ee273bb16ab3a5caf47830f63a9eedef37 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 6 Feb 2022 14:19:04 +0100 +Subject: [PATCH] armbian-next: don't try to remove packages that are not + installed to begin with + +- much faster +- new chroot_sdcard_with_stdout() runner, without bash or any escaping. +--- + lib/functions/logging/runners.sh | 6 ++++++ + lib/functions/rootfs/distro-agnostic.sh | 13 ++++++++++--- + 2 files changed, 16 insertions(+), 3 deletions(-) + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 82ea46dae..64f463648 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -19,6 +19,12 @@ function chroot_sdcard() { + TMPDIR="" run_host_command_logged_raw chroot "${SDCARD}" /bin/bash -e -c "$*" + } + ++# This should be used if you need to capture the stdout produced by the command. It is NOT logged, and NOT run thru bash, and NOT quoted. ++function chroot_sdcard_with_stdout() { ++ TMPDIR="" chroot "${SDCARD}" "$@" ++} ++ ++ + function chroot_custom_long_running() { + local target=$1 + shift +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 5569580c1..ef8c40720 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -262,13 +262,20 @@ install_distribution_agnostic() { + chroot_sdcard_apt_get remove --auto-remove ${_pkg_list} + fi + +- # remove board packages ++ # remove board packages. loop over the list to remove, check if they're actually installed, then remove individually. + if [[ -n ${PACKAGE_LIST_BOARD_REMOVE} ]]; then + _pkg_list=${PACKAGE_LIST_BOARD_REMOVE} +- display_alert "Removing PACKAGE_LIST_BOARD_REMOVE packages" "${_pkg_list}" ++ declare -a currently_installed_packages ++ # shellcheck disable=SC2207 # I wanna split, thanks. ++ currently_installed_packages=($(chroot_sdcard_with_stdout dpkg-query --show --showformat='${Package} ')) + for PKG_REMOVE in ${_pkg_list}; do +- chroot_sdcard_apt_get remove --auto-remove "${PKG_REMOVE}" ++ # shellcheck disable=SC2076 # I wanna match literally, thanks. ++ if [[ " ${currently_installed_packages[*]} " =~ " ${PKG_REMOVE} " ]]; then ++ display_alert "Removing PACKAGE_LIST_BOARD_REMOVE package" "${PKG_REMOVE}" ++ chroot_sdcard_apt_get remove --auto-remove "${PKG_REMOVE}" ++ fi + done ++ unset currently_installed_packages + fi + + # install u-boot + +From c2a084f37049b0a3338e8f8bdf1e103539439c89 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 6 Feb 2022 12:42:25 +0100 +Subject: [PATCH] armbian-next: don't try to enable systemd services for units + that don't exist + +- those might be removed by a bsp extension, so check for existence before trying to enable +--- + lib/functions/rootfs/distro-agnostic.sh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 3d8607de0..5569580c1 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -267,7 +267,7 @@ install_distribution_agnostic() { + _pkg_list=${PACKAGE_LIST_BOARD_REMOVE} + display_alert "Removing PACKAGE_LIST_BOARD_REMOVE packages" "${_pkg_list}" + for PKG_REMOVE in ${_pkg_list}; do +- chroot_sdcard_apt_get remove --auto-remove "${PKG_REMOVE}" 2>&1 ++ chroot_sdcard_apt_get remove --auto-remove "${PKG_REMOVE}" + done + fi + +@@ -414,14 +414,14 @@ install_distribution_agnostic() { + It allows implementors access to the rootfs (`${SDCARD}`) in its pristine state after packages are installed. + FAMILY_TWEAKS + +- # enable additional services +- chroot_sdcard systemctl --no-reload enable armbian-firstrun.service || true +- chroot_sdcard systemctl --no-reload enable armbian-firstrun-config.service || true +- chroot_sdcard systemctl --no-reload enable armbian-zram-config.service || true +- chroot_sdcard systemctl --no-reload enable armbian-hardware-optimize.service || true +- chroot_sdcard systemctl --no-reload enable armbian-ramlog.service || true +- chroot_sdcard systemctl --no-reload enable armbian-resize-filesystem.service || true +- chroot_sdcard systemctl --no-reload enable armbian-hardware-monitor.service || true ++ # enable additional services, if they exist. ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-firstrun.service ]] && chroot_sdcard systemctl --no-reload enable armbian-firstrun.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-firstrun-config.service ]] && chroot_sdcard systemctl --no-reload enable armbian-firstrun-config.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-zram-config.service ]] && chroot_sdcard systemctl --no-reload enable armbian-zram-config.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-hardware-optimize.service ]] && chroot_sdcard systemctl --no-reload enable armbian-hardware-optimize.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-ramlog.service ]] && chroot_sdcard systemctl --no-reload enable armbian-ramlog.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-resize-filesystem.service ]] && chroot_sdcard systemctl --no-reload enable armbian-resize-filesystem.service ++ [[ -f "${SDCARD}"/lib/systemd/system/armbian-hardware-monitor.service ]] && chroot_sdcard systemctl --no-reload enable armbian-hardware-monitor.service + + # copy "first run automated config, optional user configured" + cp "${SRC}"/packages/bsp/armbian_first_run.txt.template "${SDCARD}"/boot/armbian_first_run.txt.template + +From 9291369c6d68660e9a43f43ee3fc94c8ad0fc774 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 6 Feb 2022 12:12:01 +0100 +Subject: [PATCH] armbian-next: don't error/warn on failure to enable + bootsplash when systemd units missing + +--- + lib/functions/rootfs/boot_logo.sh | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/lib/functions/rootfs/boot_logo.sh b/lib/functions/rootfs/boot_logo.sh +index 319ea1144..4b5e98aa9 100644 +--- a/lib/functions/rootfs/boot_logo.sh ++++ b/lib/functions/rootfs/boot_logo.sh +@@ -108,10 +108,11 @@ function boot_logo() { + [[ -f "${SDCARD}"/boot/armbianEnv.txt ]] && grep -q '^bootlogo' "${SDCARD}"/boot/armbianEnv.txt && + sed -i 's/^bootlogo.*/bootlogo=true/' "${SDCARD}"/boot/armbianEnv.txt || echo 'bootlogo=true' >> "${SDCARD}"/boot/armbianEnv.txt + [[ -f "${SDCARD}"/boot/boot.ini ]] && sed -i 's/^setenv bootlogo.*/setenv bootlogo "true"/' "${SDCARD}"/boot/boot.ini ++ ++ # enable additional services. @TODO: rpardini: really wonder where do these come from? ++ chroot_sdcard "systemctl --no-reload enable bootsplash-ask-password-console.path || true" ++ chroot_sdcard "systemctl --no-reload enable bootsplash-hide-when-booted.service || true" ++ chroot_sdcard "systemctl --no-reload enable bootsplash-show-on-shutdown.service || true" + fi +- # enable additional services +- chroot_sdcard systemctl --no-reload enable bootsplash-ask-password-console.path || true +- chroot_sdcard systemctl --no-reload enable bootsplash-hide-when-booted.service || true +- chroot_sdcard systemctl --no-reload enable bootsplash-show-on-shutdown.service || true + return 0 + } + +From ee634ea265ad9947f4061cd3bc0ffdf7d83d3e78 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 6 Feb 2022 11:24:33 +0100 +Subject: [PATCH] armbian-next: use indented HEREDOCS for all + call_extension_method's + +--- + lib/extensions.sh | 30 +++++++++++++++--------------- + lib/functions/bsp/bsp-cli.sh | 8 ++++---- + lib/functions/image/partitioning.sh | 22 +++++++++++----------- + lib/functions/image/rootfs-to-image.sh | 30 +++++++++++++++--------------- + lib/functions/main/default-build.sh | 10 +++++----- + lib/functions/main/rootfs-image.sh | 8 ++++---- + lib/functions/rootfs/customize.sh | 18 +++++++++--------- + lib/functions/rootfs/distro-agnostic.sh | 28 ++++++++++++++-------------- + lib/functions/rootfs/post-tweaks.sh | 10 +++++----- + 9 files changed, 82 insertions(+), 82 deletions(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 516700bbb..8b7ba183c 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -275,21 +275,21 @@ run_after_build__999_finish_extension_manager() { + export defined_hook_point_functions hook_point_function_trace_sources + + # eat our own dog food, pt2. +- call_extension_method "extension_metadata_ready" << 'EXTENSION_METADATA_READY' +-*meta-Meta time!* +-Implement this hook to work with/on the meta-data made available by the extension manager. +-Interesting stuff to process: +-- `"${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt"` contains a list of all hook points called, in order. +-- For each hook_point in the list, more files will have metadata about that hook point. +- - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.orig.md` contains the hook documentation at the call site (inline docs), hopefully in Markdown format. +- - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.compat` contains the compatibility names for the hooks. +- - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.exports` contains _exported_ environment variables. +- - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.vars` contains _all_ environment variables. +-- `${defined_hook_point_functions}` is a map of _all_ the defined hook point functions and their extension information. +-- `${hook_point_function_trace_sources}` is a map of all the hook point functions _that were really called during the build_ and their BASH_SOURCE information. +-- `${hook_point_function_trace_lines}` is the same, but BASH_LINENO info. +-After this hook is done, the `${EXTENSION_MANAGER_TMP_DIR}` will be removed. +-EXTENSION_METADATA_READY ++ call_extension_method "extension_metadata_ready" <<- 'EXTENSION_METADATA_READY' ++ *meta-Meta time!* ++ Implement this hook to work with/on the meta-data made available by the extension manager. ++ Interesting stuff to process: ++ - `"${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt"` contains a list of all hook points called, in order. ++ - For each hook_point in the list, more files will have metadata about that hook point. ++ - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.orig.md` contains the hook documentation at the call site (inline docs), hopefully in Markdown format. ++ - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.compat` contains the compatibility names for the hooks. ++ - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.exports` contains _exported_ environment variables. ++ - `${EXTENSION_MANAGER_TMP_DIR}/hook_point.vars` contains _all_ environment variables. ++ - `${defined_hook_point_functions}` is a map of _all_ the defined hook point functions and their extension information. ++ - `${hook_point_function_trace_sources}` is a map of all the hook point functions _that were really called during the build_ and their BASH_SOURCE information. ++ - `${hook_point_function_trace_lines}` is the same, but BASH_LINENO info. ++ After this hook is done, the `${EXTENSION_MANAGER_TMP_DIR}` will be removed. ++ EXTENSION_METADATA_READY + + # Move temporary log file over to final destination, and start writing to it instead (although 999 is pretty late in the game) + mv "${EXTENSION_MANAGER_LOG_FILE}" "${DEST}/${LOG_SUBPATH:-debug}/extensions.log" +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index a2c0adc58..a4e6db654 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -289,10 +289,10 @@ create_board_package() { + display_alert "Done with family_tweaks_bsp" "${LINUXFAMILY}" "debug" + fi + +- call_extension_method "post_family_tweaks_bsp" << 'POST_FAMILY_TWEAKS_BSP' +-*family_tweaks_bsp overrrides what is in the config, so give it a chance to override the family tweaks* +-This should be implemented by the config to tweak the BSP, after the board or family has had the chance to. +-POST_FAMILY_TWEAKS_BSP ++ call_extension_method "post_family_tweaks_bsp" <<- 'POST_FAMILY_TWEAKS_BSP' ++ *family_tweaks_bsp overrrides what is in the config, so give it a chance to override the family tweaks* ++ This should be implemented by the config to tweak the BSP, after the board or family has had the chance to. ++ POST_FAMILY_TWEAKS_BSP + + # add some summary to the image + fingerprint_image "${destination}/etc/armbian.txt" +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 4090d96e1..36683314d 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -68,10 +68,10 @@ prepare_partitions() { + UEFI_MOUNT_POINT=${UEFI_MOUNT_POINT:-/boot/efi} + UEFI_FS_LABEL="${UEFI_FS_LABEL:-ARMBIEFI}" # Should be always uppercase + +- call_extension_method "pre_prepare_partitions" "prepare_partitions_custom" << 'PRE_PREPARE_PARTITIONS' +-*allow custom options for mkfs* +-Good time to change stuff like mkfs opts, types etc. +-PRE_PREPARE_PARTITIONS ++ call_extension_method "pre_prepare_partitions" "prepare_partitions_custom" <<- 'PRE_PREPARE_PARTITIONS' ++ *allow custom options for mkfs* ++ Good time to change stuff like mkfs opts, types etc. ++ PRE_PREPARE_PARTITIONS + + # stage: determine partition configuration + if [[ -n $BOOTFS_TYPE ]]; then +@@ -117,13 +117,13 @@ PRE_PREPARE_PARTITIONS + export rootfs_size=$(du -sm $SDCARD/ | cut -f1) # MiB + display_alert "Current rootfs size" "$rootfs_size MiB" "info" + +- call_extension_method "prepare_image_size" "config_prepare_image_size" << 'PREPARE_IMAGE_SIZE' +-*allow dynamically determining the size based on the $rootfs_size* +-Called after `${rootfs_size}` is known, but before `${FIXED_IMAGE_SIZE}` is taken into account. +-A good spot to determine `FIXED_IMAGE_SIZE` based on `rootfs_size`. +-UEFISIZE can be set to 0 for no UEFI partition, or to a size in MiB to include one. +-Last chance to set `USE_HOOK_FOR_PARTITION`=yes and then implement create_partition_table hook_point. +-PREPARE_IMAGE_SIZE ++ call_extension_method "prepare_image_size" "config_prepare_image_size" <<- 'PREPARE_IMAGE_SIZE' ++ *allow dynamically determining the size based on the $rootfs_size* ++ Called after `${rootfs_size}` is known, but before `${FIXED_IMAGE_SIZE}` is taken into account. ++ A good spot to determine `FIXED_IMAGE_SIZE` based on `rootfs_size`. ++ UEFISIZE can be set to 0 for no UEFI partition, or to a size in MiB to include one. ++ Last chance to set `USE_HOOK_FOR_PARTITION`=yes and then implement create_partition_table hook_point. ++ PREPARE_IMAGE_SIZE + + if [[ -n $FIXED_IMAGE_SIZE && $FIXED_IMAGE_SIZE =~ ^[0-9]+$ ]]; then + display_alert "Using user-defined image size" "$FIXED_IMAGE_SIZE MiB" "info" +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 8b89d6217..c0aace136 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -47,10 +47,10 @@ create_image_from_sdcard_rootfs() { + run_host_command_logged rsync -aHWXh --info=progress0,stats1 "$SDCARD/boot" "$MOUNT" + fi + +- call_extension_method "pre_update_initramfs" "config_pre_update_initramfs" << 'PRE_UPDATE_INITRAMFS' +-*allow config to hack into the initramfs create process* +-Called after rsync has synced both `/root` and `/root` on the target, but before calling `update_initramfs`. +-PRE_UPDATE_INITRAMFS ++ call_extension_method "pre_update_initramfs" "config_pre_update_initramfs" <<- 'PRE_UPDATE_INITRAMFS' ++ *allow config to hack into the initramfs create process* ++ Called after rsync has synced both `/root` and `/root` on the target, but before calling `update_initramfs`. ++ PRE_UPDATE_INITRAMFS + + # stage: create final initramfs + [[ -n $KERNELSOURCE ]] && { +@@ -82,10 +82,10 @@ PRE_UMOUNT_FINAL_IMAGE + [[ $ROOTFS_TYPE != nfs ]] && umount -l $MOUNT + [[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose $ROOT_MAPPER + +- call_extension_method "post_umount_final_image" "config_post_umount_final_image" << 'POST_UMOUNT_FINAL_IMAGE' +-*allow config to hack into the image after the unmount* +-Called after unmounting both `/root` and `/boot`. +-POST_UMOUNT_FINAL_IMAGE ++ call_extension_method "post_umount_final_image" "config_post_umount_final_image" <<- 'POST_UMOUNT_FINAL_IMAGE' ++ *allow config to hack into the image after the unmount* ++ Called after unmounting both `/root` and `/boot`. ++ POST_UMOUNT_FINAL_IMAGE + + # to make sure its unmounted + while grep -Eq '(${MOUNT}|${DESTIMG})' /proc/mounts; do +@@ -179,13 +179,13 @@ POST_UMOUNT_FINAL_IMAGE + + # Previously, post_build_image passed the .img path as an argument to the hook. Now its an ENV var. + export FINAL_IMAGE_FILE="${DESTIMG}/${version}.img" +- call_extension_method "post_build_image" << 'POST_BUILD_IMAGE' +-*custom post build hook* +-Called after the final .img file is built, before it is (possibly) written to an SD writer. +-- *NOTE*: this hook used to take an argument ($1) for the final image produced. +- - Now it is passed as an environment variable `${FINAL_IMAGE_FILE}` +-It is the last possible chance to modify `$CARD_DEVICE`. +-POST_BUILD_IMAGE ++ call_extension_method "post_build_image" <<- 'POST_BUILD_IMAGE' ++ *custom post build hook* ++ Called after the final .img file is built, before it is (possibly) written to an SD writer. ++ - *NOTE*: this hook used to take an argument ($1) for the final image produced. ++ - Now it is passed as an environment variable `${FINAL_IMAGE_FILE}` ++ It is the last possible chance to modify `$CARD_DEVICE`. ++ POST_BUILD_IMAGE + + # move artefacts from temporally directory to its final destination + [[ -n $compression_type ]] && rm $DESTIMG/${version}.img +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 00a11e47e..3e81d7cd5 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -126,11 +126,11 @@ main_default_build_single() { + 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 ++ 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 + + # Cleanup. Remove the WORKDIR, unset the TMPDIR + unset TMPDIR +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index 9996d4b94..e31c319fb 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -43,10 +43,10 @@ function build_rootfs_and_image() { + # stage: prepare basic rootfs: unpack cache or create from scratch + LOG_SECTION="get_or_create_rootfs_cache_chroot_sdcard" do_with_logging get_or_create_rootfs_cache_chroot_sdcard + +- call_extension_method "pre_install_distribution_specific" "config_pre_install_distribution_specific" << 'PRE_INSTALL_DISTRIBUTION_SPECIFIC' +-*give config a chance to act before install_distribution_specific* +-Called after `create_rootfs_cache` (_prepare basic rootfs: unpack cache or create from scratch_) but before `install_distribution_specific` (_install distribution and board specific applications_). +-PRE_INSTALL_DISTRIBUTION_SPECIFIC ++ call_extension_method "pre_install_distribution_specific" "config_pre_install_distribution_specific" <<- 'PRE_INSTALL_DISTRIBUTION_SPECIFIC' ++ *give config a chance to act before install_distribution_specific* ++ Called after `create_rootfs_cache` (_prepare basic rootfs: unpack cache or create from scratch_) but before `install_distribution_specific` (_install distribution and board specific applications_). ++ PRE_INSTALL_DISTRIBUTION_SPECIFIC + + # stage: install kernel and u-boot packages + # install distribution and board specific applications +diff --git a/lib/functions/rootfs/customize.sh b/lib/functions/rootfs/customize.sh +index 2dc59d712..5405b814f 100644 +--- a/lib/functions/rootfs/customize.sh ++++ b/lib/functions/rootfs/customize.sh +@@ -3,11 +3,11 @@ customize_image() { + # for users that need to prepare files at host + [[ -f $USERPATCHES_PATH/customize-image-host.sh ]] && source "$USERPATCHES_PATH"/customize-image-host.sh + +- call_extension_method "pre_customize_image" "image_tweaks_pre_customize" << 'PRE_CUSTOMIZE_IMAGE' +-*run before customize-image.sh* +-This hook is called after `customize-image-host.sh` is called, but before the overlay is mounted. +-It thus can be used for the same purposes as `customize-image-host.sh`. +-PRE_CUSTOMIZE_IMAGE ++ call_extension_method "pre_customize_image" "image_tweaks_pre_customize" <<- 'PRE_CUSTOMIZE_IMAGE' ++ *run before customize-image.sh* ++ This hook is called after `customize-image-host.sh` is called, but before the overlay is mounted. ++ It thus can be used for the same purposes as `customize-image-host.sh`. ++ PRE_CUSTOMIZE_IMAGE + + cp "$USERPATCHES_PATH"/customize-image.sh "${SDCARD}"/tmp/customize-image.sh + chmod +x "${SDCARD}"/tmp/customize-image.sh +@@ -23,10 +23,10 @@ PRE_CUSTOMIZE_IMAGE + exit_with_error "customize-image.sh exited with error (rc: $CUSTOMIZE_IMAGE_RC)" + fi + +- call_extension_method "post_customize_image" "image_tweaks_post_customize" << 'POST_CUSTOMIZE_IMAGE' +-*post customize-image.sh hook* +-Run after the customize-image.sh script is run, and the overlay is unmounted. +-POST_CUSTOMIZE_IMAGE ++ call_extension_method "post_customize_image" "image_tweaks_post_customize" <<- 'POST_CUSTOMIZE_IMAGE' ++ *post customize-image.sh hook* ++ Run after the customize-image.sh script is run, and the overlay is unmounted. ++ POST_CUSTOMIZE_IMAGE + + return 0 + } +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 0f916b8e6..3d8607de0 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -283,10 +283,10 @@ install_distribution_agnostic() { + fi + } + +- call_extension_method "pre_install_kernel_debs" << 'PRE_INSTALL_KERNEL_DEBS' +-*called before installing the Armbian-built kernel deb packages* +-It is not too late to `unset KERNELSOURCE` here and avoid kernel install. +-PRE_INSTALL_KERNEL_DEBS ++ call_extension_method "pre_install_kernel_debs" <<- 'PRE_INSTALL_KERNEL_DEBS' ++ *called before installing the Armbian-built kernel deb packages* ++ It is not too late to `unset KERNELSOURCE` here and avoid kernel install. ++ PRE_INSTALL_KERNEL_DEBS + + # install kernel + [[ -n $KERNELSOURCE ]] && { +@@ -312,11 +312,11 @@ PRE_INSTALL_KERNEL_DEBS + fi + } + +- call_extension_method "post_install_kernel_debs" << 'POST_INSTALL_KERNEL_DEBS' +-*allow config to do more with the installed kernel/headers* +-Called after packages, u-boot, kernel and headers installed in the chroot, but before the BSP is installed. +-If `KERNELSOURCE` is (still?) unset after this, Armbian-built firmware will not be installed. +-POST_INSTALL_KERNEL_DEBS ++ call_extension_method "post_install_kernel_debs" <<- 'POST_INSTALL_KERNEL_DEBS' ++ *allow config to do more with the installed kernel/headers* ++ Called after packages, u-boot, kernel and headers installed in the chroot, but before the BSP is installed. ++ If `KERNELSOURCE` is (still?) unset after this, Armbian-built firmware will not be installed. ++ POST_INSTALL_KERNEL_DEBS + + # install board support packages + if [[ "${REPOSITORY_INSTALL}" != *bsp* ]]; then +@@ -408,11 +408,11 @@ POST_INSTALL_KERNEL_DEBS + display_alert "Done with family_tweaks" "$BOARD :: $LINUXFAMILY" "debug" + fi + +- call_extension_method "post_family_tweaks" << 'FAMILY_TWEAKS' +-*customize the tweaks made by $LINUXFAMILY-specific family_tweaks* +-It is run after packages are installed in the rootfs, but before enabling additional services. +-It allows implementors access to the rootfs (`${SDCARD}`) in its pristine state after packages are installed. +-FAMILY_TWEAKS ++ call_extension_method "post_family_tweaks" <<- 'FAMILY_TWEAKS' ++ *customize the tweaks made by $LINUXFAMILY-specific family_tweaks* ++ It is run after packages are installed in the rootfs, but before enabling additional services. ++ It allows implementors access to the rootfs (`${SDCARD}`) in its pristine state after packages are installed. ++ FAMILY_TWEAKS + + # enable additional services + chroot_sdcard systemctl --no-reload enable armbian-firstrun.service || true +diff --git a/lib/functions/rootfs/post-tweaks.sh b/lib/functions/rootfs/post-tweaks.sh +index c7cb23ea9..ec26f46af 100644 +--- a/lib/functions/rootfs/post-tweaks.sh ++++ b/lib/functions/rootfs/post-tweaks.sh +@@ -6,10 +6,10 @@ post_debootstrap_tweaks() { + chroot "${SDCARD}" /bin/bash -c "dpkg-divert --quiet --local --rename --remove /sbin/start-stop-daemon" + rm -f "${SDCARD}"/usr/sbin/policy-rc.d "${SDCARD}/usr/bin/${QEMU_BINARY}" + +- call_extension_method "post_post_debootstrap_tweaks" "config_post_debootstrap_tweaks" << 'POST_POST_DEBOOTSTRAP_TWEAKS' +-*run after removing diversions and qemu with chroot unmounted* +-Last chance to touch the `${SDCARD}` filesystem before it is copied to the final media. +-It is too late to run any chrooted commands, since the supporting filesystems are already unmounted. +-POST_POST_DEBOOTSTRAP_TWEAKS ++ call_extension_method "post_post_debootstrap_tweaks" "config_post_debootstrap_tweaks" <<- 'POST_POST_DEBOOTSTRAP_TWEAKS' ++ *run after removing diversions and qemu with chroot unmounted* ++ Last chance to touch the `${SDCARD}` filesystem before it is copied to the final media. ++ It is too late to run any chrooted commands, since the supporting filesystems are already unmounted. ++ POST_POST_DEBOOTSTRAP_TWEAKS + + } + +From cba342a0ce4843cf69144c11ea881e0ce0b6ba40 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 6 Feb 2022 14:39:49 +0100 +Subject: [PATCH] armbian-next: manual merge (8) of all lib/*.sh changes + between revisions 1d499d9ac282d44d4fdb052e5f64fb902688c18f and + 3b7f5b1f3418b7ad7a7c03f2af6d8da66f20bcb9 + +--- + lib/functions/compilation/patching.sh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/compilation/patching.sh b/lib/functions/compilation/patching.sh +index 0d32729ab..99cb31719 100644 +--- a/lib/functions/compilation/patching.sh ++++ b/lib/functions/compilation/patching.sh +@@ -120,26 +120,28 @@ apply_patch_series() { + awk '$0 ~ /^+.*patch$/{print $2}' | + xargs -I % sh -c 'rm -f %' + +- patch --batch --silent --no-backup-if-mismatch -p1 -N < $bzdir/"$p" > $err_pt 2>&1 ++ patch --batch --silent --no-backup-if-mismatch -p1 -N < $bzdir/"$p" >> $err_pt 2>&1 + flag=$? + + case $flag in + 0) +- printf "%-77s [\033[32m done \033[0m]\n" "${p}" +- printf "%-77s [ done ]\n" "${p}" >> "${DEST}"/debug/patching.log ++ printf "[\033[32m done \033[0m] %s\n" "${p}" ++ printf "[ done ] %s\n" "${p}" >> "${DEST}"/debug/patching.log + ;; + 1) +- printf "%-77s [\033[33m FAILED \033[0m]\n" "${p}" +- echo -e "For ${p} \t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log ++ printf "[\033[33m FAILED \033[0m] %s\n" "${p}" ++ echo -e "[ FAILED ] For ${p} \t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log + cat $err_pt >> "${DEST}"/debug/patching.log + ;; + 2) +- printf "%-77s [\033[31m Patch wrong \033[0m]\n" "${p}" ++ printf "[\033[31m Patch wrong \033[0m] %s\n" "${p}" + echo -e "Patch wrong ${p}\t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log + cat $err_pt >> "${DEST}"/debug/patching.log + ;; + esac ++ echo "" > $err_pt + done ++ echo "" >> "${DEST}"/debug/patching.log + rm $err_pt + } + + +From b2b1fdf3dae9193072994369c7b5bac7318366eb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 5 Feb 2022 22:05:21 +0100 +Subject: [PATCH] armbian-next: manual merge (7) of all lib/*.sh changes + between revisions d885bfc97d908b09dddac06393c2987995704d0a and + 1d499d9ac282d44d4fdb052e5f64fb902688c18f + +--- + lib/functions/compilation/extra-drivers.sh | 3 +-- + lib/functions/configuration/main-config.sh | 22 ++++++++++++++++++++-- + lib/functions/general/git.sh | 4 ++-- + lib/functions/image/rootfs-to-image.sh | 14 -------------- + lib/functions/main/default-build.sh | 6 ++++++ + lib/functions/rootfs/distro-agnostic.sh | 5 +++-- + lib/functions/rootfs/distro-specific.sh | 7 +++++++ + 7 files changed, 39 insertions(+), 22 deletions(-) + +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/extra-drivers.sh +index 7fb60c37c..b466c940b 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/extra-drivers.sh +@@ -552,9 +552,8 @@ prepare_extra_kernel_drivers() { + + # Bluetooth support for Realtek 8822CS (hci_ver 0x8) chipsets + # For sunxi, these two patches are applied in a series. +- if linux-version compare "${version}" ge 5.11 && [[ "$LINUXFAMILY" != sunxi* ]] && [[ "$EXTRAWIFI" == yes ]]; then ++ if linux-version compare "${version}" ge 5.11 && [[ "$LINUXFAMILY" != sunxi* ]]; then + display_alert "Adding" "Bluetooth support for Realtek 8822CS (hci_ver 0x8) chipsets" "info" +- + process_patch_file "${SRC}/patch/misc/bluetooth-rtl8822cs-hci_ver-0x8.patch" "applying" + process_patch_file "${SRC}/patch/misc/Bluetooth-hci_h5-Add-power-reset-via-gpio-in-h5_btrt.patch" "applying" + fi +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 5f6a21b1a..1457e6bca 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -42,7 +42,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=13 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=14 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(improved_git remote get-url $(improved_git remote 2> /dev/null | grep origin) 2> /dev/null) + BUILD_REPOSITORY_COMMIT=$(improved_git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) +@@ -58,6 +58,21 @@ function do_main_configuration() { + REPO_CONFIG="aptly.conf" + fi + ++ # image artefact destination with or without subfolder ++ FINALDEST=$DEST/images ++ if [[ "${MAKE_FOLDERS}" == yes ]]; then ++ ++ if [[ "$RC" == yes ]]; then ++ FINALDEST=$DEST/images/"${BOARD}"/RC ++ elif [[ "$BETA" == yes ]]; then ++ FINALDEST=$DEST/images/"${BOARD}"/nightly ++ else ++ FINALDEST=$DEST/images/"${BOARD}"/archive ++ fi ++ ++ install -d ${FINALDEST} ++ fi ++ + # TODO: fixed name can't be used for parallel image building + ROOT_MAPPER="armbian-root" + +@@ -87,7 +102,7 @@ function do_main_configuration() { + china) + [[ -z $USE_MAINLINE_GOOGLE_MIRROR ]] && [[ -z $MAINLINE_MIRROR ]] && MAINLINE_MIRROR=tuna + [[ -z $USE_GITHUB_UBOOT_MIRROR ]] && [[ -z $UBOOT_MIRROR ]] && UBOOT_MIRROR=gitee +- [[ -z $GITHUB_MIRROR ]] && GITHUB_MIRROR=fastgit ++ [[ -z $GITHUB_MIRROR ]] && GITHUB_MIRROR=cnpmjs + [[ -z $DOWNLOAD_MIRROR ]] && DOWNLOAD_MIRROR=china + ;; + *) ;; +@@ -404,6 +419,9 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + + if [[ "${ARCH}" == "amd64" ]]; then + UBUNTU_MIRROR='archive.ubuntu.com/ubuntu' # ports are only for non-amd64, of course. ++ if [[ -n ${CUSTOM_UBUNTU_MIRROR} ]]; then # ubuntu redirector doesn't work well on amd64 ++ UBUNTU_MIRROR="${CUSTOM_UBUNTU_MIRROR}" ++ fi + fi + + # don't use mirrors that throws garbage on 404 +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 6d0bda152..a02faa1f2 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -70,7 +70,7 @@ waiter_local_repo() { + mkdir -p $work_dir + cd $work_dir || exit_with_error + +- display_alert "Checking git sources" "$dir $name/$branch" "info" ++ display_alert "Checking git sources" "$dir $url$name/$branch" "info" + + if [ "$(git rev-parse --git-dir 2> /dev/null)" != ".git" ]; then + git init -q . +@@ -80,7 +80,7 @@ waiter_local_repo() { + ( + $VAR_SHALLOW_ORIGINAL + +- display_alert "Add original git sources" "$dir $name/$branch" "info" ++ display_alert "Add original git sources" "$dir $url$name/$branch" "info" + if [ "$(git ls-remote -h $url $branch | + awk -F'/' '{if (NR == 1) print $NF}')" != "$branch" ]; then + display_alert "Bad $branch for $url in $VAR_SHALLOW_ORIGINAL" +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index b62ad1f5c..8b89d6217 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -101,20 +101,6 @@ POST_UMOUNT_FINAL_IMAGE + mkdir -p $DESTIMG + mv ${SDCARD}.raw $DESTIMG/${version}.img + +- FINALDEST=$DEST/images +- [[ "${BUILD_ALL}" == yes ]] && MAKE_FOLDERS="yes" +- +- if [[ "${MAKE_FOLDERS}" == yes ]]; then +- if [[ "$RC" == yes ]]; then +- FINALDEST=$DEST/images/"${BOARD}"/RC +- elif [[ "$BETA" == yes ]]; then +- FINALDEST=$DEST/images/"${BOARD}"/nightly +- else +- FINALDEST=$DEST/images/"${BOARD}"/archive +- fi +- install -d ${FINALDEST} +- fi +- + # custom post_build_image_modify hook to run before fingerprinting and compression + [[ $(type -t post_build_image_modify) == function ]] && display_alert "Custom Hook Detected" "post_build_image_modify" "info" && post_build_image_modify "${DESTIMG}/${version}.img" + +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 34aafb1d0..00a11e47e 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -101,6 +101,12 @@ main_default_build_single() { + 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 +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index d48879929..0f916b8e6 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -152,7 +152,6 @@ install_distribution_agnostic() { + + # create extlinux config file @TODO: refactor into extensions u-boot, extlinux + if [[ $SRC_EXTLINUX == yes ]]; then +- + mkdir -p $SDCARD/boot/extlinux + cat <<- EOF > "$SDCARD/boot/extlinux/extlinux.conf" + LABEL ${VENDOR} +@@ -160,7 +159,9 @@ install_distribution_agnostic() { + INITRD /boot/$NAME_INITRD + EOF + if [[ -n $BOOT_FDT_FILE ]]; then +- echo " FDT /boot/dtb/$BOOT_FDT_FILE" >> "$SDCARD/boot/extlinux/extlinux.conf" ++ if [[ $BOOT_FDT_FILE != "none" ]]; then ++ echo " FDT /boot/dtb/$BOOT_FDT_FILE" >> "$SDCARD/boot/extlinux/extlinux.conf" ++ fi + else + echo " FDTDIR /boot/dtb/" >> "$SDCARD/boot/extlinux/extlinux.conf" + fi +diff --git a/lib/functions/rootfs/distro-specific.sh b/lib/functions/rootfs/distro-specific.sh +index 7ba7e19e7..4770af4bc 100644 +--- a/lib/functions/rootfs/distro-specific.sh ++++ b/lib/functions/rootfs/distro-specific.sh +@@ -78,6 +78,13 @@ install_distribution_specific() { + chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload mask ondemand.service >/dev/null 2>&1" + ;; + esac ++ ++ # use list modules INITRAMFS ++ if [ -f "${SRC}"/config/modules/"${MODULES_INITRD}" ]; then ++ display_alert "Use file list modules INITRAMFS" "${MODULES_INITRD}" ++ sed -i "s/^MODULES=.*/MODULES=list/" "${SDCARD}"/etc/initramfs-tools/initramfs.conf ++ cat "${SRC}"/config/modules/"${MODULES_INITRD}" >> "${SDCARD}"/etc/initramfs-tools/modules ++ fi + } + + # create_sources_list + +From b2849431e1736e9bae4eeddd3ef363a058352465 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 30 Jan 2022 22:21:50 +0100 +Subject: [PATCH] armbian-next: manual merge (6) of all lib/*.sh changes + between revisions c7f3c239fe93f8fcfdd1b1edf6f11e143802e379 and + d885bfc97d908b09dddac06393c2987995704d0a + +--- + lib/functions/compilation/extra-drivers.sh | 4 ++-- + lib/functions/compilation/patching.sh | 12 ++++++------ + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/general/git.sh | 8 ++------ + lib/functions/rootfs/create-cache.sh | 3 ++- + 5 files changed, 13 insertions(+), 16 deletions(-) + +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/extra-drivers.sh +index d45913f32..7fb60c37c 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/extra-drivers.sh +@@ -551,8 +551,8 @@ prepare_extra_kernel_drivers() { + fi + + # Bluetooth support for Realtek 8822CS (hci_ver 0x8) chipsets +- +- if linux-version compare "${version}" ge 5.11 && [ "$EXTRAWIFI" == yes ]; then ++ # For sunxi, these two patches are applied in a series. ++ if linux-version compare "${version}" ge 5.11 && [[ "$LINUXFAMILY" != sunxi* ]] && [[ "$EXTRAWIFI" == yes ]]; then + display_alert "Adding" "Bluetooth support for Realtek 8822CS (hci_ver 0x8) chipsets" "info" + + process_patch_file "${SRC}/patch/misc/bluetooth-rtl8822cs-hci_ver-0x8.patch" "applying" +diff --git a/lib/functions/compilation/patching.sh b/lib/functions/compilation/patching.sh +index 861054de2..0d32729ab 100644 +--- a/lib/functions/compilation/patching.sh ++++ b/lib/functions/compilation/patching.sh +@@ -106,8 +106,8 @@ apply_patch_series() { + local flag + local err_pt=$(mktemp /tmp/apply_patch_series_XXXXX) # @OTODO: rpardini: hmm, why is this different from all others? + +- list=$(gawk '$0 !~ /^#.*|^-.*|^$/' "${series}") +- skiplist=$(gawk '$0 ~ /^-.*/' "${series}") ++ list=$(awk '$0 !~ /^#.*|^-.*|^$/' "${series}") ++ skiplist=$(awk '$0 ~ /^-.*/{print $NF}' "${series}") + + display_alert "apply a series of " "[$(echo $list | wc -w)] patches" + display_alert "skip [$(echo $skiplist | wc -w)] patches" +@@ -125,16 +125,16 @@ apply_patch_series() { + + case $flag in + 0) +- printf "%-72s [\033[32m done \033[0m]\n" "${p#*/}" +- printf "%-72s [ done ]\n" "${p#*/}" >> "${DEST}"/debug/patching.log ++ printf "%-77s [\033[32m done \033[0m]\n" "${p}" ++ printf "%-77s [ done ]\n" "${p}" >> "${DEST}"/debug/patching.log + ;; + 1) +- printf "%-72s [\033[33m FAILED \033[0m]\n" "${p#*/}" ++ printf "%-77s [\033[33m FAILED \033[0m]\n" "${p}" + echo -e "For ${p} \t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log + cat $err_pt >> "${DEST}"/debug/patching.log + ;; + 2) +- printf "%-72s [\033[31m Patch wrong \033[0m]\n" "${p#*/}" ++ printf "%-77s [\033[31m Patch wrong \033[0m]\n" "${p}" + echo -e "Patch wrong ${p}\t\tprocess exit [ $flag ]" >> "${DEST}"/debug/patching.log + cat $err_pt >> "${DEST}"/debug/patching.log + ;; +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 0acb3b671..5f6a21b1a 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -42,7 +42,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=12 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=13 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(improved_git remote get-url $(improved_git remote 2> /dev/null | grep origin) 2> /dev/null) + BUILD_REPOSITORY_COMMIT=$(improved_git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index e4a03f278..6d0bda152 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -91,12 +91,8 @@ waiter_local_repo() { + + # Handle an exception if the initial tag is the top of the branch + # As v5.16 == HEAD +- if $( +- git ls-remote -t $url ${start_tag}\* | +- awk -F'/' '$NF !~ /v[4-5][.][1-9]{1,2}[.][1]$/ { +- exit 1 +- }' +- ); then ++ if [ "${start_tag}.1" == "$(git ls-remote -t $url ${start_tag}.1 | ++ awk -F'/' '{ print $NF }')" ]; then + git fetch --shallow-exclude=$start_tag $name + else + git fetch --depth 1 $name +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index 13e2565fd..c83cdaf99 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -231,6 +231,7 @@ function create_new_rootfs_cache() { + } + + # stage: remove downloaded packages ++ chroot_sdcard_apt_get autoremove + chroot_sdcard_apt_get clean + + # DEBUG: print free space +@@ -260,7 +261,7 @@ function create_new_rootfs_cache() { + umount_chroot "$SDCARD" + + tar cp --xattrs --directory=$SDCARD/ --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \ +- --exclude='./sys/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | lz4 -5 -c > "$cache_fname" ++ --exclude='./sys/*' --exclude='./home/*' --exclude='./root/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | lz4 -5 -c > "$cache_fname" + + # sign rootfs cache archive that it can be used for web cache once. Internal purposes + if [[ -n "${GPG_PASS}" && "${SUDO_USER}" ]]; then + +From 4fcb0204e5df9bc6c540806096def9ce8e3126e1 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 24 Jan 2022 00:16:42 +0100 +Subject: [PATCH] armbian-next: avoid writing to disk during configuration; + `ANSI_COLOR=none` logging; make CONFIG_DEFS_ONLY=yes runnable without sudo + +- when `CONFIG_DEFS_ONLY=yes`, avoid writing the config summary output.log file. + - refactor that into a function as to be easy to if-out-of + - don't write to disk during aggregate_content() if `CONFIG_DEFS_ONLY=yes` + - don't write to disk during show_checklist_variables() if `CONFIG_DEFS_ONLY=yes` + - don't write to disk during write_deboostrap_list_debug_log() if `CONFIG_DEFS_ONLY=yes` + - don't compress and rotate logs if `CONFIG_DEFS_ONLY=yes` +- don't pretend to be handling errors we can't handle during var capture +- I foresee a world we can build all .debs without sudo +- and a some kind of split of codebase entrypoint due to that future feature +- some python info.py enhancements, not ready yet +--- + lib/extensions.sh | 13 ++-- + lib/functions/cli/cli-entrypoint.sh | 7 ++- + lib/functions/configuration/aggregation.sh | 2 + + lib/functions/configuration/main-config.sh | 39 +++++++----- + lib/functions/logging/capture.sh | 11 ++-- + lib/functions/logging/logging.sh | 6 ++ + lib/functions/main/config-prepare.sh | 32 +++++----- + lib/tools/info.py | 95 ++++++++++++++++++++++++------ + 8 files changed, 142 insertions(+), 63 deletions(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 5398de20f..516700bbb 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -61,13 +61,13 @@ initialize_extension_manager() { + # This marks the manager as initialized, no more extensions are allowed to load after this. + export initialize_extension_manager_counter=$((initialize_extension_manager_counter + 1)) + +- # Extensions has its own work/tmp directory, defined by do_main_configuration, with build UUID. We just create it here. +- display_alert "EXTENSION_MANAGER_TMP_DIR" "${EXTENSION_MANAGER_TMP_DIR}" "debug" ++ # Extensions has its own work/tmp directory, defined by do_main_configuration, with build UUID. We just create it here, unless told not to. ++ display_alert "Initializing EXTENSION_MANAGER_TMP_DIR" "${EXTENSION_MANAGER_TMP_DIR}" "debug" + mkdir -p "${EXTENSION_MANAGER_TMP_DIR}" + + # Log destination. + export EXTENSION_MANAGER_LOG_FILE="${EXTENSION_MANAGER_TMP_DIR}/extensions.log" +- echo -n "" > "${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt" ++ [[ "${WRITE_EXTENSIONS_METADATA:-yes}" == "no" ]] && echo -n "" > "${EXTENSION_MANAGER_TMP_DIR}/hook_point_calls.txt" + + # globally initialize the extensions log. + echo "-- lib/extensions.sh included. logs will be below, followed by the debug generated by the initialize_extension_manager() function." > "${EXTENSION_MANAGER_LOG_FILE}" +@@ -87,7 +87,7 @@ initialize_extension_manager() { + declare -i hook_points_counter=0 hook_functions_counter=0 hook_point_functions_counter=0 + + # initialize the cleanups file. +- fragment_manager_cleanup_file="${SRC}"/.tmp/extension_function_cleanup.sh ++ fragment_manager_cleanup_file="${EXTENSION_MANAGER_TMP_DIR}/extension_function_cleanup.sh" + echo "# cleanups: " > "${fragment_manager_cleanup_file}" + + local FUNCTION_SORT_OPTIONS="--general-numeric-sort --ignore-case" # --random-sort could be used to introduce chaos +@@ -255,7 +255,7 @@ cleanup_extension_manager() { + # this will unset all the functions. + # shellcheck disable=SC1090 # dynamic source, thanks, shellcheck + source "${fragment_manager_cleanup_file}" +- rm "${fragment_manager_cleanup_file}" # remove the cleanup file ++ # file is removed together with EXTENSION_MANAGER_TMP_DIR below. + fi + # cleanup our tmpdir. + if [[ -d "${EXTENSION_MANAGER_TMP_DIR}" ]]; then +@@ -298,6 +298,9 @@ EXTENSION_METADATA_READY + + # This is called by call_extension_method(). To say the truth, this should be in an extension. But then it gets too meta for anyone's head. + write_hook_point_metadata() { ++ # Dont do anything if told not to. ++ [[ "${WRITE_EXTENSIONS_METADATA:-yes}" == "no" ]] && return 0 ++ + local main_hook_point_name="$1" + + [[ ! -d "${EXTENSION_MANAGER_TMP_DIR}" ]] && mkdir -p "${EXTENSION_MANAGER_TMP_DIR}" +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index b16ea387d..587348b01 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -15,8 +15,8 @@ function cli_entrypoint() { + : + elif [[ "${1}" == docker || "${1}" == dockerpurge || "${1}" == docker-shell ]] && grep -q "$(whoami)" <(getent group docker); then + : +- elif [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then # not really building in this case, just gathering meta-data. +- : ++ elif [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then # this var is set in the ENVIRONMENT, not as parameter. ++ display_alert "No sudo for" "env CONFIG_DEFS_ONLY=yes" "debug" # not really building in this case, just gathering meta-data. + else + display_alert "This script requires root privileges, trying to use sudo" "" "wrn" + sudo "${SRC}/compile.sh" "$@" +@@ -115,7 +115,8 @@ function cli_entrypoint() { + do_capturing_defs prepare_and_config_main_build_single # this sets CAPTURED_VARS + + if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then +- echo "${CAPTURED_VARS}" # to stdout! ++ echo "${CAPTURED_VARS}" # to stdout! ++ cleanup_extension_manager # manually cleanup extension manager before exiting + return 0 + else + unset CAPTURED_VARS +diff --git a/lib/functions/configuration/aggregation.sh b/lib/functions/configuration/aggregation.sh +index c57529ca7..e89275995 100644 +--- a/lib/functions/configuration/aggregation.sh ++++ b/lib/functions/configuration/aggregation.sh +@@ -5,6 +5,7 @@ + # Write to variables : + # - aggregated_content + aggregate_content() { ++ [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] && return 0 # Don't write to disk in this case. + LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/potential-paths.log" + echo -e "Potential paths :" >> "${LOG_OUTPUT_FILE}" + show_checklist_variables potential_paths +@@ -117,6 +118,7 @@ cleanup_list() { + # before calling the `show_checklist_variables` function and unset after. + # + show_checklist_variables() { ++ [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] && return 0 # Don't write to disk in this case. + local checklist=$* + local var pval + local log_file=${LOG_OUTPUT_FILE:-"${SRC}"/output/${LOG_SUBPATH}/trash.log} +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 4cc607176..0acb3b671 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -491,33 +491,42 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + PACKAGE_MAIN_LIST="$(echo ${PACKAGE_MAIN_LIST})" + fi + +- LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/debootstrap-list.log" +- echo -e "\nVariables after manual configuration" >> $LOG_OUTPUT_FILE +- show_checklist_variables "DEBOOTSTRAP_COMPONENTS DEBOOTSTRAP_LIST PACKAGE_LIST PACKAGE_MAIN_LIST" +- unset LOG_OUTPUT_FILE ++ [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] || write_deboostrap_list_debug_log + + # Give the option to configure DNS server used in the chroot during the build process + [[ -z $NAMESERVER ]] && NAMESERVER="1.0.0.1" # default is cloudflare alternate + +- call_extension_method "post_aggregate_packages" "user_config_post_aggregate_packages" << 'POST_AGGREGATE_PACKAGES' +-*For final user override, using a function, after all aggregations are done* +-Called after aggregating all package lists, before the end of `compilation.sh`. +-Packages will still be installed after this is called, so it is the last chance +-to confirm or change any packages. +-POST_AGGREGATE_PACKAGES ++ call_extension_method "post_aggregate_packages" "user_config_post_aggregate_packages" <<- 'POST_AGGREGATE_PACKAGES' ++ *For final user override, using a function, after all aggregations are done* ++ Called after aggregating all package lists, before the end of `compilation.sh`. ++ Packages will still be installed after this is called, so it is the last chance ++ to confirm or change any packages. ++ POST_AGGREGATE_PACKAGES + +- local build_script_env_file="${DEST}/${LOG_SUBPATH}/output.log" +- display_alert "Writing build config summary to" "${build_script_env_file}" "debug" ++ # If not only capturing defs, write the output file. This an early write to disk, and @TODO: should be moved later into the configuration phase ++ [[ "${CONFIG_DEFS_ONLY}" == "yes" ]] || write_config_summary_output_file + +- # debug ++ display_alert "Done with main-config.sh" "do_main_configuration" "debug" ++} ++ ++function write_deboostrap_list_debug_log() { ++ LOG_OUTPUT_FILE="$SRC/output/${LOG_SUBPATH}/debootstrap-list.log" ++ echo -e "\nVariables after manual configuration" >> $LOG_OUTPUT_FILE ++ show_checklist_variables "DEBOOTSTRAP_COMPONENTS DEBOOTSTRAP_LIST PACKAGE_LIST PACKAGE_MAIN_LIST" ++ unset LOG_OUTPUT_FILE ++} ++ ++function write_config_summary_output_file() { ++ local build_script_env_file="${DEST}/${LOG_SUBPATH}/output.log" + local debug_dpkg_arch debug_uname debug_virt debug_src_mount debug_src_perms debug_src_temp_perms + debug_dpkg_arch="$(dpkg --print-architecture)" + debug_uname="$(uname -a)" +- debug_virt="$(systemd-detect-virt)" ++ debug_virt="$(systemd-detect-virt || true)" + debug_src_mount="$(findmnt -o TARGET,SOURCE,FSTYPE,AVAIL -T "${SRC}")" + debug_src_perms="$(getfacl -p "${SRC}")" + debug_src_temp_perms="$(getfacl -p "${SRC}"/.tmp 2> /dev/null)" + ++ display_alert "Writing build config summary to" "${build_script_env_file}" "debug" + cat <<- EOF >> "${build_script_env_file}" + ## BUILD SCRIPT ENVIRONMENT + +@@ -565,6 +574,4 @@ POST_AGGREGATE_PACKAGES + + CPU configuration: $CPUMIN - $CPUMAX with $GOVERNOR + EOF +- +- display_alert "Done with main-config.sh" "do_main_configuration" "debug" + } +diff --git a/lib/functions/logging/capture.sh b/lib/functions/logging/capture.sh +index 660068c89..775923419 100644 +--- a/lib/functions/logging/capture.sh ++++ b/lib/functions/logging/capture.sh +@@ -1,10 +1,11 @@ + function do_capturing_defs() { + # make sure to local with a value, otherwise they will appear in the list... +- local pre_exec_vars="" exit_code=0 post_exec_vars="" new_vars_list="" onevar="" all_vars_array=() ++ local pre_exec_vars="" post_exec_vars="" new_vars_list="" onevar="" all_vars_array=() + pre_exec_vars="$(compgen -A variable | grep -E '[[:upper:]]+' | grep -v -e "^BASH_" | sort)" + +- # run parameters passed +- "$@" || exit_code=$? ++ # run parameters passed. if this fails, so will we, immediately, and not capture anything correctly. ++ # if you ever find stacks referring here, please look at the caller and $1 ++ "$@" + + post_exec_vars="$(compgen -A variable | grep -E '[[:upper:]]+' | grep -v -e "^BASH_" | sort)" + new_vars_list="$(comm -13 <(echo "$pre_exec_vars") <(echo "${post_exec_vars}"))" +@@ -14,9 +15,9 @@ function do_capturing_defs() { + all_vars_array+=("$(declare -p "${onevar}")") + done + #IFS=$'\n' +- CAPTURED_VARS="${all_vars_array[*]}" ++ export CAPTURED_VARS="${all_vars_array[*]}" + #display_alert "Vars defined during ${*@Q}:" "${CAPTURED_VARS}" "debug" + unset all_vars_array post_exec_vars new_vars_list pre_exec_vars onevar join_by + +- return ${exit_code} ++ return 0 # return success explicitly , preemptively preventing short-circuit problems. + } +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 66aeb9d40..90a376608 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -103,6 +103,12 @@ display_alert() { + echo "--> A: [" "$@" "]" >> "${CURRENT_LOGFILE}" + fi + ++ # If asked, avoid any fancy ANSI escapes completely. ++ if [[ "${ANSI_COLOR}" == "none" ]]; then ++ echo "${@}" >&2 ++ return 0 ++ fi ++ + local message="$1" level="$3" # params + local level_indicator="" inline_logs_color="" extra="" ci_log="" # this log + case "${level}" in +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index cad494207..b416b1302 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -17,23 +17,25 @@ function prepare_and_config_main_build_single() { + [[ -z $LANGUAGE ]] && export LANGUAGE="en_US:en" # set to english if not set + [[ -z $CONSOLE_CHAR ]] && export CONSOLE_CHAR="UTF-8" # set console to UTF-8 if not set + +- # set log path +- LOG_SUBPATH=${LOG_SUBPATH:=debug} +- mkdir -p "${DEST}/${LOG_SUBPATH}" # This creates the logging output. +- +- # compress and remove old logs, if they exist. +- if [[ -f "${DEST}/${LOG_SUBPATH}/timestamp" ]]; then +- if ls "${DEST}/${LOG_SUBPATH}/"*.log &> /dev/null; then +- display_alert "Archiving previous build logs..." "${DEST}/${LOG_SUBPATH}" "info" +- (cd "${DEST}/${LOG_SUBPATH}" && tar -czf logs-"$(< timestamp)".tgz ./*.log) # > /dev/null 2>&1 +- rm -f "${DEST}/${LOG_SUBPATH}"/*.log ++ if [[ "${CONFIG_DEFS_ONLY}" != "yes" ]]; then ++ # set log path ++ LOG_SUBPATH=${LOG_SUBPATH:=debug} ++ mkdir -p "${DEST}/${LOG_SUBPATH}" # This creates the logging output. ++ ++ # compress and remove old logs, if they exist. ++ if [[ -f "${DEST}/${LOG_SUBPATH}/timestamp" ]]; then ++ if ls "${DEST}/${LOG_SUBPATH}/"*.log &> /dev/null; then ++ display_alert "Archiving previous build logs..." "${DEST}/${LOG_SUBPATH}" "info" ++ (cd "${DEST}/${LOG_SUBPATH}" && tar -czf logs-"$(< timestamp)".tgz ./*.log) # > /dev/null 2>&1 ++ rm -f "${DEST}/${LOG_SUBPATH}"/*.log ++ fi ++ # delete compressed logs older than 7 days ++ find "${DEST}"/${LOG_SUBPATH} -name '*.tgz' -mtime +7 -delete + fi +- # delete compressed logs older than 7 days +- find "${DEST}"/${LOG_SUBPATH} -name '*.tgz' -mtime +7 -delete +- fi + +- # Mark a timestamp, for next build. +- date +"%d_%m_%Y-%H_%M_%S" > "${DEST}"/${LOG_SUBPATH}/timestamp ++ # Mark a timestamp, for next build. ++ date +"%d_%m_%Y-%H_%M_%S" > "${DEST}"/${LOG_SUBPATH}/timestamp ++ fi + + # PROGRESS_LOG_TO_FILE is either yes, or unset. (@TODO: this is still used in buildpkg) + if [[ $PROGRESS_LOG_TO_FILE != yes ]]; then unset PROGRESS_LOG_TO_FILE; fi +diff --git a/lib/tools/info.py b/lib/tools/info.py +index 308d482e7..af932eefa 100755 +--- a/lib/tools/info.py ++++ b/lib/tools/info.py +@@ -1,4 +1,4 @@ +-#!/bin/env python3 ++#!/usr/bin/env python3 + import concurrent.futures + import glob + import json +@@ -18,11 +18,12 @@ def armbian_value_parse_list(item_value): + + + def get_all_boards_list_from_armbian(src_path): +- ret = [] ++ ret = {} + for file in glob.glob(src_path + "/config/boards/*.*"): + stem = Path(file).stem + if stem != "README": +- ret.append(stem) ++ ret[stem] = file ++ # return ret + return ret + + +@@ -42,10 +43,26 @@ def map_to_armbian_params(map_params): + + + def run_armbian_compile_and_parse(path_to_compile_sh, compile_params): +- result = subprocess.run( +- [path_to_compile_sh] + map_to_armbian_params(compile_params), +- stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, universal_newlines=True +- ) ++ exec_cmd = ([path_to_compile_sh] + map_to_armbian_params(compile_params)) ++ # print(exec_cmd) ++ try: ++ result = subprocess.run( ++ exec_cmd, ++ stdout=subprocess.PIPE, check=True, universal_newlines=True, ++ env={ ++ "CONFIG_DEFS_ONLY": "yes", # Dont do anything. Just output vars. ++ "ANSI_COLOR": "none", # Do not use ANSI colors in logging output ++ "WRITE_EXTENSIONS_METADATA": "no" # Not interested in ext meta here ++ }, ++ stderr=subprocess.PIPE ++ ) ++ except subprocess.CalledProcessError as e: ++ eprint( ++ "Error calling Armbian: params: {}, return code: {}, stderr: {}".format( ++ compile_params, e.returncode, e.stderr ++ ) ++ ) ++ raise e + + # Now parse it with regex-power! + # regex = r"^declare (..) (.*?)=\"(.*?)\"$" # old multiline version +@@ -66,7 +83,11 @@ def run_armbian_compile_and_parse(path_to_compile_sh, compile_params): + + all_keys[key] = value + +- return {"in": compile_params, "out": all_keys, "logs": result.stderr.split("\n")} ++ logs = ["Not available"] ++ if result.stderr: ++ logs = result.stderr.split("\n") ++ ++ return {"in": compile_params, "out": all_keys, "logs": logs} + + + # Find the location of compile.sh, relative to this Python script. +@@ -90,25 +111,53 @@ common_compile_params = { + "CLOUD_IMAGE": "yes", + "CLEAN_LEVEL": "debs", + "SHOW_LOG": "yes", ++ "SKIP_EXTERNAL_TOOLCHAINS": "yes", + "CONFIG_DEFS_ONLY": "yes", + "KERNEL_CONFIGURE": "no", + "EXPERT": "yes" + } + + board_compile_params = { +- "BOARD": "uefi-x86", +- "BRANCH": "current", + "RELEASE": "impish", + "BUILD_DESKTOP": "no" + } + + +-def get_info_for_one_board(board_name, common_params): +- eprint("Getting info for board '{}'".format(board_name)) ++# I've to read the first line from the board file, that's the hardware description in a pound comment. ++# Also, 'KERNEL_TARGET="legacy,current,edge"' which we need to parse. ++def parse_board_file_for_static_info(board_file, board_id): ++ file_handle = open(board_file, 'r') ++ file_lines = file_handle.readlines() ++ file_handle.close() ++ ++ file_lines.reverse() ++ hw_desc_line = file_lines.pop() ++ hw_desc_clean = hw_desc_line.strip("# ").strip("\n") ++ ++ # Parse KERNEL_TARGET line. ++ kernel_target_matches = re.findall(r"^KERNEL_TARGET=\"(.*)\"", "\n".join(file_lines), re.MULTILINE) ++ kernel_targets = kernel_target_matches[0].split(",") ++ eprint("Possible kernel branches for board: ", board_id, " : ", kernel_targets) ++ ++ return { ++ "BOARD_FILE_HARDWARE_DESC": hw_desc_clean, ++ "BOARD_POSSIBLE_BRANCHES": kernel_targets, ++ "BOARD_DESC_ID": board_id ++ } ++ ++ ++def get_info_for_one_board(board_file, board_name, common_params, board_info): ++ eprint( ++ "Getting info for board '{}' branch '{}' in file '{}'".format( ++ board_name, common_params["BRANCH"], board_file ++ ) ++ ) ++ ++ # eprint("Running Armbian bash for board '{}'".format(board_name)) + try: + parsed = run_armbian_compile_and_parse(compile_sh_full_path, common_params | {"BOARD": board_name}) + # print(json.dumps(parsed, indent=4, sort_keys=True)) +- return parsed ++ return parsed | board_info + except: + eprint("Failed get info for board '{}'".format(board_name)) + return None +@@ -116,16 +165,24 @@ def get_info_for_one_board(board_name, common_params): + + if True: + all_boards = get_all_boards_list_from_armbian(armbian_src_path) +- # print(json.dumps(all_boards, indent=4, sort_keys=True)) ++ # eprint(json.dumps(all_boards, indent=4, sort_keys=True)) + + every_info = [] + with concurrent.futures.ProcessPoolExecutor(max_workers=32) as executor: + every_future = [] +- for board in all_boards: +- all_params = common_compile_params | board_compile_params +- eprint("Submitting future for board {}".format(board)) +- future = executor.submit(get_info_for_one_board, board, all_params) +- every_future.append(future) ++ for board in all_boards.keys(): ++ try: ++ board_info = parse_board_file_for_static_info(all_boards[board], board) ++ except: ++ eprint("** Failed to parse board file {} static.".format(board)) ++ continue ++ ++ for possible_branch in board_info["BOARD_POSSIBLE_BRANCHES"]: ++ all_params = common_compile_params | board_compile_params | {"BRANCH": possible_branch} ++ eprint("Submitting future for board {} with BRANCH={}".format(board, possible_branch)) ++ future = executor.submit(get_info_for_one_board, all_boards[board], board, all_params, ++ board_info) ++ every_future.append(future) + + eprint("Waiting for all futures...") + executor.shutdown(wait=True) + +From c7785c788f81bce938f2af6b3d576ba9834433b7 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 23 Jan 2022 23:00:17 +0100 +Subject: [PATCH] armbian-next: shellfmt and regen library (after rebase from + master n.5) + +--- + lib/functions/compilation/atf.sh | 2 +- + lib/functions/logging/logging.sh | 4 +- + lib/functions/rootfs/create-cache.sh | 2 +- + lib/library-functions.sh | 365 +++++++++++++++++------------------ + 4 files changed, 186 insertions(+), 187 deletions(-) + +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index d2a30d09f..91ca8aaf1 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -57,7 +57,7 @@ compile_atf() { + + [[ $(type -t atf_custom_postprocess) == function ]] && atf_custom_postprocess 2>&1 + +- atftempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. ++ atftempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 ${atftempdir} + + # copy files to temp directory +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 5981d9547..66aeb9d40 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -4,7 +4,7 @@ function logging_init() { + # globals + export padding="" left_marker="[" right_marker="]" + export normal_color="\x1B[0m" gray_color="\e[1;30m" # "bright black", which is grey +- declare -i logging_section_counter=0 # -i: integer ++ declare -i logging_section_counter=0 # -i: integer + export logging_section_counter + } + +@@ -45,7 +45,7 @@ function do_with_logging() { + export CURRENT_LOGGING_COUNTER + CURRENT_LOGGING_COUNTER="$(printf "%03d" "$logging_section_counter")" + export CURRENT_LOGGING_SECTION=${LOG_SECTION:-build} # default to "build" +- export CURRENT_LOGGING_DIR="${DEST}/${LOG_SUBPATH}" # origin: build-all-ng - @TODO: rpardini: lets revisit this later ++ export CURRENT_LOGGING_DIR="${DEST}/${LOG_SUBPATH}" # origin: build-all-ng - @TODO: rpardini: lets revisit this later + export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${CURRENT_LOGGING_SECTION}.log" + mkdir -p "${CURRENT_LOGGING_DIR}" + +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index f969159cf..13e2565fd 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -279,7 +279,7 @@ get_package_list_hash() { + local list_content + read -ra package_arr <<< "${DEBOOTSTRAP_LIST} ${PACKAGE_LIST}" + read -ra exclude_arr <<< "${PACKAGE_LIST_EXCLUDE}" +- ( ++ ( + ( + printf "%s\n" "${package_arr[@]}" + printf -- "-%s\n" "${exclude_arr[@]}" +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 09139086b..f7a679dcc 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -1,97 +1,97 @@ + #!/usr/bin/env bash + # This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/repo.sh +-# shellcheck source=lib/functions/general/repo.sh +-source "${SRC}"/lib/functions/general/repo.sh ++### lib/functions/bsp/bsp-cli.sh ++# shellcheck source=lib/functions/bsp/bsp-cli.sh ++source "${SRC}"/lib/functions/bsp/bsp-cli.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/host.sh +-# shellcheck source=lib/functions/general/host.sh +-source "${SRC}"/lib/functions/general/host.sh ++### lib/functions/bsp/bsp-desktop.sh ++# shellcheck source=lib/functions/bsp/bsp-desktop.sh ++source "${SRC}"/lib/functions/bsp/bsp-desktop.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/git.sh +-# shellcheck source=lib/functions/general/git.sh +-source "${SRC}"/lib/functions/general/git.sh ++### lib/functions/bsp/utils-bsp.sh ++# shellcheck source=lib/functions/bsp/utils-bsp.sh ++source "${SRC}"/lib/functions/bsp/utils-bsp.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/downloads.sh +-# shellcheck source=lib/functions/general/downloads.sh +-source "${SRC}"/lib/functions/general/downloads.sh ++### lib/functions/cli/cli-entrypoint.sh ++# shellcheck source=lib/functions/cli/cli-entrypoint.sh ++source "${SRC}"/lib/functions/cli/cli-entrypoint.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/cleaning.sh +-# shellcheck source=lib/functions/general/cleaning.sh +-source "${SRC}"/lib/functions/general/cleaning.sh ++### lib/functions/cli/utils-cli.sh ++# shellcheck source=lib/functions/cli/utils-cli.sh ++source "${SRC}"/lib/functions/cli/utils-cli.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/general/chroot-helpers.sh +-# shellcheck source=lib/functions/general/chroot-helpers.sh +-source "${SRC}"/lib/functions/general/chroot-helpers.sh ++### lib/functions/compilation/atf.sh ++# shellcheck source=lib/functions/compilation/atf.sh ++source "${SRC}"/lib/functions/compilation/atf.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/extras/buildpkg.sh +-# shellcheck source=lib/functions/extras/buildpkg.sh +-source "${SRC}"/lib/functions/extras/buildpkg.sh ++### lib/functions/compilation/debs.sh ++# shellcheck source=lib/functions/compilation/debs.sh ++source "${SRC}"/lib/functions/compilation/debs.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/extras/fel.sh +-# shellcheck source=lib/functions/extras/fel.sh +-source "${SRC}"/lib/functions/extras/fel.sh ++### lib/functions/compilation/extra-drivers.sh ++# shellcheck source=lib/functions/compilation/extra-drivers.sh ++source "${SRC}"/lib/functions/compilation/extra-drivers.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/debs.sh +-# shellcheck source=lib/functions/compilation/debs.sh +-source "${SRC}"/lib/functions/compilation/debs.sh ++### lib/functions/compilation/kernel.sh ++# shellcheck source=lib/functions/compilation/kernel.sh ++source "${SRC}"/lib/functions/compilation/kernel.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/uboot.sh +-# shellcheck source=lib/functions/compilation/uboot.sh +-source "${SRC}"/lib/functions/compilation/uboot.sh ++### lib/functions/compilation/patching.sh ++# shellcheck source=lib/functions/compilation/patching.sh ++source "${SRC}"/lib/functions/compilation/patching.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled +@@ -100,16 +100,16 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/sources.sh + source "${SRC}"/lib/functions/compilation/sources.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/extra-drivers.sh +-# shellcheck source=lib/functions/compilation/extra-drivers.sh +-source "${SRC}"/lib/functions/compilation/extra-drivers.sh ++### lib/functions/compilation/uboot.sh ++# shellcheck source=lib/functions/compilation/uboot.sh ++source "${SRC}"/lib/functions/compilation/uboot.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled +@@ -118,268 +118,250 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/compilation/utils-compilation.sh + source "${SRC}"/lib/functions/compilation/utils-compilation.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/patching.sh +-# shellcheck source=lib/functions/compilation/patching.sh +-source "${SRC}"/lib/functions/compilation/patching.sh +- +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/kernel.sh +-# shellcheck source=lib/functions/compilation/kernel.sh +-source "${SRC}"/lib/functions/compilation/kernel.sh +- +-# no errors tolerated. set -e is invoked before each sourced file to make sure. +-#set -o pipefail # trace ERR through pipes - will be enabled "soon" +-#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +-set -o errtrace # trace ERR through - enabled +-set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/compilation/atf.sh +-# shellcheck source=lib/functions/compilation/atf.sh +-source "${SRC}"/lib/functions/compilation/atf.sh ++### lib/functions/configuration/aggregation.sh ++# shellcheck source=lib/functions/configuration/aggregation.sh ++source "${SRC}"/lib/functions/configuration/aggregation.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/cli/cli-entrypoint.sh +-# shellcheck source=lib/functions/cli/cli-entrypoint.sh +-source "${SRC}"/lib/functions/cli/cli-entrypoint.sh ++### lib/functions/configuration/config-desktop.sh ++# shellcheck source=lib/functions/configuration/config-desktop.sh ++source "${SRC}"/lib/functions/configuration/config-desktop.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/cli/utils-cli.sh +-# shellcheck source=lib/functions/cli/utils-cli.sh +-source "${SRC}"/lib/functions/cli/utils-cli.sh ++### lib/functions/configuration/interactive.sh ++# shellcheck source=lib/functions/configuration/interactive.sh ++source "${SRC}"/lib/functions/configuration/interactive.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/logging/errors.sh +-# shellcheck source=lib/functions/logging/errors.sh +-source "${SRC}"/lib/functions/logging/errors.sh ++### lib/functions/configuration/main-config.sh ++# shellcheck source=lib/functions/configuration/main-config.sh ++source "${SRC}"/lib/functions/configuration/main-config.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/logging/runners.sh +-# shellcheck source=lib/functions/logging/runners.sh +-source "${SRC}"/lib/functions/logging/runners.sh ++### lib/functions/configuration/menu.sh ++# shellcheck source=lib/functions/configuration/menu.sh ++source "${SRC}"/lib/functions/configuration/menu.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/logging/capture.sh +-# shellcheck source=lib/functions/logging/capture.sh +-source "${SRC}"/lib/functions/logging/capture.sh ++### lib/functions/extras/buildpkg.sh ++# shellcheck source=lib/functions/extras/buildpkg.sh ++source "${SRC}"/lib/functions/extras/buildpkg.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/logging/traps.sh +-# shellcheck source=lib/functions/logging/traps.sh +-source "${SRC}"/lib/functions/logging/traps.sh ++### lib/functions/extras/fel.sh ++# shellcheck source=lib/functions/extras/fel.sh ++source "${SRC}"/lib/functions/extras/fel.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/logging/logging.sh +-# shellcheck source=lib/functions/logging/logging.sh +-source "${SRC}"/lib/functions/logging/logging.sh ++### lib/functions/general/chroot-helpers.sh ++# shellcheck source=lib/functions/general/chroot-helpers.sh ++source "${SRC}"/lib/functions/general/chroot-helpers.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/bsp/utils-bsp.sh +-# shellcheck source=lib/functions/bsp/utils-bsp.sh +-source "${SRC}"/lib/functions/bsp/utils-bsp.sh ++### lib/functions/general/cleaning.sh ++# shellcheck source=lib/functions/general/cleaning.sh ++source "${SRC}"/lib/functions/general/cleaning.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/bsp/bsp-desktop.sh +-# shellcheck source=lib/functions/bsp/bsp-desktop.sh +-source "${SRC}"/lib/functions/bsp/bsp-desktop.sh ++### lib/functions/general/downloads.sh ++# shellcheck source=lib/functions/general/downloads.sh ++source "${SRC}"/lib/functions/general/downloads.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/bsp/bsp-cli.sh +-# shellcheck source=lib/functions/bsp/bsp-cli.sh +-source "${SRC}"/lib/functions/bsp/bsp-cli.sh ++### lib/functions/general/git.sh ++# shellcheck source=lib/functions/general/git.sh ++source "${SRC}"/lib/functions/general/git.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/main/default-build.sh +-# shellcheck source=lib/functions/main/default-build.sh +-source "${SRC}"/lib/functions/main/default-build.sh ++### lib/functions/general/host.sh ++# shellcheck source=lib/functions/general/host.sh ++source "${SRC}"/lib/functions/general/host.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/main/config-prepare.sh +-# shellcheck source=lib/functions/main/config-prepare.sh +-source "${SRC}"/lib/functions/main/config-prepare.sh ++### lib/functions/general/repo.sh ++# shellcheck source=lib/functions/general/repo.sh ++source "${SRC}"/lib/functions/general/repo.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/main/rootfs-image.sh +-# shellcheck source=lib/functions/main/rootfs-image.sh +-source "${SRC}"/lib/functions/main/rootfs-image.sh ++### lib/functions/image/initrd.sh ++# shellcheck source=lib/functions/image/initrd.sh ++source "${SRC}"/lib/functions/image/initrd.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/configuration/aggregation.sh +-# shellcheck source=lib/functions/configuration/aggregation.sh +-source "${SRC}"/lib/functions/configuration/aggregation.sh ++### lib/functions/image/loop.sh ++# shellcheck source=lib/functions/image/loop.sh ++source "${SRC}"/lib/functions/image/loop.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/configuration/main-config.sh +-# shellcheck source=lib/functions/configuration/main-config.sh +-source "${SRC}"/lib/functions/configuration/main-config.sh ++### lib/functions/image/partitioning.sh ++# shellcheck source=lib/functions/image/partitioning.sh ++source "${SRC}"/lib/functions/image/partitioning.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/configuration/interactive.sh +-# shellcheck source=lib/functions/configuration/interactive.sh +-source "${SRC}"/lib/functions/configuration/interactive.sh ++### lib/functions/image/rootfs-to-image.sh ++# shellcheck source=lib/functions/image/rootfs-to-image.sh ++source "${SRC}"/lib/functions/image/rootfs-to-image.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/configuration/menu.sh +-# shellcheck source=lib/functions/configuration/menu.sh +-source "${SRC}"/lib/functions/configuration/menu.sh ++### lib/functions/logging/capture.sh ++# shellcheck source=lib/functions/logging/capture.sh ++source "${SRC}"/lib/functions/logging/capture.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/configuration/config-desktop.sh +-# shellcheck source=lib/functions/configuration/config-desktop.sh +-source "${SRC}"/lib/functions/configuration/config-desktop.sh ++### lib/functions/logging/errors.sh ++# shellcheck source=lib/functions/logging/errors.sh ++source "${SRC}"/lib/functions/logging/errors.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/multi/build-all.sh +-# shellcheck source=lib/functions/multi/build-all.sh +-source "${SRC}"/lib/functions/multi/build-all.sh ++### lib/functions/logging/logging.sh ++# shellcheck source=lib/functions/logging/logging.sh ++source "${SRC}"/lib/functions/logging/logging.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/image/initrd.sh +-# shellcheck source=lib/functions/image/initrd.sh +-source "${SRC}"/lib/functions/image/initrd.sh ++### lib/functions/logging/runners.sh ++# shellcheck source=lib/functions/logging/runners.sh ++source "${SRC}"/lib/functions/logging/runners.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/image/rootfs-to-image.sh +-# shellcheck source=lib/functions/image/rootfs-to-image.sh +-source "${SRC}"/lib/functions/image/rootfs-to-image.sh ++### lib/functions/logging/traps.sh ++# shellcheck source=lib/functions/logging/traps.sh ++source "${SRC}"/lib/functions/logging/traps.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/image/loop.sh +-# shellcheck source=lib/functions/image/loop.sh +-source "${SRC}"/lib/functions/image/loop.sh ++### lib/functions/main/config-prepare.sh ++# shellcheck source=lib/functions/main/config-prepare.sh ++source "${SRC}"/lib/functions/main/config-prepare.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/image/partitioning.sh +-# shellcheck source=lib/functions/image/partitioning.sh +-source "${SRC}"/lib/functions/image/partitioning.sh ++### lib/functions/main/default-build.sh ++# shellcheck source=lib/functions/main/default-build.sh ++source "${SRC}"/lib/functions/main/default-build.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/rootfs/post-tweaks.sh +-# shellcheck source=lib/functions/rootfs/post-tweaks.sh +-source "${SRC}"/lib/functions/rootfs/post-tweaks.sh ++### lib/functions/main/rootfs-image.sh ++# shellcheck source=lib/functions/main/rootfs-image.sh ++source "${SRC}"/lib/functions/main/rootfs-image.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/rootfs/rootfs-desktop.sh +-# shellcheck source=lib/functions/rootfs/rootfs-desktop.sh +-source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh ++### lib/functions/multi/build-all.sh ++# shellcheck source=lib/functions/multi/build-all.sh ++source "${SRC}"/lib/functions/multi/build-all.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/rootfs/distro-agnostic.sh +-# shellcheck source=lib/functions/rootfs/distro-agnostic.sh +-source "${SRC}"/lib/functions/rootfs/distro-agnostic.sh ++### lib/functions/rootfs/apt.sh ++# shellcheck source=lib/functions/rootfs/apt.sh ++source "${SRC}"/lib/functions/rootfs/apt.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled +@@ -388,16 +370,16 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/rootfs/boot_logo.sh + source "${SRC}"/lib/functions/rootfs/boot_logo.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/rootfs/apt.sh +-# shellcheck source=lib/functions/rootfs/apt.sh +-source "${SRC}"/lib/functions/rootfs/apt.sh ++### lib/functions/rootfs/create-cache.sh ++# shellcheck source=lib/functions/rootfs/create-cache.sh ++source "${SRC}"/lib/functions/rootfs/create-cache.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled +@@ -406,16 +388,16 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/rootfs/customize.sh + source "${SRC}"/lib/functions/rootfs/customize.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled + set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +-### lib/functions/rootfs/create-cache.sh +-# shellcheck source=lib/functions/rootfs/create-cache.sh +-source "${SRC}"/lib/functions/rootfs/create-cache.sh ++### lib/functions/rootfs/distro-agnostic.sh ++# shellcheck source=lib/functions/rootfs/distro-agnostic.sh ++source "${SRC}"/lib/functions/rootfs/distro-agnostic.sh + +-# no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. invoked before each sourced file to make sure. + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled + set -o errtrace # trace ERR through - enabled +@@ -424,6 +406,23 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true + # shellcheck source=lib/functions/rootfs/distro-specific.sh + source "${SRC}"/lib/functions/rootfs/distro-specific.sh + ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/post-tweaks.sh ++# shellcheck source=lib/functions/rootfs/post-tweaks.sh ++source "${SRC}"/lib/functions/rootfs/post-tweaks.sh ++ ++# no errors tolerated. invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/rootfs-desktop.sh ++# shellcheck source=lib/functions/rootfs/rootfs-desktop.sh ++source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh + + # no errors tolerated. one last time for the win! + #set -o pipefail # trace ERR through pipes - will be enabled "soon" + +From ac99b0432bdbb7d2ee589a5f41a72e17dcbfecee Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 23 Jan 2022 22:59:25 +0100 +Subject: [PATCH] tools/shellfmt.sh: exclude "cache" and ".tmp" from + formatting, for obvious reasons + +--- + lib/tools/shellfmt.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/tools/shellfmt.sh b/lib/tools/shellfmt.sh +index 9e84606c0..69d2bbb05 100755 +--- a/lib/tools/shellfmt.sh ++++ b/lib/tools/shellfmt.sh +@@ -54,7 +54,7 @@ cd "${SRC}" + + # Should match the .editorconfig [*.{sh,inc,conf,eos,wip,tvb,csc}] + +-declare -a ALL_BASH_FILES=($(find . -type f -name '*.sh') $(find ./config -type f -name '*.inc' -o -name '*.conf' -o -name '*.eos' -o -name '*.wip' -o -name '*.tvb' -o -name '*.csc' | grep -v -e "\/config\/aptly" -e "\/config\/targets")) ++declare -a ALL_BASH_FILES=($(find . -type f -name '*.sh' | grep -v -e "^./cache/" -e "^./.tmp/") $(find ./config -type f -name '*.inc' -o -name '*.conf' -o -name '*.eos' -o -name '*.wip' -o -name '*.tvb' -o -name '*.csc' | grep -v -e "\/config\/aptly" -e "\/config\/targets")) + + echo "All files:" "${ALL_BASH_FILES[@]}" + + +From b17bb64ddc739b7084b98d070848aade693f3794 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 23 Jan 2022 22:58:36 +0100 +Subject: [PATCH] tools/gen-library.sh: sort function files, so it does not + keep changing between runs on different machines. + +- order should not be important, since files only contain functions, but avoid git churn +--- + lib/tools/gen-library.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/tools/gen-library.sh b/lib/tools/gen-library.sh +index 8abfad05e..3b851fe67 100755 +--- a/lib/tools/gen-library.sh ++++ b/lib/tools/gen-library.sh +@@ -17,7 +17,7 @@ cat <<- AUTOGEN_INCLUDES_HEADER > "${TARGET_SH}" + + AUTOGEN_INCLUDES_HEADER + +-find lib/functions -type f -name \*.sh | while read -r path; do ++find lib/functions -type f -name \*.sh | sort -h | while read -r path; do + ref="$(echo -n "${path}")" + cat <<- AUTOGEN_INCLUDES_EACH >> "${TARGET_SH}" + # no errors tolerated. invoked before each sourced file to make sure. + +From d84cbf9f3a367ab068bd619619daa58c56e7c96f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 23 Jan 2022 22:42:25 +0100 +Subject: [PATCH] armbian-next: manual merge (5) of all lib/*.sh changes + between revisions 1b18df3c834c5c4166e99f731d53ec88d14caf7d and + e7962bb2b555d3afdca0ff168982cc45235ca0a8 + +- most PKG_PREFIX work was already done +--- + config/sources/families/jetson-nano.conf | 50 +++++++++++++++----------------- + lib/functions/general/host.sh | 2 +- + lib/functions/rootfs/distro-agnostic.sh | 3 ++ + 3 files changed, 27 insertions(+), 28 deletions(-) + +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +index f4710d751..03717a673 100644 +--- a/config/sources/families/jetson-nano.conf ++++ b/config/sources/families/jetson-nano.conf +@@ -22,13 +22,18 @@ case $BRANCH in + ;; + + current) +- KERNELBRANCH="branch:linux-5.10.y" +- KERNELPATCHDIR='rockchip64-'$BRANCH ++ KERNELBRANCH="branch:linux-5.15.y" ++ KERNELPATCHDIR='media-'$BRANCH ++ LINUXFAMILY=media ++ LINUXCONFIG='linux-media-'$BRANCH + ;; + + edge) +- KERNELBRANCH="branch:linux-5.15.y" +- KERNELPATCHDIR='rockchip64-'$BRANCH ++ SKIP_BOOTSPLASH="yes" ++ KERNELBRANCH="branch:linux-5.16.y" ++ KERNELPATCHDIR='media-'$BRANCH ++ LINUXFAMILY=media ++ LINUXCONFIG='linux-media-'$BRANCH + ;; + + esac +@@ -39,28 +44,19 @@ write_uboot_platform() { + + family_tweaks() { + +- case $BRANCH in +- +- legacy) +- +- install -m 755 $SRC/packages/blobs/jetson/tegra21x_xusb_firmware $SDCARD/lib/firmware/tegra21x_xusb_firmware +- install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf.tegrahda +- install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf +- install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrasndt210ref $SDCARD/etc/asound.conf.tegrasndt210ref +- install -m 755 $SRC/packages/blobs/jetson/tegra-hda.conf $SDCARD/usr/share/alsa/cards/tegra-hda.conf +- install -m 755 $SRC/packages/blobs/jetson/tegra-snd-t210r.conf $SDCARD/usr/share/alsa/cards/tegra-snd-t210r.conf +- +- sed -e 's/exit 0//g' -i $SDCARD/etc/rc.local +- echo "su -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'" >> $SDCARD/etc/rc.local +- echo "exit 0" >> $SDCARD/etc/rc.local +- +- ;; +- +- edge) +- +- cp -R $SRC/packages/blobs/jetson/firmware/* $SDCARD/lib/firmware/ +- +- ;; +- esac ++ if [[ $BRANCH == legacy ]]; then ++ install -m 755 $SRC/packages/blobs/jetson/tegra21x_xusb_firmware $SDCARD/lib/firmware/tegra21x_xusb_firmware ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf.tegrahda ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrasndt210ref $SDCARD/etc/asound.conf.tegrasndt210ref ++ install -m 755 $SRC/packages/blobs/jetson/tegra-hda.conf $SDCARD/usr/share/alsa/cards/tegra-hda.conf ++ install -m 755 $SRC/packages/blobs/jetson/tegra-snd-t210r.conf $SDCARD/usr/share/alsa/cards/tegra-snd-t210r.conf ++ ++ sed -e 's/exit 0//g' -i $SDCARD/etc/rc.local ++ echo "su -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'" >> $SDCARD/etc/rc.local ++ echo "exit 0" >> $SDCARD/etc/rc.local ++ else ++ cp -R $SRC/packages/blobs/jetson/firmware/* $SDCARD/lib/firmware/ ++ fi + + } +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index fa1fcbc52..94409fafd 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -73,7 +73,7 @@ prepare_host() { + + if [[ $(dpkg --print-architecture) == amd64 ]]; then + +- hostdeps+=" distcc lib32ncurses-dev lib32stdc++6 libc6-i386 zlib1g:i386" ++ hostdeps+=" distcc lib32ncurses-dev lib32stdc++6 libc6-i386" + grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 + + elif [[ $(dpkg --print-architecture) == arm64 ]]; then +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index d348e4d39..d48879929 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -229,6 +229,9 @@ install_distribution_agnostic() { + display_alert "Temporarily disabling" "initramfs-tools hook for kernel" + chroot_sdcard chmod -v -x /etc/kernel/postinst.d/initramfs-tools + ++ display_alert "Cleaning" "package lists" ++ APT_OPTS="y" chroot_sdcard_apt_get clean ++ + display_alert "Updating" "apt package lists" + APT_OPTS="y" chroot_sdcard_apt_get update + + +From b18f3c81a1613e4b1550674a471f309a59526167 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 23 Jan 2022 22:08:16 +0100 +Subject: [PATCH] armbian-next: `TMPDIR` for all, many logging fixes, error + handling: leave-no-garbage-behind without needing traps. + +- set `MOUNT_UUID` and `WORKDIR`/`MOUNT`/`SDCARD`/`EXTENSION_MANAGER_TMP_DIR`/`DESTIMG` early in do_main_configuration() + - but, they're just _set_ there, dirs are not created early, but on demand later + - still @TODO: actually clean those during error trap. (unhappy path leaves garbage still) + - but does not leave garbage behind during "successful" runs at least (happy path works) +- actually export `TMPDIR` (== `WORKDIR`) during start of build (not config!), so all `mktemp` are subject to it + - `runners.sh` has helpers to avoid passing `TMPDIR` to chroot. Use the helpers! don't call `chroot` directly. + - don't trap/cleanup individual `mktemp` temp dirs during .deb packaging's, all is handled at once now. + - kernel packaging, for example, automatically picks up `TMPDIR` too. So now hosts `/tmp` is mostly left alone. +- fix some "infodumps" that are done into `.log` files directly. +- don't use sudo if `CONFIG_DEFS_ONLY=yes`; we'll only be collecting info, not doing anything. +- simpler logging for `rsync` operations (just dump to stdout, logging will handle it!) +- use padded counter for section logfiles, so we know which order things ran. exported as `CURRENT_LOGGING_COUNTER` +- no reason to use `apt-get` with `-yqq` anymore, since all logging is handled, so now `-y` by default +- desktop: using runners helpers for rootfs-desktop.sh, which should help a lot with acng caching and finding of problems +- extensions: correctly cleanup temp stuff, extensions has its own tmp/workdir now, and is always cleaned up at end of build. +--- + lib/extensions.sh | 14 +++++++++----- + lib/functions/bsp/bsp-cli.sh | 7 +------ + lib/functions/bsp/bsp-desktop.sh | 12 +++--------- + lib/functions/cli/cli-entrypoint.sh | 10 +++++++--- + lib/functions/compilation/atf.sh | 5 +---- + lib/functions/compilation/debs.sh | 16 +++------------- + lib/functions/compilation/kernel.sh | 7 ++----- + lib/functions/compilation/patching.sh | 2 +- + lib/functions/compilation/uboot.sh | 3 +-- + lib/functions/configuration/main-config.sh | 21 +++++++++++---------- + lib/functions/configuration/menu.sh | 2 +- + lib/functions/general/host.sh | 2 +- + lib/functions/image/rootfs-to-image.sh | 16 ++++++---------- + lib/functions/logging/logging.sh | 11 ++++++++--- + lib/functions/logging/runners.sh | 2 +- + lib/functions/main/config-prepare.sh | 2 +- + lib/functions/main/default-build.sh | 19 +++++++++++++++++++ + lib/functions/rootfs/rootfs-desktop.sh | 22 +++++++++++----------- + 18 files changed, 87 insertions(+), 86 deletions(-) + +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 1f7cd2db8..5398de20f 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -61,8 +61,8 @@ initialize_extension_manager() { + # This marks the manager as initialized, no more extensions are allowed to load after this. + export initialize_extension_manager_counter=$((initialize_extension_manager_counter + 1)) + +- # Have a unique temporary dir, even if being built concurrently by build_all_ng. +- export EXTENSION_MANAGER_TMP_DIR="${SRC}/.tmp/.extensions/${LOG_SUBPATH}" ++ # Extensions has its own work/tmp directory, defined by do_main_configuration, with build UUID. We just create it here. ++ display_alert "EXTENSION_MANAGER_TMP_DIR" "${EXTENSION_MANAGER_TMP_DIR}" "debug" + mkdir -p "${EXTENSION_MANAGER_TMP_DIR}" + + # Log destination. +@@ -245,6 +245,8 @@ initialize_extension_manager() { + # Dont show any output until we have more than 1 hook function (we implement one already, below) + [[ ${hook_functions_counter} -gt 0 ]] && + display_alert "Extension manager" "processed ${hook_points_counter} Extension Methods calls and ${hook_functions_counter} Extension Method implementations" "info" | tee -a "${EXTENSION_MANAGER_LOG_FILE}" ++ ++ return 0 # exit with success, short-circuit above. + } + + cleanup_extension_manager() { +@@ -253,6 +255,11 @@ cleanup_extension_manager() { + # this will unset all the functions. + # shellcheck disable=SC1090 # dynamic source, thanks, shellcheck + source "${fragment_manager_cleanup_file}" ++ rm "${fragment_manager_cleanup_file}" # remove the cleanup file ++ fi ++ # cleanup our tmpdir. ++ if [[ -d "${EXTENSION_MANAGER_TMP_DIR}" ]]; then ++ rm -rf "${EXTENSION_MANAGER_TMP_DIR}" + fi + # reset/unset the variables used + initialize_extension_manager_counter=0 +@@ -287,9 +294,6 @@ EXTENSION_METADATA_READY + # Move temporary log file over to final destination, and start writing to it instead (although 999 is pretty late in the game) + mv "${EXTENSION_MANAGER_LOG_FILE}" "${DEST}/${LOG_SUBPATH:-debug}/extensions.log" + export EXTENSION_MANAGER_LOG_FILE="${DEST}/${LOG_SUBPATH:-debug}/extensions.log" +- +- # Cleanup. Leave no trace... +- [[ -d "${EXTENSION_MANAGER_TMP_DIR}" ]] && rm -rf "${EXTENSION_MANAGER_TMP_DIR}" + } + + # This is called by call_extension_method(). To say the truth, this should be in an extension. But then it gets too meta for anyone's head. +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index 71f0ea765..a2c0adc58 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -1,10 +1,8 @@ + create_board_package() { + display_alert "Creating board support package for CLI" "$CHOSEN_ROOTFS" "info" + +- bsptempdir=$(mktemp -d) ++ bsptempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 ${bsptempdir} +- # @TODO: these traps are a real trap. +- #trap "rm -rf \"${bsptempdir}\" ; exit 0" 0 1 2 3 15 + + local destination=${bsptempdir}/${BSP_CLI_PACKAGE_FULLNAME} + mkdir -p "${destination}"/DEBIAN +@@ -309,7 +307,4 @@ POST_FAMILY_TWEAKS_BSP + rsync --remove-source-files -rq "${destination}.deb" "${DEB_STORAGE}/" 2>&1 + + display_alert "Done building BSP CLI package" "${destination}" "debug" +- +- # cleanup +- rm -rf ${bsptempdir} + } +diff --git a/lib/functions/bsp/bsp-desktop.sh b/lib/functions/bsp/bsp-desktop.sh +index baa585d7f..7ccba50c2 100644 +--- a/lib/functions/bsp/bsp-desktop.sh ++++ b/lib/functions/bsp/bsp-desktop.sh +@@ -32,7 +32,7 @@ create_desktop_package() { + PACKAGE_LIST_PREDEPENDS=${PACKAGE_LIST_PREDEPENDS//[[:space:]]/} + + local destination tmp_dir +- tmp_dir=$(mktemp -d) ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + destination=${tmp_dir}/${BOARD}/${CHOSEN_DESKTOP}_${REVISION}_all + rm -rf "${destination}" + mkdir -p "${destination}"/DEBIAN +@@ -66,7 +66,7 @@ create_desktop_package() { + chmod 755 "${destination}"/DEBIAN/postinst + + #display_alert "Showing ${destination}/DEBIAN/postinst" +- cat "${destination}/DEBIAN/postinst" >> "${DEST}"/${LOG_SUBPATH}/install.log ++ cat "${destination}/DEBIAN/postinst" >> "${DEST}/${LOG_SUBPATH}/bsp_postinst.log" + + # Armbian create_desktop_package scripts + +@@ -86,9 +86,6 @@ create_desktop_package() { + cd .. + fakeroot_dpkg_deb_build "${destination}" "${DEB_STORAGE}/${RELEASE}/${CHOSEN_DESKTOP}_${REVISION}_all.deb" + +- # cleanup +- rm -rf "${tmp_dir}" +- + unset aggregated_content + + } +@@ -100,7 +97,7 @@ create_bsp_desktop_package() { + local package_name="${BSP_DESKTOP_PACKAGE_FULLNAME}" + + local destination tmp_dir +- tmp_dir=$(mktemp -d) ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + destination=${tmp_dir}/${BOARD}/${BSP_DESKTOP_PACKAGE_FULLNAME} + rm -rf "${destination}" + mkdir -p "${destination}"/DEBIAN +@@ -148,9 +145,6 @@ create_bsp_desktop_package() { + cd .. + fakeroot_dpkg_deb_build "${destination}" "${DEB_STORAGE}/${RELEASE}/${package_name}.deb" + +- # cleanup +- rm -rf "${tmp_dir}" +- + unset aggregated_content + + } +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 4590d7e37..b16ea387d 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -15,6 +15,8 @@ function cli_entrypoint() { + : + elif [[ "${1}" == docker || "${1}" == dockerpurge || "${1}" == docker-shell ]] && grep -q "$(whoami)" <(getent group docker); then + : ++ elif [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then # not really building in this case, just gathering meta-data. ++ : + else + display_alert "This script requires root privileges, trying to use sudo" "" "wrn" + sudo "${SRC}/compile.sh" "$@" +@@ -109,7 +111,7 @@ function cli_entrypoint() { + if [[ "${BUILD_ALL}" == "yes" || "${BUILD_ALL}" == "demo" ]]; then + do_main_build_all_ng + else +- # configuration etc ++ # configuration etc - it initializes the extension manager. + do_capturing_defs prepare_and_config_main_build_single # this sets CAPTURED_VARS + + if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then +@@ -119,11 +121,13 @@ function cli_entrypoint() { + unset CAPTURED_VARS + fi + +- # Allow for custom user-invoked functions. @TODO: check this with extensions usage? ++ # Allow for custom user-invoked functions, or do the default build. + if [[ -z $1 ]]; then +- main_default_build_single ++ main_default_build_single # this cleans up the extension manager + else ++ # @TODO: check this with extensions usage? + eval "$@" + fi ++ + fi + } +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index 10d9bdec3..d2a30d09f 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -57,12 +57,9 @@ compile_atf() { + + [[ $(type -t atf_custom_postprocess) == function ]] && atf_custom_postprocess 2>&1 + +- atftempdir=$(mktemp -d) ++ atftempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 ${atftempdir} + +- # @TODO: these traps are a real trap. +- #trap "rm -rf \"${atftempdir}\" ; exit 0" 0 1 2 3 15 +- + # copy files to temp directory + for f in $target_files; do + local f_src +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index 2932264c0..f491715a3 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -3,11 +3,9 @@ compile_firmware() { + + local firmwaretempdir plugin_dir + +- firmwaretempdir=$(mktemp -d) ++ firmwaretempdir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 ${firmwaretempdir} + +- # @TODO: these traps are a real trap. +- #trap "rm -rf \"${firmwaretempdir}\" ; exit 0" 0 1 2 3 15 + plugin_dir="armbian-firmware${FULL}" + mkdir -p "${firmwaretempdir}/${plugin_dir}/lib/firmware" + +@@ -47,18 +45,14 @@ compile_firmware() { + mv "armbian-firmware${FULL}_${REVISION}_all" "armbian-firmware${FULL}" + rsync -rq "armbian-firmware${FULL}_${REVISION}_all.deb" "${DEB_STORAGE}/" + +- # remove temp directory - @TODO: maybe not, just leave thrash behind. +- rm -rf "${firmwaretempdir}" + } + + compile_armbian-zsh() { + + local tmp_dir armbian_zsh_dir +- tmp_dir=$(mktemp -d) ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 ${tmp_dir} + +- # @TODO: these traps are a real trap. +- #trap "rm -rf \"${tmp_dir}\" ; exit 0" 0 1 2 3 15 + armbian_zsh_dir=armbian-zsh_${REVISION}_all + display_alert "Building deb" "armbian-zsh" "info" + +@@ -124,18 +118,15 @@ compile_armbian-zsh() { + + fakeroot_dpkg_deb_build "${tmp_dir}/${armbian_zsh_dir}" + rsync --remove-source-files -rq "${tmp_dir}/${armbian_zsh_dir}.deb" "${DEB_STORAGE}/" +- rm -rf "${tmp_dir}" + + } + + compile_armbian-config() { + + local tmp_dir armbian_config_dir +- tmp_dir=$(mktemp -d) ++ tmp_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 ${tmp_dir} + +- # @TODO: these traps are a real trap. +- #trap "rm -rf \"${tmp_dir}\" ; exit 0" 0 1 2 3 15 + armbian_config_dir=armbian-config_${REVISION}_all + display_alert "Building deb" "armbian-config" "info" + +@@ -179,7 +170,6 @@ compile_armbian-config() { + + fakeroot_dpkg_deb_build "${tmp_dir}/${armbian_config_dir}" + rsync --remove-source-files -rq "${tmp_dir}/${armbian_config_dir}.deb" "${DEB_STORAGE}/" +- rm -rf "${tmp_dir}" + } + + compile_xilinx_bootgen() { +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index e0bce0699..dc357ee93 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -249,10 +249,8 @@ compile_kernel() { + create_linux-source_package() { + ts=$(date +%s) + local sources_pkg_dir tmp_src_dir +- tmp_src_dir=$(mktemp -d) ++ tmp_src_dir=$(mktemp -d) # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + +- # @TODO: these traps are a real trap. +- #trap "rm -rf \"${tmp_src_dir}\" ; exit 0" 0 1 2 3 15 + sources_pkg_dir=${tmp_src_dir}/${CHOSEN_KSRC}_${REVISION}_all + mkdir -p "${sources_pkg_dir}"/usr/src/ \ + "${sources_pkg_dir}"/usr/share/doc/linux-source-${version}-${LINUXFAMILY} \ +@@ -264,7 +262,7 @@ create_linux-source_package() { + display_alert "Compressing sources for the linux-source package" + tar cp --directory="$kerneldir" --exclude='.git' --owner=root . | + pv -N "$(logging_echo_prefix_for_pv "compress_kernel_sources") $display_name" -p -b -r -s "$(du -sb "$kerneldir" --exclude=='.git' | cut -f1)" | +- pixz -4 > "${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.xz" ++ pixz -0 > "${sources_pkg_dir}/usr/src/linux-source-${version}-${LINUXFAMILY}.tar.xz" # @TODO: .deb will compress this later. -0 for now, but should be a plain tar + cp COPYING "${sources_pkg_dir}/usr/share/doc/linux-source-${version}-${LINUXFAMILY}/LICENSE" + + cat <<- EOF > "${sources_pkg_dir}"/DEBIAN/control +@@ -285,5 +283,4 @@ create_linux-source_package() { + + te=$(date +%s) + display_alert "Make the linux-source package" "$(($te - $ts)) sec." "info" +- rm -rf "${tmp_src_dir}" + } +diff --git a/lib/functions/compilation/patching.sh b/lib/functions/compilation/patching.sh +index 52d00010f..861054de2 100644 +--- a/lib/functions/compilation/patching.sh ++++ b/lib/functions/compilation/patching.sh +@@ -104,7 +104,7 @@ apply_patch_series() { + local series="${2}" + local bzdir="$(dirname $series)" + local flag +- local err_pt=$(mktemp /tmp/apply_patch_series_XXXXX) ++ local err_pt=$(mktemp /tmp/apply_patch_series_XXXXX) # @OTODO: rpardini: hmm, why is this different from all others? + + list=$(gawk '$0 !~ /^#.*|^-.*|^$/' "${series}") + skiplist=$(gawk '$0 ~ /^-.*/' "${series}") +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index fba1d185b..188c062d6 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -144,7 +144,7 @@ compile_uboot() { + local uboot_name="${CHOSEN_UBOOT}_${REVISION}_${ARCH}" + + # create directory structure for the .deb package +- uboottempdir="$(mktemp -d)" ++ uboottempdir="$(mktemp -d)" # subject to TMPDIR/WORKDIR, so is protected by single/common error trap to clean-up. + chmod 700 "${uboottempdir}" + mkdir -p "$uboottempdir/$uboot_name/usr/lib/u-boot" "$uboottempdir/$uboot_name/usr/lib/$uboot_name" "$uboottempdir/$uboot_name/DEBIAN" + +@@ -227,7 +227,6 @@ compile_uboot() { + [[ ! -f $uboottempdir/${uboot_name}.deb ]] && exit_with_error "Building u-boot package failed" + + rsync --remove-source-files -rq "$uboottempdir/${uboot_name}.deb" "${DEB_STORAGE}/" 2>&1 +- rm -rf "$uboottempdir" + + display_alert "Built u-boot deb OK" "${uboot_name}.deb" "info" + return 0 # success +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index d4995a6b7..4cc607176 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -10,7 +10,17 @@ + # https://github.com/armbian/build/ + + function do_main_configuration() { +- display_alert "Starting main configuration" "" "info" ++ # set unique mounting directory for this build. ++ MOUNT_UUID=$(uuidgen) ++ ++ # Super-global variables, used everywhere. The directories are NOT _created_ here, since this is config stage, not build. ++ export WORKDIR="${SRC}/.tmp/work-${MOUNT_UUID}" # WORKDIR at this stage. It will become TMPDIR later. It has special significance to `mktemp` and others! ++ export SDCARD="${SRC}/.tmp/rootfs-${MOUNT_UUID}" # SDCARD (which is NOT an sdcard, but will be, maybe, one day) is where we work the rootfs before final imaging. "rootfs" stage. ++ export MOUNT="${SRC}/.tmp/mount-${MOUNT_UUID}" # MOUNT ("mounted on the loop") is the mounted root on final image (via loop). "image" stage ++ export EXTENSION_MANAGER_TMP_DIR="${SRC}/.tmp/extensions-${MOUNT_UUID}" # EXTENSION_MANAGER_TMP_DIR used to store extension-composed functions ++ export DESTIMG="${SRC}/.tmp/image-${MOUNT_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept ++ ++ display_alert "Starting main configuration" "${MOUNT_UUID}" "info" + + # common options + # daily beta build contains date in subrevision +@@ -283,15 +293,6 @@ function do_main_configuration() { + + display_alert "Done with" "desktop config stuff - END" "debug" + +- # set unique mounting directory +- MOUNT_UUID=$(uuidgen) +- +- # Super-global variables, used everywhere. They're not _created_ here, since this is config stage, not build. +- export WORKDIR="${SRC}/.tmp/work-${MOUNT_UUID}" # WORKDIR at this stage. It will become TMPDIR later. It has special significance to `mktemp` and others! +- export SDCARD="${SRC}/.tmp/rootfs-${MOUNT_UUID}" # SDCARD (which is NOT an sdcard, but will be, maybe, one day) is where we work the rootfs before final imaging. "rootfs" stage. +- export MOUNT="${SRC}/.tmp/mount-${MOUNT_UUID}" # MOUNT ("mounted on the loop") is the mounted root on final image (via loop). "image" stage +- export DESTIMG="${SRC}/.tmp/image-${MOUNT_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept +- + # dropbear needs to be configured differently # @TODO: rpardini: yes, and? are you a lost leftover comment from a previous era? + [[ $CRYPTROOT_ENABLE == yes && $RELEASE == xenial ]] && exit_with_error "Encrypted rootfs is not supported in Xenial" + [[ $RELEASE == stretch && $CAN_BUILD_STRETCH != yes ]] && exit_with_error "Building Debian Stretch images with selected kernel is not supported" +diff --git a/lib/functions/configuration/menu.sh b/lib/functions/configuration/menu.sh +index 2d4ac1462..92afcc5c5 100644 +--- a/lib/functions/configuration/menu.sh ++++ b/lib/functions/configuration/menu.sh +@@ -35,7 +35,7 @@ show_select_menu() { + + show_developer_warning() { + local temp_rc +- temp_rc=$(mktemp) ++ temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow + cat <<- 'EOF' > "${temp_rc}" + screen_color = (WHITE,RED,ON) + EOF +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index e875dc340..fa1fcbc52 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -337,7 +337,7 @@ install_pkg_deb() { + local _line=${BASH_LINENO[0]} + local _function=${FUNCNAME[1]} + local _file=$(basename "${BASH_SOURCE[1]}") +- local tmp_file=$(mktemp /tmp/install_log_XXXXX) ++ local tmp_file=$(mktemp /tmp/install_log_XXXXX) # @TODO: rpardini: hmm. why? lets use TMPDIR just like everyone else. + export DEBIAN_FRONTEND=noninteractive + + list=$( +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index f1d327a84..b62ad1f5c 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -19,15 +19,15 @@ create_image_from_sdcard_rootfs() { + [[ $ROOTFS_TYPE == nfs ]] && version=${version}_nfsboot + + if [[ $ROOTFS_TYPE != nfs ]]; then +- display_alert "Copying files to" "/" +- rsync -aHWXh \ ++ display_alert "Copying files via rsync to" "/" ++ run_host_command_logged rsync -aHWXh \ + --exclude="/boot/*" \ + --exclude="/dev/*" \ + --exclude="/proc/*" \ + --exclude="/run/*" \ + --exclude="/tmp/*" \ + --exclude="/sys/*" \ +- --info=progress0,stats1 $SDCARD/ $MOUNT/ 2>&1 ++ --info=progress0,stats1 $SDCARD/ $MOUNT/ + else + display_alert "Creating rootfs archive" "rootfs.tgz" "info" + tar cp --xattrs --directory=$SDCARD/ --exclude='./boot/*' --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \ +@@ -41,14 +41,10 @@ create_image_from_sdcard_rootfs() { + display_alert "Copying files to" "/boot" + if [[ $(findmnt --target $MOUNT/boot -o FSTYPE -n) == vfat ]]; then + # fat32 +- rsync -rLtWh \ +- --info=progress0,stats1 \ +- --log-file="${DEST}"/${LOG_SUBPATH}/install.log $SDCARD/boot $MOUNT 2>&1 #@TODO: log to stdout, terse? ++ run_host_command_logged rsync -rLtWh --info=progress0,stats1 "$SDCARD/boot" "$MOUNT" + else + # ext4 +- rsync -aHWXh \ +- --info=progress0,stats1 \ +- --log-file="${DEST}"/${LOG_SUBPATH}/install.log $SDCARD/boot $MOUNT 2>&1 #@TODO: log to stdout, terse? ++ run_host_command_logged rsync -aHWXh --info=progress0,stats1 "$SDCARD/boot" "$MOUNT" + fi + + call_extension_method "pre_update_initramfs" "config_pre_update_initramfs" << 'PRE_UPDATE_INITRAMFS' +@@ -58,7 +54,7 @@ PRE_UPDATE_INITRAMFS + + # stage: create final initramfs + [[ -n $KERNELSOURCE ]] && { +- update_initramfs $MOUNT ++ update_initramfs "$MOUNT" + } + + # DEBUG: print free space +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index b075a76ab..5981d9547 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -4,6 +4,8 @@ function logging_init() { + # globals + export padding="" left_marker="[" right_marker="]" + export normal_color="\x1B[0m" gray_color="\e[1;30m" # "bright black", which is grey ++ declare -i logging_section_counter=0 # -i: integer ++ export logging_section_counter + } + + function logging_error_show_log() { +@@ -39,9 +41,12 @@ function do_with_logging() { + [[ -z "${DEST}" ]] && exit_with_error "DEST is not defined. Can't start logging." + + # @TODO: check we're not currently logging (eg: this has been called 2 times without exiting) +- export CURRENT_LOGGING_SECTION=${LOG_SECTION:-build} +- export CURRENT_LOGGING_DIR="${DEST}/${LOG_SUBPATH}" +- export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/000.${CURRENT_LOGGING_SECTION}.log" ++ export logging_section_counter=$((logging_section_counter + 1)) # increment counter, used in filename ++ export CURRENT_LOGGING_COUNTER ++ CURRENT_LOGGING_COUNTER="$(printf "%03d" "$logging_section_counter")" ++ export CURRENT_LOGGING_SECTION=${LOG_SECTION:-build} # default to "build" ++ export CURRENT_LOGGING_DIR="${DEST}/${LOG_SUBPATH}" # origin: build-all-ng - @TODO: rpardini: lets revisit this later ++ export CURRENT_LOGFILE="${CURRENT_LOGGING_DIR}/${CURRENT_LOGGING_COUNTER}.${CURRENT_LOGGING_SECTION}.log" + mkdir -p "${CURRENT_LOGGING_DIR}" + + # Markers for CI (GitHub Actions); CI env var comes predefined as true there. +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 255281667..82ea46dae 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -4,7 +4,7 @@ function chroot_sdcard_apt_get_install() { + } + + function chroot_sdcard_apt_get() { +- local -a apt_params=("-${APT_OPTS:-yqq}") ++ local -a apt_params=("-${APT_OPTS:-y}") + [[ $NO_APT_CACHER != yes ]] && apt_params+=( + -o "Acquire::http::Proxy=\"http://${APT_PROXY_ADDR:-localhost:3142}\"" + -o "Acquire::http::Proxy::localhost=\"DIRECT\"" +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 32be7355d..cad494207 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -133,7 +133,7 @@ function prepare_and_config_main_build_single() { + [[ ${KERNEL_CONFIGURE} == prebuilt ]] && [[ -z ${REPOSITORY_INSTALL} ]] && + REPOSITORY_INSTALL="u-boot,kernel,bsp,armbian-zsh,armbian-config,armbian-bsp-cli,armbian-firmware${BUILD_DESKTOP:+,armbian-desktop,armbian-bsp-desktop}" + +- do_main_configuration ++ do_main_configuration # This initializes the extension manager among a lot of other things + + # @TODO: this does not belong in configuration. it's a compilation thing. move there + # optimize build time with 100% CPU usage +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 5d868a381..34aafb1d0 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -1,6 +1,15 @@ + # 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. + 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}" ++ export TMPDIR="${WORKDIR}" ++ # @todo: handle this in the exit trap, don't leave garbage behind when exiting. ++ + start=$(date +%s) + # Check and install dependencies, directory structure and settings + # The OFFLINE_WORK variable inside the function +@@ -117,6 +126,16 @@ 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 + ++ # Cleanup. Remove the WORKDIR, unset the TMPDIR ++ unset TMPDIR ++ if [[ -d "${WORKDIR}" ]]; then ++ display_alert "Cleaning up WORKDIR" "$(du -h -s "$WORKDIR")" "debug" ++ rm -rf "${WORKDIR}" ++ fi ++ ++ # cleanup the extension manager, that was initialized during prepare_and_config_main_build_single ++ cleanup_extension_manager ++ + end=$(date +%s) + runtime=$(((end - start) / 60)) + display_alert "Runtime" "$runtime min" "info" +diff --git a/lib/functions/rootfs/rootfs-desktop.sh b/lib/functions/rootfs/rootfs-desktop.sh +index 571571045..3564d8df2 100644 +--- a/lib/functions/rootfs/rootfs-desktop.sh ++++ b/lib/functions/rootfs/rootfs-desktop.sh +@@ -9,7 +9,7 @@ install_ppa_prerequisites() { + + # Myy : TODO Try to find a way to install this package only when + # we encounter a PPA. +- run_on_sdcard "DEBIAN_FRONTEND=noninteractive apt install -yqq software-properties-common" ++ chroot_sdcard_apt_get_install "software-properties-common" + + } + +@@ -34,7 +34,7 @@ add_apt_sources() { + display_alert "Adding APT Source ${new_apt_source}" + # -y -> Assumes yes to all queries + # -n -> Do not update package cache after adding +- run_on_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" ++ chroot_sdcard "add-apt-repository -y -n \"${new_apt_source}\"" + display_alert "Return code : $?" + + # temporally exception for jammy +@@ -52,7 +52,7 @@ add_apt_sources() { + display_alert "Adding GPG Key ${apt_source_gpg_filepath}" + local apt_source_gpg_filename="$(basename ${apt_source_gpg_filepath})" + cp "${apt_source_gpg_filepath}" "${SDCARD}/tmp/${apt_source_gpg_filename}" +- run_on_sdcard "apt-key add \"/tmp/${apt_source_gpg_filename}\"" ++ chroot_sdcard "apt-key add \"/tmp/${apt_source_gpg_filename}\"" + echo "APT Key returned : $?" + fi + done +@@ -66,9 +66,9 @@ add_desktop_package_sources() { + # Myy : I see Snap and Flatpak coming up in the next releases + # so... let's prepare for that + add_apt_sources +- run_on_sdcard "apt -y -q update" +- ls -l "${SDCARD}/etc/apt/sources.list.d" >> "${DEST}"/${LOG_SUBPATH}/install.log +- cat "${SDCARD}/etc/apt/sources.list" >> "${DEST}"/${LOG_SUBPATH}/install.log ++ chroot_sdcard_apt_get "update" ++ ls -l "${SDCARD}/etc/apt/sources.list.d" >> "${DEST}/${LOG_SUBPATH}/desktop_packages_apt_sources.log" ++ cat "${SDCARD}/etc/apt/sources.list" >> "${DEST}/${LOG_SUBPATH}/desktop_packages_apt_sources.log" + + } + +@@ -76,20 +76,20 @@ add_desktop_package_sources() { + desktop_postinstall() { + + # disable display manager for the first run +- run_on_sdcard "systemctl --no-reload disable lightdm.service >/dev/null 2>&1" +- run_on_sdcard "systemctl --no-reload disable gdm3.service >/dev/null 2>&1" ++ chroot_sdcard "systemctl --no-reload disable lightdm.service" ++ chroot_sdcard "systemctl --no-reload disable gdm3.service" + + # update packages index +- run_on_sdcard "DEBIAN_FRONTEND=noninteractive apt-get update >/dev/null 2>&1" ++ chroot_sdcard_apt_get "update" + + # install per board packages + if [[ -n ${PACKAGE_LIST_DESKTOP_BOARD} ]]; then +- run_on_sdcard "DEBIAN_FRONTEND=noninteractive apt-get -yqq --no-install-recommends install $PACKAGE_LIST_DESKTOP_BOARD" ++ chroot_sdcard_apt_get_install "$PACKAGE_LIST_DESKTOP_BOARD" + fi + + # install per family packages + if [[ -n ${PACKAGE_LIST_DESKTOP_FAMILY} ]]; then +- run_on_sdcard "DEBIAN_FRONTEND=noninteractive apt-get -yqq --no-install-recommends install $PACKAGE_LIST_DESKTOP_FAMILY" ++ chroot_sdcard_apt_get_install "$PACKAGE_LIST_DESKTOP_FAMILY" + fi + + } + +From 84ad3ec52fa01eacca30bd3754853cff312dde5a Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 22 Jan 2022 10:35:06 +0000 +Subject: [PATCH] armbian-next: bye `PKG_PREFIX`, hello + `run_host_x86_binary_logged()` wrapper function; better error handling + +- we've x86-only utilities that might need to be run on non-x86 build machines +- previously duplicated logic in PKG_PREFIX variable refactored into logged function +- added centralized debug logging +- replace all PKG_PREFIX usage with the new wrapper function, which already handles logging and errors. + - mostly FIP tooling invocations + - but also the boot_logo image builder + - wrapper function delegates to common `run_host_command_logged` +- wrap other FIP invocations with `run_host_command_logged` too, for tidy logging +- avoid using conditionals when invoking functions; that completely disables error handling inside the called function +- use explicit bash opts instead of shortcuts like `set -e` +- a _lot_ of debug logging added +--- + compile.sh | 7 +- + config/sources/families/include/meson64_common.inc | 94 ++-- + .../sources/families/include/rockchip64_common.inc | 17 +- + config/sources/families/meson-gxbb.conf | 58 +-- + config/sources/families/meson-gxl.conf | 6 - + lib/functions/cli/cli-entrypoint.sh | 6 +- + lib/functions/compilation/uboot.sh | 6 +- + lib/functions/general/host.sh | 2 +- + lib/functions/logging/runners.sh | 23 + + lib/functions/rootfs/boot_logo.sh | 12 +- + lib/library-functions.sh | 558 ++++++++++++++------- + lib/tools/gen-library.sh | 12 +- + 12 files changed, 497 insertions(+), 304 deletions(-) + +diff --git a/compile.sh b/compile.sh +index 27d598bd2..5e92ddefe 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -13,8 +13,11 @@ + # use configuration files like config-default.conf to set the build configuration + # check Armbian documentation https://docs.armbian.com/ for more info + +-set -e # disallow errors +-set -o errtrace # error trace ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++# Important, go read http://mywiki.wooledge.org/BashFAQ/105 NOW! + + SRC="$(dirname "$(realpath "${BASH_SOURCE[0]}")")" + cd "${SRC}" || exit +diff --git a/config/sources/families/include/meson64_common.inc b/config/sources/families/include/meson64_common.inc +index 4d9c9e7c9..f69669a5f 100644 +--- a/config/sources/families/include/meson64_common.inc ++++ b/config/sources/families/include/meson64_common.inc +@@ -41,48 +41,38 @@ case $BRANCH in + + esac + +-if [ "$(uname -m)" = "aarch64" ]; then +- if [[ "$(lsb_release -sc)" == "bullseye" || "$(lsb_release -sc)" == "focal" || "$(lsb_release -sc)" == "hirsute" || "$(lsb_release -sc)" == "impish" || "$(lsb_release -sc)" == "jammy" ]]; then +- PKG_PREFIX="qemu-x86_64-static -L /usr/x86_64-linux-gnu " +- else +- PKG_PREFIX="qemu-x86_64 " +- fi +-else +- PKG_PREFIX="" +-fi +- + # this helper function includes postprocess for p212 and its variants. + # $1 PATH for uboot blob repo + # $2 dir name in uboot blob repo + uboot_gxl_postprocess() { +- mv u-boot.bin bl33.bin ++ run_host_command_logged mv -v u-boot.bin bl33.bin + +- $1/blx_fix.sh $1/$2/bl30.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/$2/bl30.bin \ + $1/$2/zero_tmp \ + $1/$2/bl30_zero.bin \ + $1/$2/bl301.bin \ + $1/$2/bl301_zero.bin \ + $1/$2/bl30_new.bin bl30 + +- python $1/acs_tool.pyc $1/$2/bl2.bin \ ++ run_host_command_logged python $1/acs_tool.pyc $1/$2/bl2.bin \ + $1/$2/bl2_acs.bin \ + $1/$2/acs.bin 0 + +- $1/blx_fix.sh $1/$2/bl2_acs.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/$2/bl2_acs.bin \ + $1/$2/zero_tmp \ + $1/$2/bl2_zero.bin \ + $1/$2/bl21.bin \ + $1/$2/bl21_zero.bin \ + $1/$2/bl2_new.bin bl2 + +- $PKG_PREFIX$1/$2/aml_encrypt_gxl --bl3enc --input $1/$2/bl30_new.bin +- $PKG_PREFIX$1/$2/aml_encrypt_gxl --bl3enc --input $1/$2/bl31.img +- $PKG_PREFIX$1/$2/aml_encrypt_gxl --bl3enc --input bl33.bin ++ run_host_x86_binary_logged $1/$2/aml_encrypt_gxl --bl3enc --input $1/$2/bl30_new.bin ++ run_host_x86_binary_logged $1/$2/aml_encrypt_gxl --bl3enc --input $1/$2/bl31.img ++ run_host_x86_binary_logged $1/$2/aml_encrypt_gxl --bl3enc --input bl33.bin + +- $PKG_PREFIX$1/$2/aml_encrypt_gxl --bl2sig --input $1/$2/bl2_new.bin \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_gxl --bl2sig --input $1/$2/bl2_new.bin \ + --output bl2.n.bin.sig + +- $PKG_PREFIX$1/$2/aml_encrypt_gxl --bootmk \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_gxl --bootmk \ + --output u-boot.bin \ + --bl2 bl2.n.bin.sig \ + --bl30 $1/$2/bl30_new.bin.enc \ +@@ -94,42 +84,42 @@ uboot_gxl_postprocess() { + # $1 PATH for uboot blob repo + # $2 dir name in uboot blob repo + uboot_axg_postprocess_ng() { +- mv u-boot.bin bl33.bin ++ run_host_command_logged mv -v u-boot.bin bl33.bin + +- $1/blx_fix.sh $1/$2/bl30.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/$2/bl30.bin \ + $1/$2/zero_tmp \ + $1/$2/bl30_zero.bin \ + $1/$2/bl301.bin \ + $1/$2/bl301_zero.bin \ + $1/$2/bl30_new.bin bl30 + +- python3 $1/acs_tool.py $1/$2/bl2.bin \ ++ run_host_command_logged python3 $1/acs_tool.py $1/$2/bl2.bin \ + $1/$2/bl2_acs.bin \ + $1/$2/acs.bin 0 + +- $1/blx_fix.sh $1/$2/bl2_acs.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/$2/bl2_acs.bin \ + $1/$2/zero_tmp \ + $1/$2/bl2_zero.bin \ + $1/$2/bl21.bin \ + $1/$2/bl21_zero.bin \ + $1/$2/bl2_new.bin bl2 + +- $PKG_PREFIX$1/$2/aml_encrypt_axg --bl3sig --input $1/$2/bl30_new.bin \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_axg --bl3sig --input $1/$2/bl30_new.bin \ + --output bl30_new.bin.enc \ + --level v3 --type bl30 + +- $PKG_PREFIX$1/$2/aml_encrypt_axg --bl3sig --input $1/$2/bl31.img \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_axg --bl3sig --input $1/$2/bl31.img \ + --output bl31.img.enc \ + --level v3 --type bl31 + +- $PKG_PREFIX$1/$2/aml_encrypt_axg --bl3sig --input bl33.bin --compress lz4 \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_axg --bl3sig --input bl33.bin --compress lz4 \ + --output bl33.bin.enc \ + --level v3 --type bl33 + +- $PKG_PREFIX$1/$2/aml_encrypt_axg --bl2sig --input $1/$2/bl2_new.bin \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_axg --bl2sig --input $1/$2/bl2_new.bin \ + --output bl2.n.bin.sig + +- $PKG_PREFIX$1/$2/aml_encrypt_axg --bootmk \ ++ run_host_x86_binary_logged $1/$2/aml_encrypt_axg --bootmk \ + --output u-boot.bin \ + --bl2 bl2.n.bin.sig \ + --bl30 bl30_new.bin.enc \ +@@ -141,44 +131,44 @@ uboot_axg_postprocess_ng() { + # $1 PATH for uboot blob repo + # $2 family g12a or g12b + uboot_g12_postprocess() { +- mv u-boot.bin bl33.bin ++ run_host_command_logged mv -v u-boot.bin bl33.bin + +- $1/blx_fix.sh $1/bl30.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/bl30.bin \ + zero_tmp \ + bl30_zero.bin \ + $1/bl301.bin \ + bl301_zero.bin \ + bl30_new.bin bl30 + +- $1/blx_fix.sh $1/bl2.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/bl2.bin \ + zero_tmp \ + bl2_zero.bin \ + $1/acs.bin \ + bl21_zero.bin \ + bl2_new.bin bl2 + +- $PKG_PREFIX$1/aml_encrypt_$2 --bl30sig \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bl30sig \ + --input bl30_new.bin \ + --output bl30_new.bin.g12.enc \ + --level v3 +- $PKG_PREFIX$1/aml_encrypt_$2 --bl3sig \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bl3sig \ + --input bl30_new.bin.g12.enc \ + --output bl30_new.bin.enc \ + --level v3 --type bl30 +- $PKG_PREFIX$1/aml_encrypt_$2 --bl3sig \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bl3sig \ + --input $1/bl31.img \ + --output bl31.img.enc \ + --level v3 --type bl31 +- $PKG_PREFIX$1/aml_encrypt_$2 --bl3sig \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bl3sig \ + --input bl33.bin \ + --compress lz4 \ + --output bl33.bin.enc \ + --level v3 --type bl33 +- $PKG_PREFIX$1/aml_encrypt_$2 --bl2sig \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bl2sig \ + --input bl2_new.bin \ + --output bl2.n.bin.sig + if [ -e $1/lpddr3_1d.fw ]; then +- $PKG_PREFIX$1/aml_encrypt_$2 --bootmk --output u-boot.bin \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bootmk --output u-boot.bin \ + --bl2 bl2.n.bin.sig \ + --bl30 bl30_new.bin.enc \ + --bl31 bl31.img.enc \ +@@ -194,7 +184,7 @@ uboot_g12_postprocess() { + --ddrfw9 $1/lpddr3_1d.fw \ + --level v3 + else +- $PKG_PREFIX$1/aml_encrypt_$2 --bootmk --output u-boot.bin \ ++ run_host_x86_binary_logged $1/aml_encrypt_$2 --bootmk --output u-boot.bin \ + --bl2 bl2.n.bin.sig \ + --bl30 bl30_new.bin.enc \ + --bl31 bl31.img.enc \ +@@ -215,31 +205,31 @@ uboot_g12_postprocess() { + # this helper function includes postprocess for meson gxl and gxm. + # $1 PATH for uboot blob repo + uboot_gxl_postprocess_ng() { +- mv u-boot.bin bl33.bin ++ run_host_command_logged mv -v u-boot.bin bl33.bin + +- $1/blx_fix.sh $1/bl30.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/bl30.bin \ + $1/zero_tmp \ + $1/bl30_zero.bin \ + $1/bl301.bin \ + $1/bl301_zero.bin \ + $1/bl30_new.bin bl30 + +- python3 $1/acs_tool.py $1/bl2.bin $1/bl2_acs.bin $1/acs.bin 0 ++ run_host_command_logged python3 $1/acs_tool.py $1/bl2.bin $1/bl2_acs.bin $1/acs.bin 0 + +- $1/blx_fix.sh $1/bl2_acs.bin \ ++ run_host_command_logged $1/blx_fix.sh $1/bl2_acs.bin \ + $1/zero_tmp \ + $1/bl2_zero.bin \ + $1/bl21.bin \ + $1/bl21_zero.bin \ + $1/bl2_new.bin bl2 + +- $1/aml_encrypt_gxl --bl3enc --input $1/bl30_new.bin +- $1/aml_encrypt_gxl --bl3enc --input $1/bl31.img +- $1/aml_encrypt_gxl --bl3enc --input bl33.bin +- $1/aml_encrypt_gxl --bl2sig --input $1/bl2_new.bin \ ++ run_host_command_logged $1/aml_encrypt_gxl --bl3enc --input $1/bl30_new.bin ++ run_host_command_logged $1/aml_encrypt_gxl --bl3enc --input $1/bl31.img ++ run_host_command_logged $1/aml_encrypt_gxl --bl3enc --input bl33.bin ++ run_host_command_logged $1/aml_encrypt_gxl --bl2sig --input $1/bl2_new.bin \ + --output bl2.n.bin.sig + +- $1/aml_encrypt_gxl --bootmk --output u-boot.bin \ ++ run_host_command_logged $1/aml_encrypt_gxl --bootmk --output u-boot.bin \ + --bl2 bl2.n.bin.sig \ + --bl30 $1/bl30_new.bin.enc \ + --bl31 $1/bl31.img.enc \ +@@ -247,8 +237,8 @@ uboot_gxl_postprocess_ng() { + } + + write_uboot_platform() { +- dd if=$1/u-boot.bin of=$2 bs=1 count=442 conv=fsync > /dev/null 2>&1 +- dd if=$1/u-boot.bin of=$2 bs=512 skip=1 seek=1 conv=fsync > /dev/null 2>&1 ++ dd if=$1/u-boot.bin of=$2 bs=1 count=442 conv=fsync 2>&1 ++ dd if=$1/u-boot.bin of=$2 bs=512 skip=1 seek=1 conv=fsync 2>&1 + } + + family_tweaks_bsp() { +@@ -283,7 +273,7 @@ family_tweaks_bsp() { + cat <<- EOF > "$destination"/etc/X11/xorg.conf + Section "Device" + Identifier "DRM Graphics Acclerated" +- ++ + ## Use modesetting and glamor + Driver "modesetting" + Option "AccelMethod" "glamor" ### "glamor" to enable 3D acceleration, "none" to disable. +@@ -291,9 +281,9 @@ family_tweaks_bsp() { + Option "Dri2Vsync" "true" + Option "TripleBuffer" "True" + ## End glamor configuration +- ++ + EndSection +- ++ + Section "Screen" + Identifier "Default Screen" + SubSection "Display" +diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc +index 03efae1ed..a6cc52133 100644 +--- a/config/sources/families/include/rockchip64_common.inc ++++ b/config/sources/families/include/rockchip64_common.inc +@@ -15,19 +15,6 @@ BOOTPATCHDIR="u-boot-rockchip64" + PACKAGE_LIST_FAMILY="ethtool" + + RKBIN_DIR="$SRC/cache/sources/rkbin-tools" +-if [ "$(uname -m)" = "aarch64" ]; then +- case "$(lsb_release -sc)" in +- "bullseye" | "focal" | "hirsute" | "impish" | "jammy") +- PKG_PREFIX="qemu-x86_64-static -L /usr/x86_64-linux-gnu " +- ;; +- *) +- PKG_PREFIX="qemu-x86_64 -L /usr/x86_64-linux-gnu " +- ;; +- esac +-else +- PKG_PREFIX="" +-fi +- + BOOT_SOC=$(expr $BOOTCONFIG : '.*\(rk[[:digit:]]\+.*\)_.*') + + if [[ $BOOT_SOC == rk3399 ]]; then +@@ -153,8 +140,8 @@ uboot_custom_postprocess() { + local tempfile=$(mktemp) + tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB idbloader.bin + cat $RKBIN_DIR/$MINILOADER_BLOB >> idbloader.bin +- $PKG_PREFIX$RKBIN_DIR/tools/loaderimage --pack --uboot ./u-boot-dtb.bin uboot.img 0x200000 +- $PKG_PREFIX$RKBIN_DIR/tools/trust_merger --replace bl31.elf $RKBIN_DIR/$BL31_BLOB trust.ini ++ run_host_x86_binary_logged $RKBIN_DIR/tools/loaderimage --pack --uboot ./u-boot-dtb.bin uboot.img 0x200000 ++ run_host_x86_binary_logged $RKBIN_DIR/tools/trust_merger --replace bl31.elf $RKBIN_DIR/$BL31_BLOB trust.ini + + else + echo "Unsupported u-boot processing configuration!" +diff --git a/config/sources/families/meson-gxbb.conf b/config/sources/families/meson-gxbb.conf +index e78c1739d..2c02fbc6d 100644 +--- a/config/sources/families/meson-gxbb.conf ++++ b/config/sources/families/meson-gxbb.conf +@@ -5,16 +5,16 @@ fi + + uboot_custom_postprocess() { + if [[ $BOARD == odroidc2 ]]; then +- local t=$SRC/cache/sources/odroidc2-blobs/ +- $PKG_PREFIX$t/fip_create --bl30 $t/gxb/bl30.bin \ +- --bl301 $t/gxb/bl301.bin \ +- --bl31 $t/gxb/bl31.bin \ ++ local fip_blobs_dir="$SRC/cache/sources/odroidc2-blobs/" ++ run_host_x86_binary_logged $fip_blobs_dir/fip_create --bl30 $fip_blobs_dir/gxb/bl30.bin \ ++ --bl301 $fip_blobs_dir/gxb/bl301.bin \ ++ --bl31 $fip_blobs_dir/gxb/bl31.bin \ + --bl33 u-boot.bin \ + fip.bin +- $PKG_PREFIX$t/fip_create --dump fip.bin +- cat $t/gxb/bl2.package fip.bin > boot_new.bin ++ run_host_x86_binary_logged $fip_blobs_dir/fip_create --dump fip.bin ++ cat $fip_blobs_dir/gxb/bl2.package fip.bin > boot_new.bin + rm -f u-boot.img +- $PKG_PREFIX$t/gxb/aml_encrypt_gxb --bootsig \ ++ run_host_x86_binary_logged $fip_blobs_dir/gxb/aml_encrypt_gxb --bootsig \ + --input boot_new.bin \ + --output u-boot.img + rm -f u-boot.bin +@@ -22,37 +22,37 @@ uboot_custom_postprocess() { + fi + + if [[ $BOARD == nanopik2-s905 ]]; then +- local t=$SRC/cache/sources/odroidc2-blobs/ ++ local fip_blobs_dir=$SRC/cache/sources/odroidc2-blobs/ + mv u-boot.bin bl33.bin + +- $t/blx_fix.sh $t/k2/bl30.bin \ +- $t/k2/zero_tmp \ +- $t/k2/bl30_zero.bin \ +- $t/k2/bl301.bin \ +- $t/k2/bl301_zero.bin \ +- $t/k2/bl30_new.bin bl30 ++ $fip_blobs_dir/blx_fix.sh $fip_blobs_dir/k2/bl30.bin \ ++ $fip_blobs_dir/k2/zero_tmp \ ++ $fip_blobs_dir/k2/bl30_zero.bin \ ++ $fip_blobs_dir/k2/bl301.bin \ ++ $fip_blobs_dir/k2/bl301_zero.bin \ ++ $fip_blobs_dir/k2/bl30_new.bin bl30 + +- $PKG_PREFIX$t/k2/fip_create --bl30 $t/k2/bl30_new.bin \ +- --bl31 $t/k2/bl31.img \ ++ run_host_x86_binary_logged $fip_blobs_dir/k2/fip_create --bl30 $fip_blobs_dir/k2/bl30_new.bin \ ++ --bl31 $fip_blobs_dir/k2/bl31.img \ + --bl33 bl33.bin \ +- $t/k2/fip.bin ++ $fip_blobs_dir/k2/fip.bin + +- $PKG_PREFIX$t/k2/fip_create --dump $t/k2/fip.bin ++ run_host_x86_binary_logged $fip_blobs_dir/k2/fip_create --dump $fip_blobs_dir/k2/fip.bin + +- python $t/acs_tool.pyc $t/k2/bl2.bin \ +- $t/k2/bl2_acs.bin \ +- $t/k2/acs.bin 0 ++ python $fip_blobs_dir/acs_tool.pyc $fip_blobs_dir/k2/bl2.bin \ ++ $fip_blobs_dir/k2/bl2_acs.bin \ ++ $fip_blobs_dir/k2/acs.bin 0 + +- $t/blx_fix.sh $t/k2/bl2_acs.bin \ +- $t/k2/zero_tmp \ +- $t/k2/bl2_zero.bin \ +- $t/k2/bl21.bin \ +- $t/k2/bl21_zero.bin \ +- $t/k2/bl2_new.bin bl2 ++ $fip_blobs_dir/blx_fix.sh $fip_blobs_dir/k2/bl2_acs.bin \ ++ $fip_blobs_dir/k2/zero_tmp \ ++ $fip_blobs_dir/k2/bl2_zero.bin \ ++ $fip_blobs_dir/k2/bl21.bin \ ++ $fip_blobs_dir/k2/bl21_zero.bin \ ++ $fip_blobs_dir/k2/bl2_new.bin bl2 + +- cat $t/k2/bl2_new.bin $t/k2/fip.bin > boot_new.bin ++ cat $fip_blobs_dir/k2/bl2_new.bin $fip_blobs_dir/k2/fip.bin > boot_new.bin + +- $PKG_PREFIX$t/k2/aml_encrypt_gxb --bootsig \ ++ run_host_x86_binary_logged $fip_blobs_dir/k2/aml_encrypt_gxb --bootsig \ + --input boot_new.bin \ + --output u-boot.bin + +diff --git a/config/sources/families/meson-gxl.conf b/config/sources/families/meson-gxl.conf +index 8f42459ea..8a98b09ef 100644 +--- a/config/sources/families/meson-gxl.conf ++++ b/config/sources/families/meson-gxl.conf +@@ -1,23 +1,17 @@ + source "${BASH_SOURCE%/*}/include/meson64_common.inc" + + if [[ $BOARD == lafrite ]]; then +- + UBOOT_TARGET_MAP="u-boot-dtb.img;;u-boot.bin:u-boot.bin u-boot-dtb.img" +- + fi + + if [[ $BOARD = khadas-vim1 ]]; then +- + # temporally workaround - using prebuild u-boot from https://github.com/khadas/khadas-uboot/releases/tag/0.11 + UBOOT_TARGET_MAP=";;$SRC/packages/blobs/meson/u-boot-vim1-sd.bin:u-boot.bin" +- + fi + + if [[ $BOARD = khadas-vim2 ]]; then +- + # temporally workaround - using prebuild u-boot from https://github.com/khadas/khadas-uboot/releases/tag/0.11 + UBOOT_TARGET_MAP=";;$SRC/packages/blobs/meson/u-boot-vim2-sd.bin:u-boot.bin" +- + fi + + family_tweaks() { +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index 99adc61a4..4590d7e37 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -101,8 +101,10 @@ function cli_entrypoint() { + ## + + # reset completely after sourcing config file +- set -e # disallow errors +- set -o errtrace # error trace ++ #set -o pipefail # trace ERR through pipes - will be enabled "soon" ++ #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++ set -o errtrace # trace ERR through - enabled ++ set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + + if [[ "${BUILD_ALL}" == "yes" || "${BUILD_ALL}" == "demo" ]]; then + do_main_build_all_ng +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 183298c4b..fba1d185b 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -72,7 +72,7 @@ function compile_uboot_target() { + + if [[ $(type -t uboot_custom_postprocess) == function ]]; then + display_alert "${uboot_prefix}Postprocessing u-boot" "${version} ${target_make}" +- uboot_custom_postprocess 2>&1 ++ uboot_custom_postprocess + fi + + display_alert "${uboot_prefix}Preparing u-boot targets packaging" "${version} ${target_make}" +@@ -155,9 +155,7 @@ compile_uboot() { + for target in ${UBOOT_TARGET_MAP}; do + IFS="${_old_ifs}" # restore for the body of loop + export target uboot_name uboottempdir toolchain version uboot_target_counter +- compile_uboot_target || { +- exit_with_error "Failed to compile u-boot target" "${target}" +- } ++ compile_uboot_target + uboot_target_counter=$((uboot_target_counter + 1)) + IFS="${_new_ifs}" # split on newlines only for rest of loop + done +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index d292fcf10..e875dc340 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -69,7 +69,7 @@ prepare_host() { + nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz \ + pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig \ + systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip \ +- zlib1g-dev" ++ zlib1g-dev file" + + if [[ $(dpkg --print-architecture) == amd64 ]]; then + +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 97b13ddef..255281667 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -90,6 +90,7 @@ function run_host_command_logged_raw() { + fi + if [[ $exit_code != 0 ]]; then + display_alert "cmd exited with code ${exit_code}" "$*" "wrn" ++ display_alert "stacktrace for failed command" "$(show_caller_full)" "wrn" + fi + return $exit_code + } +@@ -98,3 +99,25 @@ function run_host_command_logged_raw() { + run_on_sdcard() { + chroot_sdcard "${@}" + } ++ ++# For host-side invocations of binaries we _know_ are x86-only. ++# Determine if we're building on non-amd64, and if so, which qemu binary to use. ++function run_host_x86_binary_logged() { ++ local -a qemu_invocation target_bin_arch ++ target_bin_arch="$(file -b "$1" | cut -d "," -f 1,2 | xargs echo -n)" # obtain the ELF name from the binary using 'file' ++ qemu_invocation=("$@") # Default to calling directly, without qemu. ++ if [[ "$(uname -m)" != "x86_64" ]]; then # If we're NOT on x86... ++ if [[ -f /usr/bin/qemu-x86_64-static ]]; then ++ display_alert "Using qemu-x86_64-static for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" ++ qemu_invocation=("/usr/bin/qemu-x86_64-static" "-L" "/usr/x86_64-linux-gnu" "$@") ++ elif [[ -f /usr/bin/qemu-x86_64 ]]; then ++ display_alert "Using qemu-x86_64 (non-static) for running on $(uname -m)" "$1 (${target_bin_arch})" "debug" ++ qemu_invocation=("/usr/bin/qemu-x86_64" "-L" "/usr/x86_64-linux-gnu" "$@") ++ else ++ exit_with_error "Can't find appropriate qemu binary for running '$1' on $(uname -m), missing packages?" ++ fi ++ else ++ display_alert "Not using qemu for running x86 binary on $(uname -m)" "$1 (${target_bin_arch})" "debug" ++ fi ++ run_host_command_logged "${qemu_invocation[@]}" # Exit with this result code ++} +diff --git a/lib/functions/rootfs/boot_logo.sh b/lib/functions/rootfs/boot_logo.sh +index 9559b5917..319ea1144 100644 +--- a/lib/functions/rootfs/boot_logo.sh ++++ b/lib/functions/rootfs/boot_logo.sh +@@ -1,9 +1,4 @@ + function boot_logo() { +- if [[ $(dpkg --print-architecture) != amd64 ]]; then +- display_alert "Can't build boot_logo throbber using this arch" "$(dpkg --print-architecture)" +- return 0 +- fi +- + display_alert "Building kernel splash logo" "$RELEASE" "info" + + LOGO=${SRC}/packages/blobs/splash/logo.png +@@ -14,8 +9,8 @@ function boot_logo() { + THROBBER_HEIGHT=$(identify $THROBBER | head -1 | cut -d " " -f 3 | cut -d x -f 2) + convert -alpha remove -background "#000000" $LOGO "${SDCARD}"/tmp/logo.rgb + convert -alpha remove -background "#000000" $THROBBER "${SDCARD}"/tmp/throbber%02d.rgb +- # @TODO I guess this is a x86 binary? +- ${SRC}/packages/blobs/splash/bootsplash-packer \ ++ ++ run_host_x86_binary_logged "${SRC}/packages/blobs/splash/bootsplash-packer" \ + --bg_red 0x00 \ + --bg_green 0x00 \ + --bg_blue 0x00 \ +@@ -107,7 +102,8 @@ function boot_logo() { + --blob "${SDCARD}"/tmp/throbber72.rgb \ + --blob "${SDCARD}"/tmp/throbber73.rgb \ + --blob "${SDCARD}"/tmp/throbber74.rgb \ +- "${SDCARD}"/lib/firmware/bootsplash.armbian > /dev/null 2>&1 ++ "${SDCARD}"/lib/firmware/bootsplash.armbian ++ + if [[ $BOOT_LOGO == yes || $BOOT_LOGO == desktop && $BUILD_DESKTOP == yes ]]; then + [[ -f "${SDCARD}"/boot/armbianEnv.txt ]] && grep -q '^bootlogo' "${SDCARD}"/boot/armbianEnv.txt && + sed -i 's/^bootlogo.*/bootlogo=true/' "${SDCARD}"/boot/armbianEnv.txt || echo 'bootlogo=true' >> "${SDCARD}"/boot/armbianEnv.txt +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 564af3c42..09139086b 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -1,241 +1,433 @@ + #!/usr/bin/env bash + # This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/configuration/menu.sh +-# shellcheck source=lib/functions/configuration/menu.sh +-source "${SRC}"/lib/functions/configuration/menu.sh +- +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/configuration/interactive.sh +-# shellcheck source=lib/functions/configuration/interactive.sh +-source "${SRC}"/lib/functions/configuration/interactive.sh +- +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/configuration/config-desktop.sh +-# shellcheck source=lib/functions/configuration/config-desktop.sh +-source "${SRC}"/lib/functions/configuration/config-desktop.sh +- +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/configuration/main-config.sh +-# shellcheck source=lib/functions/configuration/main-config.sh +-source "${SRC}"/lib/functions/configuration/main-config.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/repo.sh ++# shellcheck source=lib/functions/general/repo.sh ++source "${SRC}"/lib/functions/general/repo.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/configuration/aggregation.sh +-# shellcheck source=lib/functions/configuration/aggregation.sh +-source "${SRC}"/lib/functions/configuration/aggregation.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/host.sh ++# shellcheck source=lib/functions/general/host.sh ++source "${SRC}"/lib/functions/general/host.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/create-cache.sh +-# shellcheck source=lib/functions/rootfs/create-cache.sh +-source "${SRC}"/lib/functions/rootfs/create-cache.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/git.sh ++# shellcheck source=lib/functions/general/git.sh ++source "${SRC}"/lib/functions/general/git.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/apt.sh +-# shellcheck source=lib/functions/rootfs/apt.sh +-source "${SRC}"/lib/functions/rootfs/apt.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/downloads.sh ++# shellcheck source=lib/functions/general/downloads.sh ++source "${SRC}"/lib/functions/general/downloads.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/distro-specific.sh +-# shellcheck source=lib/functions/rootfs/distro-specific.sh +-source "${SRC}"/lib/functions/rootfs/distro-specific.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/cleaning.sh ++# shellcheck source=lib/functions/general/cleaning.sh ++source "${SRC}"/lib/functions/general/cleaning.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/rootfs-desktop.sh +-# shellcheck source=lib/functions/rootfs/rootfs-desktop.sh +-source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/general/chroot-helpers.sh ++# shellcheck source=lib/functions/general/chroot-helpers.sh ++source "${SRC}"/lib/functions/general/chroot-helpers.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/post-tweaks.sh +-# shellcheck source=lib/functions/rootfs/post-tweaks.sh +-source "${SRC}"/lib/functions/rootfs/post-tweaks.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/extras/buildpkg.sh ++# shellcheck source=lib/functions/extras/buildpkg.sh ++source "${SRC}"/lib/functions/extras/buildpkg.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/customize.sh +-# shellcheck source=lib/functions/rootfs/customize.sh +-source "${SRC}"/lib/functions/rootfs/customize.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/extras/fel.sh ++# shellcheck source=lib/functions/extras/fel.sh ++source "${SRC}"/lib/functions/extras/fel.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/distro-agnostic.sh +-# shellcheck source=lib/functions/rootfs/distro-agnostic.sh +-source "${SRC}"/lib/functions/rootfs/distro-agnostic.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/debs.sh ++# shellcheck source=lib/functions/compilation/debs.sh ++source "${SRC}"/lib/functions/compilation/debs.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/boot_logo.sh +-# shellcheck source=lib/functions/rootfs/boot_logo.sh +-source "${SRC}"/lib/functions/rootfs/boot_logo.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/uboot.sh ++# shellcheck source=lib/functions/compilation/uboot.sh ++source "${SRC}"/lib/functions/compilation/uboot.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/general/chroot-helpers.sh +-# shellcheck source=lib/functions/general/chroot-helpers.sh +-source "${SRC}"/lib/functions/general/chroot-helpers.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/sources.sh ++# shellcheck source=lib/functions/compilation/sources.sh ++source "${SRC}"/lib/functions/compilation/sources.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/general/repo.sh +-# shellcheck source=lib/functions/general/repo.sh +-source "${SRC}"/lib/functions/general/repo.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/extra-drivers.sh ++# shellcheck source=lib/functions/compilation/extra-drivers.sh ++source "${SRC}"/lib/functions/compilation/extra-drivers.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/general/cleaning.sh +-# shellcheck source=lib/functions/general/cleaning.sh +-source "${SRC}"/lib/functions/general/cleaning.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/utils-compilation.sh ++# shellcheck source=lib/functions/compilation/utils-compilation.sh ++source "${SRC}"/lib/functions/compilation/utils-compilation.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/general/git.sh +-# shellcheck source=lib/functions/general/git.sh +-source "${SRC}"/lib/functions/general/git.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/patching.sh ++# shellcheck source=lib/functions/compilation/patching.sh ++source "${SRC}"/lib/functions/compilation/patching.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/general/host.sh +-# shellcheck source=lib/functions/general/host.sh +-source "${SRC}"/lib/functions/general/host.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/kernel.sh ++# shellcheck source=lib/functions/compilation/kernel.sh ++source "${SRC}"/lib/functions/compilation/kernel.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/general/downloads.sh +-# shellcheck source=lib/functions/general/downloads.sh +-source "${SRC}"/lib/functions/general/downloads.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/compilation/atf.sh ++# shellcheck source=lib/functions/compilation/atf.sh ++source "${SRC}"/lib/functions/compilation/atf.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/multi/build-all.sh +-# shellcheck source=lib/functions/multi/build-all.sh +-source "${SRC}"/lib/functions/multi/build-all.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/cli/cli-entrypoint.sh ++# shellcheck source=lib/functions/cli/cli-entrypoint.sh ++source "${SRC}"/lib/functions/cli/cli-entrypoint.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + ### lib/functions/cli/utils-cli.sh + # shellcheck source=lib/functions/cli/utils-cli.sh + source "${SRC}"/lib/functions/cli/utils-cli.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/cli/cli-entrypoint.sh +-# shellcheck source=lib/functions/cli/cli-entrypoint.sh +-source "${SRC}"/lib/functions/cli/cli-entrypoint.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/logging/errors.sh ++# shellcheck source=lib/functions/logging/errors.sh ++source "${SRC}"/lib/functions/logging/errors.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/bsp/bsp-cli.sh +-# shellcheck source=lib/functions/bsp/bsp-cli.sh +-source "${SRC}"/lib/functions/bsp/bsp-cli.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/logging/runners.sh ++# shellcheck source=lib/functions/logging/runners.sh ++source "${SRC}"/lib/functions/logging/runners.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/bsp/bsp-desktop.sh +-# shellcheck source=lib/functions/bsp/bsp-desktop.sh +-source "${SRC}"/lib/functions/bsp/bsp-desktop.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/logging/capture.sh ++# shellcheck source=lib/functions/logging/capture.sh ++source "${SRC}"/lib/functions/logging/capture.sh ++ ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/logging/traps.sh ++# shellcheck source=lib/functions/logging/traps.sh ++source "${SRC}"/lib/functions/logging/traps.sh ++ ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/logging/logging.sh ++# shellcheck source=lib/functions/logging/logging.sh ++source "${SRC}"/lib/functions/logging/logging.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + ### lib/functions/bsp/utils-bsp.sh + # shellcheck source=lib/functions/bsp/utils-bsp.sh + source "${SRC}"/lib/functions/bsp/utils-bsp.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/image/loop.sh +-# shellcheck source=lib/functions/image/loop.sh +-source "${SRC}"/lib/functions/image/loop.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/bsp/bsp-desktop.sh ++# shellcheck source=lib/functions/bsp/bsp-desktop.sh ++source "${SRC}"/lib/functions/bsp/bsp-desktop.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/image/initrd.sh +-# shellcheck source=lib/functions/image/initrd.sh +-source "${SRC}"/lib/functions/image/initrd.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/bsp/bsp-cli.sh ++# shellcheck source=lib/functions/bsp/bsp-cli.sh ++source "${SRC}"/lib/functions/bsp/bsp-cli.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/image/rootfs-to-image.sh +-# shellcheck source=lib/functions/image/rootfs-to-image.sh +-source "${SRC}"/lib/functions/image/rootfs-to-image.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/main/default-build.sh ++# shellcheck source=lib/functions/main/default-build.sh ++source "${SRC}"/lib/functions/main/default-build.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/image/partitioning.sh +-# shellcheck source=lib/functions/image/partitioning.sh +-source "${SRC}"/lib/functions/image/partitioning.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/main/config-prepare.sh ++# shellcheck source=lib/functions/main/config-prepare.sh ++source "${SRC}"/lib/functions/main/config-prepare.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + ### lib/functions/main/rootfs-image.sh + # shellcheck source=lib/functions/main/rootfs-image.sh + source "${SRC}"/lib/functions/main/rootfs-image.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/main/config-prepare.sh +-# shellcheck source=lib/functions/main/config-prepare.sh +-source "${SRC}"/lib/functions/main/config-prepare.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/configuration/aggregation.sh ++# shellcheck source=lib/functions/configuration/aggregation.sh ++source "${SRC}"/lib/functions/configuration/aggregation.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/main/default-build.sh +-# shellcheck source=lib/functions/main/default-build.sh +-source "${SRC}"/lib/functions/main/default-build.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/configuration/main-config.sh ++# shellcheck source=lib/functions/configuration/main-config.sh ++source "${SRC}"/lib/functions/configuration/main-config.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/sources.sh +-# shellcheck source=lib/functions/compilation/sources.sh +-source "${SRC}"/lib/functions/compilation/sources.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/configuration/interactive.sh ++# shellcheck source=lib/functions/configuration/interactive.sh ++source "${SRC}"/lib/functions/configuration/interactive.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/uboot.sh +-# shellcheck source=lib/functions/compilation/uboot.sh +-source "${SRC}"/lib/functions/compilation/uboot.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/configuration/menu.sh ++# shellcheck source=lib/functions/configuration/menu.sh ++source "${SRC}"/lib/functions/configuration/menu.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/atf.sh +-# shellcheck source=lib/functions/compilation/atf.sh +-source "${SRC}"/lib/functions/compilation/atf.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/configuration/config-desktop.sh ++# shellcheck source=lib/functions/configuration/config-desktop.sh ++source "${SRC}"/lib/functions/configuration/config-desktop.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/utils-compilation.sh +-# shellcheck source=lib/functions/compilation/utils-compilation.sh +-source "${SRC}"/lib/functions/compilation/utils-compilation.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/multi/build-all.sh ++# shellcheck source=lib/functions/multi/build-all.sh ++source "${SRC}"/lib/functions/multi/build-all.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/kernel.sh +-# shellcheck source=lib/functions/compilation/kernel.sh +-source "${SRC}"/lib/functions/compilation/kernel.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/initrd.sh ++# shellcheck source=lib/functions/image/initrd.sh ++source "${SRC}"/lib/functions/image/initrd.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/debs.sh +-# shellcheck source=lib/functions/compilation/debs.sh +-source "${SRC}"/lib/functions/compilation/debs.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/rootfs-to-image.sh ++# shellcheck source=lib/functions/image/rootfs-to-image.sh ++source "${SRC}"/lib/functions/image/rootfs-to-image.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/extra-drivers.sh +-# shellcheck source=lib/functions/compilation/extra-drivers.sh +-source "${SRC}"/lib/functions/compilation/extra-drivers.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/loop.sh ++# shellcheck source=lib/functions/image/loop.sh ++source "${SRC}"/lib/functions/image/loop.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/patching.sh +-# shellcheck source=lib/functions/compilation/patching.sh +-source "${SRC}"/lib/functions/compilation/patching.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/image/partitioning.sh ++# shellcheck source=lib/functions/image/partitioning.sh ++source "${SRC}"/lib/functions/image/partitioning.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/logging/capture.sh +-# shellcheck source=lib/functions/logging/capture.sh +-source "${SRC}"/lib/functions/logging/capture.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/post-tweaks.sh ++# shellcheck source=lib/functions/rootfs/post-tweaks.sh ++source "${SRC}"/lib/functions/rootfs/post-tweaks.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/logging/runners.sh +-# shellcheck source=lib/functions/logging/runners.sh +-source "${SRC}"/lib/functions/logging/runners.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/rootfs-desktop.sh ++# shellcheck source=lib/functions/rootfs/rootfs-desktop.sh ++source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/logging/errors.sh +-# shellcheck source=lib/functions/logging/errors.sh +-source "${SRC}"/lib/functions/logging/errors.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/distro-agnostic.sh ++# shellcheck source=lib/functions/rootfs/distro-agnostic.sh ++source "${SRC}"/lib/functions/rootfs/distro-agnostic.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/logging/logging.sh +-# shellcheck source=lib/functions/logging/logging.sh +-source "${SRC}"/lib/functions/logging/logging.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/boot_logo.sh ++# shellcheck source=lib/functions/rootfs/boot_logo.sh ++source "${SRC}"/lib/functions/rootfs/boot_logo.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/logging/traps.sh +-# shellcheck source=lib/functions/logging/traps.sh +-source "${SRC}"/lib/functions/logging/traps.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/apt.sh ++# shellcheck source=lib/functions/rootfs/apt.sh ++source "${SRC}"/lib/functions/rootfs/apt.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/extras/fel.sh +-# shellcheck source=lib/functions/extras/fel.sh +-source "${SRC}"/lib/functions/extras/fel.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/customize.sh ++# shellcheck source=lib/functions/rootfs/customize.sh ++source "${SRC}"/lib/functions/rootfs/customize.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/extras/buildpkg.sh +-# shellcheck source=lib/functions/extras/buildpkg.sh +-source "${SRC}"/lib/functions/extras/buildpkg.sh ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/create-cache.sh ++# shellcheck source=lib/functions/rootfs/create-cache.sh ++source "${SRC}"/lib/functions/rootfs/create-cache.sh ++ ++# no errors tolerated. set -e is invoked before each sourced file to make sure. ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled ++### lib/functions/rootfs/distro-specific.sh ++# shellcheck source=lib/functions/rootfs/distro-specific.sh ++source "${SRC}"/lib/functions/rootfs/distro-specific.sh + + +-set -e # no errors tolerated. one last time for the win! ++# no errors tolerated. one last time for the win! ++#set -o pipefail # trace ERR through pipes - will be enabled "soon" ++#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++set -o errtrace # trace ERR through - enabled ++set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + # This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually +diff --git a/lib/tools/gen-library.sh b/lib/tools/gen-library.sh +index fd6f200e7..8abfad05e 100755 +--- a/lib/tools/gen-library.sh ++++ b/lib/tools/gen-library.sh +@@ -20,7 +20,11 @@ AUTOGEN_INCLUDES_HEADER + find lib/functions -type f -name \*.sh | while read -r path; do + ref="$(echo -n "${path}")" + cat <<- AUTOGEN_INCLUDES_EACH >> "${TARGET_SH}" +- set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. ++ # no errors tolerated. invoked before each sourced file to make sure. ++ #set -o pipefail # trace ERR through pipes - will be enabled "soon" ++ #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++ set -o errtrace # trace ERR through - enabled ++ set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + ### ${path} + # shellcheck source=${ref} + source "\${SRC}"/${path} +@@ -30,7 +34,11 @@ done + + cat <<- AUTOGEN_INCLUDES_FOOTER >> "${TARGET_SH}" + +- set -e # no errors tolerated. one last time for the win! ++ # no errors tolerated. one last time for the win! ++ #set -o pipefail # trace ERR through pipes - will be enabled "soon" ++ #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled ++ set -o errtrace # trace ERR through - enabled ++ set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled + # This file is/was autogenerated by ${0}; don't modify manually + AUTOGEN_INCLUDES_FOOTER + + +From f9e02b2152c1c82a74312ccf48ef530dac167512 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 22 Jan 2022 10:32:08 +0000 +Subject: [PATCH] armbian-next: always use UPPERCASE labels for FAT32 UEFI + filesystems (rpi4b, uefi-*) + +--- + config/sources/families/bcm2711.conf | 2 +- + lib/functions/image/partitioning.sh | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index eac9895d4..0a1322ac3 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -1,7 +1,7 @@ + enable_extension "flash-kernel" + export LINUXFAMILY=bcm2711 + export ARCH=arm64 +-export UEFI_FS_LABEL="rpicfg" # Windows/Mac users will see this if they mount the SD card. Configurable ++export UEFI_FS_LABEL="RPICFG" # Windows/Mac users will see this if they mount the SD card. Configurable, but should be uppercase always + export SKIP_BOOTSPLASH="yes" # video is init-ed before us + export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. + export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration +diff --git a/lib/functions/image/partitioning.sh b/lib/functions/image/partitioning.sh +index 92f5940c1..4090d96e1 100644 +--- a/lib/functions/image/partitioning.sh ++++ b/lib/functions/image/partitioning.sh +@@ -66,7 +66,7 @@ prepare_partitions() { + UEFISIZE=${UEFISIZE:-0} + BIOSSIZE=${BIOSSIZE:-0} + UEFI_MOUNT_POINT=${UEFI_MOUNT_POINT:-/boot/efi} +- UEFI_FS_LABEL="${UEFI_FS_LABEL:-armbiefi}" ++ UEFI_FS_LABEL="${UEFI_FS_LABEL:-ARMBIEFI}" # Should be always uppercase + + call_extension_method "pre_prepare_partitions" "prepare_partitions_custom" << 'PRE_PREPARE_PARTITIONS' + *allow custom options for mkfs* +@@ -293,7 +293,7 @@ PREPARE_IMAGE_SIZE + if [[ -n $uefipart ]]; then + display_alert "Creating EFI partition" "FAT32 ${UEFI_MOUNT_POINT} on ${LOOP}p${uefipart} label ${UEFI_FS_LABEL}" + check_loop_device "${LOOP}p${uefipart}" +- mkfs.fat -F32 -n "${UEFI_FS_LABEL}" ${LOOP}p${uefipart} 2>&1 ++ mkfs.fat -F32 -n "${UEFI_FS_LABEL^^}" ${LOOP}p${uefipart} 2>&1 # "^^" makes variable UPPERCASE, required for FAT32. + mkdir -p "${MOUNT}${UEFI_MOUNT_POINT}" + mount ${LOOP}p${uefipart} "${MOUNT}${UEFI_MOUNT_POINT}" + echo "UUID=$(blkid -s UUID -o value ${LOOP}p${uefipart}) ${UEFI_MOUNT_POINT} vfat defaults 0 2" >> $SDCARD/etc/fstab + +From acbc2f21da023796c5a72e3b78e0b20f09cf5ed0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 20 Jan 2022 23:41:18 +0000 +Subject: [PATCH] armbian-next: shellfmt after rebase onto master + +--- + config/sources/families/media.conf | 83 +++++++------------------------------- + 1 file changed, 15 insertions(+), 68 deletions(-) + +diff --git a/config/sources/families/media.conf b/config/sources/families/media.conf +index fe5e96c60..7c5a76af6 100644 +--- a/config/sources/families/media.conf ++++ b/config/sources/families/media.conf +@@ -1,100 +1,47 @@ + source "${BASH_SOURCE%/*}/include/rockchip64_common.inc" + +-if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == bananapir2pro ]]; then ++if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then + BOOTSOURCE='https://github.com/150balbes/u-boot-rk' + BOOTBRANCH='branch:rk356x' + BOOTPATCHDIR="u-boot-station-p2" +-elif [[ $BOARD == quartz64a ]]; then +- BOOTSOURCE='https://github.com/150balbes/u-boot-rk' +- BOOTBRANCH='branch:rk35xx' +- BOOTPATCHDIR="u-boot-station-p2" +-elif [[ $BOARD == station-m3 ]]; then +- BOOTSOURCE='https://github.com/150balbes/u-boot-rk' +- BOOTBRANCH='branch:rk3588' +- BOOTPATCHDIR="u-boot-station-p2" +-else +- BOOTBRANCH="tag:v2022.07" +- BOOTPATCHDIR="u-boot-media" + fi + +-SKIP_BOOTSPLASH="yes" +- + case $BRANCH in + + legacy) + KERNELDIR='linux-rockchip64' + +- if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == bananapir2pro ]]; then ++ if [[ $BOARD == station-p2 || $BOARD == station-m2 ]]; then + KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' + KERNELBRANCH='branch:kernel-4.19' + KERNELPATCHDIR='station-p2-'$BRANCH +- LINUXFAMILY=station-p2 + LINUXCONFIG='linux-station-p2-'$BRANCH ++ LINUXFAMILY=station-p2 + EXTRAWIFI="no" + WIREGUARD="no" +- elif [[ $BOARD == station-m3 ]]; then +- KERNELSOURCE='https://github.com/150balbes/rockchip-kernel' +- KERNELBRANCH='branch:kernel-5.10' +- LINUXFAMILY=station-m3 +- LINUXCONFIG='linux-station-m3-'$BRANCH +- KERNELPATCHDIR='station-m3-'$BRANCH +- AUFS="no" +- elif [[ $BOARD == jetson-nano ]]; then +- KERNELDIR='linux-nano' +- KERNELSOURCE='https://github.com/150balbes/Jetson-Nano' +- KERNELBRANCH='branch:4.9.201' +- KERNELPATCHDIR='jetson-nano-'$BRANCH +- LINUXFAMILY=jetson-nano +- LINUXCONFIG='linux-jetson-nano-'$BRANCH +- EXTRAWIFI="no" +- BOOT_FDT_FILE="none" +- SRC_CMDLINE='console=ttyS0,115200n8 console=tty0 tegraid=21.1.2.0.0 ddr_die=4096M@2048M section=512M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb debug_uartport=lsport,4 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=0x1000@0xff780000 core_edp_mv=1075 core_edp_ma=4000 tegra_fbmem=0x800000@0x92ca9000 is_hdmi_initialised=1 earlycon=uart8250,mmio32,0x70006000 fbcon=map:0' +- MODULES_INITRD="jetson-nano-legacy" + else +- if [[ $BOARD == nanopct4 ]]; then +- KERNELSOURCE='https://github.com/friendlyarm/kernel-rockchip' +- KERNELBRANCH='branch:nanopi4-linux-v4.4.y' +- KERNELPATCHDIR='rk3399-'$BRANCH +- LINUXFAMILY=rk3399 +- LINUXCONFIG='linux-rk3399-'$BRANCH +- else +- KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' +- KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' +- KERNELPATCHDIR='rockchip64-'$BRANCH +- LINUXFAMILY=rockchip64 +- LINUXCONFIG='linux-rockchip64-'$BRANCH +- fi ++ KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' ++ KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' ++ KERNELPATCHDIR='rockchip64-'$BRANCH ++ LINUXCONFIG='linux-rockchip64-'$BRANCH ++ LINUXFAMILY=rockchip64 + fi +- ;; ++ ;; + + current) +- +- KERNELBRANCH="branch:linux-5.18.y" +- LINUXCONFIG='linux-media-'$BRANCH +- +- if [[ $BOARD == station-p2 || $BOARD == station-m2 || $BOARD == quartz64a || $BOARD == bananapir2pro ]]; then +- KERNELPATCHDIR='station-p2-'$BRANCH +- LINUXFAMILY=station-p2 +- else ++ KERNELBRANCH="branch:linux-5.15.y" + KERNELPATCHDIR='media-'$BRANCH + LINUXFAMILY=media +- +- if [[ $BOARD == jetson-nano ]]; then +- MODULES_INITRD="jetson-nano-current" +- fi +- fi +- ;; ++ LINUXCONFIG='linux-media-'$BRANCH ++ ;; + + edge) ++ SKIP_BOOTSPLASH="yes" ++ KERNELBRANCH="branch:linux-5.16.y" + KERNELPATCHDIR='media-'$BRANCH +- KERNELBRANCH='branch:linux-5.19.y' + LINUXFAMILY=media + LINUXCONFIG='linux-media-'$BRANCH +- +- if [[ $BOARD == jetson-nano ]]; then +- MODULES_INITRD="jetson-nano-edge" +- fi +- ;; ++ ;; + esac + + prepare_boot_configuration + +From 407ecdb1b9108b57afea57b3ca6a17ed86ef1fcc Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Thu, 20 Jan 2022 23:35:46 +0000 +Subject: [PATCH] armbian-next: manual merge (4) of all lib/*.sh changes + between revisions 23afccf56e295610340188dc2613143d5323659e and + e610f00bc7fdcab5ba4c648fa21148518b4b767b + +- plus ooops +--- + config/sources/families/bcm2711.conf | 26 ++++++++++++----------- + config/sources/families/include/sunxi_common.inc | 2 +- + config/sources/families/jethub.conf | 2 +- + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/general/git.sh | 27 +++++++++++++++--------- + lib/functions/general/host.sh | 20 ------------------ + 6 files changed, 34 insertions(+), 45 deletions(-) + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 74e80cd03..eac9895d4 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -1,13 +1,10 @@ + enable_extension "flash-kernel" + export LINUXFAMILY=bcm2711 + export ARCH=arm64 +-export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" # config is per family and branch +-export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" # patches per family and branch +-export UEFI_FS_LABEL="RPICFG" # Windows/Mac users will see this if they mount the SD card. UPPERCASE +-export SKIP_BOOTSPLASH="yes" # video is init-ed before us +-export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. +-export RASPI_DISTRO_KERNEL=no # use default distor kernel? default is no, build from source. +-export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration ++export UEFI_FS_LABEL="rpicfg" # Windows/Mac users will see this if they mount the SD card. Configurable ++export SKIP_BOOTSPLASH="yes" # video is init-ed before us ++export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. ++export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration + export FK__KERNEL_PACKAGES="" + export RASPI_ROOT_FS_LABEL="armbian" + export CPUMIN=500000 +@@ -16,19 +13,24 @@ export GOVERNOR=ondemand + + case "${BRANCH}" in + +- ddk) +- # Use distro's default kernel (ddk). Disables kernel building. +- export RASPI_DISTRO_KERNEL=yes ++ legacy | ddk) ++ export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source + ;; + + current) ++ export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' + export KERNELBRANCH="branch:rpi-5.15.y" ++ export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" ++ export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; + + edge) ++ export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' + export KERNELBRANCH="branch:rpi-5.16.y" ++ export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" ++ export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; + esac + +@@ -40,7 +42,7 @@ prepare_partitions_custom__add_rootfs_raspi_label_to_mkfs() { + + pre_initramfs_flash_kernel__write_raspi_cmdline() { + cat <<- EOD > "${FIRMWARE_DIR}/cmdline.txt" +- root=LABEL=${RASPI_ROOT_FS_LABEL} rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1 console=tty1 ++ root=LABEL=${RASPI_ROOT_FS_LABEL} rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1 console=tty1 logo.nologo loglevel=1 + EOD + } + +@@ -55,7 +57,7 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + Kernel-Flavors: any + EOD + +- ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. This is pressing. ++ ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. + local oneDTB dtbBase + for oneDTB in "${MOUNT}"/boot/dtb/broadcom/*.dtb; do + dtbBase=$(basename "${oneDTB}") +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index 641cceb1c..eabacf86b 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -20,7 +20,7 @@ esac + + case "$KERNEL_VERSION_LEVEL" in + +- 5.10 | 5.15) ++ 5.10 | 5.15 | 5.16) + KERNELSOURCE=$MAINLINE_KERNEL_SOURCE + KERNELSOURCENAME='name=origin' + KERNELBRANCH="branch:linux-${KERNEL_VERSION_LEVEL}.y" +diff --git a/config/sources/families/jethub.conf b/config/sources/families/jethub.conf +index e747ed57c..16481c176 100644 +--- a/config/sources/families/jethub.conf ++++ b/config/sources/families/jethub.conf +@@ -172,7 +172,7 @@ family_tweaks() { + display_alert "Adding JetHome repository and authentication key" "/etc/apt/sources.list.d/jethome.list" "info" + cp "${SRC}"/packages/bsp/jethub/jethome.gpg "${SDCARD}/etc/apt/trusted.gpg.d/" + +- echo "deb http://repo.jethome.ru"$([[ $BETA == yes ]] && echo "/beta" )" ${RELEASE} jethome-${RELEASE}" \ ++ echo "deb http://repo.jethome.ru"$([[ $BETA == yes ]] && echo "/beta")" ${RELEASE} jethome-${RELEASE}" \ + >> "${SDCARD}"/etc/apt/sources.list.d/jethome.list + } + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 759deaf5d..d4995a6b7 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -32,7 +32,7 @@ function do_main_configuration() { + [[ -z $EXIT_PATCHING_ERROR ]] && EXIT_PATCHING_ERROR="" # exit patching if failed + [[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board + cd "${SRC}" || exit +- [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=11 ++ [[ -z "${ROOTFSCACHE_VERSION}" ]] && ROOTFSCACHE_VERSION=12 + [[ -z "${CHROOT_CACHE_VERSION}" ]] && CHROOT_CACHE_VERSION=7 + BUILD_REPOSITORY_URL=$(improved_git remote get-url $(improved_git remote 2> /dev/null | grep origin) 2> /dev/null) + BUILD_REPOSITORY_COMMIT=$(improved_git describe --match=d_e_a_d_b_e_e_f --always --dirty 2> /dev/null) +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index f66b5ea90..e4a03f278 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -72,31 +72,38 @@ waiter_local_repo() { + + display_alert "Checking git sources" "$dir $name/$branch" "info" + +- # Check the exception for 5.15 sunxi. We will remove this after a while. +- if [ "$dir" == "linux-mainline/5.15" ] && +- [ "$(git remote show | grep megous || true)" == "megous" ]; then +- display_alert "Remove mistakenly created and excessively large" "$dir" "info" +- rm -rf .git ./* +- fi +- + if [ "$(git rev-parse --git-dir 2> /dev/null)" != ".git" ]; then + git init -q . + + # Run in the sub shell to avoid mixing environment variables. + if [ -n "$VAR_SHALLOW_ORIGINAL" ]; then +- display_alert "Unshallowing original:" "${VAR_SHALLOW_ORIGINAL}" "debug" + ( + $VAR_SHALLOW_ORIGINAL + + display_alert "Add original git sources" "$dir $name/$branch" "info" +- if [ "$(git ls-remote -h $url $branch | awk -F'/' '{if (NR == 1) print $NF}' || true)" != "$branch" ]; then ++ if [ "$(git ls-remote -h $url $branch | ++ awk -F'/' '{if (NR == 1) print $NF}')" != "$branch" ]; then + display_alert "Bad $branch for $url in $VAR_SHALLOW_ORIGINAL" + exit 177 + fi + + git remote add -t $branch $name $url +- git fetch --shallow-exclude=$start_tag $name ++ ++ # Handle an exception if the initial tag is the top of the branch ++ # As v5.16 == HEAD ++ if $( ++ git ls-remote -t $url ${start_tag}\* | ++ awk -F'/' '$NF !~ /v[4-5][.][1-9]{1,2}[.][1]$/ { ++ exit 1 ++ }' ++ ); then ++ git fetch --shallow-exclude=$start_tag $name ++ else ++ git fetch --depth 1 $name ++ fi + git fetch --deepen=1 $name ++ # For a shallow clone, this works quickly and saves space. ++ git gc + ) + + [ "$?" == "177" ] && exit +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index d262d4baa..d292fcf10 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -153,26 +153,6 @@ prepare_host() { + + if [ -n "${EXTRA_BUILD_DEPS}" ]; then hostdeps+=" ${EXTRA_BUILD_DEPS}"; fi + +- # distribution packages are buggy, download from author +- +- # build aarch64 +- if [[ $(dpkg --print-architecture) == amd64 ]]; then +- +- if [[ ! -f /etc/apt/sources.list.d/aptly.list ]]; then +- display_alert "Updating from external repository" "aptly" "info" +- if [ x"" != x"${http_proxy}" ]; then +- apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-options http-proxy="${http_proxy}" --recv-keys ED75B5A4483DA07C > /dev/null 2>&1 +- else +- apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys ED75B5A4483DA07C > /dev/null 2>&1 +- fi +- echo "deb http://repo.aptly.info/ nightly main" > /etc/apt/sources.list.d/aptly.list +- else +- sed "s/squeeze/nightly/" -i /etc/apt/sources.list.d/aptly.list +- fi +- +- # build aarch64 +- fi +- + display_alert "Installing build dependencies" + # don't prompt for apt cacher selection + sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections + +From cdf0389ba5f0a747f4c1f9feee9527001aa61a35 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 16 Jan 2022 23:02:52 +0100 +Subject: [PATCH] atf: fix for `set -e` mode; fix CROSS_COMPILE quoting + +Signed-off-by: Ricardo Pardini +--- + lib/functions/compilation/atf.sh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/lib/functions/compilation/atf.sh b/lib/functions/compilation/atf.sh +index 73fa4a574..10d9bdec3 100644 +--- a/lib/functions/compilation/atf.sh ++++ b/lib/functions/compilation/atf.sh +@@ -51,7 +51,7 @@ compile_atf() { + # Check: https://github.com/armbian/build/issues/1157 + CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${toolchain2}:${PATH}" \ + make ENABLE_BACKTRACE="0" $target_make $CTHREADS \ +- CROSS_COMPILE=$CCACHE $ATF_COMPILER 2>&1 || { ++ CROSS_COMPILE="$CCACHE $ATF_COMPILER" 2>&1 || { + exit_with_error "ATF compilation failed" + } + +@@ -80,4 +80,6 @@ compile_atf() { + + # copy license file to pack it to u-boot package later + [[ -f license.md ]] && cp license.md "${atftempdir}"/ ++ ++ return 0 # avoid error due to short-circuit above + } + +From eea2f5f4041541f8055be549eea4cf8c2f32a901 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 16 Jan 2022 23:03:45 +0100 +Subject: [PATCH] logging: predict the future location of .img file + +- otherwise it's really unhelpful + +Signed-off-by: Ricardo Pardini +--- + lib/functions/image/rootfs-to-image.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/functions/image/rootfs-to-image.sh b/lib/functions/image/rootfs-to-image.sh +index 96e6c9ea4..f1d327a84 100644 +--- a/lib/functions/image/rootfs-to-image.sh ++++ b/lib/functions/image/rootfs-to-image.sh +@@ -193,7 +193,7 @@ POST_UMOUNT_FINAL_IMAGE + fi + + fi +- display_alert "Done building" "${DESTIMG}/${version}.img" "info" ++ display_alert "Done building" "${FINALDEST}/${version}.img" "info" # A bit predicting the future, since it's still in DESTIMG at this point. + + # Previously, post_build_image passed the .img path as an argument to the hook. Now its an ENV var. + export FINAL_IMAGE_FILE="${DESTIMG}/${version}.img" + +From 873136d95f303e1acfce017ad7d38464ee0058ec Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 15 Jan 2022 19:37:27 +0100 +Subject: [PATCH] uefi: alias `BRANCH=ddk` to `current`'s + `DISTRO_GENERIC_KERNEL=yes` + +- no real change, just to match rpi4b's BRANCH=style +- opens space for Armbian-built `current` soon + +Signed-off-by: Ricardo Pardini +--- + config/boards/uefi-arm64.conf | 4 +--- + config/boards/uefi-x86.conf | 4 +--- + config/sources/families/include/uefi_common.inc | 4 ++-- + 3 files changed, 4 insertions(+), 8 deletions(-) + +diff --git a/config/boards/uefi-arm64.conf b/config/boards/uefi-arm64.conf +index 5a705cdeb..523e488ce 100644 +--- a/config/boards/uefi-arm64.conf ++++ b/config/boards/uefi-arm64.conf +@@ -1,6 +1,4 @@ + # aarch64 via UEFI for all UEFI-enabled boards + export BOARD_NAME="UEFI arm64" + export BOARDFAMILY="uefi-arm64" +-export KERNEL_TARGET="current,edge" +- +-export BOOT_LOGO=desktop ++export KERNEL_TARGET="ddk,current,edge" +diff --git a/config/boards/uefi-x86.conf b/config/boards/uefi-x86.conf +index d6153e717..186e5fdba 100644 +--- a/config/boards/uefi-x86.conf ++++ b/config/boards/uefi-x86.conf +@@ -1,6 +1,4 @@ + # x86_64 via UEFI/BIOS for all boards + export BOARD_NAME="UEFI x86" + export BOARDFAMILY="uefi-x86" +-export KERNEL_TARGET="current,edge" +- +-export BOOT_LOGO=desktop ++export KERNEL_TARGET="ddk,current,edge" +diff --git a/config/sources/families/include/uefi_common.inc b/config/sources/families/include/uefi_common.inc +index 28ec78ffc..907e55ad1 100644 +--- a/config/sources/families/include/uefi_common.inc ++++ b/config/sources/families/include/uefi_common.inc +@@ -3,16 +3,16 @@ export SERIALCON="tty1" # Cant reasonably expect UEFI s + export SKIP_BOOTSPLASH="yes" # No splash. + export UEFI_GRUB_TIMEOUT=${UEFI_GRUB_TIMEOUT:-3} # Default 3-seconds timeout for GRUB menu. + export BOARD_FIRMWARE_INSTALL="-full" # Install full firmware for UEFI boards ++export DISTRO_GENERIC_KERNEL=no # no, build from source; yes: use distro + case "${BRANCH}" in + +- current) ++ current | ddk) + # This will force `unset KERNELSOURCE` later; no kernel will be built. + # Instead, the distro's default linux-generic kernel will be installed. + export DISTRO_GENERIC_KERNEL=yes + ;; + + edge) +- export DISTRO_GENERIC_KERNEL=no + export LINUXCONFIG="linux-uefi-${LINUXFAMILY}-${BRANCH}" + export KERNELBRANCH="branch:linux-5.15.y" + export KERNELPATCHDIR="uefi-${LINUXFAMILY}-${BRANCH}" # Might be empty. + +From fe8e12e095465e7098e5f4cff98fdb4ee80769ff Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 15 Jan 2022 02:46:02 +0100 +Subject: [PATCH] rpi: `legacy`->`ddk` (distro default kernel), remove + overclock + +- common vars in bcm2711.conf moved to top +- removed overclock/overvolt that was leftover my old setup +- confirmed: works with rpi3b too, should work with CM4/CM3 and others +- use valid UPPERCASE FAT label for RPICFG (in place of `rpicfg`) + +Signed-off-by: Ricardo Pardini +--- + config/boards/rpi4b.wip | 12 ++---------- + config/sources/families/bcm2711.conf | 25 ++++++++++++------------- + 2 files changed, 14 insertions(+), 23 deletions(-) + +diff --git a/config/boards/rpi4b.wip b/config/boards/rpi4b.wip +index 56a785a25..b471e3421 100644 +--- a/config/boards/rpi4b.wip ++++ b/config/boards/rpi4b.wip +@@ -1,8 +1,8 @@ + # Broadcom BCM2711 quad core 1-8Gb RAM SoC USB3 GBE USB-C WiFi/BT + export BOARD_NAME="Raspberry Pi 4" + export BOARDFAMILY="bcm2711" +-export KERNEL_TARGET="legacy,current,edge" +-export FK__MACHINE_MODEL="Raspberry Pi 4 Model B" # flash kernel (FK) configuration ++export KERNEL_TARGET="ddk,current,edge" ++export FK__MACHINE_MODEL="Raspberry Pi 4 Model B" # this is passed to flash-kernel. + export ASOUND_STATE="asound.state.rpi" + + # configure stuff at the appropriate time in flash-kernel +@@ -24,14 +24,6 @@ pre_initramfs_flash_kernel__write_raspi_config() { + # bootloader logs to serial, second stage + # enable_uart=1 + +- # overclock. requires decent thermals. COMMENT OUT IF DON'T USE A GREAT COOLER OR HEATSINK. +- over_voltage=6 +- arm_freq=2000 +- +- # uncomment to disable wifi or bt. +- #dtoverlay=disable-wifi +- #dtoverlay=disable-bt +- + # gpu and 3d stuff. + gpu_mem=256 + dtoverlay=vc4-fkms-v3d +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 55bad2a14..74e80cd03 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -1,10 +1,13 @@ + enable_extension "flash-kernel" + export LINUXFAMILY=bcm2711 + export ARCH=arm64 +-export UEFI_FS_LABEL="rpicfg" # Windows/Mac users will see this if they mount the SD card. Configurable +-export SKIP_BOOTSPLASH="yes" # video is init-ed before us +-export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. +-export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration ++export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" # config is per family and branch ++export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" # patches per family and branch ++export UEFI_FS_LABEL="RPICFG" # Windows/Mac users will see this if they mount the SD card. UPPERCASE ++export SKIP_BOOTSPLASH="yes" # video is init-ed before us ++export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. ++export RASPI_DISTRO_KERNEL=no # use default distor kernel? default is no, build from source. ++export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration + export FK__KERNEL_PACKAGES="" + export RASPI_ROOT_FS_LABEL="armbian" + export CPUMIN=500000 +@@ -13,23 +16,19 @@ export GOVERNOR=ondemand + + case "${BRANCH}" in + +- legacy) +- export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source ++ ddk) ++ # Use distro's default kernel (ddk). Disables kernel building. ++ export RASPI_DISTRO_KERNEL=yes + ;; + + current) +- export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' + export KERNELBRANCH="branch:rpi-5.15.y" +- export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" +- export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; ++ + edge) +- export RASPI_DISTRO_KERNEL=no + export KERNELSOURCE='https://github.com/raspberrypi/linux' + export KERNELBRANCH="branch:rpi-5.16.y" +- export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" +- export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" + ;; + esac + +@@ -56,7 +55,7 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + Kernel-Flavors: any + EOD + +- ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. ++ ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. This is pressing. + local oneDTB dtbBase + for oneDTB in "${MOUNT}"/boot/dtb/broadcom/*.dtb; do + dtbBase=$(basename "${oneDTB}") + +From 1390b62e7c08fc0d0e834854ddd5d19c5243aa8d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 15 Jan 2022 02:37:48 +0100 +Subject: [PATCH] armbian-next: shellfmt again after rebase + +Signed-off-by: Ricardo Pardini +--- + config/boards/rpi4b.wip | 2 +- + config/sources/families/bcm2711.conf | 40 ++++++++++++++++++------------------ + 2 files changed, 21 insertions(+), 21 deletions(-) + +diff --git a/config/boards/rpi4b.wip b/config/boards/rpi4b.wip +index 9afe14f75..56a785a25 100644 +--- a/config/boards/rpi4b.wip ++++ b/config/boards/rpi4b.wip +@@ -9,7 +9,7 @@ export ASOUND_STATE="asound.state.rpi" + pre_initramfs_flash_kernel__write_raspi_config() { + # for serial console, there is also 'BOOT_UART=1' in 'rpi-eeprom-config' but that is for an earlier stage. + # look at with it rpi-eeprom-config, change with 'EDITOR=nano rpi-eeprom-config --edit' +- cat <<-EOD >"${FIRMWARE_DIR}/config.txt" ++ cat <<- EOD > "${FIRMWARE_DIR}/config.txt" + [pi4] + max_framebuffers=2 + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 31ecdf529..55bad2a14 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -13,24 +13,24 @@ export GOVERNOR=ondemand + + case "${BRANCH}" in + +-legacy) +- export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source +- ;; ++ legacy) ++ export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source ++ ;; + +-current) +- export RASPI_DISTRO_KERNEL=no +- export KERNELSOURCE='https://github.com/raspberrypi/linux' +- export KERNELBRANCH="branch:rpi-5.15.y" +- export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" +- export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" +- ;; +-edge) +- export RASPI_DISTRO_KERNEL=no +- export KERNELSOURCE='https://github.com/raspberrypi/linux' +- export KERNELBRANCH="branch:rpi-5.16.y" +- export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" +- export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" +- ;; ++ current) ++ export RASPI_DISTRO_KERNEL=no ++ export KERNELSOURCE='https://github.com/raspberrypi/linux' ++ export KERNELBRANCH="branch:rpi-5.15.y" ++ export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" ++ export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" ++ ;; ++ edge) ++ export RASPI_DISTRO_KERNEL=no ++ export KERNELSOURCE='https://github.com/raspberrypi/linux' ++ export KERNELBRANCH="branch:rpi-5.16.y" ++ export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" ++ export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" ++ ;; + esac + + # Add a label to the root partition - this is common, should refactor into a separate segment +@@ -40,7 +40,7 @@ prepare_partitions_custom__add_rootfs_raspi_label_to_mkfs() { + } + + pre_initramfs_flash_kernel__write_raspi_cmdline() { +- cat <<-EOD >"${FIRMWARE_DIR}/cmdline.txt" ++ cat <<- EOD > "${FIRMWARE_DIR}/cmdline.txt" + root=LABEL=${RASPI_ROOT_FS_LABEL} rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1 console=tty1 + EOD + } +@@ -50,7 +50,7 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + display_alert "Preparing DTBs and Kernel..." "bcm2711" "info" + mkdir -p "${MOUNT}"/etc/flash-kernel/dtbs + +- cat <<-EOD >>"${MOUNT}"/etc/flash-kernel/db ++ cat <<- EOD >> "${MOUNT}"/etc/flash-kernel/db + # Armbian kernels have a different flavour than expected. + Machine: ${FK__MACHINE_MODEL} + Kernel-Flavors: any +@@ -85,7 +85,7 @@ extension_prepare_config__prepare_rpi_flash_kernel() { + fi + + if [[ "${RASPI_DISTRO_KERNEL}" == "yes" ]]; then # and firmware. +- unset KERNELSOURCE # Make sure Armbian will not try to compile from source. ++ unset KERNELSOURCE # Make sure Armbian will not try to compile from source. + export FK__KERNEL_PACKAGES="${FK__KERNEL_PACKAGES} linux-tools-raspi linux-raspi linux-image-raspi " + # Ubuntu Impish+ split the kernel modules, add the extra ones too. + if [[ "$RELEASE" =~ ^(impish|jammy)$ ]]; then + +From 03b4020135b5915e54895f5dcd53250df25d57e5 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Tue, 11 Jan 2022 11:36:25 +0100 +Subject: [PATCH] armbian-next: manual merge (3) of all lib/*.sh changes + between revisions 1035905760884fbea567717684c38faae3ef28a4 and + e4e4ab0791e60e1e7a204dd0409fa29a1cf7a376 + +- missed non lib change on Several improvements for RPi builds (#3391) +- I just realized I will have to drop all non lib changes +--- + config/boards/rpi4b.wip | 2 +- + config/sources/families/bcm2711.conf | 35 +++++++++++++++++++++++------------ + lib/functions/compilation/debs.sh | 2 +- + lib/functions/general/downloads.sh | 19 +++++++++++-------- + lib/functions/general/host.sh | 14 +++++++++++--- + 5 files changed, 47 insertions(+), 25 deletions(-) + +diff --git a/config/boards/rpi4b.wip b/config/boards/rpi4b.wip +index 56a785a25..9afe14f75 100644 +--- a/config/boards/rpi4b.wip ++++ b/config/boards/rpi4b.wip +@@ -9,7 +9,7 @@ export ASOUND_STATE="asound.state.rpi" + pre_initramfs_flash_kernel__write_raspi_config() { + # for serial console, there is also 'BOOT_UART=1' in 'rpi-eeprom-config' but that is for an earlier stage. + # look at with it rpi-eeprom-config, change with 'EDITOR=nano rpi-eeprom-config --edit' +- cat <<- EOD > "${FIRMWARE_DIR}/config.txt" ++ cat <<-EOD >"${FIRMWARE_DIR}/config.txt" + [pi4] + max_framebuffers=2 + +diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf +index 950e90b14..31ecdf529 100644 +--- a/config/sources/families/bcm2711.conf ++++ b/config/sources/families/bcm2711.conf +@@ -7,19 +7,30 @@ export KERNELDIR='linux-rpi' # Avoid sharing a source tree with o + export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration + export FK__KERNEL_PACKAGES="" + export RASPI_ROOT_FS_LABEL="armbian" ++export CPUMIN=500000 ++export CPUMAX=2000000 ++export GOVERNOR=ondemand + + case "${BRANCH}" in + +- current) +- export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source +- ;; ++legacy) ++ export RASPI_DISTRO_KERNEL=yes # This will cause board to include distro's prebuilt kernel, not from source ++ ;; + +- edge) +- export RASPI_DISTRO_KERNEL=no +- export KERNELBRANCH="branch:linux-5.15.y" +- export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" +- export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" +- ;; ++current) ++ export RASPI_DISTRO_KERNEL=no ++ export KERNELSOURCE='https://github.com/raspberrypi/linux' ++ export KERNELBRANCH="branch:rpi-5.15.y" ++ export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" ++ export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" ++ ;; ++edge) ++ export RASPI_DISTRO_KERNEL=no ++ export KERNELSOURCE='https://github.com/raspberrypi/linux' ++ export KERNELBRANCH="branch:rpi-5.16.y" ++ export KERNELPATCHDIR="${LINUXFAMILY}-${BRANCH}" ++ export LINUXCONFIG="linux-${LINUXFAMILY}-${BRANCH}" ++ ;; + esac + + # Add a label to the root partition - this is common, should refactor into a separate segment +@@ -29,7 +40,7 @@ prepare_partitions_custom__add_rootfs_raspi_label_to_mkfs() { + } + + pre_initramfs_flash_kernel__write_raspi_cmdline() { +- cat <<- EOD > "${FIRMWARE_DIR}/cmdline.txt" ++ cat <<-EOD >"${FIRMWARE_DIR}/cmdline.txt" + root=LABEL=${RASPI_ROOT_FS_LABEL} rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1 console=tty1 + EOD + } +@@ -39,7 +50,7 @@ pre_flash_kernel__symlink_dtb_and_kernel() { + display_alert "Preparing DTBs and Kernel..." "bcm2711" "info" + mkdir -p "${MOUNT}"/etc/flash-kernel/dtbs + +- cat <<- EOD >> "${MOUNT}"/etc/flash-kernel/db ++ cat <<-EOD >>"${MOUNT}"/etc/flash-kernel/db + # Armbian kernels have a different flavour than expected. + Machine: ${FK__MACHINE_MODEL} + Kernel-Flavors: any +@@ -74,7 +85,7 @@ extension_prepare_config__prepare_rpi_flash_kernel() { + fi + + if [[ "${RASPI_DISTRO_KERNEL}" == "yes" ]]; then # and firmware. +- unset KERNELSOURCE # Make sure Armbian will not try to compile from source. ++ unset KERNELSOURCE # Make sure Armbian will not try to compile from source. + export FK__KERNEL_PACKAGES="${FK__KERNEL_PACKAGES} linux-tools-raspi linux-raspi linux-image-raspi " + # Ubuntu Impish+ split the kernel modules, add the extra ones too. + if [[ "$RELEASE" =~ ^(impish|jammy)$ ]]; then +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index d696b9d86..2932264c0 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -14,7 +14,7 @@ compile_firmware() { + fetch_from_repo "https://github.com/armbian/firmware" "armbian-firmware-git" "branch:master" + + if [[ -n $FULL ]]; then +- fetch_from_repo "$MAINLINE_FIRMWARE_SOURCE" "linux-firmware-git" "branch:master" ++ fetch_from_repo "$MAINLINE_FIRMWARE_SOURCE" "linux-firmware-git" "branch:main" + # cp : create hardlinks + cp -af --reflink=auto "${SRC}"/cache/sources/linux-firmware-git/* "${firmwaretempdir}/${plugin_dir}/lib/firmware/" + fi +diff --git a/lib/functions/general/downloads.sh b/lib/functions/general/downloads.sh +index 74659ead8..5d36282c0 100644 +--- a/lib/functions/general/downloads.sh ++++ b/lib/functions/general/downloads.sh +@@ -1,19 +1,22 @@ + function webseed() { + # list of mirrors that host our files + unset text +- WEBSEED=("$(curl -s https://redirect.armbian.com/mirrors | jq '.[] |.[] | values' | grep https | awk '!a[$0]++')") ++ # Hardcoded to EU mirrors since ++ local CCODE=$(curl -s redirect.armbian.com/geoip | jq '.continent.code' -r) ++ WEBSEED=($(curl -s https://redirect.armbian.com/mirrors | jq -r '.'${CCODE}' | .[] | values')) + # aria2 simply split chunks based on sources count not depending on download speed + # when selecting china mirrors, use only China mirror, others are very slow there + if [[ $DOWNLOAD_MIRROR == china ]]; then +- WEBSEED=("https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/") ++ WEBSEED=( ++ https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/ ++ ) + elif [[ $DOWNLOAD_MIRROR == bfsu ]]; then +- WEBSEED=("https://mirrors.bfsu.edu.cn/armbian-releases/") ++ WEBSEED=( ++ https://mirrors.bfsu.edu.cn/armbian-releases/ ++ ) + fi +- for toolchain in "${WEBSEED[@]}"; do +- # use only live, tnahosting return ok also when file is absent +- if [[ $(wget -S --spider "${toolchain}${1}" 2>&1 > /dev/null | grep 'HTTP/1.1 200 OK') && ${toolchain} != *tnahosting* ]]; then +- text="${text} ${toolchain}${1}" +- fi ++ for toolchain in ${WEBSEED[@]}; do ++ text="${text} ${toolchain}${1}" + done + text="${text:1}" + echo "${text}" +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 6766aa78a..d262d4baa 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -23,7 +23,7 @@ prepare_host_basic() { + + if [[ -n $install_pack ]]; then + display_alert "Installing basic packages" "$install_pack" +- apt-get -qq update && apt-get install -qq -y --no-install-recommends $install_pack ++ sudo bash -c "apt-get -qq update && apt-get install -qq -y --no-install-recommends $install_pack" + fi + + } +@@ -329,12 +329,15 @@ function fetch_and_build_host_tools() { + } + + # Installing debian packages in the armbian build system. +-# The function accepts three optional parameters: ++# The function accepts four optional parameters: ++# autoupdate - If the installation list is not empty then update first. + # upgrade, clean - the same name for apt + # verbose - detailed log for the function + # + # list="pkg1 pkg2 pkg3 pkgbadname pkg-1.0 | pkg-2.0 pkg5 (>= 9)" + # install_pkg_deb upgrade verbose $list ++# or ++# install_pkg_deb autoupdate $list + # + # If the package has a bad name, we will see it in the log file. + # If there is an LOG_OUTPUT_FILE variable and it has a value as +@@ -347,6 +350,7 @@ install_pkg_deb() { + local list="" + local log_file + local for_install ++ local need_autoup=false + local need_upgrade=false + local need_clean=false + local need_verbose=false +@@ -359,6 +363,10 @@ install_pkg_deb() { + list=$( + for p in $*; do + case $p in ++ autoupdate) ++ need_autoup=true ++ continue ++ ;; + upgrade) + need_upgrade=true + continue +@@ -413,7 +421,7 @@ install_pkg_deb() { + fi + + if [ -n "$for_install" ]; then +- if ! $need_upgrade; then ++ if $need_autoup; then + apt-get -q update + apt-get -y upgrade + fi + +From 1f2306a3ad4f0abf5730bb5eb26a70c979d86ff3 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 9 Jan 2022 15:22:10 +0100 +Subject: [PATCH] rockship: fixes for `set -e` mode in rockship armhf family + and bsp tweaks + +Signed-off-by: Ricardo Pardini +--- + config/sources/families/rockchip.conf | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf +index 089fa5450..5870ed1fb 100644 +--- a/config/sources/families/rockchip.conf ++++ b/config/sources/families/rockchip.conf +@@ -68,11 +68,15 @@ uboot_custom_postprocess() { + + family_tweaks() { + if [[ $BOARD == tinkerboard ]]; then +- chroot $SDCARD /bin/bash -c "apt-get -y -qq install rfkill bluetooth bluez bluez-tools" +- chroot $SDCARD /bin/bash -c "systemctl --no-reload enable tinker-bluetooth.service >/dev/null 2>&1" +- sed -i -e "/#load-module module-alsa-sink/r $SRC/packages/bsp/rockchip/pulseaudio.txt" $SDCARD/etc/pulse/default.pa > /dev/null 2>&1 ++ chroot $SDCARD /bin/bash -c "apt-get -y -qq install rfkill bluetooth bluez bluez-tools" 2>&1 ++ chroot $SDCARD /bin/bash -c "systemctl --no-reload enable tinker-bluetooth.service" 2>&1 ++ if [[ -f "$SDCARD/etc/pulse/default.pa" ]]; then ++ sed -i -e "/#load-module module-alsa-sink/r $SRC/packages/bsp/rockchip/pulseaudio.txt" "$SDCARD/etc/pulse/default.pa" 2>&1 ++ else ++ display_alert "Can't find pulseaudio config" "${BOARD} - family_tweaks" "warn" ++ fi + fi +- ++ return 0 + } + + family_tweaks_bsp() { +@@ -87,8 +91,8 @@ family_tweaks_bsp() { + install -m 755 $SRC/packages/bsp/rockchip/hdmi-hotplug $destination/usr/local/bin + + # Peripheral access for specific groups +- addgroup --system --quiet --gid 997 gpio +- addgroup --system --quiet --gid 998 i2c ++ addgroup --system --quiet --gid 997 gpio || display_alert "Failed to create 997 group gid" "gpio" "warn" ++ addgroup --system --quiet --gid 998 i2c || display_alert "Failed to create 997 group gid" "gpio" "warn" + cp $SRC/packages/bsp/rockchip/70-gpio.rules $destination/etc/udev/rules.d + cp $SRC/packages/bsp/rockchip/71-i2c.rules $destination/etc/udev/rules.d + +@@ -105,4 +109,5 @@ family_tweaks_bsp() { + mkdir -p $destination/etc/initramfs-tools/hooks + install -m 550 $SRC/packages/bsp/rockchip/ap6330-initramfs-firmware $destination/etc/initramfs-tools/hooks + ++ return 0 # exit with success + } + +From 7bfb222e11c2a658ce29df17d17981fce8e03382 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 9 Jan 2022 15:21:40 +0100 +Subject: [PATCH] armhf: enable building armhf targets on amd64 using system + toolchains + +- SKIP_EXTERNAL_TOOLCHAINS=yes on amd64 should use the same system toolchains as an arm64 build + +Signed-off-by: Ricardo Pardini +--- + config/sources/armhf.conf | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/config/sources/armhf.conf b/config/sources/armhf.conf +index 89ce1441a..2d4682408 100644 +--- a/config/sources/armhf.conf ++++ b/config/sources/armhf.conf +@@ -43,4 +43,8 @@ fi + [[ -z $KERNELSOURCE ]] && KERNELSOURCE=$MAINLINE_KERNEL_SOURCE + [[ -z $KERNELBRANCH ]] && KERNELBRANCH='branch:linux-5.4.y' + ++## System toolchains don't have the -none- variant, remove it ++[[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]] && [[ "${UBOOT_COMPILER}" = *none* ]] && UBOOT_COMPILER="${UBOOT_COMPILER//-none-/-}" ++[[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]] && [[ "${ATF_COMPILER}" = *none* ]] && ATF_COMPILER="${ATF_COMPILER//-none-/-}" ++ + true # don't fail due to conditional above. + +From 79348c956a29a2077e017c2d83e129beed99208d Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 9 Jan 2022 15:20:50 +0100 +Subject: [PATCH] logging: better logging about family_tweaks and + family_tweaks_bsp + +Signed-off-by: Ricardo Pardini +--- + lib/functions/bsp/bsp-cli.sh | 8 +++++++- + lib/functions/rootfs/distro-agnostic.sh | 8 +++++--- + 2 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index d4bb3daab..71f0ea765 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -285,7 +285,11 @@ create_board_package() { + sed -i 's/#no-auto-down/no-auto-down/g' "${destination}"/etc/network/interfaces.default + + # execute $LINUXFAMILY-specific tweaks +- [[ $(type -t family_tweaks_bsp) == function ]] && family_tweaks_bsp 2>&1 ++ if [[ $(type -t family_tweaks_bsp) == function ]]; then ++ display_alert "Running family_tweaks_bsp" "${LINUXFAMILY}" "debug" ++ family_tweaks_bsp 2>&1 ++ display_alert "Done with family_tweaks_bsp" "${LINUXFAMILY}" "debug" ++ fi + + call_extension_method "post_family_tweaks_bsp" << 'POST_FAMILY_TWEAKS_BSP' + *family_tweaks_bsp overrrides what is in the config, so give it a chance to override the family tweaks* +@@ -304,6 +308,8 @@ POST_FAMILY_TWEAKS_BSP + mkdir -p "${DEB_STORAGE}/" + rsync --remove-source-files -rq "${destination}.deb" "${DEB_STORAGE}/" 2>&1 + ++ display_alert "Done building BSP CLI package" "${destination}" "debug" ++ + # cleanup + rm -rf ${bsptempdir} + } +diff --git a/lib/functions/rootfs/distro-agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +index 6249376b7..d348e4d39 100644 +--- a/lib/functions/rootfs/distro-agnostic.sh ++++ b/lib/functions/rootfs/distro-agnostic.sh +@@ -397,10 +397,12 @@ POST_INSTALL_KERNEL_DEBS + # copy boot splash images + cp "${SRC}"/packages/blobs/splash/armbian-u-boot.bmp "${SDCARD}"/boot/boot.bmp + +- display_alert "Running tweaks" "$BOARD :: $LINUXFAMILY" "info" +- + # execute $LINUXFAMILY-specific tweaks +- [[ $(type -t family_tweaks) == function ]] && family_tweaks ++ if [[ $(type -t family_tweaks) == function ]]; then ++ display_alert "Running family_tweaks" "$BOARD :: $LINUXFAMILY" "debug" ++ family_tweaks ++ display_alert "Done with family_tweaks" "$BOARD :: $LINUXFAMILY" "debug" ++ fi + + call_extension_method "post_family_tweaks" << 'FAMILY_TWEAKS' + *customize the tweaks made by $LINUXFAMILY-specific family_tweaks* + +From eca8ea1ba1b44474c3fd1baae9bdacae5ef7e431 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 21:26:08 +0100 +Subject: [PATCH] kernel: unblock cross compilation, warn about headers package + +Signed-off-by: Ricardo Pardini +--- + lib/functions/compilation/kernel.sh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index 291cf7285..e0bce0699 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -95,8 +95,7 @@ compile_kernel() { + toolchain=$(find_toolchain "$KERNEL_COMPILER" "$KERNEL_USE_GCC") + [[ -z $toolchain ]] && exit_with_error "Could not find required toolchain" "${KERNEL_COMPILER}gcc $KERNEL_USE_GCC" + else +- display_alert "'Reverse Cross compilation'" "target ${ARCH} on host $(dpkg --print-architecture)" +- exit_with_error "Architecture [$ARCH] is not supported" ++ display_alert "Unhandled cross compilation combo" "target ${ARCH} on host $(dpkg --print-architecture) - headers might not work" "warn" + fi + + kernel_compiler_version="$(eval env PATH="${toolchain}:${PATH}" "${KERNEL_COMPILER}gcc" -dumpversion)" + +From 739a4fe4d589a9d9ce58a725ed1d7db76b9aab3b Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 20:02:23 +0100 +Subject: [PATCH] logging: fixes for sunxi/megous stuff with `set -e` + +Signed-off-by: Ricardo Pardini +--- + config/sources/families/include/sunxi64_common.inc | 6 ++++-- + config/sources/families/include/sunxi_common.inc | 6 ++++-- + lib/functions/general/git.sh | 8 ++++---- + 3 files changed, 12 insertions(+), 8 deletions(-) + +diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc +index 4d16fa449..4c44d37bf 100644 +--- a/config/sources/families/include/sunxi64_common.inc ++++ b/config/sources/families/include/sunxi64_common.inc +@@ -74,6 +74,7 @@ setup_write_uboot_platform() { + + # default settings for kernel variables of the original kernel + # VAR_SHALLOW_ORIGINAL=var_origin_kernel ++# Note: rpardini: this is called via VAR_SHALLOW_ORIGINAL during fetch_from_repo via waiter_local_repo + var_origin_kernel() { + url=$MAINLINE_KERNEL_SOURCE + name='origin' +@@ -81,8 +82,7 @@ var_origin_kernel() { + start_tag="v$KERNEL_VERSION_LEVEL" + + # checking the reachability of the initial tag +- if [ "$(git ls-remote --tags $url $start_tag | +- awk -F'/' '{if (NR == 1) print $NF}')" != "$start_tag" ]; then ++ if [ "$(git ls-remote --tags $url $start_tag | awk -F'/' '{if (NR == 1) print $NF}' || true)" != "$start_tag" ]; then + exit 177 + fi + +@@ -90,4 +90,6 @@ var_origin_kernel() { + # a bifurcation point at which all previous merge branches converge. + # This is due to the subsequent extraction of `megous` + [ "$KERNEL_VERSION_LEVEL" == "5.12" ] && start_tag="v5.12-rc7" ++ ++ return 0 # don't fail due to short-circuit above + } +diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc +index 7b9907a58..641cceb1c 100644 +--- a/config/sources/families/include/sunxi_common.inc ++++ b/config/sources/families/include/sunxi_common.inc +@@ -81,6 +81,7 @@ setup_write_uboot_platform() { + + # default settings for kernel variables of the original kernel + # VAR_SHALLOW_ORIGINAL=var_origin_kernel ++# Note: rpardini: this is called via VAR_SHALLOW_ORIGINAL during fetch_from_repo via waiter_local_repo + var_origin_kernel() { + url=$MAINLINE_KERNEL_SOURCE + name='origin' +@@ -88,8 +89,7 @@ var_origin_kernel() { + start_tag="v$KERNEL_VERSION_LEVEL" + + # checking the reachability of the initial tag +- if [ "$(git ls-remote --tags $url $start_tag | +- awk -F'/' '{if (NR == 1) print $NF}')" != "$start_tag" ]; then ++ if [ "$(git ls-remote --tags $url $start_tag | awk -F'/' '{if (NR == 1) print $NF}' || true)" != "$start_tag" ]; then + exit 177 + fi + +@@ -97,4 +97,6 @@ var_origin_kernel() { + # a bifurcation point at which all previous merge branches converge. + # This is due to the subsequent extraction of `megous` + [ "$KERNEL_VERSION_LEVEL" == "5.12" ] && start_tag="v5.12-rc7" ++ ++ return 0 # don't fail due to short-circuit above + } +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 9fb0dfcf3..f66b5ea90 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -74,7 +74,7 @@ waiter_local_repo() { + + # Check the exception for 5.15 sunxi. We will remove this after a while. + if [ "$dir" == "linux-mainline/5.15" ] && +- [ "$(git remote show | grep megous)" == "megous" ]; then ++ [ "$(git remote show | grep megous || true)" == "megous" ]; then + display_alert "Remove mistakenly created and excessively large" "$dir" "info" + rm -rf .git ./* + fi +@@ -84,12 +84,12 @@ waiter_local_repo() { + + # Run in the sub shell to avoid mixing environment variables. + if [ -n "$VAR_SHALLOW_ORIGINAL" ]; then ++ display_alert "Unshallowing original:" "${VAR_SHALLOW_ORIGINAL}" "debug" + ( + $VAR_SHALLOW_ORIGINAL + + display_alert "Add original git sources" "$dir $name/$branch" "info" +- if [ "$(git ls-remote -h $url $branch | +- awk -F'/' '{if (NR == 1) print $NF}')" != "$branch" ]; then ++ if [ "$(git ls-remote -h $url $branch | awk -F'/' '{if (NR == 1) print $NF}' || true)" != "$branch" ]; then + display_alert "Bad $branch for $url in $VAR_SHALLOW_ORIGINAL" + exit 177 + fi +@@ -109,7 +109,7 @@ waiter_local_repo() { + clean_up_repo $work_dir + fi + +- if [ "$name" != "$(git remote show | grep $name)" ]; then ++ if [ "$name" != "$(git remote show | grep $name || true)" ]; then + git remote add -t $branch $name $url + fi + + +From 9fc0bd5788857c43c3f4d6e217928539ccd894a9 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 15:01:03 +0100 +Subject: [PATCH] logging: fix shellcheck references generation + +Signed-off-by: Ricardo Pardini +--- + lib/library-functions.sh | 94 ++++++++++++++++++++++++------------------------ + lib/tools/gen-library.sh | 2 +- + 2 files changed, 48 insertions(+), 48 deletions(-) + +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 46f984a97..564af3c42 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -3,237 +3,237 @@ + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/menu.sh +-# shellcheck source=functions/configuration/menu.sh ++# shellcheck source=lib/functions/configuration/menu.sh + source "${SRC}"/lib/functions/configuration/menu.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/interactive.sh +-# shellcheck source=functions/configuration/interactive.sh ++# shellcheck source=lib/functions/configuration/interactive.sh + source "${SRC}"/lib/functions/configuration/interactive.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/config-desktop.sh +-# shellcheck source=functions/configuration/config-desktop.sh ++# shellcheck source=lib/functions/configuration/config-desktop.sh + source "${SRC}"/lib/functions/configuration/config-desktop.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/main-config.sh +-# shellcheck source=functions/configuration/main-config.sh ++# shellcheck source=lib/functions/configuration/main-config.sh + source "${SRC}"/lib/functions/configuration/main-config.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/aggregation.sh +-# shellcheck source=functions/configuration/aggregation.sh ++# shellcheck source=lib/functions/configuration/aggregation.sh + source "${SRC}"/lib/functions/configuration/aggregation.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/create-cache.sh +-# shellcheck source=functions/rootfs/create-cache.sh ++# shellcheck source=lib/functions/rootfs/create-cache.sh + source "${SRC}"/lib/functions/rootfs/create-cache.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/apt.sh +-# shellcheck source=functions/rootfs/apt.sh ++# shellcheck source=lib/functions/rootfs/apt.sh + source "${SRC}"/lib/functions/rootfs/apt.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/distro-specific.sh +-# shellcheck source=functions/rootfs/distro-specific.sh ++# shellcheck source=lib/functions/rootfs/distro-specific.sh + source "${SRC}"/lib/functions/rootfs/distro-specific.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/rootfs-desktop.sh +-# shellcheck source=functions/rootfs/rootfs-desktop.sh ++# shellcheck source=lib/functions/rootfs/rootfs-desktop.sh + source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/post-tweaks.sh +-# shellcheck source=functions/rootfs/post-tweaks.sh ++# shellcheck source=lib/functions/rootfs/post-tweaks.sh + source "${SRC}"/lib/functions/rootfs/post-tweaks.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/customize.sh +-# shellcheck source=functions/rootfs/customize.sh ++# shellcheck source=lib/functions/rootfs/customize.sh + source "${SRC}"/lib/functions/rootfs/customize.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/distro-agnostic.sh +-# shellcheck source=functions/rootfs/distro-agnostic.sh ++# shellcheck source=lib/functions/rootfs/distro-agnostic.sh + source "${SRC}"/lib/functions/rootfs/distro-agnostic.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/boot_logo.sh +-# shellcheck source=functions/rootfs/boot_logo.sh ++# shellcheck source=lib/functions/rootfs/boot_logo.sh + source "${SRC}"/lib/functions/rootfs/boot_logo.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/chroot-helpers.sh +-# shellcheck source=functions/general/chroot-helpers.sh ++# shellcheck source=lib/functions/general/chroot-helpers.sh + source "${SRC}"/lib/functions/general/chroot-helpers.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/repo.sh +-# shellcheck source=functions/general/repo.sh ++# shellcheck source=lib/functions/general/repo.sh + source "${SRC}"/lib/functions/general/repo.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/cleaning.sh +-# shellcheck source=functions/general/cleaning.sh ++# shellcheck source=lib/functions/general/cleaning.sh + source "${SRC}"/lib/functions/general/cleaning.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/git.sh +-# shellcheck source=functions/general/git.sh ++# shellcheck source=lib/functions/general/git.sh + source "${SRC}"/lib/functions/general/git.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/host.sh +-# shellcheck source=functions/general/host.sh ++# shellcheck source=lib/functions/general/host.sh + source "${SRC}"/lib/functions/general/host.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/downloads.sh +-# shellcheck source=functions/general/downloads.sh ++# shellcheck source=lib/functions/general/downloads.sh + source "${SRC}"/lib/functions/general/downloads.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/multi/build-all.sh +-# shellcheck source=functions/multi/build-all.sh ++# shellcheck source=lib/functions/multi/build-all.sh + source "${SRC}"/lib/functions/multi/build-all.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/cli/utils-cli.sh +-# shellcheck source=functions/cli/utils-cli.sh ++# shellcheck source=lib/functions/cli/utils-cli.sh + source "${SRC}"/lib/functions/cli/utils-cli.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/cli/cli-entrypoint.sh +-# shellcheck source=functions/cli/cli-entrypoint.sh ++# shellcheck source=lib/functions/cli/cli-entrypoint.sh + source "${SRC}"/lib/functions/cli/cli-entrypoint.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/bsp/bsp-cli.sh +-# shellcheck source=functions/bsp/bsp-cli.sh ++# shellcheck source=lib/functions/bsp/bsp-cli.sh + source "${SRC}"/lib/functions/bsp/bsp-cli.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/bsp/bsp-desktop.sh +-# shellcheck source=functions/bsp/bsp-desktop.sh ++# shellcheck source=lib/functions/bsp/bsp-desktop.sh + source "${SRC}"/lib/functions/bsp/bsp-desktop.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/bsp/utils-bsp.sh +-# shellcheck source=functions/bsp/utils-bsp.sh ++# shellcheck source=lib/functions/bsp/utils-bsp.sh + source "${SRC}"/lib/functions/bsp/utils-bsp.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/loop.sh +-# shellcheck source=functions/image/loop.sh ++# shellcheck source=lib/functions/image/loop.sh + source "${SRC}"/lib/functions/image/loop.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/initrd.sh +-# shellcheck source=functions/image/initrd.sh ++# shellcheck source=lib/functions/image/initrd.sh + source "${SRC}"/lib/functions/image/initrd.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/rootfs-to-image.sh +-# shellcheck source=functions/image/rootfs-to-image.sh ++# shellcheck source=lib/functions/image/rootfs-to-image.sh + source "${SRC}"/lib/functions/image/rootfs-to-image.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/partitioning.sh +-# shellcheck source=functions/image/partitioning.sh ++# shellcheck source=lib/functions/image/partitioning.sh + source "${SRC}"/lib/functions/image/partitioning.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/rootfs-image.sh +-# shellcheck source=functions/main/rootfs-image.sh ++# shellcheck source=lib/functions/main/rootfs-image.sh + source "${SRC}"/lib/functions/main/rootfs-image.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/config-prepare.sh +-# shellcheck source=functions/main/config-prepare.sh ++# shellcheck source=lib/functions/main/config-prepare.sh + source "${SRC}"/lib/functions/main/config-prepare.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/default-build.sh +-# shellcheck source=functions/main/default-build.sh ++# shellcheck source=lib/functions/main/default-build.sh + source "${SRC}"/lib/functions/main/default-build.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/sources.sh +-# shellcheck source=functions/compilation/sources.sh ++# shellcheck source=lib/functions/compilation/sources.sh + source "${SRC}"/lib/functions/compilation/sources.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/uboot.sh +-# shellcheck source=functions/compilation/uboot.sh ++# shellcheck source=lib/functions/compilation/uboot.sh + source "${SRC}"/lib/functions/compilation/uboot.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/atf.sh +-# shellcheck source=functions/compilation/atf.sh ++# shellcheck source=lib/functions/compilation/atf.sh + source "${SRC}"/lib/functions/compilation/atf.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/utils-compilation.sh +-# shellcheck source=functions/compilation/utils-compilation.sh ++# shellcheck source=lib/functions/compilation/utils-compilation.sh + source "${SRC}"/lib/functions/compilation/utils-compilation.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/kernel.sh +-# shellcheck source=functions/compilation/kernel.sh ++# shellcheck source=lib/functions/compilation/kernel.sh + source "${SRC}"/lib/functions/compilation/kernel.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/debs.sh +-# shellcheck source=functions/compilation/debs.sh ++# shellcheck source=lib/functions/compilation/debs.sh + source "${SRC}"/lib/functions/compilation/debs.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/extra-drivers.sh +-# shellcheck source=functions/compilation/extra-drivers.sh ++# shellcheck source=lib/functions/compilation/extra-drivers.sh + source "${SRC}"/lib/functions/compilation/extra-drivers.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/patching.sh +-# shellcheck source=functions/compilation/patching.sh ++# shellcheck source=lib/functions/compilation/patching.sh + source "${SRC}"/lib/functions/compilation/patching.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/capture.sh +-# shellcheck source=functions/logging/capture.sh ++# shellcheck source=lib/functions/logging/capture.sh + source "${SRC}"/lib/functions/logging/capture.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/runners.sh +-# shellcheck source=functions/logging/runners.sh ++# shellcheck source=lib/functions/logging/runners.sh + source "${SRC}"/lib/functions/logging/runners.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/errors.sh +-# shellcheck source=functions/logging/errors.sh ++# shellcheck source=lib/functions/logging/errors.sh + source "${SRC}"/lib/functions/logging/errors.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/logging.sh +-# shellcheck source=functions/logging/logging.sh ++# shellcheck source=lib/functions/logging/logging.sh + source "${SRC}"/lib/functions/logging/logging.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/traps.sh +-# shellcheck source=functions/logging/traps.sh ++# shellcheck source=lib/functions/logging/traps.sh + source "${SRC}"/lib/functions/logging/traps.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/extras/fel.sh +-# shellcheck source=functions/extras/fel.sh ++# shellcheck source=lib/functions/extras/fel.sh + source "${SRC}"/lib/functions/extras/fel.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/extras/buildpkg.sh +-# shellcheck source=functions/extras/buildpkg.sh ++# shellcheck source=lib/functions/extras/buildpkg.sh + source "${SRC}"/lib/functions/extras/buildpkg.sh + + +diff --git a/lib/tools/gen-library.sh b/lib/tools/gen-library.sh +index 10a62fa70..fd6f200e7 100755 +--- a/lib/tools/gen-library.sh ++++ b/lib/tools/gen-library.sh +@@ -18,7 +18,7 @@ cat <<- AUTOGEN_INCLUDES_HEADER > "${TARGET_SH}" + AUTOGEN_INCLUDES_HEADER + + find lib/functions -type f -name \*.sh | while read -r path; do +- ref="$(echo -n "${path}" | sed -e 's/lib\///g')" ++ ref="$(echo -n "${path}")" + cat <<- AUTOGEN_INCLUDES_EACH >> "${TARGET_SH}" + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### ${path} + +From 49cdd43f9fa208e13607eae9dad138d4d49a0a5f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 13:56:36 +0100 +Subject: [PATCH] logging: manual merge (2) of all lib/*.sh changes between + revisions 117633687e9942ade647a8b7d3f80f01e3145193 and + 30830388555e463402161a6e0d6993dd6fb0544e + +Signed-off-by: Ricardo Pardini +--- + lib/functions/cli/utils-cli.sh | 8 ++++---- + lib/functions/general/host.sh | 14 ++++++++------ + 2 files changed, 12 insertions(+), 10 deletions(-) + +diff --git a/lib/functions/cli/utils-cli.sh b/lib/functions/cli/utils-cli.sh +index 593237601..d9f6a571c 100644 +--- a/lib/functions/cli/utils-cli.sh ++++ b/lib/functions/cli/utils-cli.sh +@@ -93,12 +93,12 @@ function handle_docker_vagrant() { + [[ "${codename}" =~ focal|hirsute ]] && DOCKER_BINARY="docker containerd docker.io" + + display_alert "Docker not installed." "Installing" "Info" +- echo "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/${codeid} ${codename} stable" > /etc/apt/sources.list.d/docker.list ++ sudo bash -c "echo \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/${codeid} ${codename} stable\" > /etc/apt/sources.list.d/docker.list" + +- curl -fsSL "https://download.docker.com/linux/${codeid}/gpg" | apt-key add -qq - > /dev/null 2>&1 ++ sudo bash -c "curl -fsSL \"https://download.docker.com/linux/${codeid}/gpg\" | apt-key add -qq - > /dev/null 2>&1 " + export DEBIAN_FRONTEND=noninteractive +- apt-get update +- apt-get install -y -qq --no-install-recommends ${DOCKER_BINARY} ++ sudo apt-get update ++ sudo apt-get install -y -qq --no-install-recommends ${DOCKER_BINARY} + display_alert "Add yourself to docker group to avoid root privileges" "" "wrn" + "${SRC}/compile.sh" "$@" + exit $? +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index ef681d301..6766aa78a 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -178,7 +178,7 @@ prepare_host() { + sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections + + LOG_OUTPUT_FILE="${DEST}"/${LOG_SUBPATH}/hostdeps.log +- install_pkg_deb "upgrade $hostdeps" ++ install_pkg_deb "$hostdeps" + unset LOG_OUTPUT_FILE + + update-ccache-symlinks +@@ -383,11 +383,10 @@ install_pkg_deb() { + log_file="${SRC}/output/${LOG_SUBPATH}/install.log" + fi + +- apt-get -q update +- if [ "$?" != "0" ]; then echo "apt cannot update" >> $log_file; fi ++ # This is necessary first when there is no apt cache. + if $need_upgrade; then +- apt-get -y upgrade +- if [ "$?" != "0" ]; then echo "apt cannot upgrade" >> $log_file; fi ++ apt-get -q update || echo "apt cannot update" >> $tmp_file ++ apt-get -y upgrade || echo "apt cannot upgrade" >> $tmp_file + fi + + # If the package is not installed, check the latest +@@ -414,7 +413,10 @@ install_pkg_deb() { + fi + + if [ -n "$for_install" ]; then +- ++ if ! $need_upgrade; then ++ apt-get -q update ++ apt-get -y upgrade ++ fi + apt-get install -qq -y --no-install-recommends $for_install + echo -e "\nPackages installed:" >> $log_file + dpkg-query -W \ + +From 496713bb6f122440105626db767b39db7dd41e2f Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 13:35:51 +0100 +Subject: [PATCH] logging: renaming function files a bit more consistently + +Signed-off-by: Ricardo Pardini +--- + lib/functions/cli/{cli-utils.sh => utils-cli.sh} | 0 + .../{compilation-utils.sh => utils-compilation.sh} | 0 + .../{distro_agnostic.sh => distro-agnostic.sh} | 0 + .../{distro_specific.sh => distro-specific.sh} | 0 + lib/library-functions.sh | 28 +++++++++++----------- + 5 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/lib/functions/cli/cli-utils.sh b/lib/functions/cli/utils-cli.sh +similarity index 100% +rename from lib/functions/cli/cli-utils.sh +rename to lib/functions/cli/utils-cli.sh +diff --git a/lib/functions/compilation/compilation-utils.sh b/lib/functions/compilation/utils-compilation.sh +similarity index 100% +rename from lib/functions/compilation/compilation-utils.sh +rename to lib/functions/compilation/utils-compilation.sh +diff --git a/lib/functions/rootfs/distro_agnostic.sh b/lib/functions/rootfs/distro-agnostic.sh +similarity index 100% +rename from lib/functions/rootfs/distro_agnostic.sh +rename to lib/functions/rootfs/distro-agnostic.sh +diff --git a/lib/functions/rootfs/distro_specific.sh b/lib/functions/rootfs/distro-specific.sh +similarity index 100% +rename from lib/functions/rootfs/distro_specific.sh +rename to lib/functions/rootfs/distro-specific.sh +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 61f800a56..46f984a97 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -37,20 +37,15 @@ set -e # no errors tolerated. set -e is invoked before each sourced file to make + source "${SRC}"/lib/functions/rootfs/apt.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/distro_agnostic.sh +-# shellcheck source=functions/rootfs/distro_agnostic.sh +-source "${SRC}"/lib/functions/rootfs/distro_agnostic.sh ++### lib/functions/rootfs/distro-specific.sh ++# shellcheck source=functions/rootfs/distro-specific.sh ++source "${SRC}"/lib/functions/rootfs/distro-specific.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/rootfs-desktop.sh + # shellcheck source=functions/rootfs/rootfs-desktop.sh + source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/rootfs/distro_specific.sh +-# shellcheck source=functions/rootfs/distro_specific.sh +-source "${SRC}"/lib/functions/rootfs/distro_specific.sh +- + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/post-tweaks.sh + # shellcheck source=functions/rootfs/post-tweaks.sh +@@ -61,6 +56,11 @@ set -e # no errors tolerated. set -e is invoked before each sourced file to make + # shellcheck source=functions/rootfs/customize.sh + source "${SRC}"/lib/functions/rootfs/customize.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. ++### lib/functions/rootfs/distro-agnostic.sh ++# shellcheck source=functions/rootfs/distro-agnostic.sh ++source "${SRC}"/lib/functions/rootfs/distro-agnostic.sh ++ + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/boot_logo.sh + # shellcheck source=functions/rootfs/boot_logo.sh +@@ -102,9 +102,9 @@ set -e # no errors tolerated. set -e is invoked before each sourced file to make + source "${SRC}"/lib/functions/multi/build-all.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/cli/cli-utils.sh +-# shellcheck source=functions/cli/cli-utils.sh +-source "${SRC}"/lib/functions/cli/cli-utils.sh ++### lib/functions/cli/utils-cli.sh ++# shellcheck source=functions/cli/utils-cli.sh ++source "${SRC}"/lib/functions/cli/utils-cli.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/cli/cli-entrypoint.sh +@@ -177,9 +177,9 @@ set -e # no errors tolerated. set -e is invoked before each sourced file to make + source "${SRC}"/lib/functions/compilation/atf.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/compilation/compilation-utils.sh +-# shellcheck source=functions/compilation/compilation-utils.sh +-source "${SRC}"/lib/functions/compilation/compilation-utils.sh ++### lib/functions/compilation/utils-compilation.sh ++# shellcheck source=functions/compilation/utils-compilation.sh ++source "${SRC}"/lib/functions/compilation/utils-compilation.sh + + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/kernel.sh + +From 3c36aa6e495d06ab1fc599585e14c3a66ec14f03 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 01:46:22 +0100 +Subject: [PATCH] logging: removing leftover empty file after all the moving + around + +Signed-off-by: Ricardo Pardini +--- + lib/functions/image.sh | 1 - + lib/library-functions.sh | 5 ----- + 2 files changed, 6 deletions(-) + +diff --git a/lib/functions/image.sh b/lib/functions/image.sh +deleted file mode 100644 +index 8b1378917..000000000 +--- a/lib/functions/image.sh ++++ /dev/null +@@ -1 +0,0 @@ +- +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 1f4a18415..61f800a56 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -146,11 +146,6 @@ set -e # no errors tolerated. set -e is invoked before each sourced file to make + # shellcheck source=functions/image/partitioning.sh + source "${SRC}"/lib/functions/image/partitioning.sh + +-set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. +-### lib/functions/image.sh +-# shellcheck source=functions/image.sh +-source "${SRC}"/lib/functions/image.sh +- + set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/rootfs-image.sh + # shellcheck source=functions/main/rootfs-image.sh + +From 5d19b3686e732d07ac0d49abba76e03b42f4309e Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 8 Jan 2022 01:16:55 +0100 +Subject: [PATCH] logging: really insist on set -e during library loading + +Signed-off-by: Ricardo Pardini +--- + lib/library-functions.sh | 54 +++++++++++++++++++++++++++++++++++++++++++++--- + lib/tools/gen-library.sh | 6 +++--- + 2 files changed, 54 insertions(+), 6 deletions(-) + +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 3a3953118..1f4a18415 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -1,198 +1,246 @@ + #!/usr/bin/env bash + # This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually + +-set -e # no errors tolerated +- ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/menu.sh + # shellcheck source=functions/configuration/menu.sh + source "${SRC}"/lib/functions/configuration/menu.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/interactive.sh + # shellcheck source=functions/configuration/interactive.sh + source "${SRC}"/lib/functions/configuration/interactive.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/config-desktop.sh + # shellcheck source=functions/configuration/config-desktop.sh + source "${SRC}"/lib/functions/configuration/config-desktop.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/main-config.sh + # shellcheck source=functions/configuration/main-config.sh + source "${SRC}"/lib/functions/configuration/main-config.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/configuration/aggregation.sh + # shellcheck source=functions/configuration/aggregation.sh + source "${SRC}"/lib/functions/configuration/aggregation.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/create-cache.sh + # shellcheck source=functions/rootfs/create-cache.sh + source "${SRC}"/lib/functions/rootfs/create-cache.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/apt.sh + # shellcheck source=functions/rootfs/apt.sh + source "${SRC}"/lib/functions/rootfs/apt.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/distro_agnostic.sh + # shellcheck source=functions/rootfs/distro_agnostic.sh + source "${SRC}"/lib/functions/rootfs/distro_agnostic.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/rootfs-desktop.sh + # shellcheck source=functions/rootfs/rootfs-desktop.sh + source "${SRC}"/lib/functions/rootfs/rootfs-desktop.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/distro_specific.sh + # shellcheck source=functions/rootfs/distro_specific.sh + source "${SRC}"/lib/functions/rootfs/distro_specific.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/post-tweaks.sh + # shellcheck source=functions/rootfs/post-tweaks.sh + source "${SRC}"/lib/functions/rootfs/post-tweaks.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/customize.sh + # shellcheck source=functions/rootfs/customize.sh + source "${SRC}"/lib/functions/rootfs/customize.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/rootfs/boot_logo.sh + # shellcheck source=functions/rootfs/boot_logo.sh + source "${SRC}"/lib/functions/rootfs/boot_logo.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/chroot-helpers.sh + # shellcheck source=functions/general/chroot-helpers.sh + source "${SRC}"/lib/functions/general/chroot-helpers.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/repo.sh + # shellcheck source=functions/general/repo.sh + source "${SRC}"/lib/functions/general/repo.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/cleaning.sh + # shellcheck source=functions/general/cleaning.sh + source "${SRC}"/lib/functions/general/cleaning.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/git.sh + # shellcheck source=functions/general/git.sh + source "${SRC}"/lib/functions/general/git.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/host.sh + # shellcheck source=functions/general/host.sh + source "${SRC}"/lib/functions/general/host.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/general/downloads.sh + # shellcheck source=functions/general/downloads.sh + source "${SRC}"/lib/functions/general/downloads.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/multi/build-all.sh + # shellcheck source=functions/multi/build-all.sh + source "${SRC}"/lib/functions/multi/build-all.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/cli/cli-utils.sh + # shellcheck source=functions/cli/cli-utils.sh + source "${SRC}"/lib/functions/cli/cli-utils.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/cli/cli-entrypoint.sh + # shellcheck source=functions/cli/cli-entrypoint.sh + source "${SRC}"/lib/functions/cli/cli-entrypoint.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/bsp/bsp-cli.sh + # shellcheck source=functions/bsp/bsp-cli.sh + source "${SRC}"/lib/functions/bsp/bsp-cli.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/bsp/bsp-desktop.sh + # shellcheck source=functions/bsp/bsp-desktop.sh + source "${SRC}"/lib/functions/bsp/bsp-desktop.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/bsp/utils-bsp.sh + # shellcheck source=functions/bsp/utils-bsp.sh + source "${SRC}"/lib/functions/bsp/utils-bsp.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/loop.sh + # shellcheck source=functions/image/loop.sh + source "${SRC}"/lib/functions/image/loop.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/initrd.sh + # shellcheck source=functions/image/initrd.sh + source "${SRC}"/lib/functions/image/initrd.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/rootfs-to-image.sh + # shellcheck source=functions/image/rootfs-to-image.sh + source "${SRC}"/lib/functions/image/rootfs-to-image.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image/partitioning.sh + # shellcheck source=functions/image/partitioning.sh + source "${SRC}"/lib/functions/image/partitioning.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/image.sh + # shellcheck source=functions/image.sh + source "${SRC}"/lib/functions/image.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/rootfs-image.sh + # shellcheck source=functions/main/rootfs-image.sh + source "${SRC}"/lib/functions/main/rootfs-image.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/config-prepare.sh + # shellcheck source=functions/main/config-prepare.sh + source "${SRC}"/lib/functions/main/config-prepare.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/main/default-build.sh + # shellcheck source=functions/main/default-build.sh + source "${SRC}"/lib/functions/main/default-build.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/sources.sh + # shellcheck source=functions/compilation/sources.sh + source "${SRC}"/lib/functions/compilation/sources.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/uboot.sh + # shellcheck source=functions/compilation/uboot.sh + source "${SRC}"/lib/functions/compilation/uboot.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/atf.sh + # shellcheck source=functions/compilation/atf.sh + source "${SRC}"/lib/functions/compilation/atf.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/compilation-utils.sh + # shellcheck source=functions/compilation/compilation-utils.sh + source "${SRC}"/lib/functions/compilation/compilation-utils.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/kernel.sh + # shellcheck source=functions/compilation/kernel.sh + source "${SRC}"/lib/functions/compilation/kernel.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/debs.sh + # shellcheck source=functions/compilation/debs.sh + source "${SRC}"/lib/functions/compilation/debs.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/extra-drivers.sh + # shellcheck source=functions/compilation/extra-drivers.sh + source "${SRC}"/lib/functions/compilation/extra-drivers.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/compilation/patching.sh + # shellcheck source=functions/compilation/patching.sh + source "${SRC}"/lib/functions/compilation/patching.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/capture.sh + # shellcheck source=functions/logging/capture.sh + source "${SRC}"/lib/functions/logging/capture.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/runners.sh + # shellcheck source=functions/logging/runners.sh + source "${SRC}"/lib/functions/logging/runners.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/errors.sh + # shellcheck source=functions/logging/errors.sh + source "${SRC}"/lib/functions/logging/errors.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/logging.sh + # shellcheck source=functions/logging/logging.sh + source "${SRC}"/lib/functions/logging/logging.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/logging/traps.sh + # shellcheck source=functions/logging/traps.sh + source "${SRC}"/lib/functions/logging/traps.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/extras/fel.sh + # shellcheck source=functions/extras/fel.sh + source "${SRC}"/lib/functions/extras/fel.sh + ++set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### lib/functions/extras/buildpkg.sh + # shellcheck source=functions/extras/buildpkg.sh + source "${SRC}"/lib/functions/extras/buildpkg.sh + +-# This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually - thanks ++ ++set -e # no errors tolerated. one last time for the win! ++# This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually +diff --git a/lib/tools/gen-library.sh b/lib/tools/gen-library.sh +index 49ba242be..10a62fa70 100755 +--- a/lib/tools/gen-library.sh ++++ b/lib/tools/gen-library.sh +@@ -15,13 +15,12 @@ cat <<- AUTOGEN_INCLUDES_HEADER > "${TARGET_SH}" + #!/usr/bin/env bash + # This file is/was autogenerated by ${0}; don't modify manually + +- set -e # no errors tolerated +- + AUTOGEN_INCLUDES_HEADER + + find lib/functions -type f -name \*.sh | while read -r path; do + ref="$(echo -n "${path}" | sed -e 's/lib\///g')" + cat <<- AUTOGEN_INCLUDES_EACH >> "${TARGET_SH}" ++ set -e # no errors tolerated. set -e is invoked before each sourced file to make sure. + ### ${path} + # shellcheck source=${ref} + source "\${SRC}"/${path} +@@ -31,7 +30,8 @@ done + + cat <<- AUTOGEN_INCLUDES_FOOTER >> "${TARGET_SH}" + +- # This file is/was autogenerated by ${0}; don't modify manually - thanks ++ set -e # no errors tolerated. one last time for the win! ++ # This file is/was autogenerated by ${0}; don't modify manually + AUTOGEN_INCLUDES_FOOTER + + echo "done." + +From dc2dd8dd4ced5244a5c615fe815b08455b119bbb Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 7 Jan 2022 23:35:25 +0100 +Subject: [PATCH] logging: shellfmt again after rebasing master + +Signed-off-by: Ricardo Pardini +--- + config/boards/jetson-nano.conf | 1 - + config/sources/families/jetson-nano.conf | 66 ++++++++++++++++++++++++++++++++ + extensions/flash-kernel.sh | 4 +- + lib/functions/configuration/menu.sh | 2 - + lib/library-functions.sh | 1 - + 5 files changed, 68 insertions(+), 6 deletions(-) + +diff --git a/config/boards/jetson-nano.conf b/config/boards/jetson-nano.conf +index 476b90bfb..fc2779817 100644 +--- a/config/boards/jetson-nano.conf ++++ b/config/boards/jetson-nano.conf +@@ -8,4 +8,3 @@ BOOT_LOGO="desktop" + BOOT_FDT_FILE="nvidia/tegra210-p3450-0000.dtb" + SRC_EXTLINUX="yes" + SRC_CMDLINE="console=ttyS0,115200n8 console=tty0" +- +diff --git a/config/sources/families/jetson-nano.conf b/config/sources/families/jetson-nano.conf +new file mode 100644 +index 000000000..f4710d751 +--- /dev/null ++++ b/config/sources/families/jetson-nano.conf +@@ -0,0 +1,66 @@ ++ARCH=arm64 ++KERNEL_IMAGE_TYPE=Image ++ATF_COMPILE="no" ++OFFSET=16 ++BOOTDELAY=0 ++BOOTBRANCH="tag:v2021.07" ++BOOTPATCHDIR="u-boot-rockchip64" ++UBOOT_TARGET_MAP=";;u-boot.bin" ++ ++CPUMIN=504000 ++CPUMAX=2132000 ++GOVERNOR=ondemand ++ ++case $BRANCH in ++ ++ legacy) ++ KERNELDIR='linux-nano' ++ KERNELSOURCE='https://github.com/150balbes/Jetson-Nano' ++ KERNELBRANCH='branch:4.9.201' ++ EXTRAWIFI="no" ++ BOOT_FDT_FILE="tegra210-p3448-0000-p3449-0000-a02.dtb" ++ ;; ++ ++ current) ++ KERNELBRANCH="branch:linux-5.10.y" ++ KERNELPATCHDIR='rockchip64-'$BRANCH ++ ;; ++ ++ edge) ++ KERNELBRANCH="branch:linux-5.15.y" ++ KERNELPATCHDIR='rockchip64-'$BRANCH ++ ;; ++ ++esac ++ ++write_uboot_platform() { ++ dd if=$1/u-boot.bin of=$2 bs=32k seek=1 status=noxfer > /dev/null 2>&1 ++} ++ ++family_tweaks() { ++ ++ case $BRANCH in ++ ++ legacy) ++ ++ install -m 755 $SRC/packages/blobs/jetson/tegra21x_xusb_firmware $SDCARD/lib/firmware/tegra21x_xusb_firmware ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf.tegrahda ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrahda $SDCARD/etc/asound.conf ++ install -m 755 $SRC/packages/blobs/jetson/asound.conf.tegrasndt210ref $SDCARD/etc/asound.conf.tegrasndt210ref ++ install -m 755 $SRC/packages/blobs/jetson/tegra-hda.conf $SDCARD/usr/share/alsa/cards/tegra-hda.conf ++ install -m 755 $SRC/packages/blobs/jetson/tegra-snd-t210r.conf $SDCARD/usr/share/alsa/cards/tegra-snd-t210r.conf ++ ++ sed -e 's/exit 0//g' -i $SDCARD/etc/rc.local ++ echo "su -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'" >> $SDCARD/etc/rc.local ++ echo "exit 0" >> $SDCARD/etc/rc.local ++ ++ ;; ++ ++ edge) ++ ++ cp -R $SRC/packages/blobs/jetson/firmware/* $SDCARD/lib/firmware/ ++ ++ ;; ++ esac ++ ++} +diff --git a/extensions/flash-kernel.sh b/extensions/flash-kernel.sh +index 0390a3b37..847eb37b7 100644 +--- a/extensions/flash-kernel.sh ++++ b/extensions/flash-kernel.sh +@@ -84,7 +84,7 @@ function pre_update_initramfs__setup_flash_kernel() { + + local update_initramfs_cmd="update-initramfs -c -k all" + display_alert "Updating flash-kernel initramfs..." "$update_initramfs_cmd" "" +- chroot_custom "$chroot_target" "$update_initramfs_cmd" || { ++ chroot_custom "$chroot_target" "$update_initramfs_cmd" || { + display_alert "Failed to run '$update_initramfs_cmd'" "Check logs" "err" + exit 29 + } +@@ -97,7 +97,7 @@ function pre_update_initramfs__setup_flash_kernel() { + + local flash_kernel_cmd="flash-kernel --machine '${FK__MACHINE_MODEL}'" + display_alert "flash-kernel" "${FK__MACHINE_MODEL}" "info" +- chroot_custom "$chroot_target" "${flash_kernel_cmd}" || { ++ chroot_custom "$chroot_target" "${flash_kernel_cmd}" || { + display_alert "Failed to run '${flash_kernel_cmd}'" "Check logs" "err" + exit 29 + } +diff --git a/lib/functions/configuration/menu.sh b/lib/functions/configuration/menu.sh +index 6d6f0b266..2d4ac1462 100644 +--- a/lib/functions/configuration/menu.sh ++++ b/lib/functions/configuration/menu.sh +@@ -57,7 +57,6 @@ show_developer_warning() { + SHOW_WARNING=no + } + +- + # Stuff that was in config files + function distro_menu() { + # create a select menu for choosing a distribution based EXPERT status +@@ -84,4 +83,3 @@ function distros_options() { + distro_menu "${distrib_dir}" + done + } +- +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index 285f7e84e..3a3953118 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -195,5 +195,4 @@ source "${SRC}"/lib/functions/extras/fel.sh + # shellcheck source=functions/extras/buildpkg.sh + source "${SRC}"/lib/functions/extras/buildpkg.sh + +- + # This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually - thanks + +From ce5bebdb917d1e3c88e36899c268207779716965 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 7 Jan 2022 23:28:12 +0100 +Subject: [PATCH] logging: manual merge of all lib/*.sh changes between + revisions f6143eff670d435cc8d15b52335b1b70ccb91e1c and + f3388b9aee0d1564a28fbc661c6e7b0415a6dfd0 + +Signed-off-by: Ricardo Pardini +--- + lib/functions/bsp/bsp-cli.sh | 34 ++-- + lib/functions/compilation/extra-drivers.sh | 8 +- + lib/functions/extras/buildpkg.sh | 173 +++++++++++++++----- + lib/functions/general/git.sh | 4 +- + lib/functions/general/host.sh | 251 ++++++++++++++++++----------- + lib/functions/main/default-build.sh | 2 +- + lib/functions/rootfs/distro_agnostic.sh | 5 +- + 7 files changed, 316 insertions(+), 161 deletions(-) + +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index 67baede0d..d4bb3daab 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -6,7 +6,7 @@ create_board_package() { + # @TODO: these traps are a real trap. + #trap "rm -rf \"${bsptempdir}\" ; exit 0" 0 1 2 3 15 + +- local destination=${bsptempdir}/${RELEASE}/${BSP_CLI_PACKAGE_FULLNAME} ++ local destination=${bsptempdir}/${BSP_CLI_PACKAGE_FULLNAME} + mkdir -p "${destination}"/DEBIAN + cd $destination + +@@ -59,7 +59,7 @@ create_board_package() { + Replaces: zram-config, base-files, armbian-tools-$RELEASE, linux-${RELEASE}-root-legacy-$BOARD (<< $REVISION~), linux-${RELEASE}-root-current-$BOARD (<< $REVISION~), linux-${RELEASE}-root-edge-$BOARD (<< $REVISION~) + Breaks: linux-${RELEASE}-root-legacy-$BOARD (<< $REVISION~), linux-${RELEASE}-root-current-$BOARD (<< $REVISION~), linux-${RELEASE}-root-edge-$BOARD (<< $REVISION~) + Recommends: bsdutils, parted, util-linux, toilet +- Description: Tweaks for Armbian $RELEASE on $BOARD ++ Description: Armbian board support files for $BOARD + EOF + + # set up pre install script +@@ -229,10 +229,15 @@ create_board_package() { + mv /usr/lib/chromium-browser/master_preferences.dpkg-dist /usr/lib/chromium-browser/master_preferences + fi + +- sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"${VENDOR} $REVISION "${RELEASE^}"\"/" /etc/os-release +- echo "${VENDOR} ${REVISION} ${RELEASE^} \\l \n" > /etc/issue +- echo "${VENDOR} ${REVISION} ${RELEASE^}" > /etc/issue.net ++ # Read release value ++ if [ -f /etc/lsb-release ]; then ++ RELEASE=\$(cat /etc/lsb-release | grep CODENAME | cut -d"=" -f2 | sed 's/.*/\u&/') ++ sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"${VENDOR} $REVISION "\${RELEASE}"\"/" /etc/os-release ++ echo "${VENDOR} ${REVISION} \${RELEASE} \\l \n" > /etc/issue ++ echo "${VENDOR} ${REVISION} \${RELEASE}" > /etc/issue.net ++ fi + ++ # Reload services + systemctl --no-reload enable armbian-hardware-monitor.service armbian-hardware-optimize.service armbian-zram-config.service >/dev/null 2>&1 + exit 0 + EOF +@@ -253,8 +258,11 @@ create_board_package() { + activate update-initramfs + EOF + +- # read distribution support status +- set_distribution_status ++ # copy distribution support status ++ local releases=($(find ${SRC}/config/distributions -mindepth 1 -maxdepth 1 -type d)) ++ for i in ${releases[@]}; do ++ echo "$(echo $i | sed 's/.*\///')=$(cat $i/support)" >> "${destination}"/etc/armbian-distribution-status ++ done + + # armhwinfo, firstrun, armbianmonitor, etc. config file + cat <<- EOF > "${destination}"/etc/armbian-release +@@ -264,8 +272,6 @@ create_board_package() { + BOARDFAMILY=${BOARDFAMILY} + BUILD_REPOSITORY_URL=${BUILD_REPOSITORY_URL} + BUILD_REPOSITORY_COMMIT=${BUILD_REPOSITORY_COMMIT} +- DISTRIBUTION_CODENAME=${RELEASE} +- DISTRIBUTION_STATUS=${DISTRIBUTION_STATUS} + VERSION=$REVISION + LINUXFAMILY=$LINUXFAMILY + ARCH=$ARCHITECTURE +@@ -275,12 +281,6 @@ create_board_package() { + KERNEL_IMAGE_TYPE=$KERNEL_IMAGE_TYPE + EOF + +- if [[ $BUILD_DESKTOP == yes ]]; then +- cat <<- EOF >> "${destination}"/etc/armbian-release +- DESKTOP=$DESKTOP_ENVIRONMENT +- EOF +- fi +- + # this is required for NFS boot to prevent deconfiguring the network on shutdown + sed -i 's/#no-auto-down/no-auto-down/g' "${destination}"/etc/network/interfaces.default + +@@ -301,8 +301,8 @@ POST_FAMILY_TWEAKS_BSP + + # create board DEB file + fakeroot_dpkg_deb_build "${destination}" "${destination}.deb" +- mkdir -p "${DEB_STORAGE}/${RELEASE}/" +- rsync --remove-source-files -rq "${destination}.deb" "${DEB_STORAGE}/${RELEASE}/" 2>&1 ++ mkdir -p "${DEB_STORAGE}/" ++ rsync --remove-source-files -rq "${destination}.deb" "${DEB_STORAGE}/" 2>&1 + + # cleanup + rm -rf ${bsptempdir} +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/extra-drivers.sh +index 69e287d81..d45913f32 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/extra-drivers.sh +@@ -49,12 +49,18 @@ prepare_extra_kernel_drivers() { + fi + + if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == sunxi* || "$LINUXFAMILY" == meson64 || +- "$LINUXFAMILY" == mvebu64 || "$LINUXFAMILY" == mt7623 || "$LINUXFAMILY" == mvebu || "$LINUXFAMILY" == rk35xx ]]; then ++ "$LINUXFAMILY" == mvebu64 || "$LINUXFAMILY" == mt7623 || "$LINUXFAMILY" == mvebu ]]; then + display_alert "Adjusting" "packaging" "info" + cd "$kerneldir" || exit + process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y.patch" "applying" + fi + ++ if [[ "${version}" == "4.19."* ]] && [[ "$LINUXFAMILY" == rk35xx ]]; then ++ display_alert "Adjusting" "packaging" "info" ++ cd "$kerneldir" || exit ++ process_patch_file "${SRC}/patch/misc/general-packaging-4.19.y-rk35xx.patch" "applying" ++ fi ++ + if [[ "${version}" == "4.14."* ]] && [[ "$LINUXFAMILY" == s5p6818 || "$LINUXFAMILY" == mvebu64 || + "$LINUXFAMILY" == imx7d || "$LINUXFAMILY" == odroidxu4 || "$LINUXFAMILY" == mvebu ]]; then + display_alert "Adjusting" "packaging" "info" +diff --git a/lib/functions/extras/buildpkg.sh b/lib/functions/extras/buildpkg.sh +index 2e97d652b..af92f1b84 100644 +--- a/lib/functions/extras/buildpkg.sh ++++ b/lib/functions/extras/buildpkg.sh +@@ -9,9 +9,17 @@ + # This file is a part of the Armbian build script + # https://github.com/armbian/build/ + +-# create_chroot_for_buildpkg ++# Functions: ++ ++# create_chroot ++# chroot_prepare_distccd ++# chroot_build_packages ++# chroot_installpackages_local ++# chroot_installpackages ++ ++# create_chroot + # +-create_chroot_for_buildpkg() { ++create_chroot() { + local target_dir="$1" + local release=$2 + local arch=$3 +@@ -34,18 +42,33 @@ create_chroot_for_buildpkg() { + components['impish']='main,universe,multiverse' + components['jammy']='main,universe,multiverse' + display_alert "Creating build chroot" "$release/$arch" "info" +- local includes="ccache,locales,git,ca-certificates,devscripts,libfile-fcntllock-perl,debhelper,rsync,python3,distcc" ++ local includes="ccache,locales,git,ca-certificates,devscripts,libfile-fcntllock-perl,debhelper,rsync,python3,distcc,apt-utils" ++ + # perhaps a temporally workaround +- [[ $release == buster || $release == bullseye || $release == focal || $release == hirsute || $release == sid ]] && includes=${includes}",perl-openssl-defaults,libnet-ssleay-perl" ++ case $release in ++ buster | bullseye | focal | hirsute | sid) ++ includes=${includes}",perl-openssl-defaults,libnet-ssleay-perl" ++ ;; ++ esac ++ + if [[ $NO_APT_CACHER != yes ]]; then + local mirror_addr="http://localhost:3142/${apt_mirror[${release}]}" + else + local mirror_addr="http://${apt_mirror[${release}]}" + fi ++ + mkdir -p "${target_dir}" + cd "${target_dir}" +- debootstrap --variant=buildd --components="${components[${release}]}" --arch="${arch}" $DEBOOTSTRAP_OPTION --foreign --include="${includes}" "${release}" "${target_dir}" "${mirror_addr}" +- [[ $? -ne 0 || ! -f "${target_dir}"/debootstrap/debootstrap ]] && exit_with_error "Create chroot first stage failed" ++ ++ debootstrap --variant=buildd \ ++ --components="${components[${release}]}" \ ++ --arch="${arch}" $DEBOOTSTRAP_OPTION \ ++ --foreign \ ++ --include="${includes}" "${release}" "${target_dir}" "${mirror_addr}" ++ ++ [[ $? -ne 0 || ! -f "${target_dir}"/debootstrap/debootstrap ]] && ++ exit_with_error "Create chroot first stage failed" ++ + cp /usr/bin/${qemu_binary[$arch]} "${target_dir}"/usr/bin/ + [[ ! -f "${target_dir}"/usr/share/keyrings/debian-archive-keyring.gpg ]] && + mkdir -p "${target_dir}"/usr/share/keyrings/ && +@@ -53,6 +76,7 @@ create_chroot_for_buildpkg() { + + chroot "${target_dir}" /bin/bash -c "/debootstrap/debootstrap --second-stage" + [[ $? -ne 0 || ! -f "${target_dir}"/bin/bash ]] && exit_with_error "Create chroot second stage failed" ++ + create_sources_list "$release" "${target_dir}" + [[ $NO_APT_CACHER != yes ]] && + echo 'Acquire::http { Proxy "http://localhost:3142"; };' > "${target_dir}"/etc/apt/apt.conf.d/02proxy +@@ -60,8 +84,10 @@ create_chroot_for_buildpkg() { + APT::Install-Recommends "0"; + APT::Install-Suggests "0"; + EOF +- [[ -f "${target_dir}"/etc/locale.gen ]] && sed -i "s/^# en_US.UTF-8/en_US.UTF-8/" "${target_dir}"/etc/locale.gen ++ [[ -f "${target_dir}"/etc/locale.gen ]] && ++ sed -i "s/^# en_US.UTF-8/en_US.UTF-8/" "${target_dir}"/etc/locale.gen + chroot "${target_dir}" /bin/bash -c "locale-gen; update-locale LANG=en_US:en LC_ALL=en_US.UTF-8" ++ + printf '#!/bin/sh\nexit 101' > "${target_dir}"/usr/sbin/policy-rc.d + chmod 755 "${target_dir}"/usr/sbin/policy-rc.d + rm "${target_dir}"/etc/resolv.conf 2> /dev/null +@@ -74,7 +100,17 @@ create_chroot_for_buildpkg() { + mkdir -p "${target_dir}"/var/lock + fi + chroot "${target_dir}" /bin/bash -c "/usr/sbin/update-ccache-symlinks" +- [[ $release == bullseye || $release == focal || $release == hirsute || $release == sid ]] && chroot "${target_dir}" /bin/bash -c "ln -s /usr/bin/python3 /usr/bin/python" ++ ++ display_alert "Upgrading packages in" "${target_dir}" "info" ++ chroot "${target_dir}" /bin/bash -c "apt-get -q update; apt-get -q -y upgrade; apt-get clean" ++ date +%s > "$target_dir/root/.update-timestamp" ++ ++ case $release in ++ bullseye | focal | hirsute | sid) ++ chroot "${target_dir}" /bin/bash -c "apt-get install python-is-python3" ++ ;; ++ esac ++ + touch "${target_dir}"/root/.debootstrap-complete + display_alert "Debootstrap complete" "${release}/${arch}" "info" + } ############################################################################# +@@ -133,27 +169,63 @@ chroot_build_packages() { + for arch in $target_arch; do + display_alert "Starting package building process" "$release/$arch" "info" + +- local target_dir +- target_dir="${SRC}/cache/buildpkg/${release}-${arch}-v${CHROOT_CACHE_VERSION}" ++ local t_name=${release}-${arch}-v${CHROOT_CACHE_VERSION} + local distcc_bindaddr="127.0.0.2" + +- [[ ! -f "${target_dir}"/root/.debootstrap-complete ]] && create_chroot_for_buildpkg "${target_dir}" "${release}" "${arch}" +- [[ ! -f "${target_dir}"/root/.debootstrap-complete ]] && exit_with_error "Creating chroot failed" "${release}/${arch}" ++ # Create a clean environment archive if it does not exist. ++ if [ ! -f "${SRC}/cache/buildpkg/${t_name}.tar.xz" ]; then ++ local tmp_dir=$(mktemp -d "${SRC}"/.tmp/debootstrap-XXXXX) ++ create_chroot "${tmp_dir}/${t_name}" "${release}" "${arch}" ++ display_alert "Create a clean Environment archive" "${t_name}.tar.xz" "info" ++ ( ++ tar -cp --directory="${tmp_dir}/" ${t_name} | ++ pv -p -b -r -s "$(du -sb "${tmp_dir}/${t_name}" | cut -f1)" | ++ pixz -4 > "${SRC}/cache/buildpkg/${t_name}.tar.xz" ++ ) ++ rm -rf $tmp_dir ++ fi + +- [[ -f /var/run/distcc/"${release}-${arch}".pid ]] && kill "$(< "/var/run/distcc/${release}-${arch}.pid")" > /dev/null 2>&1 ++ # Unpack the clean environment archive, if it exists. ++ if [ -f "${SRC}/cache/buildpkg/${t_name}.tar.xz" ]; then ++ local tmp_dir=$(mktemp -d "${SRC}"/.tmp/build-XXXXX) ++ ( ++ cd $tmp_dir ++ display_alert "Unpack the clean environment" "${t_name}.tar.xz" "info" ++ tar -xJf "${SRC}/cache/buildpkg/${t_name}.tar.xz" || ++ exit_with_error "Is not extracted" "${SRC}/cache/buildpkg/${t_name}.tar.xz" ++ ) ++ target_dir="$tmp_dir/${t_name}" ++ else ++ exit_with_error "Creating chroot failed" "${release}/${arch}" ++ fi ++ ++ [[ -f /var/run/distcc/"${release}-${arch}".pid ]] && ++ kill "$(< "/var/run/distcc/${release}-${arch}.pid")" > /dev/null 2>&1 + + chroot_prepare_distccd "${release}" "${arch}" + + # DISTCC_TCP_DEFER_ACCEPT=0 +- DISTCC_CMDLIST=/tmp/distcc/${release}-${arch}/cmdlist TMPDIR=/tmp/distcc distccd --daemon \ +- --pid-file "/var/run/distcc/${release}-${arch}.pid" --listen $distcc_bindaddr --allow 127.0.0.0/24 \ ++ DISTCC_CMDLIST=/tmp/distcc/${release}-${arch}/cmdlist \ ++ TMPDIR=/tmp/distcc distccd --daemon \ ++ --pid-file "/var/run/distcc/${release}-${arch}.pid" \ ++ --listen $distcc_bindaddr --allow 127.0.0.0/24 \ + --log-file "/tmp/distcc/${release}-${arch}.log" --user distccd + ++ [[ -d $target_dir ]] || ++ exit_with_error "Clean Environment is not visible" "$target_dir" ++ + local t=$target_dir/root/.update-timestamp + if [[ ! -f ${t} || $((($(date +%s) - $(< "${t}")) / 86400)) -gt 7 ]]; then + display_alert "Upgrading packages" "$release/$arch" "info" + systemd-nspawn -a -q -D "${target_dir}" /bin/bash -c "apt-get -q update; apt-get -q -y upgrade; apt-get clean" + date +%s > "${t}" ++ display_alert "Repack a clean Environment archive after upgrading" "${t_name}.tar.xz" "info" ++ rm "${SRC}/cache/buildpkg/${t_name}.tar.xz" ++ ( ++ tar -cp --directory="${tmp_dir}/" ${t_name} | ++ pv -p -b -r -s "$(du -sb "${tmp_dir}/${t_name}" | cut -f1)" | ++ pixz -4 > "${SRC}/cache/buildpkg/${t_name}.tar.xz" ++ ) + fi + + for plugin in "${SRC}"/packages/extras-buildpkgs/*.conf; do +@@ -186,12 +258,30 @@ chroot_build_packages() { + display_alert "Packages are up to date" "$package_name $release/$arch" "info" + continue + fi ++ ++ # Delete the environment if there was a build in it. ++ # And unpack the clean environment again. ++ if [[ -f "${target_dir}"/root/build.sh ]] && [[ -d $tmp_dir ]]; then ++ rm -rf $tmp_dir ++ local tmp_dir=$(mktemp -d "${SRC}"/.tmp/build-XXXXX) ++ ( ++ cd $tmp_dir ++ display_alert "Unpack the clean environment" "${t_name}.tar.xz" "info" ++ tar -xJf "${SRC}/cache/buildpkg/${t_name}.tar.xz" || ++ exit_with_error "Is not extracted" "${SRC}/cache/buildpkg/${t_name}.tar.xz" ++ ) ++ target_dir="$tmp_dir/${t_name}" ++ fi ++ + display_alert "Building packages" "$package_name $release/$arch" "ext" ++ ts=$(date +%s) + local dist_builddeps_name="package_builddeps_${release}" + [[ -v $dist_builddeps_name ]] && package_builddeps="${package_builddeps} ${!dist_builddeps_name}" + + # create build script ++ LOG_OUTPUT_FILE=/root/build-"${package_name}".log + create_build_script ++ unset LOG_OUTPUT_FILE + + fetch_from_repo "$package_repo" "extra/$package_name" "$package_ref" + +@@ -209,26 +299,31 @@ chroot_build_packages() { + built_ok+=("$package_name:$release/$arch") + fi + mv "${target_dir}"/root/*.deb "${plugin_target_dir}" 2> /dev/null ++ mv "${target_dir}"/root/*.log "$DEST/${LOG_SUBPATH}/" ++ te=$(date +%s) ++ display_alert "Build time $package_name " " $(($te - $ts)) sec." "info" + done ++ # Delete a temporary directory ++ if [ -d $tmp_dir ]; then rm -rf $tmp_dir; fi + # cleanup for distcc + kill $(< /var/run/distcc/${release}-${arch}.pid) + done + done + if [[ ${#built_ok[@]} -gt 0 ]]; then + display_alert "Following packages were built without errors" "" "info" +- for p in "${built_ok[@]}"; do ++ for p in ${built_ok[@]}; do + display_alert "$p" + done + fi + if [[ ${#failed[@]} -gt 0 ]]; then + display_alert "Following packages failed to build" "" "wrn" +- for p in "${failed[@]}"; do ++ for p in ${failed[@]}; do + display_alert "$p" + done + fi + } ############################################################################# + +-# create build script # @TODO: what is this? ++# create build script + create_build_script() { + cat <<- EOF > "${target_dir}"/root/build.sh + #!/bin/bash +@@ -248,32 +343,10 @@ create_build_script() { + export DEBEMAIL="$MAINTAINERMAIL" + $(declare -f display_alert) + +- cd /root/build +- if [[ -n "${package_builddeps}" ]]; then +- # can be replaced with mk-build-deps +- deps=() +- installed=\$( +- dpkg-query -W -f '\${db:Status-Abbrev}|\${binary:Package}\n' '*' 2>/dev/null | \ +- grep '^ii' | \ +- awk -F '|' '{print \$2}' | \ +- cut -d ':' -f 1 +- ) +- +- for packet in $package_builddeps +- do +- grep -q -x -e "\$packet" <<< "\$installed" || deps+=("\$packet") +- done +- +- if [[ \${#deps[@]} -gt 0 ]]; then +- display_alert "Installing build dependencies" +- apt-get -y -q update +- apt-get -y -q \ +- --no-install-recommends \ +- --show-progress \ +- -o DPKG::Progress-Fancy=1 install "\${deps[@]}" +- fi +- fi ++ LOG_OUTPUT_FILE=$LOG_OUTPUT_FILE ++ $(declare -f install_pkg_deb) + ++ cd /root/build + display_alert "Copying sources" + rsync -aq /root/sources/"${package_name}" /root/build/ + +@@ -281,6 +354,16 @@ create_build_script() { + # copy overlay / "debianization" files + [[ -d "/root/overlay/${package_name}/" ]] && rsync -aq /root/overlay/"${package_name}" /root/build/ + ++ package_builddeps="$package_builddeps" ++ if [ -z "\$package_builddeps" ]; then ++ # Calculate build dependencies by a standard function and ++ # еxclude special comparison characters like "|" "(>= 9)" ++ package_builddeps="\$(dpkg-checkbuilddeps |& awk -F":" '{gsub(/[|]|[(].*[)]/, " ", \$0); print \$NF}')" ++ fi ++ if [[ -n "\${package_builddeps}" ]]; then ++ install_pkg_deb \${package_builddeps} ++ fi ++ + # set upstream version + [[ -n "${package_upstream_version}" ]] && debchange --preserve --newversion "${package_upstream_version}" "Import from upstream" + +@@ -289,7 +372,9 @@ create_build_script() { + debchange -l~armbian"${REVISION}"+ "Custom $VENDOR release" + + display_alert "Building package" +- dpkg-buildpackage -b -us -j2 ++ # Set the number of build threads and certainly send ++ # the standard error stream to the log file. ++ dpkg-buildpackage -b -us -j${NCPU_CHROOT:-2} 2>>\$LOG_OUTPUT_FILE + + if [[ \$? -eq 0 ]]; then + cd /root/build +diff --git a/lib/functions/general/git.sh b/lib/functions/general/git.sh +index 2b70de167..9fb0dfcf3 100644 +--- a/lib/functions/general/git.sh ++++ b/lib/functions/general/git.sh +@@ -339,8 +339,8 @@ fetch_from_repo() { + fingerprint_image() { + cat <<- EOF > "${1}" + -------------------------------------------------------------------------------- +- Title: ${VENDOR} $REVISION ${BOARD^} $DISTRIBUTION $RELEASE $BRANCH +- Kernel: Linux $VER ++ Title: ${VENDOR} $REVISION ${BOARD^} $BRANCH ++ Kernel: Linux $VER + Build date: $(date +'%d.%m.%Y') + Maintainer: $MAINTAINER <$MAINTAINERMAIL> + Authors: https://www.armbian.com/authors +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 5156c4ed8..ef681d301 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -43,17 +43,6 @@ prepare_host() { + else + local offline=false + fi +- # build aarch64 +- if [[ $(dpkg --print-architecture) != arm64 ]]; then +- +- if [[ $(dpkg --print-architecture) != amd64 ]]; then +- display_alert "Please read documentation to set up proper compilation environment" +- display_alert "https://www.armbian.com/using-armbian-tools/" +- exit_with_error "Running this tool on non x86_64 build host is not supported" +- fi +- +- # build aarch64 +- fi + + # wait until package manager finishes possible system maintanace + wait_for_package_manager +@@ -69,35 +58,38 @@ prepare_host() { + # packages list for host + # NOTE: please sync any changes here with the Dockerfile and Vagrantfile + +- # build aarch64 ++ local hostdeps="acl aptly aria2 bc binfmt-support bison btrfs-progs \ ++ build-essential ca-certificates ccache cpio cryptsetup curl \ ++ debian-archive-keyring debian-keyring debootstrap device-tree-compiler \ ++ dialog dirmngr dosfstools dwarves f2fs-tools fakeroot flex gawk \ ++ gcc-arm-linux-gnueabihf gdisk gnupg1 gpg imagemagick jq kmod libbison-dev \ ++ libc6-dev-armhf-cross libelf-dev libfdt-dev libfile-fcntllock-perl \ ++ libfl-dev liblz4-tool libncurses-dev libpython2.7-dev libssl-dev \ ++ libusb-1.0-0-dev linux-base locales lzop ncurses-base ncurses-term \ ++ nfs-kernel-server ntpdate p7zip-full parted patchutils pigz pixz \ ++ pkg-config pv python3-dev python3-distutils qemu-user-static rsync swig \ ++ systemd-container u-boot-tools udev unzip uuid-dev wget whiptail zip \ ++ zlib1g-dev" ++ + if [[ $(dpkg --print-architecture) == amd64 ]]; then + +- local hostdeps="wget ca-certificates device-tree-compiler pv bc lzop zip binfmt-support build-essential ccache debootstrap ntpdate \ +- gawk gcc-arm-linux-gnueabihf qemu-user-static u-boot-tools uuid-dev zlib1g-dev unzip libusb-1.0-0-dev fakeroot \ +- parted pkg-config libncurses5-dev whiptail debian-keyring debian-archive-keyring f2fs-tools libfile-fcntllock-perl rsync libssl-dev \ +- nfs-kernel-server btrfs-progs ncurses-term p7zip-full kmod dosfstools libc6-dev-armhf-cross imagemagick \ +- curl patchutils liblz4-tool libpython2.7-dev linux-base swig aptly acl python3-dev python3-distutils \ +- locales ncurses-base pixz dialog systemd-container udev libfdt-dev libelf-dev lib32stdc++6 libc6-i386 lib32ncurses5 lib32tinfo5 \ +- bison libbison-dev flex libfl-dev cryptsetup gpg gnupg cpio aria2 pigz dirmngr python3-distutils jq distcc gdisk dwarves" ++ hostdeps+=" distcc lib32ncurses-dev lib32stdc++6 libc6-i386 zlib1g:i386" ++ grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 ++ ++ elif [[ $(dpkg --print-architecture) == arm64 ]]; then ++ ++ hostdeps+=" gcc-arm-linux-gnueabi gcc-arm-none-eabi libc6 libc6-amd64-cross qemu" + +- # build aarch64 + else + +- local hostdeps="wget ca-certificates device-tree-compiler pv bc lzop zip binfmt-support build-essential ccache debootstrap ntpdate \ +- gawk gcc-arm-linux-gnueabihf gcc-arm-linux-gnueabi gcc-arm-none-eabi \ +- qemu-user-static u-boot-tools uuid-dev zlib1g-dev unzip libusb-1.0-0-dev fakeroot \ +- parted pkg-config libncurses5-dev whiptail debian-keyring debian-archive-keyring f2fs-tools libfile-fcntllock-perl rsync libssl-dev \ +- nfs-kernel-server btrfs-progs ncurses-term p7zip-full kmod dosfstools libc6-amd64-cross libc6-dev-armhf-cross imagemagick \ +- curl patchutils liblz4-tool libpython2.7-dev linux-base swig aptly acl python3-dev \ +- locales ncurses-base pixz dialog systemd-container udev libfdt-dev libelf-dev libc6 qemu \ +- bison libbison-dev flex libfl-dev cryptsetup gpg gnupg cpio aria2 pigz \ +- dirmngr python3-distutils jq gdisk dwarves" ++ display_alert "Please read documentation to set up proper compilation environment" ++ display_alert "https://www.armbian.com/using-armbian-tools/" ++ exit_with_error "Running this tool on non x86_64 build host is not supported" + +- # build aarch64 + fi + + # Add support for Ubuntu 20.04, 21.04 and Mint 20.x +- if [[ $HOSTRELEASE =~ ^(focal|impish|hirsute|jammy|ulyana|ulyssa|bullseye|uma)$ ]]; then ++ if [[ $HOSTRELEASE =~ ^(focal|impish|hirsute|ulyana|ulyssa|bullseye|uma)$ ]]; then + hostdeps+=" python2 python3" + ln -fs /usr/bin/python2.7 /usr/bin/python2 + ln -fs /usr/bin/python2.7 /usr/bin/python +@@ -112,7 +104,7 @@ prepare_host() { + # + # NO_HOST_RELEASE_CHECK overrides the check for a supported host system + # Disable host OS check at your own risk. Any issues reported with unsupported releases will be closed without discussion +- if [[ -z $HOSTRELEASE || "buster bullseye focal impish hirsute jammy debbie tricia ulyana ulyssa uma" != *"$HOSTRELEASE"* ]]; then ++ if [[ -z $HOSTRELEASE || "buster bullseye focal impish hirsute debbie tricia ulyana ulyssa uma" != *"$HOSTRELEASE"* ]]; then + if [[ $NO_HOST_RELEASE_CHECK == yes ]]; then + display_alert "You are running on an unsupported system" "${HOSTRELEASE:-(unknown)}" "wrn" + display_alert "Do not report any errors, warnings or other issues encountered beyond this point" "" "wrn" +@@ -129,17 +121,6 @@ prepare_host() { + fi + fi + +- # build aarch64 +- if [[ $(dpkg --print-architecture) == amd64 ]]; then +- +- if [[ -z $HOSTRELEASE || $HOSTRELEASE =~ ^(focal|debbie|buster|bullseye|impish|hirsute|ulyana|ulyssa|uma)$ ]]; then +- hostdeps="${hostdeps/lib32ncurses5 lib32tinfo5/lib32ncurses6 lib32tinfo6}" +- fi +- +- grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 +- # build aarch64 +- fi +- + if systemd-detect-virt -q -c; then + display_alert "Running in container" "$(systemd-detect-virt)" "info" + # disable apt-cacher unless NO_APT_CACHER=no is not specified explicitly +@@ -159,12 +140,10 @@ prepare_host() { + # Skip verification if you are working offline + if ! $offline; then + +- # warning: apt-cacher-ng will fail if installed and used both on host and in container/chroot environment with shared network ++ # warning: apt-cacher-ng will fail if installed and used both on host and in ++ # container/chroot environment with shared network + # set NO_APT_CACHER=yes to prevent installation errors in such case +- if [[ $NO_APT_CACHER != yes ]]; then hostdeps="$hostdeps apt-cacher-ng"; fi +- +- local deps=() +- local installed=$(dpkg-query -W -f '${db:Status-Abbrev}|${binary:Package}\n' '*' 2> /dev/null | grep '^ii' | awk -F '|' '{print $2}' | cut -d ':' -f 1) ++ if [[ $NO_APT_CACHER != yes ]]; then hostdeps+=" apt-cacher-ng"; fi + + export EXTRA_BUILD_DEPS="" + call_extension_method "add_host_dependencies" <<- 'ADD_HOST_DEPENDENCIES' +@@ -172,9 +151,7 @@ prepare_host() { + you can add packages to install, space separated, to ${EXTRA_BUILD_DEPS} here. + ADD_HOST_DEPENDENCIES + +- for packet in $hostdeps ${EXTRA_BUILD_DEPS}; do +- if ! grep -q -x -e "$packet" <<< "$installed"; then deps+=("$packet"); fi +- done ++ if [ -n "${EXTRA_BUILD_DEPS}" ]; then hostdeps+=" ${EXTRA_BUILD_DEPS}"; fi + + # distribution packages are buggy, download from author + +@@ -196,18 +173,15 @@ prepare_host() { + # build aarch64 + fi + +- if [[ ${#deps[@]} -gt 0 ]]; then +- display_alert "Installing build dependencies" +- # don't prompt for apt cacher selection +- sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections +- display_alert "Updating apt host-side" "apt update" "info" +- apt-get -q update 2>&1 +- display_alert "Upgrading apt host-side" "apt upgrade" "info" +- apt-get -y upgrade 2>&1 +- display_alert "Installing host-side dependency packages" "apt upgrade" "info" +- apt-get -q -y --no-install-recommends install -o Dpkg::Options::='--force-confold' "${deps[@]}" 2>&1 +- update-ccache-symlinks +- fi ++ display_alert "Installing build dependencies" ++ # don't prompt for apt cacher selection ++ sudo echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean false" | sudo debconf-set-selections ++ ++ LOG_OUTPUT_FILE="${DEST}"/${LOG_SUBPATH}/hostdeps.log ++ install_pkg_deb "upgrade $hostdeps" ++ unset LOG_OUTPUT_FILE ++ ++ update-ccache-symlinks + + export FINAL_HOST_DEPS="$hostdeps ${EXTRA_BUILD_DEPS}" + call_extension_method "host_dependencies_ready" <<- 'HOST_DEPENDENCIES_READY' +@@ -223,16 +197,6 @@ prepare_host() { + ntpdate -s "${NTP_SERVER:-pool.ntp.org}" + fi + +- # build aarch64 +- if [[ $(dpkg --print-architecture) == amd64 ]]; then +- +- if [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' 'zlib1g:i386' 2> /dev/null) != *ii* ]]; then +- apt-get install -qq -y --no-install-recommends zlib1g:i386 > /dev/null 2>&1 +- fi +- +- # build aarch64 +- fi +- + # create directory structure + mkdir -p "${SRC}"/{cache,output} "${USERPATCHES_PATH}" + if [[ -n $SUDO_USER ]]; then +@@ -243,20 +207,11 @@ prepare_host() { + find "${SRC}"/output "${USERPATCHES_PATH}" -type d ! -group sudo -exec chgrp --quiet sudo {} \; + find "${SRC}"/output "${USERPATCHES_PATH}" -type d ! -perm -g+w,g+s -exec chmod --quiet g+w,g+s {} \; + fi +- # @TODO: rpardini: _very_ important spot, this is where ".tmp" is created. A _huge_ opportunity for tmpfs here. +- display_alert "Creating directory structure: .tmp" "${SRC}/.tmp" "debug" +- display_alert "Creating directory structure: DEST" "${DEST}" "debug" +- mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} \ +- "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} \ +- "${SRC}"/.tmp "${WORKDIR}" +- +- display_alert "Setting TMPDIR" "${WORKDIR}" "debug" +- export TMPDIR="${WORKDIR}" ++ mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp + + # build aarch64 + if [[ $(dpkg --print-architecture) == amd64 ]]; then + if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" != "yes" ]]; then +- display_alert "Warning! SKIP_EXTERNAL_TOOLCHAINS is not yes. This is deprecated, upgrade!" "please set SKIP_EXTERNAL_TOOLCHAINS=yes" "deprecation" + + # bind mount toolchain if defined + if [[ -d "${ARMBIAN_CACHE_TOOLCHAIN_PATH}" ]]; then +@@ -301,21 +256,20 @@ prepare_host() { + fi + done + else +- display_alert "Ignoring toolchains" "SKIP_EXTERNAL_TOOLCHAINS=${SKIP_EXTERNAL_TOOLCHAINS}" "info" +- fi +- fi # check offline +- +- # enable arm binary format so that the cross-architecture chroot environment will work +- if [[ $KERNEL_ONLY != yes ]]; then +- modprobe -q binfmt_misc +- mountpoint -q /proc/sys/fs/binfmt_misc/ || mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc +- if [[ "$(arch)" != "aarch64" ]]; then +- test -e /proc/sys/fs/binfmt_misc/qemu-arm || update-binfmts --enable qemu-arm +- test -e /proc/sys/fs/binfmt_misc/qemu-aarch64 || update-binfmts --enable qemu-aarch64 ++ display_alert "Ignoring toolchains" "SKIP_EXTERNAL_TOOLCHAINS: ${SKIP_EXTERNAL_TOOLCHAINS}" "info" + fi + fi + +- # build aarch64 ++ fi # check offline ++ ++ # enable arm binary format so that the cross-architecture chroot environment will work ++ if [[ $KERNEL_ONLY != yes ]]; then ++ modprobe -q binfmt_misc ++ mountpoint -q /proc/sys/fs/binfmt_misc/ || mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc ++ if [[ "$(arch)" != "aarch64" ]]; then ++ test -e /proc/sys/fs/binfmt_misc/qemu-arm || update-binfmts --enable qemu-arm ++ test -e /proc/sys/fs/binfmt_misc/qemu-aarch64 || update-binfmts --enable qemu-aarch64 ++ fi + fi + + [[ ! -f "${USERPATCHES_PATH}"/customize-image.sh ]] && cp "${SRC}"/config/templates/customize-image.sh.template "${USERPATCHES_PATH}"/customize-image.sh +@@ -373,3 +327,110 @@ function fetch_and_build_host_tools() { + BUILD_HOST_TOOLS + + } ++ ++# Installing debian packages in the armbian build system. ++# The function accepts three optional parameters: ++# upgrade, clean - the same name for apt ++# verbose - detailed log for the function ++# ++# list="pkg1 pkg2 pkg3 pkgbadname pkg-1.0 | pkg-2.0 pkg5 (>= 9)" ++# install_pkg_deb upgrade verbose $list ++# ++# If the package has a bad name, we will see it in the log file. ++# If there is an LOG_OUTPUT_FILE variable and it has a value as ++# the full real path to the log file, then all the information will be there. ++# ++# The LOG_OUTPUT_FILE variable must be defined in the calling function ++# before calling the install_pkg_deb function and unset after. ++# ++install_pkg_deb() { ++ local list="" ++ local log_file ++ local for_install ++ local need_upgrade=false ++ local need_clean=false ++ local need_verbose=false ++ local _line=${BASH_LINENO[0]} ++ local _function=${FUNCNAME[1]} ++ local _file=$(basename "${BASH_SOURCE[1]}") ++ local tmp_file=$(mktemp /tmp/install_log_XXXXX) ++ export DEBIAN_FRONTEND=noninteractive ++ ++ list=$( ++ for p in $*; do ++ case $p in ++ upgrade) ++ need_upgrade=true ++ continue ++ ;; ++ clean) ++ need_clean=true ++ continue ++ ;; ++ verbose) ++ need_verbose=true ++ continue ++ ;; ++ \| | \(* | *\)) continue ;; ++ esac ++ echo " $p" ++ done ++ ) ++ ++ if [ -d $(dirname $LOG_OUTPUT_FILE) ]; then ++ log_file=${LOG_OUTPUT_FILE} ++ else ++ log_file="${SRC}/output/${LOG_SUBPATH}/install.log" ++ fi ++ ++ apt-get -q update ++ if [ "$?" != "0" ]; then echo "apt cannot update" >> $log_file; fi ++ if $need_upgrade; then ++ apt-get -y upgrade ++ if [ "$?" != "0" ]; then echo "apt cannot upgrade" >> $log_file; fi ++ fi ++ ++ # If the package is not installed, check the latest ++ # up-to-date version in the apt cache. ++ # Exclude bad package names and send a message to the log. ++ for_install=$( ++ for p in $list; do ++ if $(dpkg-query -W -f '${db:Status-Abbrev}' $p |& awk '/ii/{exit 1}'); then ++ apt-cache show $p -o APT::Cache::AllVersions=no |& ++ awk -v p=$p -v tmp_file=$tmp_file \ ++ '/^Package:/{print $2} /^E:/{print "Bad package name: ",p >>tmp_file}' ++ fi ++ done ++ ) ++ ++ # This information should be logged. ++ if [ -s $tmp_file ]; then ++ echo -e "\nInstalling packages in function: $_function" "[$_file:$_line]" \ ++ >> $log_file ++ echo -e "\nIncoming list:" >> $log_file ++ printf "%-30s %-30s %-30s %-30s\n" $list >> $log_file ++ echo "" >> $log_file ++ cat $tmp_file >> $log_file ++ fi ++ ++ if [ -n "$for_install" ]; then ++ ++ apt-get install -qq -y --no-install-recommends $for_install ++ echo -e "\nPackages installed:" >> $log_file ++ dpkg-query -W \ ++ -f '${binary:Package;-27} ${Version;-23}\n' \ ++ $for_install >> $log_file ++ ++ fi ++ ++ # We will show the status after installation all listed ++ if $need_verbose; then ++ echo -e "\nstatus after installation:" >> $log_file ++ dpkg-query -W \ ++ -f '${binary:Package;-27} ${Version;-23} [ ${Status} ]\n' \ ++ $list >> $log_file ++ fi ++ ++ if $need_clean; then apt-get clean; fi ++ rm $tmp_file ++} +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index d85e8650c..5d868a381 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -80,7 +80,7 @@ main_default_build_single() { + overlayfs_wrapper "cleanup" + + # create board support package +- if [[ -n "${RELEASE}" && ! -f "${DEB_STORAGE}/$RELEASE/${BSP_CLI_PACKAGE_FULLNAME}.deb" && "${REPOSITORY_INSTALL}" != *armbian-bsp-cli* ]]; then ++ 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 + +diff --git a/lib/functions/rootfs/distro_agnostic.sh b/lib/functions/rootfs/distro_agnostic.sh +index a226ce0eb..6249376b7 100644 +--- a/lib/functions/rootfs/distro_agnostic.sh ++++ b/lib/functions/rootfs/distro_agnostic.sh +@@ -316,7 +316,7 @@ POST_INSTALL_KERNEL_DEBS + + # install board support packages + if [[ "${REPOSITORY_INSTALL}" != *bsp* ]]; then +- install_deb_chroot "${DEB_STORAGE}/$RELEASE/${BSP_CLI_PACKAGE_FULLNAME}.deb" ++ install_deb_chroot "${DEB_STORAGE}/${BSP_CLI_PACKAGE_FULLNAME}.deb" + else + install_deb_chroot "${CHOSEN_ROOTFS}" "remote" + fi +@@ -570,6 +570,9 @@ FAMILY_TWEAKS + # build logo in any case + boot_logo + ++ # disable MOTD for first boot - we want as clean 1st run as possible ++ chmod -x "${SDCARD}"/etc/update-motd.d/* ++ + return 0 # make sure to exit with success + } + + +From 9486f6117f1011dbeefd44fdda9e1d9e7f3c7425 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sun, 26 Dec 2021 12:39:03 +0100 +Subject: [PATCH] logging: generic do_capturing_defs wrapper; Python parser + +- enabled by passing CONFIG_DEFS_ONLY=yes; in this case does not build anything +- [WiP] Python3 info reader / matrix expander + - multithreaded version + +Signed-off-by: Ricardo Pardini +--- + compile.sh | 2 +- + config/boards/virtual-qemu.wip | 2 +- + lib/functions/cli/cli-entrypoint.sh | 9 +- + lib/functions/configuration/main-config.sh | 32 ++++--- + lib/functions/logging/capture.sh | 22 +++++ + lib/functions/logging/traps.sh | 4 + + lib/functions/main/config-prepare.sh | 4 +- + lib/functions/main/default-build.sh | 2 +- + lib/library-functions.sh | 4 + + lib/tools/info.py | 140 +++++++++++++++++++++++++++++ + 10 files changed, 204 insertions(+), 17 deletions(-) + +diff --git a/compile.sh b/compile.sh +index d4d07cfe0..27d598bd2 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -36,7 +36,7 @@ fi + source "${SRC}"/lib/single.sh + + # hook up the error handler early, we wanna see stack for all errors. +-trap 'main_error_monitor "$?" "$(show_caller_full)" "$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")"; exit 48' ERR EXIT ++trap 'main_error_monitor "$?" "$(show_caller_full)" "$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")"' ERR EXIT + + # And execute the main entrypoint. + cli_entrypoint "$@" +diff --git a/config/boards/virtual-qemu.wip b/config/boards/virtual-qemu.wip +index 0573bfa0b..4d7121221 100644 +--- a/config/boards/virtual-qemu.wip ++++ b/config/boards/virtual-qemu.wip +@@ -33,7 +33,7 @@ EXTRAWIFI='no' + ROOTFS_TYPE="ext4" + PACKAGE_LIST_DESKTOP_BOARD="spice-vdagent" + +-post_build_image_modify() { ++post_build_image_modify() { # @TODO: rpardini: hmm, wonder why there is a failsafe? function leaking in build-all? + + if [[ ${BOARD} == "virtual-qemu" ]]; then + local IMAGE_PATH=${1} +diff --git a/lib/functions/cli/cli-entrypoint.sh b/lib/functions/cli/cli-entrypoint.sh +index d5434ee1d..99adc61a4 100644 +--- a/lib/functions/cli/cli-entrypoint.sh ++++ b/lib/functions/cli/cli-entrypoint.sh +@@ -108,7 +108,14 @@ function cli_entrypoint() { + do_main_build_all_ng + else + # configuration etc +- prepare_and_config_main_build_single ++ do_capturing_defs prepare_and_config_main_build_single # this sets CAPTURED_VARS ++ ++ if [[ "${CONFIG_DEFS_ONLY}" == "yes" ]]; then ++ echo "${CAPTURED_VARS}" # to stdout! ++ return 0 ++ else ++ unset CAPTURED_VARS ++ fi + + # Allow for custom user-invoked functions. @TODO: check this with extensions usage? + if [[ -z $1 ]]; then +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 4632fd488..759deaf5d 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -377,7 +377,7 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + # Dependent desktop packages + # Myy : Sources packages from file here + +- # Myy : FIXME Rename aggregate_all to aggregate_all_desktop ++ # Myy : FIXME Rename aggregate_all to aggregate_all_desktop # @TODO: rpardini: already done? + if [[ $BUILD_DESKTOP == "yes" ]]; then + PACKAGE_LIST_DESKTOP+="$(one_line aggregate_all_desktop "packages" " ")" + echo -e "\nGroups selected ${DESKTOP_APPGROUPS_SELECTED} -> PACKAGES :" >> "${LOG_OUTPUT_FILE}" +@@ -446,7 +446,7 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + + [[ -n $APT_PROXY_ADDR ]] && display_alert "Using custom apt-cacher-ng address" "$APT_PROXY_ADDR" "info" + +- # Build final package list after possible override ++ display_alert "Build final package list" "after possible override" "debug" + PACKAGE_LIST="$PACKAGE_LIST $PACKAGE_LIST_RELEASE $PACKAGE_LIST_ADDITIONAL" + PACKAGE_MAIN_LIST="$(cleanup_list PACKAGE_LIST)" + +@@ -505,28 +505,38 @@ Packages will still be installed after this is called, so it is the last chance + to confirm or change any packages. + POST_AGGREGATE_PACKAGES + +- # debug +- cat <<- EOF >> "${DEST}"/${LOG_SUBPATH}/output.log ++ local build_script_env_file="${DEST}/${LOG_SUBPATH}/output.log" ++ display_alert "Writing build config summary to" "${build_script_env_file}" "debug" + ++ # debug ++ local debug_dpkg_arch debug_uname debug_virt debug_src_mount debug_src_perms debug_src_temp_perms ++ debug_dpkg_arch="$(dpkg --print-architecture)" ++ debug_uname="$(uname -a)" ++ debug_virt="$(systemd-detect-virt)" ++ debug_src_mount="$(findmnt -o TARGET,SOURCE,FSTYPE,AVAIL -T "${SRC}")" ++ debug_src_perms="$(getfacl -p "${SRC}")" ++ debug_src_temp_perms="$(getfacl -p "${SRC}"/.tmp 2> /dev/null)" ++ ++ cat <<- EOF >> "${build_script_env_file}" + ## BUILD SCRIPT ENVIRONMENT + + Repository: $REPOSITORY_URL + Version: $REPOSITORY_COMMIT + + Host OS: $HOSTRELEASE +- Host arch: $(dpkg --print-architecture) +- Host system: $(uname -a) +- Virtualization type: $(systemd-detect-virt) ++ Host arch: ${debug_dpkg_arch} ++ Host system: ${debug_uname} ++ Virtualization type: ${debug_virt} + + ## Build script directories + Build directory is located on: +- $(findmnt -o TARGET,SOURCE,FSTYPE,AVAIL -T "${SRC}") ++ ${debug_src_mount} + + Build directory permissions: +- $(getfacl -p "${SRC}") ++ ${debug_src_perms} + + Temp directory permissions: +- $(getfacl -p "${SRC}"/.tmp 2> /dev/null) ++ ${debug_src_temp_perms} + + ## BUILD CONFIGURATION + +@@ -554,4 +564,6 @@ POST_AGGREGATE_PACKAGES + + CPU configuration: $CPUMIN - $CPUMAX with $GOVERNOR + EOF ++ ++ display_alert "Done with main-config.sh" "do_main_configuration" "debug" + } +diff --git a/lib/functions/logging/capture.sh b/lib/functions/logging/capture.sh +new file mode 100644 +index 000000000..660068c89 +--- /dev/null ++++ b/lib/functions/logging/capture.sh +@@ -0,0 +1,22 @@ ++function do_capturing_defs() { ++ # make sure to local with a value, otherwise they will appear in the list... ++ local pre_exec_vars="" exit_code=0 post_exec_vars="" new_vars_list="" onevar="" all_vars_array=() ++ pre_exec_vars="$(compgen -A variable | grep -E '[[:upper:]]+' | grep -v -e "^BASH_" | sort)" ++ ++ # run parameters passed ++ "$@" || exit_code=$? ++ ++ post_exec_vars="$(compgen -A variable | grep -E '[[:upper:]]+' | grep -v -e "^BASH_" | sort)" ++ new_vars_list="$(comm -13 <(echo "$pre_exec_vars") <(echo "${post_exec_vars}"))" ++ ++ for onevar in ${new_vars_list}; do ++ # @TODO: rpardini: handle arrays and maps specially? ++ all_vars_array+=("$(declare -p "${onevar}")") ++ done ++ #IFS=$'\n' ++ CAPTURED_VARS="${all_vars_array[*]}" ++ #display_alert "Vars defined during ${*@Q}:" "${CAPTURED_VARS}" "debug" ++ unset all_vars_array post_exec_vars new_vars_list pre_exec_vars onevar join_by ++ ++ return ${exit_code} ++} +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index 9a5daa670..47878a0b0 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -49,6 +49,10 @@ function main_error_monitor() { + fi + #trap - ERR # remove this trap + local errcode="${1}" ++ # If there's no error, do nothing. ++ if [[ $errcode -eq 0 ]]; then ++ return 0 ++ fi + local stack_caller="${2}" + local full_stack_caller="${3}" + display_alert "main_error_monitor: ${errcode}! stack:" "${stack_caller}" "err" +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 196142608..32be7355d 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -102,8 +102,7 @@ function prepare_and_config_main_build_single() { + source "${SRC}/config/boards/${BOARD}.${BOARD_TYPE}" + LINUXFAMILY="${BOARDFAMILY}" + +- # @TODO: interesting. this sourced the board config. What sources the family? +- ++ # @TODO: interesting. this sourced the board config. What sources the family? do_main_configuration! + + [[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config" + +@@ -174,7 +173,6 @@ function prepare_and_config_main_build_single() { + export CHOSEN_KSRC=linux-source-${BRANCH}-${LINUXFAMILY} + + display_alert "Done with prepare_and_config_main_build_single" "${BOARD}.${BOARD_TYPE}" "info" +- + } + + # cli-bsp also uses this +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index e9f3af0ed..d85e8650c 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -18,7 +18,7 @@ main_default_build_single() { + LOG_SECTION="fetch_sources_kernel_uboot_atf" do_with_logging fetch_sources_kernel_uboot_atf + LOG_SECTION="fetch_and_build_host_tools" do_with_logging fetch_and_build_host_tools + +- for option in $(tr ',' ' ' <<< "$CLEAN_LEVEL"); do ++ for option in $(tr ',' ' ' <<< "${CLEAN_LEVEL}"); do + if [[ $option != sources ]]; then + LOG_SECTION="cleaning" do_with_logging cleaning "$option" + fi +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index f9bb093a4..285f7e84e 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -167,6 +167,10 @@ source "${SRC}"/lib/functions/compilation/extra-drivers.sh + # shellcheck source=functions/compilation/patching.sh + source "${SRC}"/lib/functions/compilation/patching.sh + ++### lib/functions/logging/capture.sh ++# shellcheck source=functions/logging/capture.sh ++source "${SRC}"/lib/functions/logging/capture.sh ++ + ### lib/functions/logging/runners.sh + # shellcheck source=functions/logging/runners.sh + source "${SRC}"/lib/functions/logging/runners.sh +diff --git a/lib/tools/info.py b/lib/tools/info.py +new file mode 100755 +index 000000000..308d482e7 +--- /dev/null ++++ b/lib/tools/info.py +@@ -0,0 +1,140 @@ ++#!/bin/env python3 ++import concurrent.futures ++import glob ++import json ++import os ++import re ++import subprocess ++import sys ++from pathlib import Path ++ ++ ++def eprint(*args, **kwargs): ++ print(*args, file=sys.stderr, **kwargs) ++ ++ ++def armbian_value_parse_list(item_value): ++ return item_value.split() ++ ++ ++def get_all_boards_list_from_armbian(src_path): ++ ret = [] ++ for file in glob.glob(src_path + "/config/boards/*.*"): ++ stem = Path(file).stem ++ if stem != "README": ++ ret.append(stem) ++ return ret ++ ++ ++def armbian_value_parse_newline_map(item_value): ++ lines = item_value.split("\n") ++ ret = [] ++ for line in lines: ++ ret.append(line.split(";")) ++ return ret ++ ++ ++def map_to_armbian_params(map_params): ++ ret = [] ++ for param in map_params: ++ ret.append(param + "=" + map_params[param]) ++ return ret ++ ++ ++def run_armbian_compile_and_parse(path_to_compile_sh, compile_params): ++ result = subprocess.run( ++ [path_to_compile_sh] + map_to_armbian_params(compile_params), ++ stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, universal_newlines=True ++ ) ++ ++ # Now parse it with regex-power! ++ # regex = r"^declare (..) (.*?)=\"(.*?)\"$" # old multiline version ++ regex = r"declare (..) (.*?)=\"(.*?)\"" ++ test_str = result.stdout ++ matches = re.finditer(regex, test_str, re.DOTALL | re.MULTILINE) ++ all_keys = {} ++ ++ for matchNum, match in enumerate(matches, start=1): ++ flags = match.group(1) ++ key = match.group(2) ++ value = match.group(3) ++ ++ if ("_LIST" in key) or ("_DIRS" in key): ++ value = armbian_value_parse_list(value) ++ elif "_TARGET_MAP" in key: ++ value = armbian_value_parse_newline_map(value) ++ ++ all_keys[key] = value ++ ++ return {"in": compile_params, "out": all_keys, "logs": result.stderr.split("\n")} ++ ++ ++# Find the location of compile.sh, relative to this Python script. ++this_script_full_path = os.path.realpath(__file__) ++eprint("Real path to this script", this_script_full_path) ++ ++armbian_src_path = os.path.realpath(os.path.join(os.path.dirname(this_script_full_path), "..", "..")) ++eprint("Real path to Armbian SRC", armbian_src_path) ++ ++compile_sh_full_path = os.path.realpath(os.path.join(armbian_src_path, "compile.sh")) ++eprint("Real path to compile.sh", compile_sh_full_path) ++ ++# Make sure it exists ++if not os.path.exists(compile_sh_full_path): ++ raise Exception("Can't find compile.sh") ++ ++common_compile_params = { ++ "KERNEL_ONLY": "no", ++ "BUILD_MINIMAL": "no", ++ "DEB_COMPRESS": "none", ++ "CLOUD_IMAGE": "yes", ++ "CLEAN_LEVEL": "debs", ++ "SHOW_LOG": "yes", ++ "CONFIG_DEFS_ONLY": "yes", ++ "KERNEL_CONFIGURE": "no", ++ "EXPERT": "yes" ++} ++ ++board_compile_params = { ++ "BOARD": "uefi-x86", ++ "BRANCH": "current", ++ "RELEASE": "impish", ++ "BUILD_DESKTOP": "no" ++} ++ ++ ++def get_info_for_one_board(board_name, common_params): ++ eprint("Getting info for board '{}'".format(board_name)) ++ try: ++ parsed = run_armbian_compile_and_parse(compile_sh_full_path, common_params | {"BOARD": board_name}) ++ # print(json.dumps(parsed, indent=4, sort_keys=True)) ++ return parsed ++ except: ++ eprint("Failed get info for board '{}'".format(board_name)) ++ return None ++ ++ ++if True: ++ all_boards = get_all_boards_list_from_armbian(armbian_src_path) ++ # print(json.dumps(all_boards, indent=4, sort_keys=True)) ++ ++ every_info = [] ++ with concurrent.futures.ProcessPoolExecutor(max_workers=32) as executor: ++ every_future = [] ++ for board in all_boards: ++ all_params = common_compile_params | board_compile_params ++ eprint("Submitting future for board {}".format(board)) ++ future = executor.submit(get_info_for_one_board, board, all_params) ++ every_future.append(future) ++ ++ eprint("Waiting for all futures...") ++ executor.shutdown(wait=True) ++ eprint("Done, all futures awaited") ++ ++ for future in every_future: ++ info = future.result() ++ if info is not None: ++ every_info.append(info) ++ ++# info = get_info_for_one_board(board, all_params) ++print(json.dumps(every_info, indent=4, sort_keys=True)) + +From 328c4f75664d68f01579467631672c5645466cdc Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Sat, 25 Dec 2021 17:12:19 +0100 +Subject: [PATCH] logging: move some interactive parts of config into its own + functions + +- mostly from config-prepare; +- there is still a lot of others in main-config + +Signed-off-by: Ricardo Pardini +--- + lib/functions/configuration/interactive.sh | 178 +++++++++++++++++++++ + lib/functions/configuration/main-config.sh | 2 +- + lib/functions/configuration/menu.sh | 29 ++++ + lib/functions/main/config-prepare.sh | 241 ++++------------------------- + lib/library-functions.sh | 5 + + 5 files changed, 247 insertions(+), 208 deletions(-) + +diff --git a/lib/functions/configuration/interactive.sh b/lib/functions/configuration/interactive.sh +new file mode 100644 +index 000000000..1f6989ae9 +--- /dev/null ++++ b/lib/functions/configuration/interactive.sh +@@ -0,0 +1,178 @@ ++function interactive_config_prepare_terminal() { ++ if [[ $BUILD_ALL != "yes" && -z $ROOT_FS_CREATE_ONLY ]]; then ++ if [[ -t 0 ]]; then # "-t fd return True if file descriptor fd is open and refers to a terminal". 0 = stdin, 1 = stdout, 2 = stderr, 3+ custom ++ # override stty size, if stdin is a terminal. ++ [[ -n $COLUMNS ]] && stty cols $COLUMNS ++ [[ -n $LINES ]] && stty rows $LINES ++ export TTY_X=$(($(stty size | awk '{print $2}') - 6)) # determine terminal width ++ export TTY_Y=$(($(stty size | awk '{print $1}') - 6)) # determine terminal height ++ fi ++ fi ++ ++ # We'll use this title on all menus ++ export backtitle="Armbian building script, https://www.armbian.com | https://docs.armbian.com | (c) 2013-2021 Igor Pecovnik " ++} ++ ++function interactive_config_ask_kernel() { ++ # @TODO: rpardini: should be refactored into 'menu' or something ++ # if KERNEL_ONLY, KERNEL_CONFIGURE, BOARD, BRANCH or RELEASE are not set, display selection menu ++ if [[ -z $KERNEL_ONLY ]]; then ++ options+=("yes" "U-boot and kernel packages") ++ options+=("no" "Full OS image for flashing") ++ KERNEL_ONLY=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ ++ --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ unset options ++ fi ++ ++ if [[ -z $KERNEL_CONFIGURE ]]; then ++ options+=("no" "Do not change the kernel configuration") ++ options+=("yes" "Show a kernel configuration menu before compilation") ++ options+=("prebuilt" "Use precompiled packages from Armbian repository") ++ KERNEL_CONFIGURE=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ ++ --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ unset options ++ fi ++} ++ ++function interactive_config_ask_board_list() { ++ if [[ -z $BOARD ]]; then ++ WIP_STATE=supported ++ WIP_BUTTON='CSC/WIP/EOS/TVB' ++ STATE_DESCRIPTION=' - boards with high level of software maturity' ++ temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow ++ ++ while true; do ++ options=() ++ if [[ $WIP_STATE == supported ]]; then ++ for board in "${SRC}"/config/boards/*.conf; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "$(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ else ++ for board in "${SRC}"/config/boards/*.wip; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(WIP)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ for board in "${SRC}"/config/boards/*.csc; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(CSC)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ for board in "${SRC}"/config/boards/*.eos; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(EOS)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ for board in "${SRC}"/config/boards/*.tvb; do ++ options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(TVB)\Zn $(head -1 "${board}" | cut -d'#' -f2)") ++ done ++ fi ++ ++ if [[ $WIP_STATE != supported ]]; then ++ cat <<- 'EOF' > "${temp_rc}" ++ dialog_color = (RED,WHITE,OFF) ++ screen_color = (WHITE,RED,ON) ++ tag_color = (RED,WHITE,ON) ++ item_selected_color = (WHITE,RED,ON) ++ tag_selected_color = (WHITE,RED,ON) ++ tag_key_selected_color = (WHITE,RED,ON) ++ EOF ++ else ++ echo > "${temp_rc}" ++ fi ++ BOARD=$(DIALOGRC=$temp_rc dialog_if_terminal --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ ++ --colors --extra-label "Show $WIP_BUTTON" --extra-button \ ++ --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ STATUS=$? ++ if [[ $STATUS == 3 ]]; then ++ if [[ $WIP_STATE == supported ]]; then ++ [[ $SHOW_WARNING == yes ]] && show_developer_warning ++ STATE_DESCRIPTION=' - \Z1(CSC)\Zn - Community Supported Configuration\n - \Z1(WIP)\Zn - Work In Progress ++ \n - \Z1(EOS)\Zn - End Of Support\n - \Z1(TVB)\Zn - TV boxes' ++ WIP_STATE=unsupported ++ WIP_BUTTON='matured' ++ EXPERT=yes ++ else ++ STATE_DESCRIPTION=' - boards with high level of software maturity' ++ WIP_STATE=supported ++ WIP_BUTTON='CSC/WIP/EOS' ++ EXPERT=no ++ fi ++ continue ++ elif [[ $STATUS == 0 ]]; then ++ break ++ fi ++ unset options ++ done ++ fi ++} ++ ++function interactive_config_ask_branch() { ++ # @TODO: rpardini, again, refactor into menu/interactive config stuff ++ if [[ -z $BRANCH ]]; then ++ options=() ++ [[ $KERNEL_TARGET == *current* ]] && options+=("current" "Recommended. Come with best support") ++ [[ $KERNEL_TARGET == *legacy* ]] && options+=("legacy" "Old stable / Legacy") ++ [[ $KERNEL_TARGET == *edge* && $EXPERT = yes ]] && options+=("edge" "\Z1Bleeding edge from @kernel.org\Zn") ++ ++ # do not display selection dialog if only one kernel branch is available ++ if [[ "${#options[@]}" == 2 ]]; then ++ BRANCH="${options[0]}" ++ else ++ BRANCH=$(dialog_if_terminal --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ ++ --menu "Select the target kernel branch\nExact kernel versions depend on selected board" \ ++ $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ fi ++ unset options ++ [[ $BRANCH == dev && $SHOW_WARNING == yes ]] && show_developer_warning ++ else ++ [[ $BRANCH == next ]] && KERNEL_TARGET="next" ++ # next = new legacy. Should stay for backward compatibility, but be removed from menu above ++ # or we left definitions in board configs and only remove menu ++ fi ++ return 0 ++} ++ ++function interactive_config_ask_release() { ++ if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then ++ options=() ++ distros_options ++ RELEASE=$(dialog_if_terminal --stdout --title "Choose a release package base" --backtitle "$backtitle" \ ++ --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ echo "options : ${options}" ++ unset options ++ fi ++} ++ ++function interactive_config_ask_desktop_build() { ++ # don't show desktop option if we choose minimal build ++ [[ $BUILD_MINIMAL == yes ]] && BUILD_DESKTOP=no ++ ++ if [[ $KERNEL_ONLY != yes && -z $BUILD_DESKTOP ]]; then ++ # read distribution support status which is written to the armbian-release file ++ set_distribution_status ++ options=() ++ options+=("no" "Image with console interface (server)") ++ options+=("yes" "Image with desktop environment") ++ BUILD_DESKTOP=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ unset options ++ [[ -z $BUILD_DESKTOP ]] && exit_with_error "No option selected" ++ if [[ ${BUILD_DESKTOP} == "yes" ]]; then ++ BUILD_MINIMAL=no ++ SELECTED_CONFIGURATION="desktop" ++ fi ++ fi ++ return 0 ++} ++ ++function interactive_config_ask_standard_or_minimal() { ++ if [[ $KERNEL_ONLY != yes && $BUILD_DESKTOP == no && -z $BUILD_MINIMAL ]]; then ++ options=() ++ options+=("no" "Standard image with console interface") ++ options+=("yes" "Minimal image with console interface") ++ BUILD_MINIMAL=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") ++ unset options ++ [[ -z $BUILD_MINIMAL ]] && exit_with_error "No option selected" ++ if [[ $BUILD_MINIMAL == "yes" ]]; then ++ SELECTED_CONFIGURATION="cli_minimal" ++ else ++ SELECTED_CONFIGURATION="cli_standard" ++ fi ++ fi ++} +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 612003391..4632fd488 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -430,7 +430,7 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + but before assembling any package lists. + USER_CONFIG + +- display_alert "Extension initialization" "extension_prepare_config" "debug" ++ display_alert "Extensions: prepare configuration" "extension_prepare_config" "debug" + call_extension_method "extension_prepare_config" <<- 'EXTENSION_PREPARE_CONFIG' + *allow extensions to prepare their own config, after user config is done* + Implementors should preserve variable values pre-set, but can default values an/or validate them. +diff --git a/lib/functions/configuration/menu.sh b/lib/functions/configuration/menu.sh +index 32939ae36..6d6f0b266 100644 +--- a/lib/functions/configuration/menu.sh ++++ b/lib/functions/configuration/menu.sh +@@ -56,3 +56,32 @@ show_developer_warning() { + [[ $? -ne 0 ]] && exit_with_error "Error switching to the expert mode" + SHOW_WARNING=no + } ++ ++ ++# Stuff that was in config files ++function distro_menu() { ++ # create a select menu for choosing a distribution based EXPERT status ++ ++ local distrib_dir="${1}" ++ ++ if [[ -d "${distrib_dir}" && -f "${distrib_dir}/support" ]]; then ++ local support_level="$(cat "${distrib_dir}/support")" ++ if [[ "${support_level}" != "supported" && $EXPERT != "yes" ]]; then ++ : ++ else ++ local distro_codename="$(basename "${distrib_dir}")" ++ local distro_fullname="$(cat "${distrib_dir}/name")" ++ local expert_infos="" ++ [[ $EXPERT == "yes" ]] && expert_infos="(${support_level})" ++ options+=("${distro_codename}" "${distro_fullname} ${expert_infos}") ++ fi ++ fi ++ ++} ++ ++function distros_options() { ++ for distrib_dir in "config/distributions/"*; do ++ distro_menu "${distrib_dir}" ++ done ++} ++ +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index bdc642ded..196142608 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -11,19 +11,7 @@ function prepare_and_config_main_build_single() { + fi + display_alert "Determined DEST:" "${DEST}" "debug" + +- if [[ $BUILD_ALL != "yes" && -z $ROOT_FS_CREATE_ONLY ]]; then +- if [[ -t 0 ]]; then # "-t fd return True if file descriptor fd is open and refers to a terminal". 0 = stdin, 1 = stdout, 2 = stderr, 3+ custom +- display_alert "stdin is a terminal" "or is it?" "warning" +- # override stty size, if stdin is a terminal. +- [[ -n $COLUMNS ]] && stty cols $COLUMNS +- [[ -n $LINES ]] && stty rows $LINES +- TTY_X=$(($(stty size | awk '{print $2}') - 6)) # determine terminal width +- TTY_Y=$(($(stty size | awk '{print $1}') - 6)) # determine terminal height +- fi +- fi +- +- # We'll use this title on all menus +- backtitle="Armbian building script, https://www.armbian.com | https://docs.armbian.com | (c) 2013-2021 Igor Pecovnik " ++ interactive_config_prepare_terminal + + # Warnings mitigation + [[ -z $LANGUAGE ]] && export LANGUAGE="en_US:en" # set to english if not set +@@ -47,20 +35,14 @@ function prepare_and_config_main_build_single() { + # Mark a timestamp, for next build. + date +"%d_%m_%Y-%H_%M_%S" > "${DEST}"/${LOG_SUBPATH}/timestamp + +- if [[ $PROGRESS_DISPLAY == none ]]; then +- display_alert "Output will be silenced." "PROGRESS_DISPLAY=none" "warning" +- export OUTPUT_VERYSILENT=yes +- elif [[ $PROGRESS_DISPLAY == dialog ]]; then # @TODO: WHO SETS THIS?? this is key to solving the logging cray-cray +- export OUTPUT_DIALOG=yes +- fi +- +- # PROGRESS_LOG_TO_FILE is either yes, or unset. ++ # PROGRESS_LOG_TO_FILE is either yes, or unset. (@TODO: this is still used in buildpkg) + if [[ $PROGRESS_LOG_TO_FILE != yes ]]; then unset PROGRESS_LOG_TO_FILE; fi + + SHOW_WARNING=yes + + display_alert "Starting single build process" "${BOARD}" "info" + ++ # @TODO: rpardini: ccache belongs in compilation, not config. I think. + if [[ $USE_CCACHE != no ]]; then + CCACHE=ccache + export PATH="/usr/lib/ccache:$PATH" +@@ -71,6 +53,7 @@ function prepare_and_config_main_build_single() { + CCACHE="" + fi + ++ # @TODO: rpardini: refactor this into 'repo' stuff. Out of configuration, I think. + if [[ -n $REPOSITORY_UPDATE ]]; then + # select stable/beta configuration + if [[ $BETA == yes ]]; then +@@ -93,91 +76,12 @@ function prepare_and_config_main_build_single() { + exit + fi + +- # if KERNEL_ONLY, KERNEL_CONFIGURE, BOARD, BRANCH or RELEASE are not set, display selection menu +- if [[ -z $KERNEL_ONLY ]]; then +- options+=("yes" "U-boot and kernel packages") +- options+=("no" "Full OS image for flashing") +- KERNEL_ONLY=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ +- --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- [[ -z $KERNEL_ONLY ]] && exit_with_error "No option selected" +- fi +- +- if [[ -z $KERNEL_CONFIGURE ]]; then +- options+=("no" "Do not change the kernel configuration") +- options+=("yes" "Show a kernel configuration menu before compilation") +- options+=("prebuilt" "Use precompiled packages from Armbian repository") +- KERNEL_CONFIGURE=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ +- --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- [[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected" +- fi ++ interactive_config_ask_kernel ++ [[ -z $KERNEL_ONLY ]] && exit_with_error "No option selected: KERNEL_ONLY" ++ [[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected: KERNEL_CONFIGURE" + +- if [[ -z $BOARD ]]; then +- WIP_STATE=supported +- WIP_BUTTON='CSC/WIP/EOS/TVB' +- STATE_DESCRIPTION=' - boards with high level of software maturity' +- temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow +- +- while true; do +- options=() +- if [[ $WIP_STATE == supported ]]; then +- for board in "${SRC}"/config/boards/*.conf; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "$(head -1 "${board}" | cut -d'#' -f2)") +- done +- else +- for board in "${SRC}"/config/boards/*.wip; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(WIP)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.csc; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(CSC)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.eos; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(EOS)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- for board in "${SRC}"/config/boards/*.tvb; do +- options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(TVB)\Zn $(head -1 "${board}" | cut -d'#' -f2)") +- done +- fi +- +- if [[ $WIP_STATE != supported ]]; then +- cat <<- 'EOF' > "${temp_rc}" +- dialog_color = (RED,WHITE,OFF) +- screen_color = (WHITE,RED,ON) +- tag_color = (RED,WHITE,ON) +- item_selected_color = (WHITE,RED,ON) +- tag_selected_color = (WHITE,RED,ON) +- tag_key_selected_color = (WHITE,RED,ON) +- EOF +- else +- echo > "${temp_rc}" +- fi +- BOARD=$(DIALOGRC=$temp_rc dialog_if_terminal --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ +- --colors --extra-label "Show $WIP_BUTTON" --extra-button \ +- --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- STATUS=$? +- if [[ $STATUS == 3 ]]; then +- if [[ $WIP_STATE == supported ]]; then +- [[ $SHOW_WARNING == yes ]] && show_developer_warning +- STATE_DESCRIPTION=' - \Z1(CSC)\Zn - Community Supported Configuration\n - \Z1(WIP)\Zn - Work In Progress +- \n - \Z1(EOS)\Zn - End Of Support\n - \Z1(TVB)\Zn - TV boxes' +- WIP_STATE=unsupported +- WIP_BUTTON='matured' +- EXPERT=yes +- else +- STATE_DESCRIPTION=' - boards with high level of software maturity' +- WIP_STATE=supported +- WIP_BUTTON='CSC/WIP/EOS' +- EXPERT=no +- fi +- continue +- elif [[ $STATUS == 0 ]]; then +- break +- fi +- unset options +- [[ -z $BOARD ]] && exit_with_error "No board selected" +- done +- fi ++ interactive_config_ask_board_list ++ [[ -z $BOARD ]] && exit_with_error "No board selected: BOARD" + + if [[ -f $SRC/config/boards/${BOARD}.conf ]]; then + BOARD_TYPE='conf' +@@ -191,80 +95,28 @@ function prepare_and_config_main_build_single() { + BOARD_TYPE='tvb' + fi + ++ # @TODO: rpardini: this is when Alice enters the hole. Sourcing stuff, extensions getting activated, etc. ++ + display_alert "Sourcing board configuration" "${BOARD}.${BOARD_TYPE}" "info" + # shellcheck source=/dev/null + source "${SRC}/config/boards/${BOARD}.${BOARD_TYPE}" + LINUXFAMILY="${BOARDFAMILY}" + +- [[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config" ++ # @TODO: interesting. this sourced the board config. What sources the family? + +- if [[ -z $BRANCH ]]; then +- options=() +- [[ $KERNEL_TARGET == *current* ]] && options+=("current" "Recommended. Come with best support") +- [[ $KERNEL_TARGET == *legacy* ]] && options+=("legacy" "Old stable / Legacy") +- [[ $KERNEL_TARGET == *edge* && $EXPERT = yes ]] && options+=("edge" "\Z1Bleeding edge from @kernel.org\Zn") + +- # do not display selection dialog if only one kernel branch is available +- if [[ "${#options[@]}" == 2 ]]; then +- BRANCH="${options[0]}" +- else +- BRANCH=$(dialog_if_terminal --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ +- --menu "Select the target kernel branch\nExact kernel versions depend on selected board" \ +- $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- fi +- unset options +- [[ -z $BRANCH ]] && exit_with_error "No kernel branch selected" +- [[ $BRANCH == dev && $SHOW_WARNING == yes ]] && show_developer_warning +- else +- [[ $BRANCH == next ]] && KERNEL_TARGET="next" +- # next = new legacy. Should stay for backward compatibility, but be removed from menu above +- # or we left definitions in board configs and only remove menu +- [[ $KERNEL_TARGET != *$BRANCH* ]] && exit_with_error "Kernel branch not defined for this board" "$BRANCH" +- fi ++ [[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config" + +- if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then +- options=() +- distros_options +- RELEASE=$(dialog_if_terminal --stdout --title "Choose a release package base" --backtitle "$backtitle" \ +- --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- echo "options : ${options}" +- [[ -z $RELEASE ]] && exit_with_error "No release selected" +- unset options +- fi ++ interactive_config_ask_branch ++ [[ -z $BRANCH ]] && exit_with_error "No kernel branch selected: BRANCH" ++ [[ $KERNEL_TARGET != *$BRANCH* ]] && exit_with_error "Kernel branch not defined for this board" "$BRANCH" + +- # don't show desktop option if we choose minimal build +- [[ $BUILD_MINIMAL == yes ]] && BUILD_DESKTOP=no +- +- if [[ $KERNEL_ONLY != yes && -z $BUILD_DESKTOP ]]; then +- # read distribution support status which is written to the armbian-release file +- set_distribution_status +- options=() +- options+=("no" "Image with console interface (server)") +- options+=("yes" "Image with desktop environment") +- BUILD_DESKTOP=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ +- --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- [[ -z $BUILD_DESKTOP ]] && exit_with_error "No option selected" +- if [[ ${BUILD_DESKTOP} == "yes" ]]; then +- BUILD_MINIMAL=no +- SELECTED_CONFIGURATION="desktop" +- fi +- fi ++ interactive_config_ask_release ++ [[ -z $RELEASE ]] && exit_with_error "No release selected: RELEASE" + +- if [[ $KERNEL_ONLY != yes && $BUILD_DESKTOP == no && -z $BUILD_MINIMAL ]]; then +- options=() +- options+=("no" "Standard image with console interface") +- options+=("yes" "Minimal image with console interface") +- BUILD_MINIMAL=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ +- --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") +- unset options +- [[ -z $BUILD_MINIMAL ]] && exit_with_error "No option selected" +- if [[ $BUILD_MINIMAL == "yes" ]]; then +- SELECTED_CONFIGURATION="cli_minimal" +- else +- SELECTED_CONFIGURATION="cli_standard" +- fi +- fi ++ interactive_config_ask_desktop_build ++ ++ interactive_config_ask_standard_or_minimal + + #prevent conflicting setup + if [[ $BUILD_DESKTOP == "yes" ]]; then +@@ -284,6 +136,7 @@ function prepare_and_config_main_build_single() { + + do_main_configuration + ++ # @TODO: this does not belong in configuration. it's a compilation thing. move there + # optimize build time with 100% CPU usage + CPUS=$(grep -c 'processor' /proc/cpuinfo) + if [[ $USEALLCORES != no ]]; then +@@ -305,20 +158,20 @@ function prepare_and_config_main_build_single() { + IMAGE_TYPE=user-built + fi + +- BOOTSOURCEDIR="${BOOTDIR}/$(branch2dir "${BOOTBRANCH}")" +- LINUXSOURCEDIR="${KERNELDIR}/$(branch2dir "${KERNELBRANCH}")" +- [[ -n $ATFSOURCE ]] && ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")" ++ export BOOTSOURCEDIR="${BOOTDIR}/$(branch2dir "${BOOTBRANCH}")" ++ export LINUXSOURCEDIR="${KERNELDIR}/$(branch2dir "${KERNELBRANCH}")" ++ [[ -n $ATFSOURCE ]] && export ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")" + +- BSP_CLI_PACKAGE_NAME="armbian-bsp-cli-${BOARD}${EXTRA_BSP_NAME}" +- BSP_CLI_PACKAGE_FULLNAME="${BSP_CLI_PACKAGE_NAME}_${REVISION}_${ARCH}" +- BSP_DESKTOP_PACKAGE_NAME="armbian-bsp-desktop-${BOARD}${EXTRA_BSP_NAME}" +- BSP_DESKTOP_PACKAGE_FULLNAME="${BSP_DESKTOP_PACKAGE_NAME}_${REVISION}_${ARCH}" ++ export BSP_CLI_PACKAGE_NAME="armbian-bsp-cli-${BOARD}${EXTRA_BSP_NAME}" ++ export BSP_CLI_PACKAGE_FULLNAME="${BSP_CLI_PACKAGE_NAME}_${REVISION}_${ARCH}" ++ export BSP_DESKTOP_PACKAGE_NAME="armbian-bsp-desktop-${BOARD}${EXTRA_BSP_NAME}" ++ export BSP_DESKTOP_PACKAGE_FULLNAME="${BSP_DESKTOP_PACKAGE_NAME}_${REVISION}_${ARCH}" + +- CHOSEN_UBOOT=linux-u-boot-${BRANCH}-${BOARD} +- CHOSEN_KERNEL=linux-image-${BRANCH}-${LINUXFAMILY} +- CHOSEN_ROOTFS=${BSP_CLI_PACKAGE_NAME} +- CHOSEN_DESKTOP=armbian-${RELEASE}-desktop-${DESKTOP_ENVIRONMENT} +- CHOSEN_KSRC=linux-source-${BRANCH}-${LINUXFAMILY} ++ export CHOSEN_UBOOT=linux-u-boot-${BRANCH}-${BOARD} ++ export CHOSEN_KERNEL=linux-image-${BRANCH}-${LINUXFAMILY} ++ export CHOSEN_ROOTFS=${BSP_CLI_PACKAGE_NAME} ++ export CHOSEN_DESKTOP=armbian-${RELEASE}-desktop-${DESKTOP_ENVIRONMENT} ++ export CHOSEN_KSRC=linux-source-${BRANCH}-${LINUXFAMILY} + + display_alert "Done with prepare_and_config_main_build_single" "${BOARD}.${BOARD_TYPE}" "info" + +@@ -338,32 +191,6 @@ function set_distribution_status() { + return 0 # due to last stmt above being a shortcut conditional + } + +-function distro_menu() { +- # create a select menu for choosing a distribution based EXPERT status +- +- local distrib_dir="${1}" +- +- if [[ -d "${distrib_dir}" && -f "${distrib_dir}/support" ]]; then +- local support_level="$(cat "${distrib_dir}/support")" +- if [[ "${support_level}" != "supported" && $EXPERT != "yes" ]]; then +- : +- else +- local distro_codename="$(basename "${distrib_dir}")" +- local distro_fullname="$(cat "${distrib_dir}/name")" +- local expert_infos="" +- [[ $EXPERT == "yes" ]] && expert_infos="(${support_level})" +- options+=("${distro_codename}" "${distro_fullname} ${expert_infos}") +- fi +- fi +- +-} +- +-function distros_options() { +- for distrib_dir in "config/distributions/"*; do +- distro_menu "${distrib_dir}" +- done +-} +- + # Some utility functions + branch2dir() { + [[ "${1}" == "head" ]] && echo "HEAD" || echo "${1##*:}" +diff --git a/lib/library-functions.sh b/lib/library-functions.sh +index b41fa1a8f..f9bb093a4 100644 +--- a/lib/library-functions.sh ++++ b/lib/library-functions.sh +@@ -7,6 +7,10 @@ set -e # no errors tolerated + # shellcheck source=functions/configuration/menu.sh + source "${SRC}"/lib/functions/configuration/menu.sh + ++### lib/functions/configuration/interactive.sh ++# shellcheck source=functions/configuration/interactive.sh ++source "${SRC}"/lib/functions/configuration/interactive.sh ++ + ### lib/functions/configuration/config-desktop.sh + # shellcheck source=functions/configuration/config-desktop.sh + source "${SRC}"/lib/functions/configuration/config-desktop.sh +@@ -187,4 +191,5 @@ source "${SRC}"/lib/functions/extras/fel.sh + # shellcheck source=functions/extras/buildpkg.sh + source "${SRC}"/lib/functions/extras/buildpkg.sh + ++ + # This file is/was autogenerated by lib/tools/gen-library.sh; don't modify manually - thanks + +From 078ad44f58e718d842b6a14d3f441560ac685022 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 24 Dec 2021 08:43:34 +0100 +Subject: [PATCH] logging: use chroot_custom for grub and flash-kernel + extension logging + +Signed-off-by: Ricardo Pardini +--- + extensions/flash-kernel.sh | 20 +++++++++----------- + extensions/grub.sh | 4 ++-- + 2 files changed, 11 insertions(+), 13 deletions(-) + +diff --git a/extensions/flash-kernel.sh b/extensions/flash-kernel.sh +index 2941d3a57..0390a3b37 100644 +--- a/extensions/flash-kernel.sh ++++ b/extensions/flash-kernel.sh +@@ -16,7 +16,6 @@ function extension_prepare_config__prepare_flash_kernel() { + export CLOUD_INIT_CONFIG_LOCATION="/boot/firmware" # use /boot/firmware for cloud-init as well + export VER="${FK__PUBLISHED_KERNEL_VERSION}" # For the VERSION + export EXTRA_BSP_NAME="${EXTRA_BSP_NAME}-fk${FK__PUBLISHED_KERNEL_VERSION}" # Unique bsp name. +- echo "-- starting" > "${DEST}"/"${LOG_SUBPATH}"/flash-kernel.log # Zero out the log for this extension. + } + + function post_install_kernel_debs__install_kernel_and_flash_packages() { +@@ -24,7 +23,7 @@ function post_install_kernel_debs__install_kernel_and_flash_packages() { + + if [[ "${FK__EXTRA_PACKAGES}" != "" ]]; then + display_alert "Installing flash-kernel extra packages" "${FK__EXTRA_PACKAGES}" +- chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get ${APT_EXTRA_DIST_PARAMS} -yqq --no-install-recommends install ${FK__EXTRA_PACKAGES}" || { ++ chroot_sdcard_apt_get_install "${FK__EXTRA_PACKAGES}" || { + display_alert "Failed to install flash-kernel's extra packages." "${EXTENSION}" "err" + exit 28 + } +@@ -32,7 +31,7 @@ function post_install_kernel_debs__install_kernel_and_flash_packages() { + + if [[ "${FK__KERNEL_PACKAGES}" != "" ]]; then + display_alert "Installing flash-kernel kernel packages" "${FK__KERNEL_PACKAGES}" +- chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get ${APT_EXTRA_DIST_PARAMS} -yqq --no-install-recommends install ${FK__KERNEL_PACKAGES}" || { ++ chroot_sdcard_apt_get_install "${FK__KERNEL_PACKAGES}" || { + display_alert "Failed to install flash-kernel's kernel packages." "${EXTENSION}" "err" + exit 28 + } +@@ -44,7 +43,7 @@ function post_install_kernel_debs__install_kernel_and_flash_packages() { + umount "${SDCARD}"/sys + mkdir -p "${SDCARD}"/sys/firmware/efi + +- chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get ${APT_EXTRA_DIST_PARAMS} -yqq --no-install-recommends install ${FK__TOOL_PACKAGE}" || { ++ chroot_sdcard_apt_get_install "${FK__TOOL_PACKAGE}" || { + display_alert "Failed to install flash-kernel package." "${EXTENSION}" "err" + exit 28 + } +@@ -74,9 +73,8 @@ function pre_update_initramfs__setup_flash_kernel() { + # hack, umount the chroot's /sys, otherwise flash-kernel tries to EFI flash due to the build host (!) being EFI + umount "$chroot_target/sys" + +- echo "-- flash-kernel disabling hooks" +- chroot "$chroot_target" /bin/bash -c "chmod -v -x /etc/kernel/postinst.d/initramfs-tools" 2>&1 +- chroot "$chroot_target" /bin/bash -c "chmod -v -x /etc/initramfs/post-update.d/flash-kernel" 2>&1 ++ chroot_custom "$chroot_target" chmod -v -x "/etc/kernel/postinst.d/initramfs-tools" ++ chroot_custom "$chroot_target" chmod -v -x "/etc/initramfs/post-update.d/flash-kernel" + + export FIRMWARE_DIR="${MOUNT}"/boot/firmware + call_extension_method "pre_initramfs_flash_kernel" <<- 'PRE_INITRAMFS_FLASH_KERNEL' +@@ -86,7 +84,7 @@ function pre_update_initramfs__setup_flash_kernel() { + + local update_initramfs_cmd="update-initramfs -c -k all" + display_alert "Updating flash-kernel initramfs..." "$update_initramfs_cmd" "" +- chroot "$chroot_target" /bin/bash -c "$update_initramfs_cmd" 2>&1 || { ++ chroot_custom "$chroot_target" "$update_initramfs_cmd" || { + display_alert "Failed to run '$update_initramfs_cmd'" "Check logs" "err" + exit 29 + } +@@ -99,14 +97,14 @@ function pre_update_initramfs__setup_flash_kernel() { + + local flash_kernel_cmd="flash-kernel --machine '${FK__MACHINE_MODEL}'" + display_alert "flash-kernel" "${FK__MACHINE_MODEL}" "info" +- chroot "$chroot_target" /bin/bash -c "${flash_kernel_cmd}" 2>&1 || { ++ chroot_custom "$chroot_target" "${flash_kernel_cmd}" || { + display_alert "Failed to run '${flash_kernel_cmd}'" "Check logs" "err" + exit 29 + } + + display_alert "Re-enabling" "initramfs-tools/flash-kernel hook for kernel" +- chroot "$chroot_target" /bin/bash -c "chmod -v +x /etc/kernel/postinst.d/initramfs-tools" 2>&1 +- chroot "$chroot_target" /bin/bash -c "chmod -v +x /etc/initramfs/post-update.d/flash-kernel" 2>&1 ++ chroot_custom "$chroot_target" chmod -v +x "/etc/kernel/postinst.d/initramfs-tools" ++ chroot_custom "$chroot_target" chmod -v +x "/etc/initramfs/post-update.d/flash-kernel" + + umount_chroot "$chroot_target/" + rm "$chroot_target"/usr/bin/"$QEMU_BINARY" +diff --git a/extensions/grub.sh b/extensions/grub.sh +index a0355f5bb..3f0478454 100644 +--- a/extensions/grub.sh ++++ b/extensions/grub.sh +@@ -96,14 +96,14 @@ pre_umount_final_image__install_grub() { + + if [[ "${UEFI_GRUB_TARGET_BIOS}" != "" ]]; then + display_alert "Installing GRUB BIOS..." "${UEFI_GRUB_TARGET_BIOS} device ${LOOP}" "" +- chroot "$chroot_target" /bin/bash -c "grub-install --target=${UEFI_GRUB_TARGET_BIOS} ${LOOP}" 2>&1 || { ++ chroot_custom "$chroot_target" grub-install --target=${UEFI_GRUB_TARGET_BIOS} "${LOOP}" || { + exit_with_error "${install_grub_cmdline} failed!" + } + fi + + local install_grub_cmdline="update-initramfs -c -k all && update-grub && grub-install --target=${UEFI_GRUB_TARGET} --no-nvram --removable" # nvram is global to the host, even across chroot. take care. + display_alert "Installing GRUB EFI..." "${UEFI_GRUB_TARGET}" "" +- chroot "$chroot_target" /bin/bash -c "$install_grub_cmdline" 2>&1 || { ++ chroot_custom "$chroot_target" "$install_grub_cmdline" || { + exit_with_error "${install_grub_cmdline} failed!" + } + + +From e4cc689b82986aa917ccf71cefcae121261559bd Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Fri, 24 Dec 2021 01:43:23 +0100 +Subject: [PATCH] logging: use line buffering, fix runner output color for GHA + +Signed-off-by: Ricardo Pardini +--- + lib/functions/logging/logging.sh | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 765dda74f..b075a76ab 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -25,7 +25,7 @@ function logging_error_show_log() { + local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" + display_alert " 👇👇👇 Showing logfile below 👇👇👇" "${logfile_to_show}" "err" + # shellcheck disable=SC2002 # my cat is great. thank you, shellcheck. +- cat "${logfile_to_show}" | grep -v -e "^$" | sed -e "${prefix_sed_cmd}" 1>&2 # write it TO stderr!! ++ cat "${logfile_to_show}" | grep -v -e "^$" | sed -e "${prefix_sed_cmd}" 1>&2 # write it to stderr!! + display_alert " 👆👆👆 Showing logfile above 👆👆👆" "${logfile_to_show}" "err" + display_alert "🦞 Error Msg" "$message" "err" + display_alert "🐞 Error stacktrace" "$stacktrace" "err" +@@ -55,16 +55,21 @@ function do_with_logging() { + # this is mostly handled by redirecting stderr to stdout: 2>&1 + + local exit_code=176 # fail by default... +- local prefix_sed_contents +- prefix_sed_contents="$(logging_echo_prefix_for_pv "tool") $(echo -n -e "${gray_color}")" +- local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" + if [[ "${SHOW_LOG}" == "yes" ]]; then ++ local prefix_sed_contents ++ local tool_color="${gray_color}" # default to gray... (should be ok on terminals) ++ if [[ "${CI}" == "true" ]]; then # ... but that is too dark for Github Actions ++ tool_color="${normal_color}" ++ fi ++ prefix_sed_contents="$(logging_echo_prefix_for_pv "tool") $(echo -n -e "${tool_color}")" ++ local prefix_sed_cmd="s/^/${prefix_sed_contents}/;" ++ + # This is sick. Create a 3rd file descriptor sending it to sed. https://unix.stackexchange.com/questions/174849/redirecting-stdout-to-terminal-and-file-without-using-a-pipe + # Also terrible: don't hold a reference to cwd by changing to SRC always + exec 3> >( + cd "${SRC}" || exit 2 + #grep --line-buffered -v "^$" | \ +- sed -e "${prefix_sed_cmd}" ++ sed -u -e "${prefix_sed_cmd}" + ) + "$@" >&3 + exit_code=$? # hopefully this is the pipe + +From b1cfead3ac2957d5e19a3f10010a814ef0e70297 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 22 Dec 2021 01:19:47 +0100 +Subject: [PATCH] logging: wrap dpkg-deb; set TMPDIR (not in chroot); refactor + kernel make + +- And a huge amount of @TODO's added +- Add "debug" and "deprecation" `display_alert()` levels +- insist that `install_common` is now `install_distribution_agnostic` +- unrelated: realtek 8822CS is EXTRAWIFI=yes only now, sorry. +- many debug statements for desktop + +Signed-off-by: Ricardo Pardini +--- + config/sources/amd64.conf | 2 +- + lib/functions/bsp/bsp-cli.sh | 2 +- + lib/functions/bsp/bsp-desktop.sh | 4 +- + lib/functions/compilation/compilation-utils.sh | 2 +- + lib/functions/compilation/debs.sh | 9 +-- + lib/functions/compilation/extra-drivers.sh | 4 +- + lib/functions/compilation/kernel.sh | 86 ++++++++++++++++---------- + lib/functions/compilation/uboot.sh | 2 +- + lib/functions/configuration/main-config.sh | 20 ++++-- + lib/functions/general/host.sh | 11 +++- + lib/functions/image/loop.sh | 2 +- + lib/functions/logging/logging.sh | 5 ++ + lib/functions/logging/runners.sh | 19 ++++-- + lib/functions/main/config-prepare.sh | 3 +- + lib/functions/main/rootfs-image.sh | 2 +- + lib/functions/rootfs/apt.sh | 13 ++-- + lib/functions/rootfs/distro_agnostic.sh | 2 +- + 17 files changed, 122 insertions(+), 66 deletions(-) + +diff --git a/config/sources/amd64.conf b/config/sources/amd64.conf +index b7a20d2c3..510d1b6b6 100644 +--- a/config/sources/amd64.conf ++++ b/config/sources/amd64.conf +@@ -4,7 +4,7 @@ export QEMU_BINARY="qemu-x86_64-static" # Hopefully you have this installed. + export KERNEL_COMPILER=' ' # hack: use single space for host gcc. won't work on arm64 hosts + export KERNEL_USE_GCC=' ' # more hacks. + export KERNEL_IMAGE_TYPE="bzImage" # Ubuntu Standard +-export KERNEL_EXTRA_TARGETS="modules" # default is "modules dtb" but x86_64 has no DTB ++export KERNEL_EXTRA_TARGETS=" " # default is "dtbs" but x86_64 has no DTB. use a space for no target + #export INITRD_ARCH=amd64 # Used by u-boot for mkimage in initramfs. No u-boot for x86 yet. + + export UBOOT_USE_GCC="none" # required by configuration.sh +diff --git a/lib/functions/bsp/bsp-cli.sh b/lib/functions/bsp/bsp-cli.sh +index b65f0b89e..67baede0d 100644 +--- a/lib/functions/bsp/bsp-cli.sh ++++ b/lib/functions/bsp/bsp-cli.sh +@@ -300,7 +300,7 @@ POST_FAMILY_TWEAKS_BSP + find "${destination}" ! -type l -print0 2> /dev/null | xargs -0r chmod 'go=rX,u+rw,a-s' + + # create board DEB file +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "${destination}" "${destination}.deb" 2>&1 ++ fakeroot_dpkg_deb_build "${destination}" "${destination}.deb" + mkdir -p "${DEB_STORAGE}/${RELEASE}/" + rsync --remove-source-files -rq "${destination}.deb" "${DEB_STORAGE}/${RELEASE}/" 2>&1 + +diff --git a/lib/functions/bsp/bsp-desktop.sh b/lib/functions/bsp/bsp-desktop.sh +index 8de8b9927..baa585d7f 100644 +--- a/lib/functions/bsp/bsp-desktop.sh ++++ b/lib/functions/bsp/bsp-desktop.sh +@@ -84,7 +84,7 @@ create_desktop_package() { + mkdir -p "${DEB_STORAGE}/${RELEASE}" + cd "${destination}" + cd .. +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "${destination}" "${DEB_STORAGE}/${RELEASE}/${CHOSEN_DESKTOP}_${REVISION}_all.deb" > /dev/null ++ fakeroot_dpkg_deb_build "${destination}" "${DEB_STORAGE}/${RELEASE}/${CHOSEN_DESKTOP}_${REVISION}_all.deb" + + # cleanup + rm -rf "${tmp_dir}" +@@ -146,7 +146,7 @@ create_bsp_desktop_package() { + mkdir -p "${DEB_STORAGE}/${RELEASE}" + cd "${destination}" + cd .. +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "${destination}" "${DEB_STORAGE}/${RELEASE}/${package_name}.deb" > /dev/null ++ fakeroot_dpkg_deb_build "${destination}" "${DEB_STORAGE}/${RELEASE}/${package_name}.deb" + + # cleanup + rm -rf "${tmp_dir}" +diff --git a/lib/functions/compilation/compilation-utils.sh b/lib/functions/compilation/compilation-utils.sh +index 13f7138d3..e9ff44a09 100644 +--- a/lib/functions/compilation/compilation-utils.sh ++++ b/lib/functions/compilation/compilation-utils.sh +@@ -92,7 +92,7 @@ overlayfs_wrapper() { + local description="$3" + mkdir -p /tmp/overlay_components/ /tmp/armbian_build/ + local tempdir workdir mergeddir +- tempdir=$(mktemp -d --tmpdir="/tmp/overlay_components/") ++ tempdir=$(mktemp -d --tmpdir="/tmp/overlay_components/") # @TODO: WORKDIR? otherwise uses host's root disk, which might be small + workdir=$(mktemp -d --tmpdir="/tmp/overlay_components/") + mergeddir=$(mktemp -d --suffix="_$description" --tmpdir="/tmp/armbian_build/") + mount -t overlay overlay -o lowerdir="$srcdir",upperdir="$tempdir",workdir="$workdir" "$mergeddir" +diff --git a/lib/functions/compilation/debs.sh b/lib/functions/compilation/debs.sh +index 793bf9eeb..d696b9d86 100644 +--- a/lib/functions/compilation/debs.sh ++++ b/lib/functions/compilation/debs.sh +@@ -12,6 +12,7 @@ compile_firmware() { + mkdir -p "${firmwaretempdir}/${plugin_dir}/lib/firmware" + + fetch_from_repo "https://github.com/armbian/firmware" "armbian-firmware-git" "branch:master" ++ + if [[ -n $FULL ]]; then + fetch_from_repo "$MAINLINE_FIRMWARE_SOURCE" "linux-firmware-git" "branch:master" + # cp : create hardlinks +@@ -42,11 +43,11 @@ compile_firmware() { + # pack + mv "armbian-firmware${FULL}" "armbian-firmware${FULL}_${REVISION}_all" + display_alert "Building firmware package" "armbian-firmware${FULL}_${REVISION}_all" "info" +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "armbian-firmware${FULL}_${REVISION}_all" 2>&1 ++ fakeroot_dpkg_deb_build "armbian-firmware${FULL}_${REVISION}_all" + mv "armbian-firmware${FULL}_${REVISION}_all" "armbian-firmware${FULL}" + rsync -rq "armbian-firmware${FULL}_${REVISION}_all.deb" "${DEB_STORAGE}/" + +- # remove temp directory ++ # remove temp directory - @TODO: maybe not, just leave thrash behind. + rm -rf "${firmwaretempdir}" + } + +@@ -121,7 +122,7 @@ compile_armbian-zsh() { + + chmod 755 "${tmp_dir}/${armbian_zsh_dir}"/DEBIAN/postinst + +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "${tmp_dir}/${armbian_zsh_dir}" 2>&1 ++ fakeroot_dpkg_deb_build "${tmp_dir}/${armbian_zsh_dir}" + rsync --remove-source-files -rq "${tmp_dir}/${armbian_zsh_dir}.deb" "${DEB_STORAGE}/" + rm -rf "${tmp_dir}" + +@@ -176,7 +177,7 @@ compile_armbian-config() { + ln -sf /usr/sbin/armbian-config "${tmp_dir}/${armbian_config_dir}"/usr/bin/armbian-config + ln -sf /usr/sbin/softy "${tmp_dir}/${armbian_config_dir}"/usr/bin/softy + +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "${tmp_dir}/${armbian_config_dir}" > /dev/null ++ fakeroot_dpkg_deb_build "${tmp_dir}/${armbian_config_dir}" + rsync --remove-source-files -rq "${tmp_dir}/${armbian_config_dir}.deb" "${DEB_STORAGE}/" + rm -rf "${tmp_dir}" + } +diff --git a/lib/functions/compilation/extra-drivers.sh b/lib/functions/compilation/extra-drivers.sh +index 39d092bbc..69e287d81 100644 +--- a/lib/functions/compilation/extra-drivers.sh ++++ b/lib/functions/compilation/extra-drivers.sh +@@ -545,14 +545,12 @@ prepare_extra_kernel_drivers() { + fi + + # Bluetooth support for Realtek 8822CS (hci_ver 0x8) chipsets +- # For sunxi, these two patches are applied in a series. +- if linux-version compare "${version}" ge 5.11 && [[ "$LINUXFAMILY" != sunxi* ]] ; then + ++ if linux-version compare "${version}" ge 5.11 && [ "$EXTRAWIFI" == yes ]; then + display_alert "Adding" "Bluetooth support for Realtek 8822CS (hci_ver 0x8) chipsets" "info" + + process_patch_file "${SRC}/patch/misc/bluetooth-rtl8822cs-hci_ver-0x8.patch" "applying" + process_patch_file "${SRC}/patch/misc/Bluetooth-hci_h5-Add-power-reset-via-gpio-in-h5_btrt.patch" "applying" +- + fi + + # Wireless drivers for Realtek 8723DS chipsets +diff --git a/lib/functions/compilation/kernel.sh b/lib/functions/compilation/kernel.sh +index df9c85ee2..291cf7285 100644 +--- a/lib/functions/compilation/kernel.sh ++++ b/lib/functions/compilation/kernel.sh +@@ -1,3 +1,39 @@ ++function run_kernel_make() { ++ declare -a common_make_params_quoted common_make_envs full_command ++ ++ common_make_envs=( ++ "CCACHE_BASEDIR=\"$(pwd)\"" # Base directory for ccache, for cache reuse ++ "PATH=\"${toolchain}:${PATH}\"" # Insert the toolchain first into the PATH. ++ ) ++ ++ common_make_params_quoted=( ++ "$CTHREADS" # Parallel compile, "-j X" for X cpus ++ "LOCALVERSION=-${LINUXFAMILY}" # Kernel param ++ "KDEB_PKGVERSION=${REVISION}" # deb package version ++ "KDEB_COMPRESS=${DEB_COMPRESS}" # dpkg compression for deb ++ "BRANCH=${BRANCH}" # @TODO: rpardini: Wonder what BRANCH is used for during packaging? ++ "ARCH=${ARCHITECTURE}" # Why? ++ "KBUILD_DEBARCH=${ARCH}" # Where used? ++ "DEBFULLNAME=${MAINTAINER}" # For changelog generation ++ "DEBEMAIL=${MAINTAINERMAIL}" # idem ++ "CROSS_COMPILE=${CCACHE} ${KERNEL_COMPILER}" # Prefix for tool invocations. ++ ) ++ ++ # last statement, so it passes the result to calling function. ++ full_command=("${KERNEL_MAKE_RUNNER:-run_host_command_logged}" "${common_make_envs[@]}" make "$@" "${common_make_params_quoted[@]@Q}") ++ display_alert "Kernel make" "${full_command[*]}" "debug" ++ # echo "${full_command[@]}" >&2 # last-resort bash-quoting debugging ++ "${full_command[@]}" # and exit with it's code, since it's the last statement ++} ++ ++function run_kernel_make_dialog() { ++ KERNEL_MAKE_RUNNER="run_host_command_dialog" run_kernel_make "$@" ++} ++ ++function run_kernel_make_long_running() { ++ KERNEL_MAKE_RUNNER="run_host_command_logged_long_running" run_kernel_make "$@" ++} ++ + compile_kernel() { + if [[ $CLEAN_LEVEL == *make* ]]; then + display_alert "Cleaning" "$LINUXSOURCEDIR" "info" +@@ -18,14 +54,16 @@ compile_kernel() { + rm -f localversion + + # read kernel version +- local version hash ++ local version hash pre_patch_version + version=$(grab_version "$kerneldir") ++ pre_patch_version="${version}" ++ display_alert "Pre-patch kernel version" "${pre_patch_version}" "debug" + + # read kernel git hash + hash=$(improved_git --git-dir="$kerneldir"/.git rev-parse HEAD) + + # Apply a series of patches if a series file exists +- if test -f "${SRC}"/patch/kernel/${KERNELPATCHDIR}/series.conf; then ++ if test -f "${SRC}"/patch/kernel/"${KERNELPATCHDIR}"/series.conf; then + display_alert "series.conf file visible. Apply" + series_conf="${SRC}"/patch/kernel/${KERNELPATCHDIR}/series.conf + +@@ -33,7 +71,7 @@ compile_kernel() { + apply_patch_series "${kerneldir}" "$series_conf" + fi + +- # build 3rd party drivers ++ # build 3rd party drivers; # @TODO: does it build? or only patch? + prepare_extra_kernel_drivers + + advanced_patch "kernel" "$KERNELPATCHDIR" "$BOARD" "" "$BRANCH" "$LINUXFAMILY-$BRANCH" +@@ -61,7 +99,8 @@ compile_kernel() { + exit_with_error "Architecture [$ARCH] is not supported" + fi + +- display_alert "Compiler version" "${KERNEL_COMPILER}gcc $(eval env PATH="${toolchain}:${PATH}" "${KERNEL_COMPILER}gcc" -dumpversion)" "info" ++ kernel_compiler_version="$(eval env PATH="${toolchain}:${PATH}" "${KERNEL_COMPILER}gcc" -dumpversion)" ++ display_alert "Compiler version" "${KERNEL_COMPILER}gcc ${kernel_compiler_version}" "info" + + # copy kernel config + local COPY_CONFIG_BACK_TO="" +@@ -93,28 +132,26 @@ compile_kernel() { + fi + + # hack for deb builder. To pack what's missing in headers pack. +- cp "${SRC}"/patch/misc/headers-debian-byteshift.patch /tmp ++ cp "${SRC}"/patch/misc/headers-debian-byteshift.patch /tmp # @TODO: ok, but why /tmp? It's leaking there. + + display_alert "Kernel configuration" "${LINUXCONFIG}" "info" + + if [[ $KERNEL_CONFIGURE != yes ]]; then + if [[ $BRANCH == default ]]; then +- run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${PATH}" \ +- make "ARCH=$ARCHITECTURE" "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" silentoldconfig ++ run_kernel_make silentoldconfig # This will exit with generic error if it fails. + else + # TODO: check if required +- run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${PATH}" \ +- make "ARCH=$ARCHITECTURE" "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" olddefconfig || { ++ run_kernel_make olddefconfig || { + exit_with_error "Error kernel olddefconfig" + } + fi + else +- run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${PATH}" \ +- make "$CTHREADS" "ARCH=$ARCHITECTURE" "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" oldconfig ++ display_alert "Starting kernel oldconfig+menuconfig" "${LINUXCONFIG}" "debug" ++ ++ run_kernel_make oldconfig + + # No logging for this. this is UI piece +- CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${PATH}" \ +- make "$CTHREADS" "ARCH=$ARCHITECTURE" "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" "${KERNEL_MENUCONFIG:-menuconfig}" || { ++ run_kernel_make_dialog "${KERNEL_MENUCONFIG:-menuconfig}" || { + exit_with_error "Error kernel menuconfig failed" + } + +@@ -127,8 +164,7 @@ compile_kernel() { + + # export defconfig too if requested + if [[ $KERNEL_EXPORT_DEFCONFIG == yes ]]; then +- run_host_command_logged CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${PATH}" \ +- make "ARCH=$ARCHITECTURE" "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" savedefconfig ++ run_kernel_make savedefconfig + + [[ -f defconfig ]] && cp defconfig "${DEST}/config/${LINUXCONFIG}.defconfig" + fi +@@ -142,11 +178,7 @@ compile_kernel() { + fi + + display_alert "Compiling Kernel" "${LINUXCONFIG} ${KERNEL_IMAGE_TYPE}" "info" +- # shellcheck disable=SC2086 # sorry gotta expand the targets somewhere +- run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" PATH="${toolchain}:${PATH}" \ +- make "$CTHREADS" "ARCH=$ARCHITECTURE" "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" \ +- "$SRC_LOADADDR" "LOCALVERSION=\"-$LINUXFAMILY\"" \ +- $KERNEL_IMAGE_TYPE ${KERNEL_EXTRA_TARGETS:-modules dtbs} || { ++ run_kernel_make_long_running "${KERNEL_IMAGE_TYPE}" modules "${KERNEL_EXTRA_TARGETS:-dtbs}" || { + exit_with_error "Failure during kernel compile" "@host" + } + +@@ -164,17 +196,7 @@ compile_kernel() { + display_alert "Creating kernel packages" "${LINUXCONFIG} $kernel_packaging_target" "info" + + # produce deb packages: image, headers, firmware, dtb +- run_host_command_logged_long_running CCACHE_BASEDIR="$(pwd)" env PATH="${toolchain}:${PATH}" \ +- make "$CTHREADS" $kernel_packaging_target \ +- "KDEB_PKGVERSION=$REVISION" \ +- "KDEB_COMPRESS=${DEB_COMPRESS}" \ +- "BRANCH=$BRANCH" \ +- "LOCALVERSION=\"-${LINUXFAMILY}\"" \ +- "KBUILD_DEBARCH=$ARCH" \ +- "ARCH=$ARCHITECTURE" \ +- "DEBFULLNAME=\"$MAINTAINER\"" \ +- "DEBEMAIL=\"$MAINTAINERMAIL\"" \ +- "CROSS_COMPILE=\"$CCACHE $KERNEL_COMPILER\"" || { ++ run_kernel_make_long_running $kernel_packaging_target || { + exit_with_error "Failure during kernel packaging" "@host" + } + +@@ -259,7 +281,7 @@ create_linux-source_package() { + Description: This package provides the source code for the Linux kernel $version + EOF + +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" ++ fakeroot_dpkg_deb_build -z0 "${sources_pkg_dir}" "${sources_pkg_dir}.deb" + rsync --remove-source-files -rq "${sources_pkg_dir}.deb" "${DEB_STORAGE}/" + + te=$(date +%s) +diff --git a/lib/functions/compilation/uboot.sh b/lib/functions/compilation/uboot.sh +index 666a84033..183298c4b 100644 +--- a/lib/functions/compilation/uboot.sh ++++ b/lib/functions/compilation/uboot.sh +@@ -222,7 +222,7 @@ compile_uboot() { + [[ -n $atftempdir && -f $atftempdir/license.md ]] && cp "${atftempdir}/license.md" "$uboottempdir/${uboot_name}/usr/lib/u-boot/LICENSE.atf" 2>&1 + + display_alert "Building u-boot deb" "${uboot_name}.deb" +- fakeroot dpkg-deb -b -Z${DEB_COMPRESS} "$uboottempdir/${uboot_name}" "$uboottempdir/${uboot_name}.deb" 2>&1 ++ fakeroot_dpkg_deb_build "$uboottempdir/${uboot_name}" "$uboottempdir/${uboot_name}.deb" + rm -rf "$uboottempdir/${uboot_name}" + [[ -n $atftempdir ]] && rm -rf "${atftempdir}" + +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index 14953a5fe..612003391 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -190,7 +190,7 @@ function do_main_configuration() { + it is often used to in turn override those. + POST_FAMILY_CONFIG + +- display_alert "Handling some" "desktop config stuff 1" "warning" ++ display_alert "Handling some" "desktop config stuff 1" "debug" + + # Myy : Once we got a list of selected groups, parse the PACKAGE_LIST inside configuration.sh + DESKTOP_ELEMENTS_DIR="${SRC}/config/desktop/${RELEASE}" +@@ -216,6 +216,7 @@ function do_main_configuration() { + fi + + fi ++ display_alert "Handling some" "desktop config stuff 2" "debug" + + if [[ $BUILD_DESKTOP == "yes" ]]; then + # Expected environment variables : +@@ -226,6 +227,7 @@ function do_main_configuration() { + + desktop_environment_check_if_valid + fi ++ display_alert "Handling some" "desktop config stuff 3" "debug" + + if [[ $BUILD_DESKTOP == "yes" && -z $DESKTOP_ENVIRONMENT_CONFIG_NAME ]]; then + # FIXME Check for empty folders, just in case the current maintainer +@@ -249,6 +251,7 @@ function do_main_configuration() { + exit_with_error "No desktop configuration selected... Do you really want a desktop environment ?" + fi + fi ++ display_alert "Handling some" "desktop config stuff 4" "debug" + + if [[ $BUILD_DESKTOP == "yes" ]]; then + DESKTOP_ENVIRONMENT_PACKAGE_LIST_DIRPATH="${DESKTOP_ENVIRONMENT_DIRPATH}/${DESKTOP_ENVIRONMENT_CONFIG_NAME}" +@@ -266,6 +269,7 @@ function do_main_configuration() { + options+=("${appgroup}" "${appgroup^}" off) + done + ++ # FIXME: pardini: here's a subshell to run dialog. in the middle of the main config. refactor this away + DESKTOP_APPGROUPS_SELECTED=$( + show_select_menu \ + "Choose desktop softwares to add" \ +@@ -277,15 +281,18 @@ function do_main_configuration() { + unset options + fi + +- #exit_with_error 'Testing' ++ display_alert "Done with" "desktop config stuff - END" "debug" + + # set unique mounting directory + MOUNT_UUID=$(uuidgen) +- SDCARD="${SRC}/.tmp/rootfs-${MOUNT_UUID}" +- MOUNT="${SRC}/.tmp/mount-${MOUNT_UUID}" +- DESTIMG="${SRC}/.tmp/image-${MOUNT_UUID}" + +- # dropbear needs to be configured differently ++ # Super-global variables, used everywhere. They're not _created_ here, since this is config stage, not build. ++ export WORKDIR="${SRC}/.tmp/work-${MOUNT_UUID}" # WORKDIR at this stage. It will become TMPDIR later. It has special significance to `mktemp` and others! ++ export SDCARD="${SRC}/.tmp/rootfs-${MOUNT_UUID}" # SDCARD (which is NOT an sdcard, but will be, maybe, one day) is where we work the rootfs before final imaging. "rootfs" stage. ++ export MOUNT="${SRC}/.tmp/mount-${MOUNT_UUID}" # MOUNT ("mounted on the loop") is the mounted root on final image (via loop). "image" stage ++ export DESTIMG="${SRC}/.tmp/image-${MOUNT_UUID}" # DESTIMG is where the backing image (raw, huge, sparse file) is kept ++ ++ # dropbear needs to be configured differently # @TODO: rpardini: yes, and? are you a lost leftover comment from a previous era? + [[ $CRYPTROOT_ENABLE == yes && $RELEASE == xenial ]] && exit_with_error "Encrypted rootfs is not supported in Xenial" + [[ $RELEASE == stretch && $CAN_BUILD_STRETCH != yes ]] && exit_with_error "Building Debian Stretch images with selected kernel is not supported" + [[ $RELEASE == bionic && $CAN_BUILD_STRETCH != yes ]] && exit_with_error "Building Ubuntu Bionic images with selected kernel is not supported" +@@ -423,6 +430,7 @@ desktop/${RELEASE}/environments/${DESKTOP_ENVIRONMENT}/appgroups + but before assembling any package lists. + USER_CONFIG + ++ display_alert "Extension initialization" "extension_prepare_config" "debug" + call_extension_method "extension_prepare_config" <<- 'EXTENSION_PREPARE_CONFIG' + *allow extensions to prepare their own config, after user config is done* + Implementors should preserve variable values pre-set, but can default values an/or validate them. +diff --git a/lib/functions/general/host.sh b/lib/functions/general/host.sh +index 3e750ebe7..5156c4ed8 100644 +--- a/lib/functions/general/host.sh ++++ b/lib/functions/general/host.sh +@@ -243,11 +243,20 @@ prepare_host() { + find "${SRC}"/output "${USERPATCHES_PATH}" -type d ! -group sudo -exec chgrp --quiet sudo {} \; + find "${SRC}"/output "${USERPATCHES_PATH}" -type d ! -perm -g+w,g+s -exec chmod --quiet g+w,g+s {} \; + fi +- mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} "${SRC}"/.tmp ++ # @TODO: rpardini: _very_ important spot, this is where ".tmp" is created. A _huge_ opportunity for tmpfs here. ++ display_alert "Creating directory structure: .tmp" "${SRC}/.tmp" "debug" ++ display_alert "Creating directory structure: DEST" "${DEST}" "debug" ++ mkdir -p "${DEST}"/debs-beta/extra "${DEST}"/debs/extra "${DEST}"/{config,debug,patch} \ ++ "${USERPATCHES_PATH}"/overlay "${SRC}"/cache/{sources,hash,hash-beta,toolchain,utility,rootfs} \ ++ "${SRC}"/.tmp "${WORKDIR}" ++ ++ display_alert "Setting TMPDIR" "${WORKDIR}" "debug" ++ export TMPDIR="${WORKDIR}" + + # build aarch64 + if [[ $(dpkg --print-architecture) == amd64 ]]; then + if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" != "yes" ]]; then ++ display_alert "Warning! SKIP_EXTERNAL_TOOLCHAINS is not yes. This is deprecated, upgrade!" "please set SKIP_EXTERNAL_TOOLCHAINS=yes" "deprecation" + + # bind mount toolchain if defined + if [[ -d "${ARMBIAN_CACHE_TOOLCHAIN_PATH}" ]]; then +diff --git a/lib/functions/image/loop.sh b/lib/functions/image/loop.sh +index c248a0065..296697b44 100644 +--- a/lib/functions/image/loop.sh ++++ b/lib/functions/image/loop.sh +@@ -31,7 +31,7 @@ write_uboot_to_loop_image() { + + local loop=$1 revision + display_alert "Preparing u-boot bootloader" "$loop" "info" +- TEMP_DIR=$(mktemp -d || exit 1) ++ TEMP_DIR=$(mktemp -d) # set-e is in effect. no need to exit on errors explicitly + chmod 700 ${TEMP_DIR} + revision=${REVISION} + if [[ -n $UPSTREM_VER ]]; then +diff --git a/lib/functions/logging/logging.sh b/lib/functions/logging/logging.sh +index 01d6b67d7..765dda74f 100644 +--- a/lib/functions/logging/logging.sh ++++ b/lib/functions/logging/logging.sh +@@ -119,6 +119,11 @@ display_alert() { + inline_logs_color="\e[0;32m" + ;; + ++ debug | deprecation) ++ level_indicator="✨" # "🌴" 🥑 ++ inline_logs_color="\e[1;33m" ++ ;; ++ + *) + level_indicator="🌿" # "✨" 🌿 🪵 + inline_logs_color="\e[1;37m" +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index 2c99ae571..97b13ddef 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -16,7 +16,7 @@ function chroot_sdcard_apt_get() { + + # please, please, unify around this function. if SDCARD is not enough, I'll make a mount version. + function chroot_sdcard() { +- run_host_command_logged_raw chroot "${SDCARD}" /bin/bash -e -c "$*" ++ TMPDIR="" run_host_command_logged_raw chroot "${SDCARD}" /bin/bash -e -c "$*" + } + + function chroot_custom_long_running() { +@@ -24,10 +24,10 @@ function chroot_custom_long_running() { + shift + local _exit_code=1 + if [[ "${SHOW_LOG}" == "yes" ]] || [[ "${CI}" == "true" ]]; then +- run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++ TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" + _exit_code=$? + else +- run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" ++ TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" + _exit_code=$? + fi + return $_exit_code +@@ -36,7 +36,13 @@ function chroot_custom_long_running() { + function chroot_custom() { + local target=$1 + shift +- run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++ TMPDIR="" run_host_command_logged_raw chroot "${target}" /bin/bash -e -c "$*" ++} ++ ++# for deb building. ++function fakeroot_dpkg_deb_build() { ++ display_alert "Building .deb package" "$(basename "${3:-${2:-${1}}}" || true)" "debug" ++ run_host_command_logged_raw fakeroot dpkg-deb -b "-Z${DEB_COMPRESS}" "$@" 2>&1 + } + + # for long-running, host-side expanded bash invocations. +@@ -60,6 +66,11 @@ function run_host_command_logged() { + run_host_command_logged_raw /bin/bash -e -c "$*" + } + ++# for interactive, dialog-like host-side invocations. no redirections performed, but same bash usage and expansion, for consistency. ++function run_host_command_dialog() { ++ /bin/bash -e -c "$*" ++} ++ + # do NOT use directly, it does NOT expand the way it should (through bash) + function run_host_command_logged_raw() { + # Log the command to the current logfile, so it has context of what was run. +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index c03c16d84..bdc642ded 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -9,6 +9,7 @@ function prepare_and_config_main_build_single() { + else + DEST="${SRC}"/output + fi ++ display_alert "Determined DEST:" "${DEST}" "debug" + + if [[ $BUILD_ALL != "yes" && -z $ROOT_FS_CREATE_ONLY ]]; then + if [[ -t 0 ]]; then # "-t fd return True if file descriptor fd is open and refers to a terminal". 0 = stdin, 1 = stdout, 2 = stderr, 3+ custom +@@ -116,7 +117,7 @@ function prepare_and_config_main_build_single() { + WIP_STATE=supported + WIP_BUTTON='CSC/WIP/EOS/TVB' + STATE_DESCRIPTION=' - boards with high level of software maturity' +- temp_rc=$(mktemp) ++ temp_rc=$(mktemp) # @TODO: this is a _very_ early call to mktemp - no TMPDIR set yet - it needs to be cleaned-up somehow + + while true; do + options=() +diff --git a/lib/functions/main/rootfs-image.sh b/lib/functions/main/rootfs-image.sh +index a5ce58de8..9996d4b94 100644 +--- a/lib/functions/main/rootfs-image.sh ++++ b/lib/functions/main/rootfs-image.sh +@@ -52,7 +52,7 @@ PRE_INSTALL_DISTRIBUTION_SPECIFIC + # install distribution and board specific applications + + LOG_SECTION="distro" do_with_logging install_distribution_specific +- LOG_SECTION="install_common" do_with_logging install_distribution_agnostic ++ LOG_SECTION="install_distribution_agnostic" do_with_logging install_distribution_agnostic + + # install locally built packages + [[ $EXTERNAL_NEW == compile ]] && LOG_SECTION="packages_local" do_with_logging chroot_installpackages_local +diff --git a/lib/functions/rootfs/apt.sh b/lib/functions/rootfs/apt.sh +index dd26c8b65..29833851a 100644 +--- a/lib/functions/rootfs/apt.sh ++++ b/lib/functions/rootfs/apt.sh +@@ -3,16 +3,18 @@ apt_purge_unneeded_packages() { + display_alert "No longer needed packages" "purge" "info" + chroot_sdcard_apt_get autoremove + } +-# this is called by distributions.sh->install_common(), and thus already under a logging manager. ++ + install_deb_chroot() { + local package=$1 + local variant=$2 + local transfer=$3 + local name + local desc ++ + if [[ ${variant} != remote ]]; then + # @TODO: this can be sped up significantly by mounting debs readonly directly in chroot /root/debs and installing from there + # also won't require cleanup later ++ + name="/root/"$(basename "${package}") + [[ ! -f "${SDCARD}${name}" ]] && cp "${package}" "${SDCARD}${name}" + desc="" +@@ -21,11 +23,10 @@ install_deb_chroot() { + desc=" from repository" + fi + +- # @TODO: this is mostly duplicated in distributions.sh->install_common(), refactor into "chroot_apt_get()" + display_alert "Installing${desc}" "${name/\/root\//}" +- [[ $NO_APT_CACHER != yes ]] && local apt_extra="-o Acquire::http::Proxy=\"http://${APT_PROXY_ADDR:-localhost:3142}\" -o Acquire::http::Proxy::localhost=\"DIRECT\"" ++ + # when building in bulk from remote, lets make sure we have up2date index +- [[ $BUILD_ALL == yes && ${variant} == remote ]] && chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get $apt_extra -yqq update" ++ [[ $BUILD_ALL == yes && ${variant} == remote ]] && chroot_sdcard_apt_get update + + # install in chroot via apt-get, not dpkg, so dependencies are also installed from repo if needed. + chroot_sdcard_apt_get --no-install-recommends install "${name}" || { +@@ -33,8 +34,8 @@ install_deb_chroot() { + } + + # @TODO: mysterious. store installed/downloaded packages in deb storage. only used for u-boot deb. why? +- [[ ${variant} == remote && ${transfer} == yes ]] && rsync -rq "${SDCARD}"/var/cache/apt/archives/*.deb ${DEB_STORAGE}/ ++ [[ ${variant} == remote && ${transfer} == yes ]] && rsync -rq "${SDCARD}"/var/cache/apt/archives/*.deb "${DEB_STORAGE}"/ + +- # IMPORTANT! Do not use conditional above as last statement in a function, since it determines the result of the function. ++ # IMPORTANT! Do not use short-circuit above as last statement in a function, since it determines the result of the function. + return 0 + } +diff --git a/lib/functions/rootfs/distro_agnostic.sh b/lib/functions/rootfs/distro_agnostic.sh +index 50e6e4923..a226ce0eb 100644 +--- a/lib/functions/rootfs/distro_agnostic.sh ++++ b/lib/functions/rootfs/distro_agnostic.sh +@@ -1,5 +1,5 @@ + install_distribution_agnostic() { +- display_alert "Applying common tweaks" "install_common" "info" ++ display_alert "Installing distro-agnostic part of rootfs" "install_distribution_agnostic" "debug" + + # install rootfs encryption related packages separate to not break packages cache + # @TODO: terrible, this does not use apt-cacher, extract to extension and fix + +From 9869508b622be33fe5114313c02d107b500f79aa Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 22 Dec 2021 19:39:26 +0100 +Subject: [PATCH] logging: don't bail out on patching error + +Signed-off-by: Ricardo Pardini +--- + lib/functions/compilation/patching.sh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/lib/functions/compilation/patching.sh b/lib/functions/compilation/patching.sh +index 7114cf0cd..52d00010f 100644 +--- a/lib/functions/compilation/patching.sh ++++ b/lib/functions/compilation/patching.sh +@@ -87,14 +87,15 @@ process_patch_file() { + # detect and remove files which patch will create + lsdiff -s --strip=1 "${patch}" | grep '^+' | awk '{print $2}' | xargs -I % sh -c 'rm -f %' + +- patch --batch -p1 -N < "${patch}" 2>&1 +- +- if [[ $? -ne 0 ]]; then ++ # @TODO: try patching with `git am` first, so git contains the patch commit info/msg. -- For future git-based hashing. ++ # shellcheck disable=SC2015 # noted, thanks. I need to handle exit code here. ++ patch --batch -p1 -N < "${patch}" && { ++ display_alert "* $status $(basename "${patch}")" "" "info" ++ } || { + display_alert "* $status $(basename "${patch}")" "failed" "wrn" + [[ $EXIT_PATCHING_ERROR == yes ]] && exit_with_error "Aborting due to" "EXIT_PATCHING_ERROR" +- else +- display_alert "* $status $(basename "${patch}")" "" "info" +- fi ++ } ++ return 0 # short-circuit above, avoid exiting with error + } + + # apply_patch_series + +From 91806c9e0934a7d4a01425bf76c013dca110f5f0 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Wed, 22 Dec 2021 01:18:23 +0100 +Subject: [PATCH] logging: bunch of fixes; no-stdin; traps; better stacks + +- mostly no-stdin dialog handling (desktop et al) +- let ERR trap run together with unmount trap (EXIT etc) + +Signed-off-by: Ricardo Pardini +--- + compile.sh | 2 +- + lib/extensions.sh | 13 ++++++++++--- + lib/functions/configuration/main-config.sh | 3 ++- + lib/functions/configuration/menu.sh | 13 ++++++++++--- + lib/functions/general/repo.sh | 2 +- + lib/functions/logging/traps.sh | 5 ++--- + lib/functions/main/config-prepare.sh | 17 +++++++++-------- + lib/functions/rootfs/create-cache.sh | 11 ++++++----- + 8 files changed, 41 insertions(+), 25 deletions(-) + +diff --git a/compile.sh b/compile.sh +index f6a2cd8f5..d4d07cfe0 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -36,7 +36,7 @@ fi + source "${SRC}"/lib/single.sh + + # hook up the error handler early, we wanna see stack for all errors. +-trap 'main_error_monitor "$?" "$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" "$(show_caller_full)"; exit 48' ERR EXIT ++trap 'main_error_monitor "$?" "$(show_caller_full)" "$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")"; exit 48' ERR EXIT + + # And execute the main entrypoint. + cli_entrypoint "$@" +diff --git a/lib/extensions.sh b/lib/extensions.sh +index 4ea9bb111..1f7cd2db8 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -339,12 +339,19 @@ get_extension_hook_stracktrace() { + + show_caller_full() { + { +- local frame=0 +- while caller $frame; do +- ((frame++)) ++ local i=0 ++ local line_no ++ local function_name ++ local file_name ++ echo "" # line break ++ while caller $i; do ++ ((i++)) ++ done | while read -r line_no function_name file_name; do ++ echo -e "\t$file_name:$line_no\tat\t$function_name" + done + } || true # always success + } ++ + # can be called by board, family, config or user to make sure an extension is included. + # single argument is the extension name. + # will look for it in /userpatches/extensions first. +diff --git a/lib/functions/configuration/main-config.sh b/lib/functions/configuration/main-config.sh +index e7487efe5..14953a5fe 100644 +--- a/lib/functions/configuration/main-config.sh ++++ b/lib/functions/configuration/main-config.sh +@@ -190,8 +190,9 @@ function do_main_configuration() { + it is often used to in turn override those. + POST_FAMILY_CONFIG + +- # Myy : Once we got a list of selected groups, parse the PACKAGE_LIST inside configuration.sh ++ display_alert "Handling some" "desktop config stuff 1" "warning" + ++ # Myy : Once we got a list of selected groups, parse the PACKAGE_LIST inside configuration.sh + DESKTOP_ELEMENTS_DIR="${SRC}/config/desktop/${RELEASE}" + DESKTOP_CONFIGS_DIR="${DESKTOP_ELEMENTS_DIR}/environments" + DESKTOP_CONFIG_PREFIX="config_" +diff --git a/lib/functions/configuration/menu.sh b/lib/functions/configuration/menu.sh +index 12880526c..32939ae36 100644 +--- a/lib/functions/configuration/menu.sh ++++ b/lib/functions/configuration/menu.sh +@@ -1,5 +1,12 @@ + # Stuff involving dialog + ++# Pardini: dialog_if_terminal prints error and exits if stdin is not a terminal, or if running under CI. ++function dialog_if_terminal() { ++ [[ ! -t 0 ]] && exit_with_error "stdin is not a terminal. can't use dialog." "dialog_if_terminal ${*}" "err" ++ [[ "${CI}" == "true" ]] && exit_with_error "CI=true. can't use dialog." "dialog_if_terminal ${*}" "err" ++ dialog "$@" ++} ++ + # Myy : Menu configuration for choosing desktop configurations + show_menu() { + provided_title=$1 +@@ -11,7 +18,7 @@ show_menu() { + #echo "Provided menuname : $provided_menuname" + #echo "Provided options : " "${@:4}" + #echo "TTY X: $TTY_X Y: $TTY_Y" +- dialog --stdout --title "$provided_title" --backtitle "${provided_backtitle}" \ ++ dialog_if_terminal --stdout --title "$provided_title" --backtitle "${provided_backtitle}" \ + --menu "$provided_menuname" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" + } + +@@ -20,7 +27,7 @@ show_select_menu() { + provided_title=$1 + provided_backtitle=$2 + provided_menuname=$3 +- dialog --stdout --title "${provided_title}" --backtitle "${provided_backtitle}" \ ++ dialog_if_terminal --stdout --title "${provided_title}" --backtitle "${provided_backtitle}" \ + --checklist "${provided_menuname}" $TTY_Y $TTY_X $((TTY_Y - 8)) "${@:4}" + } + +@@ -44,7 +51,7 @@ show_developer_warning() { + - Forum posts related to dev kernel, CSC, WIP and EOS boards + should be created in the \Z2\"Community forums\"\Zn section + " +- DIALOGRC=$temp_rc dialog --title "Expert mode warning" --backtitle "${backtitle}" --colors --defaultno --no-label "I do not agree" \ ++ DIALOGRC=$temp_rc dialog_if_terminal --title "Expert mode warning" --backtitle "${backtitle}" --colors --defaultno --no-label "I do not agree" \ + --yes-label "I understand and agree" --yesno "$warn_text" "${TTY_Y}" "${TTY_X}" + [[ $? -ne 0 ]] && exit_with_error "Error switching to the expert mode" + SHOW_WARNING=no +diff --git a/lib/functions/general/repo.sh b/lib/functions/general/repo.sh +index f54d59562..be3121527 100644 +--- a/lib/functions/general/repo.sh ++++ b/lib/functions/general/repo.sh +@@ -193,7 +193,7 @@ repo-manipulate() { + LIST=("${new_list[@]}") + LIST_LENGTH=$((${#LIST[@]} / 2)) + exec 3>&1 +- TARGET_VERSION=$(dialog --cancel-label "Cancel" --backtitle "BACKTITLE" --no-collapse --title "Remove packages from repositories" --clear --menu "Delete" $((9 + ${LIST_LENGTH})) 82 65 "${LIST[@]}" 2>&1 1>&3) ++ TARGET_VERSION=$(dialog_if_terminal --cancel-label "Cancel" --backtitle "BACKTITLE" --no-collapse --title "Remove packages from repositories" --clear --menu "Delete" $((9 + ${LIST_LENGTH})) 82 65 "${LIST[@]}" 2>&1 1>&3) + exitstatus=$? + exec 3>&- + if [[ $exitstatus -eq 0 ]]; then +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index fa1abd262..9a5daa670 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -1,12 +1,11 @@ + # unmount_on_exit - used during rootfs building, to avoid leaving mounted stuff behind + # + unmount_on_exit() { +- trap - ERR # Also remove any error trap. it's too late for that. + set +e # we just wanna plow through this, ignoring errors. + trap - INT TERM EXIT # remove the trap + + local stack_here +- stack_here="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" ++ stack_here="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}" || true)" + display_alert "trap caught, shutting down" "${stack_here}" "err" + if [[ "${ERROR_DEBUG_SHELL}" == "yes" ]]; then + ERROR_DEBUG_SHELL=no # dont do it twice +@@ -39,7 +38,7 @@ unmount_on_exit() { + exit_with_error "generic error during build_rootfs_image: ${stack_here}" || true # but don't trigger error again + fi + +- return 47 # trap returns error. # exit successfully. we're already handling a trap here. ++ return 49 # trap returns error. + } + + # added by main_default_build_single to show details about errors when they happen and exit. exit might trigger the above. +diff --git a/lib/functions/main/config-prepare.sh b/lib/functions/main/config-prepare.sh +index 0dd34a875..c03c16d84 100644 +--- a/lib/functions/main/config-prepare.sh ++++ b/lib/functions/main/config-prepare.sh +@@ -11,7 +11,8 @@ function prepare_and_config_main_build_single() { + fi + + if [[ $BUILD_ALL != "yes" && -z $ROOT_FS_CREATE_ONLY ]]; then +- if [[ -t 1 ]]; then # "-t fd return True if file descriptor fd is open and refers to a terminal" ++ if [[ -t 0 ]]; then # "-t fd return True if file descriptor fd is open and refers to a terminal". 0 = stdin, 1 = stdout, 2 = stderr, 3+ custom ++ display_alert "stdin is a terminal" "or is it?" "warning" + # override stty size, if stdin is a terminal. + [[ -n $COLUMNS ]] && stty cols $COLUMNS + [[ -n $LINES ]] && stty rows $LINES +@@ -95,7 +96,7 @@ function prepare_and_config_main_build_single() { + if [[ -z $KERNEL_ONLY ]]; then + options+=("yes" "U-boot and kernel packages") + options+=("no" "Full OS image for flashing") +- KERNEL_ONLY=$(dialog --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ ++ KERNEL_ONLY=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ + --menu "Select what to build" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + unset options + [[ -z $KERNEL_ONLY ]] && exit_with_error "No option selected" +@@ -105,7 +106,7 @@ function prepare_and_config_main_build_single() { + options+=("no" "Do not change the kernel configuration") + options+=("yes" "Show a kernel configuration menu before compilation") + options+=("prebuilt" "Use precompiled packages from Armbian repository") +- KERNEL_CONFIGURE=$(dialog --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ ++ KERNEL_CONFIGURE=$(dialog_if_terminal --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \ + --menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + unset options + [[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected" +@@ -150,7 +151,7 @@ function prepare_and_config_main_build_single() { + else + echo > "${temp_rc}" + fi +- BOARD=$(DIALOGRC=$temp_rc dialog --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ ++ BOARD=$(DIALOGRC=$temp_rc dialog_if_terminal --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \ + --colors --extra-label "Show $WIP_BUTTON" --extra-button \ + --menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + STATUS=$? +@@ -206,7 +207,7 @@ function prepare_and_config_main_build_single() { + if [[ "${#options[@]}" == 2 ]]; then + BRANCH="${options[0]}" + else +- BRANCH=$(dialog --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ ++ BRANCH=$(dialog_if_terminal --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \ + --menu "Select the target kernel branch\nExact kernel versions depend on selected board" \ + $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + fi +@@ -223,7 +224,7 @@ function prepare_and_config_main_build_single() { + if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then + options=() + distros_options +- RELEASE=$(dialog --stdout --title "Choose a release package base" --backtitle "$backtitle" \ ++ RELEASE=$(dialog_if_terminal --stdout --title "Choose a release package base" --backtitle "$backtitle" \ + --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + echo "options : ${options}" + [[ -z $RELEASE ]] && exit_with_error "No release selected" +@@ -239,7 +240,7 @@ function prepare_and_config_main_build_single() { + options=() + options+=("no" "Image with console interface (server)") + options+=("yes" "Image with desktop environment") +- BUILD_DESKTOP=$(dialog --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ BUILD_DESKTOP=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ + --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + unset options + [[ -z $BUILD_DESKTOP ]] && exit_with_error "No option selected" +@@ -253,7 +254,7 @@ function prepare_and_config_main_build_single() { + options=() + options+=("no" "Standard image with console interface") + options+=("yes" "Minimal image with console interface") +- BUILD_MINIMAL=$(dialog --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ ++ BUILD_MINIMAL=$(dialog_if_terminal --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \ + --menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") + unset options + [[ -z $BUILD_MINIMAL ]] && exit_with_error "No option selected" +diff --git a/lib/functions/rootfs/create-cache.sh b/lib/functions/rootfs/create-cache.sh +index ab900d508..f969159cf 100644 +--- a/lib/functions/rootfs/create-cache.sh ++++ b/lib/functions/rootfs/create-cache.sh +@@ -239,13 +239,13 @@ function create_new_rootfs_cache() { + [[ -d "${MOUNT}" ]] && + display_alert "Mount point" "$(echo -e "$freespace" | grep $MOUNT | head -1 | awk '{print $5}')" "info" + +- # create list of installed packages for debug purposes +- chroot $SDCARD /bin/bash -c "dpkg --get-selections" | grep -v deinstall | awk '{print $1}' | cut -f1 -d':' > ${cache_fname}.list 2>&1 ++ # create list of installed packages for debug purposes - this captures it's own stdout. ++ chroot "${SDCARD}" /bin/bash -c "dpkg --get-selections" | grep -v deinstall | awk '{print $1}' | cut -f1 -d':' > "${cache_fname}.list" + + # creating xapian index that synaptic runs faster + if [[ $BUILD_DESKTOP == yes ]]; then + display_alert "Recreating Synaptic search index" "Please wait" "info" +- chroot $SDCARD /bin/bash -c "[[ -f /usr/sbin/update-apt-xapian-index ]] && /usr/sbin/update-apt-xapian-index -u" ++ chroot_sdcard "[[ -f /usr/sbin/update-apt-xapian-index ]] && /usr/sbin/update-apt-xapian-index -u || true" + fi + + # this is needed for the build process later since resolvconf generated file in /run is not saved +@@ -260,7 +260,7 @@ function create_new_rootfs_cache() { + umount_chroot "$SDCARD" + + tar cp --xattrs --directory=$SDCARD/ --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \ +- --exclude='./sys/*' . | pv -p -b -r -s $(du -sb $SDCARD/ | cut -f1) -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | lz4 -5 -c > $cache_fname ++ --exclude='./sys/*' . | pv -p -b -r -s "$(du -sb $SDCARD/ | cut -f1)" -N "$(logging_echo_prefix_for_pv "store_rootfs") $display_name" | lz4 -5 -c > "$cache_fname" + + # sign rootfs cache archive that it can be used for web cache once. Internal purposes + if [[ -n "${GPG_PASS}" && "${SUDO_USER}" ]]; then +@@ -268,6 +268,7 @@ function create_new_rootfs_cache() { + echo "${GPG_PASS}" | sudo -H -u ${SUDO_USER} bash -c "gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes ${cache_fname}" || exit 1 + fi + ++ return 0 # protect against possible future short-circuiting above this + } + + # get_package_list_hash +@@ -278,7 +279,7 @@ get_package_list_hash() { + local list_content + read -ra package_arr <<< "${DEBOOTSTRAP_LIST} ${PACKAGE_LIST}" + read -ra exclude_arr <<< "${PACKAGE_LIST_EXCLUDE}" +- ( ++ ( + ( + printf "%s\n" "${package_arr[@]}" + printf -- "-%s\n" "${exclude_arr[@]}" + +From 70b9182fb02337c6c8d023469571acb2f1462317 Mon Sep 17 00:00:00 2001 +From: Ricardo Pardini +Date: Mon, 20 Dec 2021 23:29:18 +0100 +Subject: [PATCH] logging: trap ERR very early, pass-in caller info + +Signed-off-by: Ricardo Pardini +--- + compile.sh | 3 +++ + lib/extensions.sh | 13 ++++++++----- + lib/functions/logging/runners.sh | 2 +- + lib/functions/logging/traps.sh | 28 +++++++++++++++++----------- + lib/functions/main/default-build.sh | 2 -- + 5 files changed, 29 insertions(+), 19 deletions(-) + +diff --git a/compile.sh b/compile.sh +index 23919ae91..f6a2cd8f5 100755 +--- a/compile.sh ++++ b/compile.sh +@@ -35,5 +35,8 @@ fi + # shellcheck source=lib/single.sh + source "${SRC}"/lib/single.sh + ++# hook up the error handler early, we wanna see stack for all errors. ++trap 'main_error_monitor "$?" "$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" "$(show_caller_full)"; exit 48' ERR EXIT ++ + # And execute the main entrypoint. + cli_entrypoint "$@" +diff --git a/lib/extensions.sh b/lib/extensions.sh +index d8b3aed9c..4ea9bb111 100644 +--- a/lib/extensions.sh ++++ b/lib/extensions.sh +@@ -328,7 +328,8 @@ get_extension_hook_stracktrace() { + source="${source#"lib/functions/"}" + source="${source#"lib/"}" + # add to the list +- arrow="$([[ "$final_stack" != "" ]] && echo "-> ")" ++ # shellcheck disable=SC2015 # i know. thanks. I won't write an if here ++ arrow="$([[ "$final_stack" != "" ]] && echo "-> " || true)" + final_stack="${source}:${line} ${arrow} ${final_stack} " + done + # output the result, no newline +@@ -337,10 +338,12 @@ get_extension_hook_stracktrace() { + } + + show_caller_full() { +- local frame=0 +- while caller $frame; do +- ((frame++)) +- done ++ { ++ local frame=0 ++ while caller $frame; do ++ ((frame++)) ++ done ++ } || true # always success + } + # can be called by board, family, config or user to make sure an extension is included. + # single argument is the extension name. +diff --git a/lib/functions/logging/runners.sh b/lib/functions/logging/runners.sh +index ef0c2389c..2c99ae571 100644 +--- a/lib/functions/logging/runners.sh ++++ b/lib/functions/logging/runners.sh +@@ -49,7 +49,7 @@ function run_host_command_logged_long_running() { + run_host_command_logged_raw /bin/bash -e -c "$*" + _exit_code=$? + else +- run_host_command_logged_raw /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}")" --progress --timer --line-mode --force --cursor --delay-start 0 -i "0.5" ++ run_host_command_logged_raw /bin/bash -e -c "$*" | pv -N "$(logging_echo_prefix_for_pv "${INDICATOR:-compile}") " --progress --timer --line-mode --force --cursor --delay-start 0 -i "2" + _exit_code=$? + fi + return $_exit_code +diff --git a/lib/functions/logging/traps.sh b/lib/functions/logging/traps.sh +index 9edd1d956..fa1abd262 100644 +--- a/lib/functions/logging/traps.sh ++++ b/lib/functions/logging/traps.sh +@@ -5,9 +5,9 @@ unmount_on_exit() { + set +e # we just wanna plow through this, ignoring errors. + trap - INT TERM EXIT # remove the trap + +- local stacktrace +- stacktrace="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" +- display_alert "trap caught, shutting down" "${stacktrace}" "err" ++ local stack_here ++ stack_here="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}")" ++ display_alert "trap caught, shutting down" "${stack_here}" "err" + if [[ "${ERROR_DEBUG_SHELL}" == "yes" ]]; then + ERROR_DEBUG_SHELL=no # dont do it twice + display_alert "MOUNT" "${MOUNT}" "err" +@@ -36,7 +36,7 @@ unmount_on_exit() { + + # if we've been called by exit_with_error itself, don't recurse. + if [[ "${ALREADY_EXITING_WITH_ERROR:-no}" != "yes" ]]; then +- exit_with_error "generic error during build_rootfs_image: ${stacktrace}" || true # but don't trigger error again ++ exit_with_error "generic error during build_rootfs_image: ${stack_here}" || true # but don't trigger error again + fi + + return 47 # trap returns error. # exit successfully. we're already handling a trap here. +@@ -44,11 +44,17 @@ unmount_on_exit() { + + # added by main_default_build_single to show details about errors when they happen and exit. exit might trigger the above. + function main_error_monitor() { +- trap - ERR # remove this trap +- local stacktrace +- stacktrace="$(get_extension_hook_stracktrace "${BASH_SOURCE[*]}" "${BASH_LINENO[*]}" || true)" +- display_alert "main_error_monitor! '$*'" "${stacktrace}" "err" +- show_caller_full >&2 || true +- display_alert "main_error_monitor2! '$*'" "${stacktrace}" "err" +- exit 46 ++ if [[ "${ALREADY_EXITING_WITH_ERROR}" == "yes" ]]; then ++ display_alert "second run detected" "ERR trap" "err" ++ #exit 46 ++ fi ++ #trap - ERR # remove this trap ++ local errcode="${1}" ++ local stack_caller="${2}" ++ local full_stack_caller="${3}" ++ display_alert "main_error_monitor: ${errcode}! stack:" "${stack_caller}" "err" ++ display_alert "main_error_monitor: ${errcode}! full:" "${full_stack_caller}" "err" ++ ALREADY_EXITING_WITH_ERROR=yes ++ exit 45 ++ return 44 + } +diff --git a/lib/functions/main/default-build.sh b/lib/functions/main/default-build.sh +index 2bd62724f..e9f3af0ed 100644 +--- a/lib/functions/main/default-build.sh ++++ b/lib/functions/main/default-build.sh +@@ -10,8 +10,6 @@ main_default_build_single() { + exit 0 + fi + +- trap 'main_error_monitor $?' ERR +- + if [[ $CLEAN_LEVEL == *sources* ]]; then + cleaning "sources" + fi + +``` +