blob: de587af157aecd75f4022a2419561e072e7d7b60 [file] [log] [blame] [view]
Building Android with SlothFS
=============================
[Slothfs](https://github.com/google/slothfs) is a FUSE file system that offers a
read-only view of a Git tree. It downloads files lazily, so it takes up less
diskspace than a full checkout based on `repo`. Once its caches are seeded,
creating fresh workspaces or syncing should take on the order of seconds.
It is developed as open source, and can be used by anyone that uses
Gerrit/Gitiles based Git hosting. The [design doc](design.md) explains the
background behind its design choices.
It has been tested on Linux, but we expect it works on OSX too.
For the remainder of this document, we will assume that you are trying to
compile some flavor of Android.
Installing
==========
Get the source code,
go get github.com/google/slothfs/cmd/slothfs-repofs
SlothFS depends git2go, which depends on libgit2. For git2go, we recommend
compiling libgit2 in statically, as documented
[here](https://github.com/libgit2/git2go#from-next).
To install all components, run
cd $GOPATH/src/github.com/google/slothfs/ && sh all.bash
The rest of this document assumes this has been done, and `$GOPATH/bin/` is in
your `$PATH`.
In addition, install the standard Android `clone.json` to avoid unnecessary git
clones
mkdir -p $HOME/.config/slothfs
curl https://raw.githubusercontent.com/google/slothfs/master/android.json \
> $HOME/.config/slothfs/clone.json
Selecting the host
==================
The defaults of slothfs are for the public version of Android at
`android.googlesource.com`. Set the `-gitiles_url` option to change against
which version of Android you want to run.
Mounting the filesystem
=======================
First, create a mountpoint:
sudo mkdir -p /slothfs && sudo chown $USER /slothfs
Then, to mount the file system, run
slothfs-repofs /slothfs
Dereferencing a manifest
========================
The manifest describes which repositories go into an Android checkout. To make a
file system out of this, we must decide at which exact revision each repository
should be offered.
This can be done with `slothfs-deref-manifest`, eg.
slothfs-deref-manifest > /tmp/m.xml
Configuring a workspace
=======================
A workspace can be created by a symlinking a deferenced manifest field into the
`config` directory, i.e.
ln -s /tmp/m.xml /slothfs/config/my-workspace
This should create a directory `/slothfs/my-workspace` holding the tree
described in `/tmp/m.xml`.
On the first time you do this, slothfs will have to fetch the tree data, which
is slow, so this might take a while.
Using a workspace
=================
To use the read-only tree, create a writable checkout. Let's assume we want to
change the `art` repo:
mkdir -p checkout ; cd checkout
git clone https://android.googlesource.com/platform/art
To make `checkout` into a full-fledged checkout, run
slothfs-populate -ro /slothfs/my-workspace .
This populate the `checkout` directory with symlinks into `/slothfs`, yielding a
full check out.
If there were symlinks to a previous checkout in the workspace, this will also
update timestamps to make incremental builds work.
Syncing
=======
Advancing your checkout to a different timestamp uses the same commands. To sync
to the current state of the Android tree, do the following
slothfs-populate -sync .
This fetches the latest manifest file, finds the project revisions, sets up a
workspace for the manifest, and updates the symlinks from your read/write
checkout.
Removing a workspace
====================
Remove a workspace by removing its symlink configuration entry, eg.
rm /slothfs/config/my-workspace
Unmounting slothfs
==================
A SlothFS daemon can be unmounted with `fusermount`
fusermount -u /slothfs
If this reports `device busy`, check if there any processes holding open files
(eg. Jack compilation servers.)
Metadata
========
The file system offers the following metadata files:
workspace/.slothfs/manifest.xml - manifest XML
workspace/path/to/repo/.slothfs/tree.json - tree listing of this repository
workspace/path/to/repo/.slothfs/treeID - hex tree ID of the this repository
In addition, each blob has the `user.gitsha1` extended attribute that surfaces
the blob's git SHA1 checksum.
Configuring
===========
SlothFS clones repositories on-demand, as soon as a file in the repository is
opened. You can avoid cloning altogether for repositories you know you don't
need; the files will then be fetched over HTTP.
Details of which repositories and files trigger cloning are configured through a
JSON file.
For example, if you work on Android, and build on a Linux machine, you will
never need the Darwin related prebuilts. You can avoid a costly clone for those
by doing:
{"Repo": ".*darwin.*", "Clone": false}
Similarly, the build system system will read files (typically called '*.mk')
across the entire tree. When any .mk file is opened, this should not trigger a
clone. This is achieved with the following entry
{"File": ".*mk$", "Clone": false}
Together, the following `config.json` file is a good start for working on
android:
[{"Repo": ".*darwin.*", "Clone": false},
{"File": ".*mk$", "Clone": false}]
A more elaborate configuration file is included as `android.json`.
File layout
-----------
SlothFS loads the configuration data from a directory that can be ste with the
`-config` flag. The following configuration is available
$HOME/.config/clone.json # clone configuration
$HOME/.config/manifests/ # configured workspaces
SlothFS caches data in a directory which can be set with `-cache` flag.
The following data are cached:
$HOME/.cache/slothfs/tree # trees
$HOME/.cache/slothfs/git # bare git repositories
$HOME/.cache/slothfs/blob # blobs
Caveats: timestamps
-------------------
When syncing a checkout with `slothfs-populate`, an attempt is made to update
timestamps of the blobs, so incremental builds will work as expected. However,
since blobs are shared between different workspaces, a sync in one workspace may
cause spurious rebuilds in other workspaces.
Similarly, interrupting `slothfs-populate` and then syncing to another workspace
may yield unpredictable results.
When the slothfs FUSE daemon is restarted, all timestamp information is lost.