#!/usr/bin/perl

##############################################################################
#
#	generate_config_sh
#		Process that takes an automatically generated config.sh
#		file and allows the environment to overload the values
#		automatically discovered by Configure on our target platform.
#
#	Author	Redvers Davies <red@criticalintegration.com>
#
##############################################################################

my $config = shift;

my $sys = env::var('SYS');

my $callbacks = \%();
$callbacks->{+'ar'} = \@(\&simple_process, \@("AR", "arm-linux-ar"));
$callbacks->{+'archname'} = \@(\&simple_process, \@("SYS", "armv4l-linux"));
$callbacks->{+'cc'} = \@(\&simple_process, \@("CC", "arm-linux-gcc"));
$callbacks->{+'cccdlflags'} = \@(\&simple_process, \@("CFLAGS", ""));
$callbacks->{+'ccdlflags'} = \@(\&simple_process, \@("CFLAGS", ""));
$callbacks->{+'ccflags'} = \@(\&simple_process, \@("CFLAGS", "-fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"));
$callbacks->{+'ccflags_uselargefiles'} = \@(\&simple_process, \@("CFLAGS", "-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"));
$callbacks->{+'ccname'} = \@(\&simple_process, \@("CC", "arm-linux-gcc"));
$callbacks->{+'cpp'} = \@(\&simple_process, \@("CCP", "arm-linux-cpp"));
$callbacks->{+'cppflags'} = \@(\&simple_process, \@("CCPFLAGS", "-fno-strict-aliasing"));
$callbacks->{+'cpprun'} = \@(\&simple_process_append, \@("CC", "arm-linux-gcc -E", "-E"));
$callbacks->{+'cppstdin'} = \@(\&simple_process_append, \@("CC", "arm-linux-gcc -E", "-E"));
$callbacks->{+'full_ar'} = \@(\&backtick, \@("AR", "which $(env::var('AR'))", "/usr/local/arm/2.95.3/bin/arm-linux-ar"));
$callbacks->{+'ld'} = \@(\&simple_process, \@("LD", "arm-linux-ld"));
$callbacks->{+'ldflags'} = \@(\&simple_process, \@("LDFLAGS", ""));
$callbacks->{+'ldflags_uselargefiles'} = \@(\&simple_process, \@("LDFLAGS", ""));
$callbacks->{+'myarchname'} = \@(\&simple_process, \@("SYS", "armv4l-linux"));
$callbacks->{+'archlib'} = \@(\&library_munge, \@("SYS", "armv4l-linux"));
$callbacks->{+'archlibexp'} = \@(\&library_munge, \@("SYS", "armv4l-linux"));
$callbacks->{+'installarchlib'} = \@(\&library_munge, \@("SYS", "armv4l-linux"));
$callbacks->{+'installsitearch'} = \@(\&library_munge, \@("SYS", "armv4l-linux"));
$callbacks->{+'sitearch'} = \@(\&library_munge, \@("SYS", "armv4l-linux"));
$callbacks->{+'sitearchexp'} = \@(\&library_munge, \@("SYS", "armv4l-linux"));

if ($config eq "") {
	die("Please run me as generate_config_sh path/to/original/config.sh");
}

open(FILE, "$config") || die("Unable to open $config");

my $line_in;
while ($line_in = ~< *FILE) {
	if ($line_in =~ m/^#/) {
		next;
	}

	if ($line_in !~ m/./) {
		next;
	}

	$line_in =~ m/^([^=]+)=(.*)/;
	my $key = $1;
	my $value = $2;
	if (ref($callbacks->{?$key}) eq "ARRAY") {
		($callbacks->{$key}->[0])->($key,$value);
	} else {
		print($line_in);
	}
}

sub backtick {
	my $key = shift;
	my $value = shift;
	my $envvar = $callbacks->{$key}->[1]->[0];

	if (env::var($envvar)) {
		my $rawtext = `$callbacks->{$key}->[1][1]`;
		chomp($rawtext);
		print("$key=\'$rawtext\'\n");
	} else {
		print("$key=\'$callbacks->{$key}->[1]->[2]\'\n");
	}
}
	

sub simple_process {
	my $key = shift;
	my $envvar = $callbacks->{$key}->[1]->[0];

	if (env::var($envvar)) {
		print("$key=\"$(env::var($envvar))\"\n");
	} else {
		print("$key=\'$callbacks->{$key}->[1]->[1]\'\n");
	}

}

sub simple_process_append {
	my $key = shift;
	my $envvar = $callbacks->{$key}->[1]->[0];

	if (env::var($envvar)) {
		print("$key=\"$(env::var($envvar)) $callbacks->{$key}->[1]->[2]\"\n");
	} else {
		print("$key=\'$callbacks->{$key}->[1]->[1]\'\n");
	}

}

sub library_munge {
	my $key = shift;
	my $value = shift;
	my $envvar = $callbacks->{$key}->[1]->[0];

	if (env::var($envvar)) {
		$value =~ s/$callbacks->{$key}->[1]->[1]/$(env::var($envvar))/g;
		print("$key=$value\n");
	} else {
		print("$key=$value\n");
	}
		
}












