Index: Makefile
===================================================================
--- Makefile	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
+++ Makefile	(revision 656437a0d8513459f1bc36bb837969801023cf4c)
@@ -30,5 +30,8 @@
 #
 
-.PHONY: all config config_default distclean clean cscope
+CSCOPE = cscope.out
+STANSE = stanse
+
+.PHONY: all config config_default distclean clean cscope stanse
 
 all: Makefile.config config.h config.defs
@@ -36,4 +39,12 @@
 	$(MAKE) -C uspace
 	$(MAKE) -C boot
+
+stanse: Makefile.config config.h config.defs
+	$(MAKE) -C kernel clean
+	$(MAKE) -C kernel EXTRA_TOOL=stanse
+	$(STANSE) --checker ReachabilityChecker --jobfile kernel/kernel.job
+
+cscope:
+	find kernel boot uspace -regex '^.*\.[chsS]$$' | xargs cscope -b -k -u -f$(CSCOPE)
 
 Makefile.config: config_default
@@ -50,13 +61,8 @@
 
 distclean: clean
-	rm -f Makefile.config config.h config.defs tools/*.pyc
+	rm -f $(CSCOPE) Makefile.config config.h config.defs tools/*.pyc
 
 clean:
-	-$(MAKE) -C kernel clean
-	-$(MAKE) -C uspace clean
-	-$(MAKE) -C boot clean
-
-cscope:
-	find kernel boot uspace -regex '^.*\.[chsS]$$' -print > srclist
-	rm -f cscope.out
-	cscope -bi srclist
+	$(MAKE) -C kernel clean
+	$(MAKE) -C uspace clean
+	$(MAKE) -C boot clean
Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
+++ kernel/Makefile	(revision 656437a0d8513459f1bc36bb837969801023cf4c)
@@ -33,7 +33,8 @@
 all: ../version ../Makefile.config ../config.h ../config.defs
 	-[ -f $(DEPEND) ] && mv -f $(DEPEND) $(DEPEND_PREV)
-	$(MAKE) -f Makefile.build
+	$(MAKE) -f Makefile.build EXTRA_TOOL=$(EXTRA_TOOL)
 
 clean:
-	rm -f $(DEPEND) $(DEPEND_PREV) $(RAW) $(BIN) $(MAP) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* $(ARCH_INCLUDE) $(GENARCH_INCLUDE) arch/*/_link.ld
+	rm -f $(DEPEND) $(DEPEND_PREV) $(RAW) $(BIN) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* $(ARCH_INCLUDE) $(GENARCH_INCLUDE) arch/*/_link.ld
 	find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm \{\} \;
+	find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o.preproc' -follow -exec rm \{\} \;
Index: kernel/Makefile.build
===================================================================
--- kernel/Makefile.build	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
+++ kernel/Makefile.build	(revision 656437a0d8513459f1bc36bb837969801023cf4c)
@@ -110,5 +110,5 @@
 ifeq ($(COMPILER),gcc_native)
 	CC = gcc
-	GCC = $(CC)
+	GCC = gcc
 	AS = $(BINUTILS_PREFIX)as
 	LD = $(BINUTILS_PREFIX)ld
@@ -168,4 +168,5 @@
 	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
 endif
+
 
 ## Generic kernel sources
@@ -384,4 +385,7 @@
 test/fpu/%.o: test/fpu/%.c $(DEPEND)
 	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c $< -o $@
+ifeq ($(EXTRA_TOOL),stanse)
+	../tools/jobfile.py $(JOB) $< $@ $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
+endif
 
 #
@@ -390,4 +394,7 @@
 %.o: %.c $(DEPEND)
 	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) -c $< -o $@
+ifeq ($(EXTRA_TOOL),stanse)
+	../tools/jobfile.py $(JOB) $< $@ $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS)
+endif
 
 $(REAL_MAP).o: $(REAL_MAP).bin
Index: kernel/Makefile.common
===================================================================
--- kernel/Makefile.common	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
+++ kernel/Makefile.common	(revision 656437a0d8513459f1bc36bb837969801023cf4c)
@@ -36,4 +36,5 @@
 BIN = kernel.bin
 MAP = kernel.map
+JOB = kernel.job
 MAP_PREV = $(MAP).prev
 DISASM = kernel.disasm
Index: tools/jobfile.py
===================================================================
--- tools/jobfile.py	(revision 656437a0d8513459f1bc36bb837969801023cf4c)
+++ tools/jobfile.py	(revision 656437a0d8513459f1bc36bb837969801023cf4c)
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2009 Martin Decky
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+"""
+Add a source/object file pair to a Stanse jobfile
+"""
+
+import sys
+import os
+
+def usage(prname):
+	"Print usage syntax"
+	print prname + " <JOBFILE> <SOURCE> <OBJECT> [OPTIONS ...]"
+
+def main():
+	if (len(sys.argv) < 4):
+		usage(sys.argv[0])
+		return
+	
+	jobfname = sys.argv[1]
+	srcfname = sys.argv[2]
+	objfname = sys.argv[3]
+	cwd = os.getcwd()
+	options = " ".join(sys.argv[4:])
+	
+	if (os.path.isfile(jobfname)):
+		jobfile = file(jobfname, "r")
+		records = jobfile.read().split("\n")
+		jobfile.close()
+	else:
+		records = []
+	
+	records.append("{%s},{%s},{%s},{%s}" % (srcfname, objfname, cwd, options))
+	
+	jobfile = file(jobfname, "w")
+	jobfile.write("\n".join(records))
+	jobfile.close()
+
+if __name__ == '__main__':
+	main()
