view www/news.html @ 1229:313c702a0984

Remove toybox.
author Rob Landley <>
date Tue, 24 Aug 2010 03:08:47 -0500
parents 3c5eb21262af
children 479bcbb2775e
line wrap: on
line source

<title>Aboriginal Linux - We cross compile so you don't have to.</title>
<!--#include file="header.html" -->


<h2><a name="05-02-2010" />May 2, 2010</h2>
<p>The name of the project is changing from Firmware Linux to Aboriginal
Linux.  The new URL is "".</p>

<p>Some reasons to move away from the old name are
<a href=>listed here</a>,
and some reasons to pick the new name are covered in
<a href=>this thread</a>.</p>

<p>Some links may be broken while we switch over.  Let us know what we've
missed on the mailing list...</p>

<h2><a name="03-29-2010" />March 29, 2010</h2>
<p><a href=downloads/firmware-0.9.11.tar.bz2>Version 0.9.11</a> is out,
based on <a href=>hg commit
1020</a>.  We're closing in on a 1.0 release, but not quite there yet.</p>

<p>This version upgrades to Linux 2.6.33, uClibc, and BusyBox

<b><h3>Improved native builds</h3></b>

<p>Most targets now have <a href=downloads/binaries>prebuilt binaries</a>
for <a href=>dropbear</a>,
<a href=>strace</a>,
<a href=>busybox</a>.  These are statically
linked against uClibc, so just download, set the executable bit, and run.</p>

<p>These dropbear and strace binaries are built using the automated three-disk
native build capability introduced <a href=#11-07-2009>back in November</a>,
which has been improved and genericized this release.  Now one script creates
a build image (see examples in sources/native-builds) and another script
launches a system image with that build image attached as the third
hard drive (/dev/hdc), telling the system image to automatically build
those source packages and upload the result to the host via ftp.</p>

<p>So to reproduce the dropbear and strace binaries for a supported ARCH,
you could do:</p>

sources/native-builds/ tools.hdc
sources/more/ ARCH tools.hdc output

<p>When the build exits, the results should be in the host's "output"

<p>The arm, mips, x86, x86-64 targets that worked last time still work.
The armv4eb and m68k targets still don't work.</p>

<p>The powerpc and sparc targets have been upgraded.  Powerpc now works with
the 3-disk automated native build (although you'll need qemu 0.12.4 to take
advantage of this).  The sparc dynamic linker still doesn't work in uClibc,
but the statically linked system is now working well enough to build packages

<p>New targets this release are i486 (thanks David Seikel) and mips64 (which
mostly works, but the native toolchain isn't quite properly configured to
build stuff with yet).</p>

<p>Finally, the sh4 target was broken by a cosmetic cleanup of the startup
assembly code in Linux 2.6.33 that rendered any binutils version older
than 4 months unusable to build sh4.  While it's possible to patch around
this, it hasn't yet been worth effort.  The Linux-sh4 maintainer is aware
of the issue, but explicitly
<a href=>doesn't
care</a> about users other than his employer, and so far nobody
else seems to care enough about supporting the discontinued Sega Dreamcast
game console to argue with him.  (Might revisit this next release, but m68k
support is a higher priority.)</p>

<p>The system-image's "" is now a much smaller and simpler
script, consisting primarily of the qemu command line.  (And if you export
DEBUG=1 it prints the emulator command line.)  The distcc and hdb
setup code moved to</p>

<p>The <a href=screenshots>screenshots</a> page is working again, if a bit

<p>The script (to automatically git bisect a build issue)
has been updated, more to come next release.</p>

<p>The script has been updated to understand FORK=1 and download
packages in parallel.  (And to extract them in parallel when

<p>The new export_if_blank shell function allows several more environment
variables to be overridden, including TOP, SOURCES, SRCDIR, PATCHDIR,

<p>I'd also like to thank the debugging efforts of Wolfgang Denk, who hit
as many bugs trying to use this project as I normally do with other people's.
He eventually got discouraged and left, but thanks to his efforts:</p>

<li><p>We now unset several environment variables (such as ARCH and
CROSS_COMPILE) that break things if the host exports random data in them
before the build.  (Yes, this fights with export_if_blank above, and
the way configuration works in general.  Some more design works is necessary
here to let you configure the project with environment variables, but
not be confused by existing environment debris.)</p></li>

<li><p>BUILD_STATIC=none can how handle the case where the host toolchain
can't build any static binaries at all.</p></li>

<li><p>The CROSS_SMOKE_TEST implementation (which had bit rotted) was fixed and
moved to its own script (sources/more/, which is called by as necessary.</p>

<p>Note that actually trying to use it is a question
of getting qemu application emulation to work for your target.  For
arm you need to tweak /proc/sys/vm/mmap_min_addr as root.  For ppc you
need <a href=>this patch</a>.  For mips64 somebody still needs to
implement it (<a href=>no matter what gentoo thinks</a>).</p>

<p>(There's a reason the smoke test was disabled long enough to bit-rot.
It broke for qemu reasons more often than it found bugs in the toolchain.)</p>

<h2><a name="02-02-2010" />February 2, 2010</h2>

<p><a href=downloads/firmware-0.9.10.tar.bz2>Version 0.9.10</a> is out,
based on <a href=>hg
commit 966</a>.</p>

<p>Yeah, I know 1.0 is overdue for a release, here's a resync point
with the 2.6.32 kernel and uClibc</p>

<p>There are some regressions this time around, which I plan to fix up
in the next release.  The 2.6.32 kernel broke strace,
and upgrading to the new version didn't fix it.  (I know how, I just haven't
yet.)  The m68k target isn't currently building due to the uClibc upgrade
(yeah, "bugfix only", I know), and the armv6l target seems to be broken two
different ways.  I screwed up the screenshots page (which is halfway converted
to Vladimir's new fancy version with style sheets, but "halfway" doesn't
actually display right).  The cron job building nightly snapshots got taken down
when the server's hard drive filled up, and now it's in the process of being
upgraded with a couple new scripts:</p>

<p>The new sources/more/ script does a "make oldconfig"
between the stable and "USE_UNSTABLE=linux" kernels, and creates a new
alt-miniconfig-linux for the specified target with any new symbols that
showed up.  (This means the snapshots should break less, but adding the
symbols to the native configs will still require manual filtering.)</p>

<p>Also, the new sources/more/ script automatically does
a git bisect between a known good and known bad (generally HEAD) version
of one of the unstable packages (linux, uClibc, or busybox).  It can test
that the build completes, or that the system image boots and successfully
builds the static native dropbear binary.  (In theory this will allow the
nightly snapshots to automaticaly isolate and report the first commit that
broke them.)</p>

<p>In other general infrastructure news: some extensive upgrades to the
compiler wrapper (ccwrap), such as no longer needing GIMME_AN_S at compile
time and instead autodetecting the presence of vs libgcc.a
and behaving appropriately.  A largeish cleanup/refactoring of the compiler
build (described in
<a href=>commit 944</a>)
added a new "" script, which handles building the
improved "cross-compiler" tarball that includes thread support and
uClibc++ and is statically linked against uClibc on the host.
The simple cross compiler is now "" (which is
good enough to build a system image, but isn't very useful in other

<p>The stage now only builds
e2fsprogs or squashfs if the build is actually going to use them (based
on the SYSIMAGE_TYPE config symbol).  The sources/sections scripts now
come in two flavors: an *.build version with setup/cleanup called
automatically and *.sh files which do their own setup/cleanup within
the script.  Each system image's will once again add
/sbin:/usr/sbin to the $PATH if it can't find mke2fs.</p>

<p>The --extract command line option went away from because
everything else works via environment variables.  Use EXTRACT_ALL=1 instead.</p>

<p>Fixed a few regressions that snuck into previous versions: the
config-{linux,uClibc,busybox} should once again be in the root filesystem's
usr/src directory, should now try to build the static native
dropbear/strace binaries for all targets (not just the last one) and it
should properly be running again.</p>

<h2><a name="12-08-2009" />December 8, 2009</h2>
<p><a href=downloads/firmware-0.9.9.tar.bz2>Version 0.9.9</a> is out,
based on <a href=>hg commit 921</a>.</p>

<p>Just a checkpoint on the way to 1.0, which is still planned for
around new years, but there's been some schedule slippage already.</p>

<p><b>New documentation</b></p>
<p>The presentation slides have been converted to
<a href=presentation.html>HTML</a>, although the much prettier (and much
bigger) <a href=downloads/presentation.pdf>PDF</a> is still available.</p>

<p>There is also a <a href=FAQ.html>FAQ</a>, which is still somewhat sparse.
(Ask away.)</p>

<li><p><b>Prebuilt binaries</b></p></li>

<p>Added shm support to uClibc.  Bugfix to the c++
compiler (it should work again).  The system images now have a "guest"
user/group so packages can more easily be built as a non-root user.
The shell prompt now includes the $HOST name.</p>

<li><p><b>Build scripts</b></p>
<p>A new trivial-but-convenient "./" script lets you delete just the
target builds out of "build".  (If you delete that whole directory it has to
re-extract all the package tarballs and rebuilt the host tools, which is
often unnecessary work.)</p>

<p>Command recording has been completely redone.  No more RECORD_COMMANDS
variable, instead run sources/more/ to wrap the current
$PATH in build/wrappy (either after or instead of running,
then run your build stages, and finally either run
sources/more/ to get a summary or
look at the raw command line lists in build/logs.</p>

<p>The Great Refactoring continues in sources/sections: broke up into individual binutils, gcc, and ccwrap
stages, split off linux-headers and uClibc++ from,
and spun off from</p>

<p>Also broke kernel_cmdline() out of qemu_defaults() to make it easier to add
non-qemu sources/targets configurations without reinventing the wheel,
and fixed up dependencies for hw-target builds (which should work a lot
more reliably now).</p>

<p>Bumped up the number of $CPUS used by the build to 1.5x the actual number
(as long as your host has at least 512 megs of ram per actual CPU).  That
should help keep larger servers busy.</p>

<p>Some self-hosting fixes from Natanael Copa (making sure
builds on a uClibc host): added --disable-nls to the e2fsprogs build
(what exactly is ./configure running all these tests for again?), and a
squashfs patch (substituting a function uClibc hasn't got).</p>

<p>Simplified to use killtree() instead of mysetsid.
Simplified the cross-compiler/cross-static logic to set the $PATH to
use the right one, rather than moving them around during the build.
Updated to show "NONE" for system images that didn't build.
Added more support for SKIP_STRIP and CFLAGS=-g to the rest of the
packages.  Cleaned out the old USE_COLOR stuff which was superceded by

<h2><a name=11-07-2009 />November 7, 2009</h2>
<p><a href=downloads/firmware-0.9.8.tar.bz2>Version 0.9.8</a> is out,
based on hg commit 876.  (If you want to see all the changes in this release,
look at <a href=>commits 810 through 876</a>.)</p>

<p.The current plan is to cut one more release at the end of the month, and
then have the 1.0 release around new year's.  This could be considered a
1.0-pre1, if you like.</p>

<p>This release upgrades linux to and busybox to 1.15.2.
(The uClibc version is still, they haven't had a new release

<p>The old #firmware irc channel on has been merged into #edev,
so go there now to ask questions about this project.  (A _lot_ of
knowledgeable, helpful people hang there who can answer your embedded
development questions.)</p>

<h3><b>Bug tracker and roadmap</b></h3>

<p>The <a href=>new bug
tracker</a> has a <a href=>roadmap</a>
showing what we plan to implement for the next release or two.</p>

<p>It's also a place to file bugs, athough sending them to the <a href=>mailing list</a>
is still the fastest way to get a fix.</p>

<h3><b>New screenshots page</b></h3>

<p><a href=screenshots>This page</a> lists every target, with
a "screenshot" of the target's boot messages under qemu, and associated
links to all the various prebuilt binaries for that target.</p>

<h3><b>Fun with static linking</b></h3>

<p>The cross-compiler-$ARCH tarballs are all compiled for i686 and
statically linked against uClibc for maximum portability.</p>

<p>The busybox binary in the root filesystem images is now built statically by
default, providing a 20% speed improvement in ./configure times under qemu
(due to the reduced page translation overhead).  You can switch this back
to dynamic with "BUILD_STATIC=none".</p>

<p>Static dropbear and strace binaries for each target are also available,
built by the new sources/more/ script.</p>

<h3><b>System Image interface changes</b></h3>

<p>The script used to set up a development environment
out of the build directory, but didn't provide an easy way to do so based
on downloaded tarballs.  (You had to work out and provide extensive
command line arguments to the script.)  This has been

<p>The script in each system interface tarball is now much
simpler.  It now looks for distccd and $ARCH-cc in its $PATH, and sets up
distcc acceleration automatically if it finds them.  (It announces whether
or not it has managed to do so, and announces whether or not it
thinks it has distcc acceleration enabled just before launching a command
prompt.)  So setting up the distcc accelerator should be less of a pain.</p>

<p>Also, no longer takes any command line arguments.  Instead
the environment variable $HDB indicates a /dev/hdb disk image to mount on
/home, $HDBMEGS specifies the size of a (sparse ext2) HDB image to create if
it doesn't already exist, and QEMU_MEMORY indicates how many megabytes of
physical memory the emulator should allocate for the virtual system.</p>

<p>Each system-image also provides a simple wrapper
which calls with HDBMEGS=2048, HDB=hdb.img, and
QEMU_MEMORY=256.  (These are the values used to provide,
and give a reasonable build environment with 256 megs of physical memory
and 2 gigabytes of writeable /home space.)  The script
itself now merely adds the specified build/cross-compiler-$ARCH directory
to the $PATH, changes directory to the appropriate build/system-image-$ARCH,
and calls ./  It's 3 lines.</p>

<p>The system images can now also automatically mount a third disk image
($HDC, specifying an /dev/hdc image to mount onto the /mnt directory), and if
that filesystem contains an executable "init" program in its root directory
the sbin/ script will run that instead of launching a command prompt.</p>

<p>The new uses this HDC capability to automatically
run some native package builds without having to drive the build through
/dev/console via a wrapper script (the way does).  See
sources/more/ for the script which generates
the hdc.sqf image for this.</p>

<p>Note that some targets (such as sh4 and powerpc) don't yet support /dev/hdc
due to QEMU board emulation limitations.</p>

<h3><b>Build interface changes</b></h3>

<p>The new "sources/more" directory contains scripts the end user can
call, but which aren't important enough to clutter up the top level
directory with.  The and scripts moved there,
as did the used to build the nightly snapshots.</p>

<p>The new sources/more/ natively compiles dropbear and
strace under the emulator, and copies them out to the host through the virtual
network (into the build/cron-temp directory) using busybox ftpd on the host.
This provides an example of how to use the new HDC /mnt/init functionality
to perform automatic builds under the emulator, and copy the results out
through the network.  It uses the new sources/ wrapper to detect
hung builds (defined as builds that haven't produced a line of output within
a given number of seconds).</p>

<p>The new BINARY_PACKAGE_TARBALLS variable (in the file "config") tells
the build to create a separate tarball of the binaries produced building
each package.  (These more granular tarballs aren't shipped yet, but may
be in a future release.)</p>

<p>The new SKIP_STRIP variable tells the build not to strip binaries.
(Add in CFLAGS=-g for enormous binaries full of debug info.)</p>

<h3><b>Target upgrades</b></h3>

<p>Powerpc and sh4 should now work fine with stock qemu 0.11.0.</p>

<p>The arm platform now has an armv4tl target.  This is a little-endian armv4
eabi, for armv4 chips offering the "thumb" extension which eabi requires.
(The plain armv4l target is still oabi.  The oabi/eabi thing is different
binary ABIs, a bit like Linux vs BSD binaries or aout vs elf.  The eabi
standard is the new one, but some of the older arm hardware can't support
it.  This takes it down as far as it can go.)</p>


<p>Behind the scenes, some extensive work is going on to simplify the
build scripts.  (The documentation's fallen a bit behind reality here,
but should be back up to date next release.)</p>

<p>The uClibc miniconfigs are now automatically generated, with the
bulk of the config living in sources/baseconfig-uClibc and the few
target specific lines being appended from the UCLIBC_CONFIG variable
defined in the target's settings file.</p>

<p>The other big change is factoring out lots of common code, moving it into
the sources/sections directory, so things like the uClibc, busybox, and
toolchain builds now live in one place and are called from the various
other scripts that need them.  (This may eventually allow alternate build
scripts for these packages, potentially swapping out glibc for uClibc, or
llvm/clang for gcc.  In the meantime, it eliminates a lot of redundant code.)</p>

<p>This required lots of small cleanups, such as making the scripts now
consistently use the $STAGE_DIR variable for their output directory.
Some other cleanups were primarily cosmetic, such as moving the extracted
tarball cache directory from build/sources to build/packages.  (Tarballs
live in packages, extracted tarballs live in build/packages.)</p>

<p>The root filesystem now contains simple /etc/passwd and /etc/group files,
because dropbear won't work without them (not even to ssh out).</p>

<p>Several small bugfixes (ccwrap no longer segfaults if $PATH isn't
exported, /etc/resolv.conf doesn't get overwritten unnecessarily by,

<h2><a name=08-20-2009 />August 20, 2009</h2>
<p><a href=downloads/firmware-0.9.7.tar.bz2>Version 0.9.7</a> is out, a little
over a month and a half late.  It's a larger update than usual, so the
release notes are a bit long.</p>

<p>This release is based on
<a href=>mercurial version 807</a>
of the build scripts,
and includes <b>Linux</b> and <b>BusyBox 1.14.3</b>.
No new uClibc release is out since last time.</p>

<p>Lots of little bugs got fixed.  For example, this release should build on
Fedora 11 (and any other platform that hasn't got "which" installed by
default), and now supports distcc and ccache on the host (and will use them
automatically if they are installed).</p>

<h3><b>Changes to build stages: new root-filesystem, cross-static, and
native-compiler tarballs, upgraded and</b></h3>

<p>The old "mini-native" stage has been renamed "root-filesystem"
(the same way package-mini-native became system-image last release).  The
script names (and resulting tarballs) now indicate what each stage makes.
So calls,,,
and, in that order.</p>

<p>The old script is gone, with its functionality
integrated into (which now builds i686 hosted static toolchains
for each target by default).  This is implemented by two new environment
variables triggering optional behavior: STATIC_CROSS_COMPILER_HOST

<p>Setting STATIC_CROSS_COMPILER_HOST to an architecture name creates a
cross compiler statically linked to run on that host (via a technique
known as canadian cross compile).  For example, the invocation:</p>

<p>BUILD_CROSS_COMPILER_HOST=i686 ./ armv4l</P>

<p>Would create a tarball called "cross-static-armv4l.tar.bz2" which was
built to run on an i686 host, and was statically linked (against uClibc)
on that host to be distribution independent.</p>

<p>Setting BUILD_STATIC_NATIVE_COMPILER to any non-empty value creates a
native compiler for the target (packaged as native-compiler-$ARCH.tar.bz2),
which is statically linked against uClibc so it can be extracted and run on
just about any system of the appropriate type.  (So if you can get a Linux
shell prompt and have enough storage and memory, you should be able to
compile stuff.)</p>

<p>The upgraded script runs on each
target built.  (The script attempts to compile and run "hello
world" natively within a system image under qemu, and indicates whether or
not it worked via "pass" or "fail".)  Note that now
autodetects which targets have been built (have system images in the build
directory), and times out after 60 seconds so targets that hang
will return failure eventually.</p>


<h3><b>Squashfs 4.0 now the default system image type</b></h3>

<p>The root filesystem image type is now squashfs by default.  (To change it set
SYSIMAGE_TYPE to ext2 or initramfs, either in your environment or the file

<p>This involved upgrading the userspace squashfs support package
to the version 4.0 supported by the upstream kernel, and numerous small fixes
to work with a read-only root filesystem (with writeable spaced mounted on
/home and /tmp).</p>

<h3><b>Target upgrades</b></h3>
<h3><b>ARM upgrades</b></h3>

<p>Lots of work on the arm targets, with the addition of a new armv6l target
and conversion of the armv5l target to
<a href=>ARM EABI</a> (which used to be documented <a href=>here</a>,
but ARM screwed up its website and now you have to go
<a href=>here</a>).  The armv4l target still provides an ARM v4
little endian soft float OABI target (which is "the i386 of ARM", meaning it
should run on just about any arm hardware, if a bit slowly).  A new
armv4be target is the same as armv4l except big endian.</p>

<p>A new hw-tct-hammer target supports the <a href=>Tin Can Tools hammer/nail board</a>.</p>

<h3><b>Updated sparc support, almost works now.  (uClibc for sparc still sucks.)</b></h3>

<p>The sparc target has also been upgraded to the point where it now gives
a shell prompt.  (And immediately dies with a bus error or a hang if you try
to do anything, because uClibc for sparc still doesn't work.  The "upgrade"
consisted of statically linking everything because uClibc's dynamic loader
doesn't work for sparc.)</p>

<h3><b>PowerPC remains fiddly due to QEMU issues, new powerpc-440fp target</b></h3>

<p>PowerPC support in QEMU is
<a href=>officially unstable</a>, so although FWL's powerpc target hasn't significantly
changed from last release, the version of QEMU in source control no longer
runs it (nor the binary powerpc system images released with FWL 0.9.6) and
QEMU's developers do not consider this a regression.  While we search for a new
Linux kernel .config that matches QEMU's current expectations (and await a
release considered "stable"), note that setting HOST_BUILD_EXTRA=1 before
running will build a version of qemu that does run powerpc and
put it in build/host where can find it.  (Note also that
building qemu from source still takes significantly longer than the rest of the stage combined.)</p>

<p>A new powerpc-440fp target produces code for the powerpc 440 with hardware
floating point.  (Theoretically QEMU's "bamboo" board emulation should
run this, but QEMU doesn't emulate a 440 processor yet.  We compromise by
running a ppc440 filesystem under qemu's power mac emulation, to take
advantage of the ppc440 instruction set being almost a subset of full powerpc.
This gets us a shell prompt, but throws illegal instruction errors if you
try to do anything fancy.)</p>

<p>(Note that powerpc-440fp is not a hw-target for powerpc, it's a different
processor instruction set like i586 vs i686.  Alas, one that qemu doesn't
properly emulate yet.)</p>



<h3><b>Now using last GPLv2 release of GCC, and future plans</b></h3>

<p>The upgrade to <b>gcc 4.2.1</b> gives us
<a href=>the last
GPLv2 licensed version of gcc</a> (thus avoiding
<a href=>various problems</a>).
<a href=>Make 3.81</a>
was already the last GPLv2 release of that project.</p>

<p>Note that <b>bash 2.05b</b> is still intentionally ancient (to avoid the
bloat of 3.x), and may be replaced with busybox ash as the default FWL shell
in a future release.  Similarly, although <b>binutils 2.17</b> was the last
GPLv2 version from the FSF, an upgrade to
<a href=>the
last GPLv2 release of Red Hat's binutils fork,</a> is under
consideration for a future release.  But mostly the GNU compiler toolchain
has been upgraded as far as possible for the forseeable future, either because
new versions provide no significant benefits or because they're not available
under a license compatible with the Linux kernel's.</p>

<p>Future upgrades to these packages will either be via individual patches
(maintaining GPLv2 license) or by investigating alternative non-FSF
packages such as OpenBSD's <a href=>PCC</a> or
Apple's <a href=>LLVM</a>.  In preparation for support of
alternate compilers, the build scripts have moved from using "gcc" to the
more generic "cc" for the compiler name wherever possible, but currently no
drop-in replacement compiler is available.</p>


<h3><b>Implementation details</b></h3>

<p>Each target configuration renamed "details" to "settings", and added
a "description".  (This makes Gentoo From Scratch's kconfig easier.)</p>

<p>The stage now populates a "packages" directory instead of
"sources/packages", meaning that everything in the sources directory now
comes from the FWL source tarball.  To do the equivalent of "make clean"
you can "rm -rf build", and to do a "make distclean" you can
"rm -rf packages build".</p>

<p>The build no longer deletes the alt-* tarballs when UNSTABLE isn't
set, you must do that by hand if you want an updated alt- version of a
package.  The packages/MANIFEST file creation can now use the extended
tarball information to detect git version numbers.</p>

<p>The === bars now show the current stage name and architecture each
package is being built for.  (Pipe the build output to grep "^===" to see
just the start of each new package build.)  The same information is sent
to the title bar of your xterm, export NO_TITLE_BAR=1 if you don't want the
build to update the title bar.</p>

<p>The BUILD_STATIC option now applies to all packages built in, and can be set from a target configuration's settings file
(as sparc is now doing).</p>

<p>The BUILD_VERBOSE option passes V=1 to the linux, busybox, and uClibc
builds that otherwise sanitize their output.</p>

<p>You can now set NATIVE_TOOLCHAIN=only to build just the compiler
and not the other parts (busybox, make, toybox, bash...)  This is used
by the canadian cross steps in to create static cross and native

<p>This release broke up scripts/ so that script just
sets lots of environment variables, and now includes scripts/
to define shell functions.  The architecture setup (reading architecture
files and creating temporary directories and such) is now done via the
"read_arch_dir $ARCH" shell function, so merely including sources/
should no longer have significant side effects.  Similarly, setupfor now
has an EXTRACT_ONLY environment variable instead of depending on a blank
$ARCH (which has, despite wanting to snapshot source so it can
build stuff).</p>

<p>Various fixes to make parallel builds work better.  (So it neither leaves
background processes running nor kills the parent shell and closes your
xterm when you hit ctrl-c.)  The new "killtree" shell function,
which kills a process and all its children and grandchildren recursively with
pgrep.  We also build our own sources/toys/mysetsid.c program with the host
compiler (because the normal command line "setsid" doesn't also do a tcsetpgrp
on stdin so signal handling isn't forwarded to the new session).  This should
more reliably allow ctrl-c to exit and and such,
and let FORK=1 ./ stop all its background processes when
interrupted.  (Note that also honors FORK=1.)</p>

<p>The logs from now live in build/logs.</p>

<p>The new config option ROOT_NODIRS avoids creating the normal set of empty
directories in the new root filesystem.  (The old /tools support went
away, but a BUILD_STATIC ROOT_NODIRS build can be extracted into /tools
and used from there.  Then either symlink "/lib" to "/tools/lib" or "export
UCLIBC_DYNAMIC_LINKER=/tools/lib/" to add more stuff to
/tools natively.)</p>

<p>The compiler wrapper (sources/toys/ccwrap.c) can now use
architecture-specific WRAPPER_TOPDIR values.  (I.E. armv4l-cc could
"export armv4l_WRAPPER_TOPDIR=/path/to/directory".)  This makes
canadian cross compiles a lot easier.</p>

<h2><a name=04-02-2009 />April 2, 2009</h2>
<p><a href=downloads/firmware-0.9.6.tar.bz2>Version 0.9.6</a> includes
Linux 2.6.29 and uClibc, now with support for sh4 and upgraded powerpc

<p>The big news is the <a href=>Gentoo
From Scratch</a> project, which extends a FWL system image into a Gentoo
Stage 1 environment, building natively inside qemu.</p>

<p>The <a href=documentation.html>documentation</a> has been extensively
rewritten (but needs more).  The source now contains a README and each image
has a usr/src/MANIFEST file listing the packages it built from.</p>

<p>The cross and native toolchains now include ldd, readelf, and
ldconfig.  Added support for hardware targets (an unfinished example
of which is hw-wrt610n) that use the same cross compiler and system
image as a qemu platform, but build/package a different kernel to boot
on actual hardware.</p>

<p>Several new build options:</p>
<li><p><b>$SYSIMAGE_TYPE</b> defaults to "ext2" but can now
produce and boot "initramfs" images as well. (And squashfs, but that doesn't
work yet due to missing features in squashfs tools version 3.4.)</p></li>
<li><p>Setting <b>$HOST_BUILD_EXTRA</b> compiles qemu 0.10.1 in
You currently need to do this to run sh4 or powerpc, 0.10.1 has some bugs
needing patches.  Not on by default because it takes a _long_ time.</p></li>
<li><p><b>$NO_CLEANUP</b> keeps source around after builds for debugging purposes.</p></li>
<li><p><b>$SYSIMAGE_HDA_MEGS</b> lets you control the size of the ext2 system images.</p></li>
<li><p><b>$SNAPSHOT_SYMLINK</b> lets the extracted source live on a different
filesystem than the build happens on.  (Once the updated squashfs userspace
tools ship, may be updated to use this.)</p></li>
<li><p><b>$CROSS_SMOKE_TEST</b> use qemu application emulation to test run hello
world program at the end of the cross compiler build stage.</p></li>
<li><p><b>$SKIP_STAGE_TARBALLS</b> don't create tarballs of each stage,
just populate the directories.</p></li>
<li><p><b>$NATIVE_RETROFIT_CXX</b> retroactively add uClibc++ to the cross
compiler tarball during the native build stage.</p></li>

<p>The scripts of system images have several new options,
do "./ --help" for a list.  Takes several environment
variables such as $QEMU_EXTRA and $KERNEL_EXTRA.  Root filesystems can
now run in read only mode with "KERNEL_EXTRA=ro".</p>

<p>Lots of build infrastructure upgrades.  The build stages have been
reorganized somewhat (most noticeably is now called  The "sources/packages" directory has moved up a
directory (to separate repository files from stuff downloaded at runtime).
Upgrades to the cc wrapper and the USE_UNSTABLE infrastructure.  Better
stripping of the cross compilers and system images, so everything's a bit
smaller.  The mirror list now lives in  New is a
wrapper around  New builds them under
qemu; set FORK=1 to build them in paralell just like  The
ext2 system images are now built at a small size with genext2fs and
then expanded with resize2fs (because genext2fs slows down exponentially
as size increases; this means e2fsprogs is built in now).
Distcc has been upgraded, and should work more reliably now.</p>

<p>Too many little bug fixes to list.</p>

<h2><a name=12-16-2008 />December 16, 2008</h2>
<p>The mailing list moved to firmware at  The link in
the nav bar on the left has changed, but the
<a href=>old
archives</a> are still there for the moment.</p>

<h2><a name=12-03-2008 />December 3, 2008</h2>
<p>After several false starts (I.E. last minute bugs, yes I test this thing
before shipping it),
<a href=downloads/firmware-0.9.5.tar.bz2>Version 0.9.5</a> is out, inching
towards a 1.0 release.  Lots of new work this time.</p>

<p>The biggest news is uClibc 0.9.30 and uClibc++ 0.2.2.  The native toolchain
now supports C++, hooked up to distcc and everything.</p>

<p>The <a href=documentation.html>documentation</a> has been extensively
rewritten.  (There's always more to do, but most of it isn't horribly out
of date anymore.)</p>

<p>The packaging stage now uses genext2fs instead of User Mode Linux, so
the most brittle part of the build has been removed.  FWL can now fully
rebuild itself under itself, all the way through the packaging stage.</p>

<p>My personal website's getting a touch overwhelmed, so a higher bandwidth
site is now available at
<a href=></a>.  This should become
the new primary website going forward.</p>

<p>BusyBox has also been upgraded (to 1.13.0), and the new USE_UNSTABLE
infrastructure allows test versions of any package to be downloaded and built
without forking the build scripts, so future package upgrades can be dealt
with as side projects without blocking other important work.</p>

<p>The packaging stage now uses genext2fs instead of User Mode Linux, so
the most brittle part of the build has been removed.  FWL can now fully
rebuild itself under itself, all the way through the packaging stage.</p>

<p>The old forkbomb script has been replaced with sources/
with an argument --fork to build all targets in parallel, and "--fork 3"
to limit the parallelism.  This script can run from a cron job, producing
a "buildall" directory with tarballs, compressed logs, and a README file
listing the version of each package.  The environment variable USE_STATIC_HOST
specifies an $ARCH to create statically linked cross compilers
for.  (The build will then try to use them for the later stages,
and won't get far if you specify an arch that can't run on the host.)</p>

<p>The script has been broken up, with a new sources/
containing shell functions (like download, setupfor, and cleanup) and
a new "config" setting the user-editable environment variables that control
the build.  Several of these variables have been renamed and their number has
grown.  You can now specify the colors for each build stage using the variables
at the end of config.</p>

<p>Building mini-native in a Linux From Scratch style /tools directory is
no longer the default.  Instead set NATIVE_TOOLSDIR=1 if you want that
kind of layout instead of a more conventional layout.  (Similarly,
NATIVE_TOOLCHAIN=1 now enables the native toolchain, but that variable
defaults to enabled in config.)</p>

<p>See the <a href=documentation.html>docs</a> for details.</p>

<h2><a name=08-06-2008 />August 6, 2008</h2>
<p><a href=downloads/firmware-0.9.0.tar.bz2>Version 0.9.0</a> is out
(<a href=>changeset 378</a>)
and can rebuild itself under itself.  (The packaging step still requires User
Mode Linux to create ext2 images, which only works on x86 and x86-64 hosts.
The next release should replace that with something more portable.)
The root filesystem is now based on BusyBox 1.11.1 (plus a few bug fixes).</p>

<p>The prebuilt binary images have been moved into their own
<a href=downloads/binaries>binaries</a> directory.
The prebuilt binary <a href=downloads/binaries/cross-compiler>cross
compilers</a> are statically linked against uClibc for better portability.
Updated the <a href=downloads/README>README</a> to better describe the
contents of the <a href=downloads/binaries/system-image>system-image

<p>The script can now take a number of parallel targets to
launch, for example "./ --fork 3".  (The resulting display is kind
of horrible but the out-$ARCH.txt files are still legible.)  Leaving off the
number still builds all targets in parallel, with the original display.</p>

<p>The script was reorganized so that interesting environment
variables the user might want to export for themselves are set near the top
of the script.  Currently this includes:</p>

<li><p><b>BUILD_SHORT</b> - Makes the stage skip building
development tools.  The resulting mini-native root filesystem contains uClibc
and busybox, but nothing else.  (Export "BUILD_SHORT=headers" to put back the
toolchain headers for use by another compiler, such as tinycc.)</p>

<li><p><b>BUILD_STATIC</b> - Tell to create static
binaries, for a more portable cross compiler toolchain.  (If you want them
linked against uClibc, build a mini-native for your host, chroot into it, and
then rebuild under that.)</li>

<li><p><b>PREFERRED_MIRROR</b> - Tell to fetch packages from a
non-default location (falling back to the standard mirror list if it can't get
one from there).</p></li>

<li><p><b>RECORD_COMMANDS</b> - Record a list of all command lines used during
each build stage log files named "cmdlines.$STAGE.$PACKAGE" under the build
directory.  Each file can be turned into a list of the command names used via
"awk '{print $1}' build/cmdlines* | sort -u".  The script
sources/toys/ gives a report of all commands
used by each package after a call to "RECORD_COMMANDS=1 ./".
(This is an easy way to find out exactly what environmental dependencies a
package needs to build, or at least what it uses out of $PATH).</p></li>

<p>Updated documentation is in progress...</p>

<h2><a name=06-06-2008 />June 6, 2008</h2>
<p><a href=downloads/firmware-0.4.0.tar.bz2>Version 0.4.0</a> is out
(<a href=>changeset 345</a>),
with kernel and the "distcc trick" working out of the box.</p>

<p>The distcc trick accelerates a native build by calling out to the
cross compiler.  To use it, download the appropriate cross-compiler-$ARCH and
system-image-$ARCH tarballs, run the "" from the system image
directory with the path to the cross compiler directory as its first argument.
(You need to have distcc installed on the host system.)</p>

<p>After building from source, the cross-compiler and system-image directories
remain in the build directory.  The "" runs these with
distcc acceration set up.  The script "" is a wrapper
around which feeds a script into qemu's stdin to compile
and run a multi-threaded "hello world" under the emulator, using distcc and
the cross compiler.</p>

<p>If works for a platform, it means a lot of stuff worked to get
that far.  The cross compiler worked to build the system, and the emulated
system booted so QEMU, the uClibc config, and the kernel config agreed.
The emulated system has a working virtual hard drive and serial port, and for
distcc to work it has a working virtual network connection.  Running "make"
would also require a working realtime clock.</p>

<p>The seven commands missing in order to run the FWL build under itself
are bzip2, sort, diff, wget, install, od, and find.  (The busybox versions,
where available, had a bug, and they're not in toybox yet.)  I'm trying to
get those in for the next release in September.</p>

<p>Sorry I missed a release back in April.  Shouldn't happen again.</p>

<h2><a name=01-29-2008 />January 29, 2008</h2>
<p><a href=downloads/firmware-0.3.1.tar.bz2>Version 0.3.1</a> is out
(<a href=>changeset 275</a>), with
kernel 2.6.24.  The <a href=downloads/images>images</a>
are now tarballs each containing the ext2, zImage, and run script files.
The run scripts now run by default so /proc, /sys, /dev
and the virtual network are initialized, and the default shell is busybox
ash (so cursor keys and history work).</p>

<p>Sparc is still broken (tracked it down to a dynamic linking bug, I think,
haven't fixed it yet) and m68k is failing to build with an internal compiler
error (next release I should upgrade the compiler).  All the other targets
have a working virtual network, and all but powerpc exit qemu when you
exit the PID 1 command shell.</p>

<p>Building on an x86-64 host< should no longer be insanely slow (the
gcc-min-heapsize arguments that allow 32-bit hosts to build in
128 megs of ram do very impolite things to 64-bit hosts), and the resulting
x86-64 cross compiler should now be properly relocatable.</p>

<p>Better build dependency tracking: the host-tools script is now
populating a single directory with all the commands needed by the build, and
restricting $PATH to that directory (so it can't accidentally call any
commands that aren't explicitly listed).  It's building toybox and busybox to
provide most of these commands (the remaining ones are listed towards the end
of, and creating symlinks to the remaining ones out
of the original $PATH.  This allows it to build on a wider range of host

<h2><a name=11-02-2007 />November 2, 2007</h2>
<p><a href=downloads/firmware-0.3.0.tar.bz2>Version 0.3.0</a> is out
(changeset 242), with kernel 2.6.23.  PowerPC finally works under
qemu (network and everything), and it's building a m68k target
(although I have no emulator to run that).  That means there are
ten targets, of which eight run under qemu.  (Sparc is still
broken, let me know if anybody actually cares.)</p>

<p>The new "./ --fork" script builds all the targets in
parallel, or use --nofork if you haven't got the memory for that
(and --watch to watch and existing build if you ctrl-c out of
the display before it's done).</p>

<p>The build is now smarter about extracting only one copy of the
source code (in build/sources) and re-using it for multiple builds,
building out of tree (via cp -rs to create a tree full of symlinks
so the package doesn't need native out-of-tree support).</p>

<h2><a name=09-02-2007 />September 2, 2007</h2>
<p>Added <a href=new_platform.html>a porting guide</a>.  I'm working on
m68k, ppc, big endian arm, and maybe blackfin targets for the next release,
and thought other people might be interested in the process.  (The vast
majority of it is fiddly debugging.  These are the other steps.)</p>

<h2><a name-06-27-2007 />June 27, 2007</h2>
<p><a href=downloads/firmware-0.2.2.tar.bz2>Version 0.2.2</a> is out
(changeset 185).  Using uClibc 0.9.29 release, several small bugfixes,
new mips big-endian config, actually work when /bin/sh->dash (mostly
by explicitly saying /bin/bash everywhere), automatically detect
the number of CPUs in the machine to feed -j to make, and better
diagnostic output.</p>

<h2><a name=04-09-2007 />April 9, 2007</h2>
<p><a href=downloads/firmware-0.2.1.tar.bz2>Version 0.2.1</a> is out
(changeset 156).  Significant upgrades to armv4l: the native compiler works
now, and it's using soft-float.  Added armv5l and i586 targets to show how
to do that kind of variant.  Added preliminary powerpc support (although
qemu can't run it yet).  Reorganized the download directory and rewrote
the <a href=downloads/README>README</a>.  Added squashfs back (the kernel
supports it, but it's not using it yet).  Moved uClibc to miniconfig.
(Yes, the patch for this is huge, and yes I need to push it all upstream into
the Linux kernel.  On the bright side, this one builds on a host that doesn't
have curses installed.)  Stopped trying to build qemu (at least until they
get the gcc 3.x dependencies cleaned out), now just warn if it's not there
(so far the build only uses it to sanity-test the cross compiler, which is
now skipped automatically if it's not there).</p>

<p>I note that some versions of Ubuntu (Edgy and up) are pushing a political
agenda.  They install bash, but point /bin/sh to dash instead.  (So why
install bash if you're not going to use it?)  This breaks all sorts of things,
and if somebody can tell me how to force make to run "/bin/bash" instead of
"/bin/sh", I'll consider trying to deal with the mess.  Until then, I suggest
"rm /bin/sh; ln -s bash /bin/sh" to get a working system.  (I'm no fan of
bash, but dash is just broken.)</p>

<p>(Those of you who use vi and want to be able to use the cursor keys while
in insert mode might want to do something similar with vi->vim.  Ubuntu seems
to be trying to train users to change their habits.  Dog biscuits would be a
more honest approach.)</p>

<p>Update: I've been pointed at
<a href=>this</a> as evidence Ubuntu isn't
pushing a political agenda.  Ok, maybe it's just really bad technical judgement.
Are they honestly saying that people write shell scripts for the speed?  And
how do you make a size argument and then install bash by default in ADDITION
to the other shell?  Boggle.  In 1991 after Linus Torvalds taught his term
program to understand the minix filesystem so he could upload and download
without rebooting, he taught it to handle the system calls of bash so he could
rm/mv/mkdir without rebooting.  That's where Linux 0.0.1
came from.  Bash was the default Linux shell _before_ 0.0.1.  Be very
careful messing with that kind of a de-facto standard, guys.  Dash is
garbage.  Background a process with &amp; and then hit ctrl-c: it'll kill it.
It doesn't understand blah/{blah,blah} file list syntax.  It can't do
"source" (just ".", which is unreadable).  I repeat: I'm not a
fan of bash (yeah, the bloat's getting crazy), but dash is broken.</p>

<p>And that still doesn't explain why "vi" can't use the cursor keys in
insert mode, but "vim" can...</p>

<h2><a name=03-06-2007 />March 6, 2007</h2>
<p>Version 0.2.0 is out.  This one builds ext2 images which can boot up to a
shell prompt under qemu.  This works on i686, armv4l, x86_64, and mipsel.
(Sparc's broken.  Anyone who cares about sparc is welcome to debug it.)</p>

<p>There are now prebuilt ext2 image files in the download directory.
The kernels are in the mini-native tarballs.  (Yeah, I should repackage that
next release.)  The system emulator invocation for each platform is
the appropriate sources/configs file, and invokes 'em.</p>

<p>The mailing list is in the usual place if you have any questions.</p>

<h2><a name=01-14-2007 />January 14, 2007</h2>
<p>There's a new irc channel for the project, #firmware on freenode.</p>

<p><a href=>Changeset 88</a> builds
i686, x86_64, armv4l, mips, and sparc.  I've made a release tarball of
that (<a href=downloads/firmware-0.1.1.tar.bz2>firmware 0.1.1</a>, "It works
for me"), and updated the prebuilt cross-compiler tarballs in the
<a href=downloads>downloads</a> directory.  I've added a big README and
prebuilt mini-native tarballs for each platform (although packing them up into
something qemu can boot is currently left as an exercise for the reader).</p>

<p>Speaking of which, I'm currently working on adding ext2 packaging
(via <a href=>toybox</a>) to the build scripts,
so qemu system emulation can boot the result and then run the next stage

<h2><a name=12-28-2006 />December 28, 2006</h2>
<p><a href=>Changeset 68</a> builds
a native build environment with a working toolchain.  And in celebration, I've
revamped the website with an actual navigation bar and content and such.</p>

<p>I should put out a release soon.</p>

<h2><a name=12-05-2006 />December 5, 2006</h2>
<p><a href=>Changeset 27</a> builds
a relocatable armv4l cross-compile toolchain!  Download the tarball,
run ./, then run ./, then grab the "build/cross-compiler"
directory and use "bin/armv4l-unknown-linux-gnu-gcc" out of that (which
I admit is a bit of a mouthful, for which I blame the FSF).</p>

<h2><a name=08-06-2006 />August 6, 2006</h2>
<p>Mecurial repository created.  Nothing to see yet, move along...</p>

<!--#include file="footer.html" -->