5.9 KiB
Welcome to the Armbian build framework documentation!
Overview:
(ANSI) Logging
Logs are output to output/logs, in a few different formats. We output ANSI color both to the screen and to the logs.
Please add SHARE_LOG=yes to share your logs with our pastebin service when reporting issues, that allows us to check the logs on a web
browser and keep to correct formatting.
Command line syntax has changed
General CLI syntax: ./compile.sh PARAM=value OTHER_PARAM=other_value [<configfile> <configfile> ...] [<command>]
- where
commanddefaults tobuildif you don't specify it; could also bekernel-configoru-bootetc - you can't have a config file with the same name as a possible
<command>(system will check & bomb if so) - also: there's no more
defaultconfig -- you have to be explicit - also: there's no more
dockerconfig -- Docker is fully auto-managed now. The system will complain if you have one. - you can specify
PARAM=value,<configfile>or<command>in any order
No more config-default.conf, you need to specify the config file in the command line
- No "default" config is auto-loaded anymore. Default config lead to unreproducible failing builds and was a source of confusion.
- The configs still go to the same place,
userpatches/config-xyz.conf-- but now you gotta tell the build system to use that config, like./compile.sh BOARD=xxx xyz; otherwise works the same.
Artifacts, cache, what the ...?
The armbian/build system is currently undergoing refactoring to improve its structure. Previously, the build system
was a single, complex Bash script that mixed the building of .deb packages with the creation of images.
This was reworked into a 1-to-N image-to-artifact dependency tree; a certain image build will depend on N possible
"artifacts". Artifacts are either .deb packages, a .tar of multiple .deb packages, or a rootfs.tar.zstd. Each
artifact can be individually built, and has a specific name and a version.
Each artifact is also now cached by default using OCI storage at ghcr.io (GitHub Container Registry). To achieve consistent caching, each artifact produces a version that includes hashes of its composing files, variables, patches, hooks, external git SHA1 references, etc. That way we can consistently check the remote OCI cache for previously-built artifacts, and possibly save image builders from having to build heavy packages just to produce an image.
TL-DR about artifacts and caching:
KERNEL_ONLY=yesandKERNEL_ONLY=noare no more. Use thekernelCLI command instead.ARTIFACT_IGNORE_CACHE=yescan help if you're getting false positives. Please also report the problem, with a complete logfile.
Automatic Docker/sudo launcher
compile.shwill prefer to use Docker if it detects Docker is installed and working.- This handles Docker Desktop and Rancher Desktop (in Docker emulation mode) under macOS/Darwin, including Apple M1/M2.
- You don't need and actually can't have the old docker config file.
- If Docker is not installed, it will try to use
sudoto run the build as root. - If you run directly as root, it will warn you and ask you to run it without sudo.
Kernel Git Trees: shallow vs full
During the build, depending on which local or remote caches are hit, it might be needed to build the Linux Kernel.
The kernel's git repo is huge. Most build systems resort to fetching "shallow" trees directly from upstream git servers,
to save bandwidth. Unfortunately that creates immense extra CPU load on the git servers. To avoid this problem,
Armbian produces daily automated git tree exports cached in ghcr.io OCI repositories, and only uses git fetch to
update the relatively small new changes from the upstream git server.
There are two types of cached Kernel git trees:
fullis a complete git tree, including all of Torvald'smasterand all of the currently-supportedstablebranches.fullis very large download and requires a lot of disk space.fullis more useful over time and when building multiple different kernels on the same machine, like for CI servers or developer workstations.
shallowis a shallow tree for a specificstablebranchshallowis a much smaller download and requires less disk spaceshallowis appropriate for restricted devices like SBCs which will build a single kernel
**TL,DR: ** KERNEL_GIT=full or KERNEL_GIT=shallow or let the system decide for you.
Consider Forking before cloning the repo
Before cloning the repo, consider forking it first. This will allow you to make changes and submit pull requests. You will need a GitHub account to do this; see GitHub's documentation for more information. If you fork, make sure to keep your fork up-to-date with the main repo, by rebasing your fork.
Some really confusing stuff still remains
This is (by far) not a complete list:
- wifi/other kernel drivers are still using pre-armbian-next code, and are very hard to work with. it's not only the contents are a mess, the way the whole thing works leads to more and more compounding work. To make it worse, family patches sometimes need to patch driver code, leading to a cycle of sadness for developers. We're still coming up with a plan to completely replace this lest most of us go insane.
- although "aggregation" has been rewritten in Python, it still mostly works using the legacy principle, by scanning directories and files in a very complex and error-prone way. This is a source of many bugs and confusion. We plan to replace this with pure extensions eventually.
- we've mostly working Kernel headers (linux-headers pkg) for 5.10+ including some vendor kernels
Multiple u-boot's for same board
We can build u-boot twice, using UBOOT_TARGET_MAP. Some example I did in https://github.com/armbian/build/blob/main/config/boards/odroidhc4.conf#L15-L20 may help.