blob: a02f08e3f88e83f5542ec113ba7a5f47b8026ece [file] [log] [blame] [view]
# Getting Started with Debian on the i.MX8M
## Checking out the repository
We've stored our code in Gerrit, and like the Android developers before us, we
use repo to manage the projects in our Gerrit repositories.
To get started, first, you're going to need to pull down a copy of the `repo`
tool from our public facing sites and add it to your path:
```
mkdir -p bin
export PATH=$PATH:$HOME/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```
Make sure you've initialized git with your name and email address, and have
configured it properly for fetching the sources:
```
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
```
Once you've done this, you're actually ready to check out the sources. Make a
new directory where you'd like it to live, and do the following:
```
repo init -u sso://spacepark/manifest -m debian.xml
repo sync -j$(lscpu |awk '/^CPU\(s\):/ { print $2 }')
```
After a short wait, you'll be ready to go for making changes to the repository
and building images.
## Building the Tree
To build the tree, first you need to prepare your environment:
```
source build/setup.sh
```
At this point you'll have a couple of extra functions available to navigate
around the tree and build things in part or in whole. For now, let's just build
the whole shebang. First you need to make a debootstrap tarball, and then
finally build the tree:
```
mm debootstrap make-bootstrap-tarball
m -j$(lscpu |awk '/^CPU\(s\):/ { print $2 }')
```
In about an hour, if the tip of the tree is good, you should have images ready
to flash available in the out/ directory. To get to the tree quickly, use the
`j` command to "jump" into the product directory, and then use the `flash.sh`
script to flash everything to an attached board (note: the board will need to be
in fastboot mode, and everything previously stored on the emmc will be erased).
```
j product
flash.sh
```
To build the world for an sdcard, build the `sdcard` target:
```
m sdcard
```
## Quick Explanation of the Build System
The build system is relatively straightforward. It's a selection of split
out multi-target makefiles defined in the `build/` directory. Each makefile is
designed to be as standalone as possible so that each can be built individually
using the `mm` command, or collectively using `m`.
Adding modules is also relatively straightforward, assuming a decent
understanding of GNU Make rules. An example of how to get started is available
in the `build/template.mk` script. Simply copy this file to a new filename, and
then add the following line to the list of includes in the toplevel
`build/Makefile` file:
```
include $(ROOTDIR)/build/your-module.mk
```
Note that `targets` and `clean` are special partial targets. The rules must be
defined with a double colon (`::`) and not added to your module's `.PHONY`
target. Additionally, the output of the `targets` command is a list of strings
of the form:
```
targetname - some short description of your target
```
This is actually parsed by the `mm` function to help with tab completion. It's
relatively robust in the face of spaces, but you must separate your targetname
with a dash (`-`) from the description, or the completion routine will likely
break.
If you follow the conventions in the template, `mm` will autocomplete your
module and it's targets listed in the `targets` make target.
## Quick Tour of setup.sh Functions
### m -- Make everything from the toplevel
The `m` function can be called from any directory in the filesystem to build the
entire tree from the ground up. Effectively the command does a pushd to the root
of the tree and issues a make command. You can specify any options or targets
you'd like to build, including the `targets` command to have a look around in
the build system.
### mm -- Make an individual Module
The `mm` function can, like the `m` function, be called from any directory in
the filesystem to build an individual module. It has autocompletion functions,
so simply typing `mm` and then hitting TAB will autocomplete the list of modules
available. Additionally, if you press TAB again, after you've autocompleted a
module name, it will autocomplete the list of targets available in that module,
as returned by the `targets` target.
### j -- Jump around the directory tree
This is a kind of switchboard of sorts that lets you jump around the tree
quickly. Many of the paths are arcane because of historical reasons, so this
tool was written to make things a bit easier.
If you issue the `j` command with no arguments, it will automatically change
your current working directory to the root of the tree. If, however, you issue
`j help`, it will list a list of target names you can "jump" to. You can open up
`build/setup.sh` to see which ones are currently defined, or just jump around
and explore.
## Quick Tour of the Directory Layout
#### build/
Contains build scripts, the setup.sh script and rootfs overlay, as well as some
additional tooling.
#### cache/
Contains the debootstrap tarball you must build before starting any other build
lives here. This directory is ephemeral and doesn't exist on a first clone, but
will also not be removed when the `clean` target is run. Bear in mind: if you
update the package list in `build/debootstrap.mk`, you'll need to re-reun `mm
deboostrap make-debootstrap-tarball` to regenerate this.
#### device/
Contains i.MX8M Enterprise-specific configuration files, kernel configurations,
and other device-specific information. Cloned from the AndroidThings repository
and will likely migrate as time goes on.
#### docs/
Contains this documentation, as well as other documentation about the build
system and working in the tree.
#### hardware/
Contains the kernel and u-boot bootloader source code. These are forks of the
original AndroidThings source code.
#### imx-firmware/
Contains the atheros and qualcomm Wifi firmware blobs. Cloned from the
AndroidThings repository and will likely migrate out as time goes on and bom
selections change.
#### imx-gpu-viv/
Contains the Vivante upstream binary drivers for the GPU. These are required to
get the displays working. Also clonsed from the AndroidThings repository.
#### out/
The ephemeral directory that contains both local host binaries and tools, as
well as build artifacts and the final images produced. It has a specific
structure documented elsewhere.
#### packages/
Debian package sources used to build the packages installed to make the
distribution more functional for the Enterprise board.
#### prebuilts/
Contains the prebuilt toolchains to build for an aarch64 target.
#### system/
Contains AndroidThings tools like bpt, as well as fastboot and other low-level
tooling for the host and device-side userlands. Currently the only parts we're
using in the tree are fastboot and bpt. Cloned from the AndroidThings
repository.
#### vendor/
Contains many NXP specific binaries for various peripherals used in the final
build to get peripherals working.