#!/usr/bin/tclsh
# -*- tcl -*-

proc usage {} {
  puts "Usage: build \[-v\] \[clean\]"
  exit -1
}

# use Makefile.template to generate a Makefile
proc create_makefile {target relayfs} {
  if {[catch {open ../Makefile.template r} fd]} {
    puts "ERROR opening ../Makefile.template"
    exit -1
  }
  if {[catch {open Makefile w} mfd]} {
    puts "ERROR creating Makefile"
    exit -1
  }
  while {[gets $fd line] >= 0} {
    if {[regsub XXX $line $target newline]} {
      set line $newline
    }
    if {[regsub RELAYFS $line $relayfs newline]} {
      set line $newline
    }
    puts $mfd $line
  }
  close $fd
  close $mfd
}

proc build {{target ""}} {
  global clean verbose debug
  if {$target == ""} {
    set target [file tail [pwd]]
  }
  if {$clean} {
    puts "Cleaning $target"
    if {[catch {exec make clean >& compile.errors} res]} {
      [exec cat compile.errors]
      exit -1
    }
  } else {
    puts "Building $target"

    if {$debug == ""} {
      if {[catch {exec make >& compile.errors} res]} {
	puts "\n------------ Compile error in $target -------------------\n"
	if {[catch {open compile.errors r} fd]} {
	  puts "Compile failed for unknown reasons"
	  exit -1
	}
	while {[gets $fd line] >= 0} {
	  puts $line
	}
	close $fd
	exit -1 
      } 
    } else {
      if {[catch {exec make debug >& compile.errors} res]} {
	puts "\n------------ Compile error in $target -------------------\n"
	if {[catch {open compile.errors r} fd]} {
	  puts "Compile failed for unknown reasons"
	  exit -1
	}
	while {[gets $fd line] >= 0} {
	  puts $line
	}
	close $fd
	exit -1 
      }
    }

    if {![catch {open compile.errors r} fd]} {
      # search for warnings
      set bad 0
      while {[gets $fd line] >= 0} {
	if {$verbose} {
	  puts $line
	} else {
	  if {[regexp {[^W]*([A-Za-z][A-Za-z0-9_]*)[^\"]*\"([^\"]*)} $line match warn var]} {
	    if {$warn == "Warning"} {
	      switch $var {
		_stp_ctrl_unregister -
		_stp_ctrl_register -
		relay_subbufs_consumed -
		_stp_ctrl_send -
		relay_open -
		relayfs_create_dir -
		relayfs_remove_dir -
		relay_flush -
		relay_switch_subbuf -
		relay_close {}
		default {
		  if {$bad == 0} {
		    puts "\n------------ Unexpected Warnings in $target -------------------\n"
		  }
		  puts $line
		  set bad 1
		}
	      }
	    }
	  }
	}
      }
      close $fd
    }
    if {$bad} {
      exit -1
    }
  }
}

set clean 0
set verbose 0
set debug ""
foreach arg $argv {
  if {$arg == "clean"} {
    set clean 1
  } elseif {$arg == "-v"} {
    set verbose 1
  } elseif {$arg == "debug"} {
    set debug $arg
  } elseif {$arg != ""} {
    usage
  }
}

set relayfs ""
if {![file exists /lib/modules/[exec uname -r]/build/include/linux/relayfs_fs.h]} {
  set relayfs {-I $(RT)/relayfs}
}

if {![catch {open targets r} tfd]} {
  while {[gets $tfd line] >= 0} {
    set target [lindex $line 0]
    create_makefile $target $relayfs
    build $target
    catch {exec /bin/rm Makefile}
  }
  close $tfd
} else {
  if {![file exists Makefile]} {
    puts "Now in [pwd]"
    puts "ERROR: No targets file found and no Makefile either"
    exit -1
  }
  build
}

puts "Done"
catch {exec /bin/rm compile.errors}


