# -*- ruby -*-

#
# Rakefile for Houken unittest
#

require 'fileutils'

task :default => [:parser, :tester, :run]


$parserDir = '..'
$parserSrcDir = $parserDir + '/src'
$objDir = 'obj'

parserLib = $parserDir + '/libhouken.a'

$ldflags = ['-static', '-L/usr/local/lib', '-lcppunit']
$cppflags = ["-g", "-I#{$parserSrcDir}"]
target = 'tester.exe'

srcs = FileList['*.cpp']
objs = srcs.ext('.o').map{|f| $objDir + '/' + f}
deps = srcs.ext('.d').map{|f| $objDir + '/' + f}


def makeDepend (srcFile)
  depFile = $objDir + '/' + srcFile.sub(/\.cpp$/, '.d')
  puts "makind #{depFile} ..."
  target = dep = nil
  open("| g++ -MM #{$cppflags.join(' ')} #{srcFile}") do |fd|
    target,dep = fd.read.gsub(/\\\s/, '').split(':', 2)
  end
  depends = dep.split(/\s+/)
  depends.delete('')
  target = $objDir + '/' + target
  open(depFile, 'w') do |out|
    a = ([target] + depends).join(',')
    out.puts a
  end
  file target => depends do
    sh 'g++', '-Wall', '-c', '-o', target, *($cppflags + [srcFile])
  end
end


def readDepend (srcFile)
  depFile = $objDir + '/' + srcFile.sub(/\.cpp$/, '.d')
  begin
    open(depFile) do |fd|
      depends = fd.read.chomp.split(',')
      target = depends.shift
      file target => depends do
        sh 'g++', '-Wall', '-c', '-o', target, *($cppflags + [srcFile])
      end
    end
    return true
  rescue Errno::ENOENT
    return false
  end
end


task :depend do
  srcs.each do |src|
    readDepend(src) or makeDepend(src)
  end
end


desc "build parser"
task :parser do
  sh "(cd #{$parserDir}; rake)"
end

file parserLib => :parser


desc "build tester"
task :tester => [:depend, target]

file target => [parserLib]+objs do
  sh 'g++', '-o', target, *(objs.to_a + [parserLib] + $ldflags)
end


desc "run tester"
task :run => target do
  sh './' + target
end


desc "cleanup unittest binaries"
task :clean do
  FileUtils.rm_f(Dir[target + '*'], :verbose => true)
  FileUtils.rm_f(Dir[$objDir + '/*.o'], :verbose => true)
  FileUtils.rm_f(Dir[$objDir + '/*.d'], :verbose => true)
end

task :parserclean do
  sh "(cd #{$parserDir}; rake clean)"
end

task :allclean => [:clean, :parserclean]
