Add Jmk2 build system, port lisp to it
diff --git a/share/jmk/jmk.tcl b/share/jmk/jmk.tcl
index 36c65a9..d1de805 100644
--- a/share/jmk/jmk.tcl
+++ b/share/jmk/jmk.tcl
@@ -8,7 +8,11 @@
 variable asm as
 variable cc cc
 
-variable options
+# variable options
+
+variable src \$^
+variable first_src \$<
+variable target \$@
 
 proc init {name {target {DEFAULT_TARGET}}} {
 	if {$target eq {DEFAULT_TARGET}} {
@@ -20,6 +24,10 @@
 
 	set jmk_name $name
 	set jmk_target $target
+
+	puts {MAKEFILE_DEPTH ?= 1}
+
+	rule all $target {}
 }
 
 proc preset {p} {
@@ -61,7 +69,82 @@
 	}
 }
 
+proc log {category message} {
+	puts "\t@printf '\\e\[1;34m%8s\\e\[m  %s\\n' '$category' '$message' > /dev/stderr"
+}
+
+proc cc {command} {
+	puts "\t@$::cc $command $::cflags"
+}
+
+proc asm {command} {
+	puts "\t@$::asm $command $::asmflags"
+}
+
+proc shell {command} {
+	puts "\t@$command"
+}
+
+proc rule {target deps does} {
+	puts ""
+	puts "$target: $deps"
+	eval $does
+}
+
+proc type {type} {
+	::type::$type
+}
+
+proc srcs {args} {
+	puts ""
+	variable objs ""
+
+	foreach src $args {
+		variable obj [regsub -- {(.+)\.\w+} $src {\1.o}]
+		variable objs "$objs $obj"
+	}
+
+	puts "OBJECTS += $objs"
+}
+
+namespace eval type {
+	proc executable {} {
+		global jmk_target
+
+		rule $jmk_target "\$(OBJECTS)" {
+			log LD $::target
+			cc "-o $::target $::src"
+		}
+
+		helpers
+	}
+
+proc helpers {} {
+	rule .c.o {} {
+		log CC $::first_src
+		cc "-c $::first_src -o $::target"
+	}
+
+	rule .s.o {} {
+		log ASM $::first_src
+		asm "\$(ASMFLAGS) $::first_src -o $::target"
+	}
+
+	rule clean {} {
+		shell "rm -f **/*.o **/*.a *.so $::target \$(OBJECTS)"
+	}
+}	
+}
+
 namespace eval preset {
+	proc freestanding {} {
+		cflags -nostdlib -nostdinc -fno-builtin -fno-stack-protector -ffreestanding
+	}
+
+	proc optimize {} {
+		cflags -O2
+	}
+	
 	proc 32 {} {
 		cflag -m32
 		asmflag -felf32
@@ -73,7 +156,7 @@
 	}
 
 	proc warn {} {
-		cflag "-Wall -Wextra -Werror"
+		cflags -Wall -Wextra -Wno-unused-function -Wno-unused-variable -Wno-incompatible-pointer-types -Werror
 	}
 
 	proc nasm {} {
@@ -81,9 +164,3 @@
 		set asm nasm
 	}
 }
-
-if {[catch {array set options $argv} msg]} {
-	puts "Sorry, you must pass an even number of arguments to this script"
-	puts "in the form <key> <value>"
-	exit 1
-}