Index: Makefile
===================================================================
--- Makefile	(revision 7b6c5f4d2b3692c9e99cb9ee960077e1a0d9ba73)
+++ Makefile	(revision cc6f688f354a22e73aa08bf66a55f9faa4fea32c)
@@ -34,57 +34,20 @@
 endif
 
-## Common compiler flags
-#
+SOURCES = \
+	libc \
+	init
 
-DEFS = -DARCH=$(ARCH)
-CFLAGS = -fno-builtin -fomit-frame-pointer -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -nostdlib -nostdinc -Ilibc/include
-LFLAGS = -M
-AFLAGS =
+CLEANS := $(addsuffix .clean,$(SOURCES))
 
-## Setup platform configuration
-#
+.PHONY: all $(SOURCES) $(CLEANS) clean
 
-include libc/arch/$(ARCH)/Makefile.inc
+all: $(SOURCES)
 
-## Toolchain configuration
-#
+clean: $(CLEANS)
+	find $(SOURCES) -name '*.o' -follow -exec rm \{\} \;
 
-ifeq ($(COMPILER),native)
-	CC = gcc
-	AS = as
-	LD = ld
-	OBJCOPY = objcopy
-	OBJDUMP = objdump
-else
-	CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc
-	AS = $(TOOLCHAIN_DIR)/$(TARGET)-as
-	LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld
-	OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy
-	OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump
-endif
+$(CLEANS):
+	$(MAKE) -C $(basename $@) clean ARCH=$(ARCH)
 
-.PHONY: all clean
-
-all: init
-
-clean:
-	-rm -f init init.map _link.ld *.o
-	$(MAKE) -C libc clean ARCH=$(ARCH)
-
-libc/libc.a:
-	$(MAKE) -C libc all ARCH=$(ARCH)
-
-_link.ld: _link.ld.in
-	$(CC) $(DEFS) $(CFLAGS) -E -x c $< | grep -v "^\#" > $@
-
-init: init.o libc/libc.a _link.ld
-	$(LD) -T _link.ld $(LFLAGS) init.o libc/libc.a -o $@ -Map init.map
-
-%.o: %.S
-	$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@
-
-%.o: %.s
-	$(AS) $(AFLAGS) $< -o $@
-
-%.o: %.c
-	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
+$(SOURCES):
+	$(MAKE) -C $@ all ARCH=$(ARCH)
