The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use ExtUtils::MakeMaker;

# pick up our parameters from @ARGV
my %ARGV;
for (@ARGV) {
    if (/^(.*?)\=(.*)/) {
	$ARGV{$1} = $2;
    } else {
	$ARGV{$_} = 1;
    }
    $_ = '' if /^--gdal-config/;
    $_ = '' if /^--no-version-check/;
}

# search and decide which GDAL (gdal-config) to build against

# scan known possible locations in the order of preference:
my @configs;
for ('../../apps/gdal-config',
     'c:/msys/1.0/local/bin/gdal-config',
     '/usr/local/bin/gdal-config',
     '/usr/bin/gdal-config') {
    push @configs, $_ if -r $_;
}
print "Found @configs\n";

my $config;
if ($ARGV{'--gdal-config'}) {
    die "'$ARGV{'--gdal-config'}' does not exist or is unreadable." unless -r $ARGV{'--gdal-config'};
    $config = $ARGV{'--gdal-config'};
} else {
    $config = shift @configs;
}

die "Can't find gdal-config. Please install GDAL development files or\n".
    "define the location of gdal-config using --gdal-config=XXX.\n"
    unless $config;

print "Using $config.\n";

# check that we're part of GDAL distro
# or that installed GDAL version is the same as that in lib/Geo/GDAL.pm 

my $LIB = '';
my $INC = '';
if ($config eq '../../apps/gdal-config') { 
    print "Building against GDAL in this distro tree\n";
    $LIB .= '-L../../.libs -L../.. ';
} elsif ($config eq 'c:/msys/1.0/local/bin/gdal-config') {
    print "Building against GDAL in c:/msys/1.0/local/bin/\n";
    $LIB .= '-Lc:/msys/1.0/local/lib ';
    $INC .= '-Ic:/msys/1.0/local/include ';
} else {
    print "Building against GDAL defined in $config\n";
}

my $gdal_version;
my $pm_version;
my $fh;
if (open($fh, $config)) {
    for (<$fh>) {
	($gdal_version) = /(\d+\.\d+\.\d+)/ if /^CONFIG_VERSION/;
	if (/^CONFIG_LIBS/) {
	    s/^CONFIG_LIBS="//;
	    s/"\s*$//;
	    if ($_ =~ /\.la$/) { 
		# parse a libtool library file
		$LIB .= parse_libtool_library_file_for_l($_);
	    } else {
		$LIB .= $_;
	    }
	    $LIB .= ' ';
	}
	if (/^CONFIG_DEP_LIBS/) {
	    s/^CONFIG_DEP_LIBS="//;
	    s/"\s*$//;
	    $LIB .= $_;
	}
	if (/^CONFIG_CFLAGS/) {
	    s/^CONFIG_CFLAGS="//;
	    s/"\s*$//;
	    $INC .= $_;
	}
    }
    close $fh;
}
if (open($fh, "lib/Geo/GDAL.pm")) {
    for (<$fh>) {
	($pm_version) = /(\d+\.\d+\.\d+)/ if /GDAL_VERSION/;
    }
    close $fh;
} else {
    die "GDAL Perl modules not found, perhaps you need to run make generate?";
}

die "=======================================================\n".
    "PLEASE NOTE!\n".
    "The GDAL that you try to build against has version\n".
    "$gdal_version and this module was released from version\n".
    "$pm_version. These do not match. Building against newer\n".
    "version may work but you need to remove this check first.\n".
    "You can pass by this warning with --no-version-check.\n".
    "Thank you.\n".
    "=======================================================\n"
    if ($gdal_version ne $pm_version) and !$ARGV{'--no-version-check'};

%object = ( 'Geo::GDAL' => 'gdal_wrap.o',
	    'Geo::GDAL::Const' => 'gdalconst_wrap.o',
	    'Geo::OGR' => 'ogr_wrap.o',
	    'Geo::OSR' => 'osr_wrap.o' );

#print "LIB = $LIB\n";
#print "INC = $INC\n";

for my $module (keys %object) {
    my $add = $module;
    $add =~ s/:/_/g;
    WriteMakefile( NAME => $module,
		   VERSION_FROM => 'lib/Geo/GDAL.pm',
		   MAKEFILE => 'Makefile_'.$add,
		   LIBS => $LIB,
		   INC => $INC,
		   OBJECT => $object{$module},
		   PM => {'lib/Geo/GDAL.pm' => '$(INST_LIBDIR)/GDAL.pm',
			  'lib/Geo/OGR.pm' => '$(INST_LIBDIR)/OGR.pm',
			  'lib/Geo/OSR.pm' => '$(INST_LIBDIR)/OSR.pm',
			  'lib/Geo/GDAL/Const.pm' => '$(INST_LIBDIR)/GDAL/Const.pm'}
	);
}

sub parse_libtool_library_file_for_l {
    my $fn = shift;
    my $fh;
    my $l = '';
    if (open($fh, $fn)) {
	while (<$fh>) {
	    if (/^dlname=(.*)/) {
		$l = $1;
		$l =~ s/^'//;
		$l =~ s/^lib/\-l/;
		$l =~ s/\..*$//;
		last;
	    }
	}
	close $fh;
    }
    return $l;
}