blob: ce0618696dfae397f539dfb63066453c8e0b1e1b [file] [log] [blame]
<html><head><title>What is toybox?</title>
<!--#include file="header.html" -->
<h2><a name="what" />What is toybox?</h2>
<p>Toybox combines many common Linux command line utilities together into
a single <a href=license.html>BSD-licensed</a> executable. It's simple, small, fast, and reasonably
standards-compliant (<a href=http://opengroup.org/onlinepubs/9699919799>POSIX-2008</a> and <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0>LSB 4.1</a>).</p>
<p>Toybox's main goal is to make Android
<a href=http://landley.net/aboriginal/about.html#selfhost>self-hosting</a>
by improving Android's command line utilities so it can
build an installable Android Open Source Project image
entirely from source under a stock Android system. After a talk at the 2013
Embedded Linux Conference explaining this plan
(<a href=http://landley.net/talks/celf-2013.txt>outline</a>,
<a href=https://www.youtube.com/watch?v=SGmtP5Lg_t0>video</a>), Google
<a href=https://lwn.net/Articles/629362/>merged toybox into AOSP</a> and
began shipping toybox in Android Mashmallow.</p>
<p>Toybox aims to provide one quarter of a theoretical "minimal native
development environment", which is the simplest Linux system capable of
rebuilding itself from source code and then building
<a href=http://linuxfromscratch.org/lfs>Linux From Scratch</a>
and the <a href=https://source.android.com>Android Open Source Project</a>
under the result. In theory, this should only require four packages:
1) a set of posix-ish command line utilities,
2) a compiler<a name="1_back"></a><sup><font size=-3><a href=#1>[1]</a></font></sup>,
3) a C library, and 4) a kernel. This provides a reproducible and auditable
base system, which with the addition of a few convienciences (vi, top,
shell command line history...) can provide a usable interactive experience
rather than just a headless build server.</p>
<b><h2><a name="why" />Why is toybox?</h2></b>
<p>The <a href=http://landley.net/talks/celf-2015.txt>2015 toybox talk</a>
starts with links to three previous talks on the history and motivation of
the project: "Why Toybox", "Why Public Domain", and "Why did I do
Aboriginal Linux (which led me here)?". If you're really bored,
there's even a half-finished
<a href=http://landley.net/aboriginal/history.html>a history page</a>.</p>
<p>The toybox maintainer's earlier minimal self-hosting system project,
<a href=http://landley.net/aboriginal/about.html>Aboriginal Linux</a>,
got its minimal native development environment down to seven packages in
its 1.0 release (busybox, uClibc, gcc, binutils, make, bash, and linux)
and built Linux From Scratch under the result. That project
<a href=http://landley.net/aboriginal/history.html>was the reason</a>
toybox's maintainer became busybox maintainer, having done so
much work to extend busybox to replace all the gnu tools in a Linux From
Scratch build that the previous maintainer handed over the project (to
spend more time on buildroot).</p>
<p>Despite the maintainer's history with busybox, toybox is a fresh
from-scratch implementation under an
<a href=https://source.android.com/source/licenses.html>android-compatible</a>
<a href=license.html>license</a>. Busybox predates Android, but has never
shipped with Android due to the license. As long as we're starting over anyway,
we can do a better job.</p>
<p>These days, toybox is replacing busybox
in Aboriginal Linux one command at a time, and each toybox release is
regression tested by building Aboriginal Linux with it, then building
Linux From Scratch under the result with the new toybox commands.
The list of commands remaining is tracked <a href=roadmap.html#dev_env>in
the roadmap</a>, and the replacing busybox in Aboriginal Linux is
one of the main goals for toybox' 1.0 release.</p>
<p>Building LFS requres fewer commands than building AOSP, which has a lot more
<a href=http://source.android.com/source/initializing.html>build
prerequisites</a>. In theory some of those can be built from source
as external packages (we're clearly not including our own java implementation),
but some early prerequisites may need to be added to bootstrap AOSP far enough
to build them (such as a read-only version of "git":
how does repo download the AOSP source otherwise?)
<a name="2_back"></a><sup><font size=-3><a href=#2>[2]</a></font></sup></p>
<b><h2><a name="status" />What commands are planned/implemented in toybox?</h2></b>
<p>The current list of commands implemented by toybox is on the
<a href=status.html>status page</a>, which is updated each release.
There is also a <a href=roadmap.html>roadmap</a> listing all planned commands
for the 1.0 release and the reasons for including them.</p>
<p>In general, configuring toybox with "make defconfig" enables all the commands
compete enough to be useful. Configuring "allyesconfig" enables partially
implemented commands as well, along with debugging features.</p>
<b><h3>Relevant Standards</h3></b>
<p>Most commands are implemented according to POSIX-2008 (I.E.
<a href=http://opengroup.org/onlinepubs/9699919799/idx/utilities.html>The
Single Unix Specification version 4</a>) where applicable. This does not mean
that toybox is implementing every SUSv4 utility: some such as SCCS and ed are
obsolete, while others such as c99 are outside the scope of the project.
Toybox also isn't implementing full internationalization support: it should be
8-bit clean and handle UTF-8, but otherwise we leave this to X11 and higher
layers. And some things (like $CDPATH support in "cd") await a good
explanation of why to bother with them. (POSIX provides an important
frame of reference, but is not an infallable set of commandments to be blindly
obeyed. We do try to document our deviations from it in the comment section
at the start of each command under toys/posix.)</p>
<p>The other major sources of commands are the Linux man pages, the
Linux Standard Base, and testing the behavior of existing command
implementations (although not generally looking at their
source code), including the commands in Android's toolbox. SUSv4 does not
include many basic commands such as "mount", "init", and "mke2fs", which are
kind of nice to have.</p>
<p>For more on this see the <a href=roadmap.html>roadmap</a> and
<a href=design.html>design goals</a>.</p>
<b><h2><a name="downloads" />Download</h2></b>
<p>This project is maintained as a <a href=https://github.com/landley/toybox>git
archive</a>, and also offers <a href=http://landley.net/toybox/downloads>source
tarballs</a> and <a href=http://landley.net/toybox/bin>static binaries</a>
of the release versions.</p>
<p>The maintainer's <a href=http://landley.net/notes.html>development log</a> and the project's
<a href=http://lists.landley.net/listinfo.cgi/toybox-landley.net>mailing
list</a> are also good ways to track what's going on with the project.</p>
<b><h2><a name="toycans" />What's the toybox logo image?</h2></b>
<p>It's <a href=toycans-big.jpg>carefully stacked soda cans</a>. Specifically,
it's a bunch of the original "Coke Zero" and "Pepsi One" cans, circa 2006,
stacked to spell out the binary values of the ascii string "Toybox", with
null terminator at the bottom. (The big picture's on it's side because
the camera was held sideways to get a better shot.)</p>
<p>No, it's not photoshopped, I actually had these cans until a coworker
who Totally Did Not Get It <sup><font size=-3><a href=http://www.timesys.com>tm</a></font></sup> threw them out one day after I'd gone home,
thinking they were recycling. (I still have two of each kind, but
Pepsi One seems discontinued and Coke Zero switched its can color
from black to grey, presumably in celebration. It was fun while it lasted...)</p>
<b><h2>Footnotes</h2></b>
<p><a name="1" /><a href="#1_back">[1]</a> Ok, most toolchains (gcc, llvm, pcc, libfirm...)
are multiple packages, but the maintainer of toybox used to maintain a
<a href=http://landley.net/tinycc>fork of tinycc</a> (an integrated
compiler/assembler/linker which once upon a
time did <a href=http://bellard.org/tcc/tccboot.html>build a bootable linux
kernel</a> before its original developer abandoned the project),
and has <a href=http://landley.net/hg/qcc/file/tip/todo/todo.txt>vague plans</a> of <a href=http://landley.net/qcc>trying
again someday</a>. The compiler toolchain is _conceptually_ one package,
implementable as a single multicall binary acting like make, cc, as, ld, cpp,
strip, readelf, nm, objdump, and so on as necessary. It's just the existing
packages that do this <strike>kinda suck</strike> don't. (In theory "make"
belongs in qcc, in practice llvm hasn't got its own make so toybox probably
needs to add it after 1.0 to eliminate another gpl build prerequite from
AOSP.)</p>
<p><a name="2" /><a href="#2_back">[2]</a>
The dividing line is
"Is there an acceptably licensed version Android can ship, or do we have
to write one?" Since android is not "GNU/Linux" in any way, we need to
clean out all traces of gnu software from its build to get a clean
self-hosting system.</p>
<!--#include file="footer.html" -->