#!/usr/local/bin/perl

$top = `pwd`;
chop($top);
while (! -d "build") {
	chdir("..");
	$top = `pwd`;
	chop($top);
	if ($top eq '/') {
		die "Could not find build directory.  Stopped at";
	}
}

if (-d "pd_make") {
	open(F, "pd_make/build.db") || die "Could not open build.db.  Stopped at";
}
else {
	die "Could not find a pd_make directory.  Stopped at";
}

for (@ARGV) {
	if (/\.o$/ || /\.cpp$/ || /\.c$/) {
		s/\.o$//;
		s/\.cpp$//;
		s/\.c$//;
		push(@files, $_);
		$haveFiles = 1;
	}
	else {
		push(@libs, $_);
		$haveLibs = 1;
	}
}

if ($haveFiles) {
	&compileFiles;
}
elsif ($haveLibs) {
	&compileLibs;
}

sub compileLibs {
	for (@libs) {
		$dir = "build/lib/$_";
		if (-e $dir) {
			chdir($dir);
			system "mk here_obj";
		}
		else {
			warn "Could not find directory: $dir";
		}
	}
}

sub compileFiles {
	@dbLines = <F>;
	close(F);
	for (@files) {
		$file = $_;
		@compile = ();
		for (@dbLines) {
			if (/^#/ || /^\s*$/ || /^\/\//) {
				next;
			}
			$dbLine = $_;
			$str = "$file.cpp";
			if ($dbLine =~ /\/$str/) {
				($dir, $fullFile) = split(/\s+/, $dbLine);
				($srcDir, $file) = split(/\//, $fullFile);
				($file, $suffix) = split(/\./, $file);
				push(@compile, $dir);
			}
		}
		$count = @compile;
		if ($count > 1) {
			for (@compile) {
				$dir = $_;
				($dummy, $subDir) = split(/\//, $_);
				$uniqFile = "${file}_${subDir}";
				&compile($dir, $uniqFile);
			}
		}
		else {
			&compile($dir, $file);
		}
	}
}
	
sub compile {
	local($dir, $file) = @_;
	$dir = "build/$dir";
	chdir($dir);
	$dotO = "$file.o";
	system "mk $dotO";
	chdir($top);
}
