#!/usr/bin/perl

use strict;
use FindBin;
use File::Spec;
use Config;
use inc::Module::Install;

BEGIN {
    if ($^O eq 'cygwin') {
	die << "."
** Cygwin currently unsupported on Win32; please use ActivePerl or MinGW Perl
   instead, with the .msi installer of GHC.
.
    }
}
	

chdir $FindBin::Bin;

my $pugs = "pugs$Config{_exe}";
my $full_pugs = File::Spec->catfile($FindBin::Bin, $pugs);
my $full_t = File::Spec->catdir($FindBin::Bin, 't');
my $version_h = "version.h";
my $svn_entries = File::Spec->catfile(".svn", "entries");

if ("@ARGV" eq "-version") {
    open OUT, "> $version_h" or die $!;
    print OUT "#undef PUGS_SVN_REVISION\n";
    if (-r $svn_entries) {
        open FH, $svn_entries;
        while (<FH>) {
            /^ *committed-rev=.(\d+)./ or next;
            print OUT "#define PUGS_SVN_REVISION $1\n";
            unlink "src/Help.hi"; # rebuild Help.hs to show new revision number
            exit;
        }
    }
    print OUT "#define PUGS_SVN_REVISION 0\n";
    exit;
}



name            ('Perl6-Pugs');
version_from    ('lib/Perl6/Pugs.pm');
abstract_from   ('lib/Perl6/Pugs.pm');
author          ('Autrijus Tang <autrijus@autrijus.org>');
license         ('perl');
install_script  ($pugs);
build_requires  ('Test::More');
makemaker_args  (
    test => { TESTS => join ' ', (glob("t/*.t"), glob("t/*/*.t")) },
    MAN1PODS => {},
);

(`ghc --version` =~ /Glasgow/) or die << '.';
*** Cannot find a runnable 'ghc' from path.
*** Please install GHC from http://haskell.org/ghc/.
.

clean_files("src/*.hi", "src/*.o*", "src/Rule/*.o*", "pugs*", "config.h", "version.h");

my $has_readline = eval {
    require Term::ReadLine;
    require Term::ReadLine::Gnu;
    1
};

if (!$has_readline) {
    warn << '.';
*** Readline support disabled.  If you want readline support,
    please install Term::ReadLine::Gnu from CPAN, as well as
    the GNU Readline headers and shared library.
.
}


open IN, '< lib/Perl6/Pugs.pm' or die $!;
open FH, '> config.h' or die $!;

while (<IN>) {
    /version (\S+) .*\breleased (.*)\./ or next;
    print FH << ".";

#ifdef PUGS_VERSION
#undef PUGS_VERSION
#endif
#define PUGS_VERSION "$1"

#ifdef PUGS_DATE
#undef PUGS_DATE
#endif
#define PUGS_DATE "$2"

.
    last;
}

if ($^O eq 'MSWin32') {
    print FH "#undef PUGS_HAVE_POSIX\n";
}
else {
    print FH "#define PUGS_HAVE_POSIX 1\n";
}

if ($has_readline) {
    print FH "#define PUGS_HAVE_READLINE 1\n";
}
else {
    print FH "#undef PUGS_HAVE_READLINE\n";
}
close FH;

postamble(<< ".");
$pugs: @{[glob("src/*.hs"), glob("src/Rule/*.hs")]} $version_h
	ghc --make -o pugs src/Main.hs -isrc

tags ::
	hasktags -c src
.

if (-e $svn_entries) {
    postamble(<< ".");
$version_h : $svn_entries
	\$(PERLRUN) Makefile.PL -version

.
}
else {
    open FH, "> $version_h" or die $!;
    print FH "#undef PUGS_SVN_REVISION\n";
    print FH "#define PUGS_SVN_REVISION 0\n";
    close FH;
}

WriteAll( sign => 1 );

# FIXUP
open MAKEFILE, '< Makefile' or die $!;
my $makefile = do { local $/; <MAKEFILE> };
$full_pugs =~ s{\\}{\\\\}g; $full_pugs =~ s{'}{\\'}g;
$full_t =~ s{\\}{\\\\}g; $full_t =~ s{'}{\\'}g;
$makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/ENV->{HARNESS_PERL} = q*$full_pugs*; ENV->{PERL6LIB} = q*$full_t*; $1/;
$makefile =~ s/("-MExtUtils::Command::MM")/"-Iinc" $1/g;
close MAKEFILE;
open MAKEFILE, '> Makefile' or die $!;
print MAKEFILE $makefile;
close MAKEFILE;