The tools in our organization attempt to be portable, but there are obstacles that need to be dealt with on non-Linux systems, such as the installation of the respective external tools.
Since I use FreeBSD myself, the point of this repo is to help other potential FreeBSD users keep their build process comfortable. Linux users don't need it, because the tools all work out of box in there.
Our script chain requires the following commonly installable tools to work:
- POSIX core utilities and shell (
/bin/sh) git- repository management (pkg install git)wget- fetching files (pkg install wget)cpio- creating ramdisk images (in base system)tar- unpacking third party archives (in base system)ar- unpacking third party archives (in base system)lz4c- kernel and initramfs image compression (pkg install liblz4)perl- mostly used in shell to decode base64 (pkg install perl5)
Additionally, it requires additional tools that are not always available:
adb- working with TWRP recovery (pkg install android-tools-adb)fastboot- flash and boot the images (pkg install android-tools-fastboot)mkimage- create.fitimages from kernel+DTB (pkg install u-boot-tools)mkbootimg- create unsigned Android boot images (not available OOTB)futility- sign imagesmkbootimgcreates (not available OOTB)
To build Linux, some more are necessary:
bison-pkg install bisonflex-pkg install flex
As you can see, mkbootimg and futility are the tricky parts. You don't need
either to boot a kernel on the Pixel C, but you need both to create images that
can actually persist on the device.
We have a version that works on FreeBSD in our organization. It is not present in FreeBSD ports. To obtain it, use the script available here.
./get_mkbootimg.sh
You will need to install gmake (pkg install gmake). The tool by default
installs into ~/bin which is in PATH on FreeBSD. Provide a custom prefix
as th efirst argument if you want.
This installs two tools, mkbootimg and unpackbootimg, the latter doing
the reverse of the former (i.e. turn an image into a zImage and a ramdisk).
This tool is used to sign the images with Chrome OS signing keys to make them flashable. Just like above, we have a version that works on FreeBSD in our organization, so get it:
./get_futility.sh
This installs just one tool, futility and the script works exactly the same
as for mkbootimg.
You will also need a cross-compiler for the aarch64-linux-gnu target. You
can use the get_cross.sh script for it, which will download, compile and
install bc, binutils and gcc. Only binutils and gcc are a part of
the actual cross-compiling toolchain, but GNU bc is necessary in the Linux
build system.
mkdir $HOME/gcc-linux-cross
./get_cross.sh $HOME/gcc-linux-cross 16
The second parameter is the number of gmake jobs. The first parameter is the
install prefix and it must exist and be writable.
The toolchain supplied with the FreeBSD base system should be enough to build.
If something fails, you can skip the previous components by setting SKIP_BC,
SKIP_BINUTILS or SKIP_GCC.
Building the kernel is the same as on Linux. If you use the Pixel C kernel
scripts, they will automatically take care of overriding sed and make
for the build with gsed and gmake. You will need to have the cross-gcc
install prefix in your PATH. If you're not using the scripts, then you
will need to make sure calling sed during the build calls gsed; you
can do that for example by symlinking gsed as sed into your cross prefix.