#!/usr/bin/perl


sub build_depends{
local(*INCDIR,*SRCDIR,$OUTFILE) = @_;
#open(OUTFILE,">$FILENAME") || die "Can't open $FILENAME\n";

@incfiles = ();
foreach $incdir (@INCDIR) {
    opendir(DIR, $incdir) || die "Can't open $incdir. $!\n";
    @filenames = readdir(DIR);
    foreach (@filenames) {(/.h$/) && push(@incfiles, "$incdir/$_");}
    closedir(DIR);
}

@srcfiles = ();
foreach $srcdir (@SRCDIR) {
    opendir(DIR, $srcdir) || die "Can't open $srcdir. $!\n";
    @filenames = readdir(DIR);
    foreach (@filenames) {
	(/.[cC]$/) && push(@srcfiles, "$srcdir/$_");
    }
    closedir(DIR);
}
foreach $srcdir (@SRCDIR) {
    opendir(DIR, $srcdir) || die "Can't open $srcdir. $!\n";
    @filenames = readdir(DIR);
    foreach (@filenames) {
	(/.cpp$/) && push(@srcfiles, "$srcdir/$_");
    }
    closedir(DIR);
}

foreach $incfile (@incfiles) {
    open(INCFILE, "<$incfile") || die "Can't open $incfile. $!\n";
    foreach (<INCFILE>) {
	if (/^#include\s+"(.*)"/) {
	    @list = grep(/\/$1$/, @incfiles);
	    if ($#list >= 0) {
		$includes{$incfile} .= join(' ', @list) . ' ';
	    }
	}
    }
    close(INCFILE);
}

foreach $srcfile (@srcfiles) {

    $objfile = $srcfile;
    $objfile =~ s/(.*)\///;
    $original = $objfile;
    $original =~ s/^.*\.//;
    $objfile =~ s/\.cpp/\.o/;
    $objfile =~ s/\.[cC]/\.o/;

    $deplist = "";
    open(SRCFILE, "<$srcfile") || die "Can't open $srcfile. $!\n";
    foreach (<SRCFILE>) {
	if (/^#include\s+"(.*)"/) {
 	    @list = grep(/\/$1$/, @incfiles);
	    foreach (@list) {
		$deplist .= $_ . ' ' . $includes{$_} . ' ';
	    }
	}
    }
    close(SRCFILE);

    $prev = "";
    @newlist = ($srcfile);
    foreach (sort split(/\s+/, $deplist)) {
	(/^$prev$/) || push(@newlist, $_);
	$prev = $_;
    }

    $list = join(' ', @newlist);

#    $list =~ s/^(.{40}\S+)(.*)/\1 \\\n        \2/;
#    while ($list =~ s/(\n^.{60}\S+)(.*)$/\1 \\\n        \2/){}
    $list =~ s/^(.{40}\S* )(.+)/\1\\\n        \2/;
    while ($list =~ s/(\n^.{50}\S* )(.+)$/\1\\\n\t\2/){}

    print OUTFILE "$objfile : $list";
    print OUTFILE "\n";
    if($original eq "cpp") {
	print OUTFILE "\t\$(CXX) -c \$(CFLAGS) $srcfile -o \$@\n";
    }
    else {
	print OUTFILE "\t\$(CC) -c \$(CFLAGS) $srcfile -o \$@\n";
    }
#    print OUTFILE "\t\$(CC) -c \$(CFLAGS) $srcfile -o \$@\n";
    print OUTFILE "\n";
}
#close(OUTFILE);

}

@INCDIR = ("../Obj"); #,"../lib/DSuperLU/SRC");# list of include directories
@SRCDIR = ("../Obj","../examples");       # list of src directories
$FILENAME = "depends.ml";
open(OUTFILE,">$FILENAME") || die "Can't open $FILENAME\n";
&build_depends(*INCDIR,*SRCDIR,OUTFILE);
close(OUTFILE);

#@INCDIR = ("../SRC","../CBLAS");# list of include directories
#@SRCDIR = ("../SRC","../CBLAS");           # list of src directories
#$FILENAME = "depends.superlu";

#open(OUTFILE,">$FILENAME") || die "Can't open $FILENAME\n";
#$chdir "../lib/DSuperLU/SRC" || die "Can't cd to director\n";
#&build_depends(*INCDIR,*SRCDIR,OUTFILE);
#close(OUTFILE);
