#!/usr/bin/env ruby

def usage
  print "Usage: ruby #$0 srcdir\n"
  exit(-1)
end

srcdir = ARGV.shift || usage

deps = Hash.new
pros = Hash.new


SUFFIX = ".F90"

def parse(deps, pros, srcdir, dir="")
  dirs = Dir[ File.join(srcdir, dir, "*") ]
  dirs.each do |fdir|
    dir = fdir.sub(/#{srcdir}\//,"")
    next if /\A\./ =~ dir
    parse(deps, pros, srcdir, dir)
    files = Dir[ File.join(fdir, "*#{SUFFIX}") ]
    files.each do |file|
      basename = File.basename(file, SUFFIX)
      dep = {
        :dir => dir,
        :depends => Array.new
      }
      pro = {
        :dir => dir,
        :file => basename
      }
      deps[basename] = dep
      File.foreach(file) do |line|
        case line
        when /^\s*module (\w+)/
          mod = $1
          next if /procedure/ =~ mod
          pros[mod] = pro
        when /^\s*use (\w+)/
          mod = $1
          next if /(dc_types|dc_log|mpi|netcdf|scale_|gadg|rng|NAME)/ =~ mod
          dep[:depends].push(mod) unless dep[:depends].include?(mod)
        end
      end
    end
  end
end

parse(deps, pros, srcdir)

File.open( File.join(srcdir, "depend"), "w" ) do |file|
  deps.sort.each do |name, dep|
    file.print "$(BUILD_DIR)/#{name}.o: #{dep[:dir]}/#{name}.F90 $(DEPENDLIB)"
#    file.print "#{name}.o: #{name}.F90"
    dep[:depends].sort.each do |mod|
      if pro = pros[mod]
        file.print " $(BUILD_DIR)/#{pro[:file]}.o"
      else
        p name
        p mod
        raise
      end
    end
    file.print "\n"
  end
  file.print "\n"
  file.print "MODS =\t\\\n\t", pros.keys.sort.map{|mod| "#{mod.downcase}.mod"}.join("\t\\\n\t"), "\n"
end
