#!/usr/bin/perl
#
# Compatible with GNU autoconf version 2.12
#                 GNU automake version 1.3
#		  RPM version 3.0

$NAME = "autospec";
$AUTHOR = "Stephen Rust";
$COPYRIGHT = "Copyright (C) 1998";
$EMAIL = "<steve\@tp.org>";
$VERSION = "Version 0.6";
$prefix = "/usr";
$verbose=0;

chomp($release = `date +%y%m%d`);

sub version
{
	print "$NAME  $VERSION $COPYRIGHT $AUTHOR $EMAIL\n";
	exit;
}

sub usage
{
        print "Usage:\n";
	print "\t$NAME [-f -h] [-c <configfile>] <source directory> [outfile]\n";
	print "\t          -f   Force overwrite of outfile.\n";
	print "\t          -v   Verbose output\n";
	print "\t          --version Print version\n";
	print "\t          -h   This help screen.\n";
	exit;
}

if ((scalar @ARGV) < 1 or (scalar @ARGV) > 5) {
	&usage;
}

foreach $arg (@ARGV) {
	if ($arg eq "-f") {
		$force = 1;
	}
	elsif ($arg eq "-h") {
		&usage;
	}
	elsif ($arg eq "--version") {
		&version;
	}
	elsif ($arg eq "-v") {
		$verbose=1;
	}
	elsif ($arg eq "-c") {
		print "$NAME: -c option not supported yet\n";
	}
	elsif (!$inputdir) {
		$inputdir = $arg;
	}
	elsif (!$outfile) {
		$outfile = $arg;
	}
	else {
		&usage;
	}
}	

if ( ! -d "$inputdir") {
	print "$NAME: Input directory doesn't exist, or is not a directory.\n";
	&usage;
}

if (!$outfile) {
	$outfile = "$inputdir.spec";
}

if ( -e "$outfile" && !$force) {
	print "$NAME: $outfile exists, use -f option to force overwrite.\n";
	&usage;
}

chdir $inputdir;

if ( -e "autogen.sh") {
	$autogen = 1;
}

if ( ! -e "config.status") {
	if ($verbose ne 0) {
		print "$NAME: config.status doesn't exist.\n";
	}
	if ($autogen) {
		if ($verbose ne 0) {
			print "$NAME: running autogen.sh --no-create\n";
		}
		system('./autogen.sh --no-create');
	}
	elsif ( -e "configure") {
		if ($verbose ne 0) {
			print "$NAME: running configure --no-create\n";
		}
		system('./configure --no-create');
	}
	else {
		print "$NAME: neither autogen.sh or configure found, please check ";
		print "directory.\n";
		exit;
	}
}

if ( ! -e "config.status") {
	print "$NAME: config.status still doesn't exist, please check directory.\n";
	exit;
}

if (! -e "Makefile") {
	print "$NAME: No Makefile found, please ready source for an installation.\n";
	print "$NAME: (i.e: Run 'make' to your specifications)\n";
	exit;
}

open(CONFIG, "config.status");
@config = <CONFIG>;
close(CONFIG);

foreach $line (@config) {
	if ($line =~ /s\%\@VERSION\@\%/) {
		@temp = split('%', $line);
		$version = $temp[(scalar @temp)-2];
	}
	elsif ($line =~ /s\%\@prefix\@\%/) {
		@temp = split('%', $line);
		$prefix = $temp[(scalar @temp)-2];
	}
}

if (!$version) {
	if ($verbose ne 0) {
		print "$NAME: No version found, using 'unknown'.\n";
	}
	$version = "unknown";
}
else {
	if ($verbose ne 0) {
		print "$NAME: $inputdir version: $version\n";
	}
}

if (!$prefix) {
	if ($verbose ne 0) {
		print "$NAME: No prefix found, using '/usr/local'.\n";
	}
	$prefix = "/usr/local";
}
else {
	if ($verbose ne 0) {
		print "$NAME: Installation prefix: $prefix\n";
	}
}

if ($verbose ne 0) {
	print "$NAME: running 'geninstallfiles', grabbing install info\n";
}
system("geninstallfiles");
@input = `./geninstallfiles.sh`;

foreach $line (@input) {
	chomp($line);
	$final{$line} = "";
}

@final = sort keys %final;

open(OUTFILE, ">$outfile");

print OUTFILE "%define ver\t$version\n";
print OUTFILE "%define rel\t$release\n";
print OUTFILE "%define prefix\t$prefix\n";
print OUTFILE "%define cc\tgcc\n";

print OUTFILE "Name: $inputdir\n";
print OUTFILE "Version: %ver\n";
print OUTFILE "Release: %rel\n";

open(COPY, "$inputdir/COPYING");
read(COPY, $copyright, 80);
if ($copyright =~ /LIBRARY/) {
	print OUTFILE "Copyright: LGPL\n";
}
else {
	print OUTFILE "Copyright: GPL\n";
}
close(COPY);

$source = "$inputdir-$version-$release.tar.gz";

print OUTFILE "Source: $source\n";
print OUTFILE "URL: http://insert.url.here/$source\n";
print OUTFILE "Summary: $inputdir\n";
print OUTFILE "Group: ";

if ($copyright =~ /LIBRARY/) {
	print OUTFILE "Libraries\n";
}
else {
	print OUTFILE "Applications\n";
}

print OUTFILE "\n\n%description\n";

close(README);

open (README, "README");
while ($line = <README>) {
	print OUTFILE "$line";
}
close(README);

print OUTFILE "\n\n%prep\n%setup\n%build\n";

if ($autogen) {
	print OUTFILE "./autogen.sh --prefix=%prefix\n";
}
else {
	print OUTFILE "./configure --prefix=%prefix\n";
}

print OUTFILE "make\n\n";

print OUTFILE "%install\nrm -rf \$RPM_BUILD_ROOT\n\nmake install\n\n";
print OUTFILE "%clean\nrm -rf \$RPM_BUILD_ROOT\n\n";
print OUTFILE "%post -p /sbin/ldconfig\n\n%postun -p /sbin/ldconfig\n\n";

print OUTFILE "%files\n%defattr(-, root, root)\n";
foreach $file (@final) {
	if (!$outfiles{$file}) {
		$outfiles{$file} = 1;
		print OUTFILE "$file\n";	
	}
}
close(OUTFILE);

if ($verbose ne 0) {
	print "$NAME: $outfile written.\n";
}
