flatten the make system a little bit by providing only modules as a
compilation unit.

to add a module as a dependency of another, just add to the MODULE make
variable, instead of APPS/LIBS/DEVS
diff --git a/makefile b/makefile
index 8223526..a40bda0 100644
--- a/makefile
+++ b/makefile
@@ -1,15 +1,15 @@
 -include local.mk
 include macros.mk
 
-PROJECT ?= armemu-test
-DEBUG ?= false
+PROJECT ?= beagle-test
+DEBUG ?= 1
 
 BUILDDIR := build-$(PROJECT)
 OUTBIN := $(BUILDDIR)/lk.bin
 OUTELF := $(BUILDDIR)/lk
 CONFIGHEADER := $(BUILDDIR)/config.h
 
-INCLUDES := -Iinclude
+INCLUDES := -I$(BUILDDIR) -Iinclude
 CFLAGS := -O2 -g -fno-builtin -finline -W -Wall -Wno-multichar -Wno-unused-parameter -Wno-unused-function -include $(CONFIGHEADER)
 #CFLAGS += -Werror
 CPPFLAGS := -fno-exceptions -fno-rtti -fno-threadsafe-statics
@@ -21,12 +21,11 @@
 LDFLAGS += -gc-sections
 
 # top level rule
-all:: $(OUTBIN) $(OUTELF).lst $(OUTELF).debug.lst $(OUTELF).sym
+all:: $(OUTBIN) $(OUTELF).lst $(OUTELF).debug.lst $(OUTELF).sym $(OUTELF).size
 
 # the following three object lists are identical except for the ordering
 # which is bootobjs, kobjs, objs
 BOOTOBJS :=	
-KOBJS :=
 OBJS :=
 
 # a linker script needs to be declared in one of the project/target/platform files
@@ -46,15 +45,14 @@
 TARGET :=
 PLATFORM :=
 ARCH :=
-LIBS := libc
-APPS :=
-DEVS :=
+ALLMODULES :=
+MODULES :=
 
 # any rules you put here will also be built by the system before considered being complete
-EXTRA_BUILDDEPS :=
+EXTRA_BUILDDEPS := 
 
 # any rules you put here will be depended on in clean builds
-EXTRA_CLEANDEPS :=
+EXTRA_CLEANDEPS := 
 
 include project/$(PROJECT)/rules.mk
 include target/$(TARGET)/rules.mk
@@ -65,20 +63,15 @@
 include kernel/rules.mk
 include dev/rules.mk
 
-DEVS := $(sort $(DEVS))
-LIBS := $(sort $(LIBS))
-APPS := $(sort $(APPS))
-
-include $(addsuffix /rules.mk,$(addprefix dev/,$(DEVS)))
-include $(addsuffix /rules.mk,$(addprefix lib/,$(LIBS)))
-include $(addsuffix /rules.mk,$(addprefix app/,$(APPS)))
+# recursively include any modules in the MODULE variable, leaving a trail of included
+# modules in the ALLMODULES list
+include module.mk
 
 # any extra top level build dependencies that someone declared
 all:: $(EXTRA_BUILDDEPS)
 
 ALLOBJS := \
 	$(BOOTOBJS) \
-	$(KOBJS) \
 	$(OBJS)
 
 # add some automatic configuration defines
@@ -87,21 +80,21 @@
 	TARGET_$(TARGET)=1 \
 	PLATFORM_$(PLATFORM)=1 \
 	ARCH_$(ARCH)=1 \
-	$(addsuffix =1,$(addprefix WITH_DEV_,$(DEVS))) \
-	$(addsuffix =1,$(addprefix WITH_LIB_,$(LIBS))) \
-	$(addsuffix =1,$(addprefix WITH_APP_,$(APPS)))
+	$(addsuffix =1,$(addprefix WITH_,$(ALLMODULES)))
 
 # debug build?
-ifeq ($(DEBUG),true)
+ifneq ($(DEBUG),)
 DEFINES += \
-	DEBUG=1
+	DEBUG=$(DEBUG)
 endif
 
 ALLOBJS := $(addprefix $(BUILDDIR)/,$(ALLOBJS))
 
 DEPS := $(ALLOBJS:%o=%d)
 
-CC := $(TOOLCHAIN_PREFIX)gcc
+# default to no ccache
+CCACHE ?= 
+CC := $(CCACHE) $(TOOLCHAIN_PREFIX)gcc
 LD := $(TOOLCHAIN_PREFIX)ld
 OBJDUMP := $(TOOLCHAIN_PREFIX)objdump
 OBJCOPY := $(TOOLCHAIN_PREFIX)objcopy
@@ -109,6 +102,10 @@
 SIZE := $(TOOLCHAIN_PREFIX)size
 NM := $(TOOLCHAIN_PREFIX)nm
 
+# comment out or override if you want to see the full output of each command
+NOECHO ?= @
+
+# the logic to compile and link stuff is in here
 include build.mk
 
 clean: $(EXTRA_CLEANDEPS)
@@ -152,4 +149,3 @@
 endif
 
 .PHONY: configheader
-