On Wednesday 17 March 2010 10:16:34 David N. Lombard wrote:
> On Mon, Mar 15, 2010 at 03:02:26PM -0700, Rob Landley wrote:
> > On Monday 15 March 2010 04:43:56 Ralf Friedl wrote:
> > > If you place everything in one big include file, with preprocessor
> > > conditions on the definition of THIS, you will trigger a recompile of
> > > all files whenever you change a single file.
> >
> > ... In fact, does
> > anybody except applet developers ever do anything _except_ build all from
> > a clean start?)
>
> That quite true.  Unless I'm specifically chasing something in busybox,
> it's always (re)built completely.  It ensures a linear, well-defined path,
> instead of some random walk.

For toybox, my Makefile's non-phony targets boil down to:

  all: toybox

  toybox toybox_unstripped: .config *.[ch] lib/*.[ch] toys/*.[ch] scripts/*.sh
        scripts/make.sh

And then in make.sh i've got the stuff to regenerate the generated/* stuff 
(which you'll notice the above dependencies do _not_ look at), and then the 
build itself is (with some enviornment variables expanded):

  # Figure out which toys/*.c files are enabled in .config

  TOYFILES=$(cat .config | sed -nr \
    -e 's/^CONFIG_(.*)=y/\1/;t skip;b;:skip;s/_.*//;p' | \
    sort -u | tr A-Z a-z | grep -v '^toybox$' | sed 's...@\(.*\)@toys/\1.c@' )

  # Compile toybox

  $CC $CFLAGS -Wall -Wundef -Wno-char-subscripts -funsigned-char -I . \
    -o toybox_unstripped -Os -ffunction-sections -fdata-sections \
    -Wl,--gc-sections main.c lib/*.c $TOYFILES \
    -Wl,--as-needed,-lutil,--no-as-needed || exit 1
  $STRIP toybox_unstripped -o toybox || exit 1

I wasn't trying to push that part into busybox, but essentially I do a "make 
all" whenever anything changes, and let the compiler discard unneeded code.  
My build logic is fairly simple as a result, and doesn't actually take that 
long.  (When you "make all" as often as I do, you find ways to keep the compile 
time down. :)  Also, if I'm testing just one app I can .config everything else 
off, but mostly I don't bother...

The main downside is that doesn't take advantage of SMP, but that's really a 
compiler issue.  (You can't have the compiler doing gc-sections _and_ take 
proper advantage of SMP until your compiler becomes multi-threaded.  I 
blathered about this topic for way too long at an an OLF bof a few years back, 
http://free-electrons.com/pub/video/2008/ols/ols2008-rob-landley-linux-
compiler.ogg )

As I said, it's still pretty fast anyway.  Admittedly toybox only has about 40 
commands right now and busybox has around 7 times that many.  But toybox takes 
just under 9 seconds to do a defconfig build on my laptop.  With a cold cache, 
current busybox takes about that long to figure out it has nothing to do when 
you type "make" in a directory that's already built everything.  Complicating 
things does not streamline them.

Rob
-- 
Latency is more important than throughput. It's that simple. - Linus Torvalds
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to