BEGIN {
    my @missing;
    my @required = qw(
        inc::Module::Install
        Module::Install::AuthorTests
        Module::Install::CheckLib
        Module::Install::Repository
        Module::Install::XSUtil
    );
    foreach my $module (@required) {
        eval <<EOM;
            require $module;
            $module->import;
EOM
        if ($@) {
            push @missing, $module;
        }
    }

    if (@missing) {
        print "You don't seem to have some modules required for building this module.\nPlease install the following modules first:\n\n";
        foreach my $module (@missing) {
            $module =~ s/^inc:://;
            print " + $module\n";
        }
        print "\nBail out\n";
        exit 1;
    }
}

sub cc_append_to_libs_mine ($);


my $RUNNING_IN_HELL = $^O eq 'MSWin32';

my $config = run_probes();
check_lib($config);
define_symbols($config);

do 'tools/genfiles.pl';
die if $@;
MeCabBuild::write_files($config->{version});

name 'Text-MeCab';
all_from 'lib/Text/MeCab.pm';

requires 'Class::Accessor::Fast';
requires 'Encode';
requires 'Exporter';
requires 'File::Spec';
use_ppport;
cc_append_to_ccflags $config->{cflags};
cc_append_to_inc $config->{include};
cc_libs $config->{libs};
cc_define @{ $config->{define} };
cc_src_paths 'xs';
cc_warnings;
auto_set_repository;

build_requires 'Devel::CheckLib';
test_requires 'Test::More', 0.84;
test_requires 'Test::Requires';
tests 't/*.t t/*/*.t';
author_tests 'xt';
WriteAll;

sub cc_append_to_libs_mine ($) {
    my $ma = makemaker_args;
    if ($ma->{LIBS}) {
        $ma->{LIBS} .= " $_[0]";
    } else {
        $ma->{LIBS} = $_[0];
    }
}

sub run_probes
{
    my $config = do 'tools/probe_mecab.pl';
    die if $@;

    for(my $i = 0; $i < @ARGV; $i++) {
        if ($ARGV[$i] =~ /^--debugging$/) {
            splice(@ARGV, $i, 1);
            $config->{debugging} = 1;
            $i--;
        }
    }

    $config->{cflags} ||= '';
    $config->{cflags} .= ' -I src';

    print
        "Detected the following mecab information:\n",
        "   version: $config->{version}\n",
        "   cflags: $config->{cflags}\n",
        "   libs: $config->{libs}\n",
        "   include: $config->{include}\n",
    ;
    return $config;
}

sub check_lib
{
    my $config = shift;

    if (! $RUNNING_IN_HELL) {
        checklibs(
            lib  => 'mecab',
            LIBS => $config->{libs},
        );
    }
}

sub define_symbols
{
    my $config = shift;
    my @define;

    if ($RUNNING_IN_HELL) { # save us, the Win32 puppies
        # XXX - Note to self: 
        #  (1) first there was the need to to protect the symbol value
        #      from being garbled by the shell
        #  (2) then the Redmond camp apparently decided that they don't like
        #      my quoting.
        #  (3) So charsbar provided this patch.
        @define = (
            qq(-DTEXT_MECAB_ENCODING=\\"$config->{encoding}\\"),
            qq(-DTEXT_MECAB_CONFIG=\\"$config->{config}\\"),
        );
    } else {
        @define = (
            "-DTEXT_MECAB_ENCODING='\"$config->{encoding}\"'",
            "-DTEXT_MECAB_CONFIG='\"$config->{config}\"'",
        );
    }

    if ($config->{debugging}) {
        push @define, "-DTEXT_MECAB_DEBUG=1";
    }
    $config->{define} = \@define;
}

## Legacy code.
##
## When the time comes, this will be deleted
## sub prepare_makefile
## {
##     # Hack. I don't like the layout where .xs files are on the top level.
##     link("lib/Text/MeCab.xs", "MeCab.xs");
## 
##     # if no inc directory is found, I'm being executed via the author.
##     # I'm going to create inc, and add Devel::CheckLib there
##     if (! -d './inc' and ! $RUNNING_IN_HELL) {
##         mkdir('inc') or die "Could not make inc directory: $!";
##         mkdir('inc/Devel') or die "Could not make inc/Devel directory: $!";
##         require Devel::CheckLib;
## 
##         link($INC{'Devel/CheckLib.pm'}, 'inc/Devel/CheckLib.pm') or
##             die "Failed to copy Devel::CheckLib: $!";
##     }
## 
## 
##     my $config = run_probes();
##     check_lib($config);
##     define_symbols($config);
##     extract_constants($config);
## 
##     # XXX For debug
##     # use Data::Dumper;
##     # print Dumper($config);
##     my %INFO = (
##         ABSTRACT     => 'Alternative Interface To libmecab',
##         AUTHOR       => 'Daisuke Maki <daisuke@endeworks.jp>',
##         CCFLAGS      => $config->{cflags},
##         DEFINE       => join( " ", @{ $config->{define} } ),
##         DISTNAME     => 'Text-MeCab',
##         INSTALLDIRS  => 'site',
##         LIBS         => $config->{libs},
##         LICENSE      => 'perl',
##         NAME         => 'Text::MeCab',
##         OBJECT       => '$(O_FILES)',
##         PREREQ_PM    => {
##             'Class::Accessor::Fast' => 0,
##             'Encode'                => 0,
##             'Exporter'              => 0,
##             'File::Spec'            => 0,
##             'Test::More'            => 0,
##             'Path::Class'           => 0,
##         },
##         VERSION_FROM => 'lib/Text/MeCab.pm',
##         clean        => {
##             FILES => 'lib/typemap MeCab.xs'
##         },
##         test         => {
##             TESTS    => 't/*.t t/*/*.t'
##         }
##     );
##     $INFO{OPTIMIZE} = '-g' if $config->{debugging};
## 
##     WriteMakefile(%INFO);
## }