# 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.
