/usr/local/CPAN/Net-LibIDN/Makefile.PL


use strict;
use ExtUtils::MakeMaker;
use Getopt::Long;
use Config;

# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.

my $options;
my $testno=1;
my %MakeParams = InitMakeParams();

WriteMakefile(%MakeParams);


sub MY::postamble {	
	"
LibIDN.pm: _LibIDN.pm _test.pl
		perl Makefile.PL $options

test.pl: _test.pl
		perl Makefile.PL $options
"
}

sub InitMakeParams
{
	my %Params =
	(
		'NAME'			=> 'Net::LibIDN',
		'VERSION_FROM'	=> 'LibIDN.pm', # finds $VERSION
		'PREREQ_PM'		=> {}, # e.g., Module::Name => 1.1
		($] >= 5.005 ?	## Add these new keywords supported since 5.005
		(ABSTRACT_FROM	=> 'LibIDN.pm', # retrieve abstract from module
		AUTHOR			=> 'Thomas Jacob <jacob@internet24.de>') : ()),
		PM				=> { 'LibIDN.pm' => '$(INST_LIB)/Net/LibIDN.pm' },
		clean			=> { FILES => "test.pl LibIDN.pm" }
	);
	my ($libdir, $incdir, $disable_tld);

	$options=join(' ', @ARGV);

	GetOptions
	(
		"with-libidn=s" => \$libdir,
		"with-libidn-inc=s" => \$incdir,
		"disable-tld" => \$disable_tld
	);

	if ($libdir)
	{
		$Params{LIBS} = "-L$libdir -lidn";
	}
	else
	{
		$Params{LIBS} = $Config{ldflags} . ' -lidn';
	}

	if ($incdir)
	{
		$Params{INC} = "-I$incdir";
	}
	else
	{
		$Params{INC} = '';
	}

	my $libidn = CheckLibidn($Params{INC}, $Params{LIBS});

	unless($libidn)
	{
		print "This module requires GNU Libidn, which could not be found.\n" unless $libidn;
		exit 0;
	}

	print "Found LibIDN, ";
	print $libidn == 1? "without": "with";
	print " TLD checking support\n";

	if ($libidn == 2 && $disable_tld)
	{
		print "TLD checking support disabled at user request\n";
	}

	$disable_tld = 1 if ($libidn<2);

	if ($disable_tld)
	{
		$Params{DEFINE} = '';
	}
	else
	{
		$Params{DEFINE} = '-DHAVE_TLD';
	}
	FilterTLD("_LibIDN.pm", "LibIDN.pm", !$disable_tld);
	FilterTLD("_test.pl", "test.pl", !$disable_tld);

	return(%Params);
}

sub FilterTLD
{
	my $in = shift;
	my $out = shift;
	my $tld = shift;
	local *IN, *OUT;

	open(IN, "<$in") || die "Can't open file $in\n";
	open(OUT, ">$out") || die "Can't write file $out\n";

	my ($inside, $else);
	while(<IN>)
	{
		if (m/^#IF_TLD/)
		{
			$inside = 1;
			next;
		}
		if (m/^#ELSE_TLD/)
		{
			$else = 1;
			next;
		}
		if (m/^#ENDIF_TLD/)
		{
			$inside = 0;
			$else = 0;
			next;
		}
		if ($inside)
		{
			if ($tld)
			{
				print OUT $_ unless $else;
			}
			elsif($else)
			{
				print OUT $_;
			}
		}
		else
		{
			print OUT $_;
		}
		
	}
}

sub CheckCCode
{
	my $code = shift;
	my $cflags = shift;
	my $ldflags = shift;
	my $output = shift;
	my $test = '__test'.$testno++;
	local * FILE;

	if (open(FILE, ">$test.c"))
	{
		print FILE $code;
		close(FILE);
	}
	else
	{
		return 0;
	}

	foreach my $cc (qw/cc gcc/)
	{
		unlink($test);
		system "$cc $cflags -o $test $test.c $ldflags";
		next if ($? >> 8);

		if (open(FILE, "./$test|"))
		{
			my $match;
			while(<FILE>)
			{
				$match = 1 if $_ eq $output;
				last;
			}
			close(FILE);
			next unless $match;
		}
		else
		{
			next;
		}
		unlink($test);
		unlink("$test.c");
		return 1;
	}
	return 0;
}

sub CheckLibidn
{
	my $cflags = shift;
	my $ldflags = shift;
	my $result;
	my $final;
	local * FILE;

	my $test1 = <<EOT;
#include <idna.h>
#include <stdio.h>
int main(void)
{
	char * output;
	int res;
	
	res = idna_to_ascii_8z("libidn", &output, 0);
	printf("%d-%s", res, output);

	return 0;
}
EOT
	return $result unless CheckCCode($test1, $cflags, $ldflags, "0-libidn");

	$result = 1;

	my $test2 = <<EOT;
#include <tld.h>
#include <stdio.h>
int main(void)
{
	char * output;
	int res;

	res =tld_get_z ("libidn.idn", &output);	
	printf("%d-%s", res, output);
	
	return 0;
}
EOT

	return $result unless CheckCCode($test2, $cflags, $ldflags, "0-idn");
	
	return 2;
}