The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use 5.010000;
use strict;
use ExtUtils::MakeMaker;
use Config;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.

my $LNAME = 'LMDB';
my $NAME = "${LNAME}_File";
my ($LIBS) = map { /^LIBS=(.*)$/ && $1 || () } @ARGV;
my ($INC) = map { /^INC=(.*)/ && $1 || () } @ARGV;
my $myextlib = '';
{
    $LIBS ||= '';
    my @libdata = ExtUtils::Liblist->ext($LIBS || '-llmdb', 0, 'mdb_env_create');
    my @stdinc = qw(/usr/include /usr/local/include);
    push @stdinc, $libdata[3] if $libdata[3];
    my($Head) = grep -f "$_/lmdb.h", @stdinc;
    if(($INC || $Head) && $libdata[0]) {
	$INC ||= "-I$Head" if -f "$libdata[3]/lmdb.h";
	warn "Will use SYSTEM lmdb in $libdata[3]\n";
	$LIBS ||= '-llmdb';
	warn "If that path isn't a standard one, you may need to set LD_LIBRARY_PATH!\n"
	    if($libdata[4][0] =~ /.so/);
    } else {
	warn "Will use my own copy of liblmdb.\n";
	$myextlib = 'liblmdb/liblmdb$(LIB_EXT)';
    }

    #LMDB needs pthreads, perl can provide it, but...
    $LIBS .= ' -lpthread' unless $Config{useithreads} eq 'define';
    $LIBS .= ' -lrt' if $^O =~ /solaris/i;
}

WriteMakefile(
    NAME		=> $NAME,
    MIN_PERL_VERSION	=> '5.10.0',
    VERSION_FROM	=> "lib/$NAME.pm", # finds $VERSION
    PREREQ_PM		=> {}, # e.g., Module::Name => 1.1
    ABSTRACT_FROM	=> "lib/$NAME.pm", # retrieve abstract from module
    AUTHOR		=> 'Salvador Ortiz <sog@msg.com.mx>',
    DEFINE		=> '', # e.g., '-DHAVE_SOMETHING'
    XSPROTOARG		=> '-noprototypes',
    LICENSE		=> 'artistic_2',
    TEST_REQUIRES	=> { 'Test::More' => 0, 'Test::Exception' => 0 },
    OBJECT		=> '$(O_FILES)', # link all the C files too
    LIBS		=> $LIBS,
    ($myextlib ? (
	MYEXTLIB	=> $myextlib,
	INC		=> '-I./liblmdb',
	) : (
	INC		=> $INC
	)
    ),
);
if  (eval {require ExtUtils::Constant; 1}) {
  # If you edit these definitions to change the constants used by this module,
  # you will need to use the generated const-c.inc and const-xs.inc
  # files to replace their "fallback" counterparts before distributing your
  # changes.
  my @names = (qw(MDB_APPEND MDB_APPENDDUP MDB_BAD_RSLOT MDB_CORRUPTED
		 MDB_CREATE MDB_CURRENT MDB_CURSOR_FULL MDB_DBS_FULL
		 MDB_DUPFIXED MDB_DUPSORT MDB_FIXEDMAP MDB_INCOMPATIBLE
		 MDB_INTEGERDUP MDB_INTEGERKEY MDB_INVALID MDB_KEYEXIST
		 MDB_LAST_ERRCODE MDB_MAPASYNC MDB_MAP_FULL MDB_MAP_RESIZED
		 MDB_MULTIPLE MDB_NODUPDATA MDB_NOLOCK MDB_NOMEMINIT
		 MDB_NOMETASYNC MDB_NOOVERWRITE MDB_NORDAHEAD
		 MDB_NOSUBDIR MDB_NOSYNC MDB_NOTFOUND MDB_NOTLS MDB_PAGE_FULL
		 MDB_PAGE_NOTFOUND MDB_PANIC MDB_RDONLY MDB_READERS_FULL
		 MDB_RESERVE MDB_REVERSEDUP MDB_REVERSEKEY MDB_SUCCESS
		 MDB_TLS_FULL MDB_TXN_FULL MDB_VERSION_FULL MDB_VERSION_MAJOR
		 MDB_VERSION_MINOR MDB_VERSION_MISMATCH MDB_VERSION_PATCH
		 MDB_WRITEMAP),
	      {name=>"MDB_VERSION_STRING", type=>"PV", macro=>"1"},
	      {name=>"MDB_VERSION_DATE", type=>"PV", macro=>"1"},
              {name=>"MDB_FIRST", macro=>"1"},
              {name=>"MDB_FIRST_DUP", macro=>"1"},
              {name=>"MDB_GET_BOTH", macro=>"1"},
              {name=>"MDB_GET_BOTH_RANGE", macro=>"1"},
              {name=>"MDB_GET_CURRENT", macro=>"1"},
              {name=>"MDB_GET_MULTIPLE", macro=>"1"},
              {name=>"MDB_LAST", macro=>"1"},
              {name=>"MDB_LAST_DUP", macro=>"1"},
              {name=>"MDB_NEXT", macro=>"1"},
              {name=>"MDB_NEXT_DUP", macro=>"1"},
              {name=>"MDB_NEXT_MULTIPLE", macro=>"1"},
              {name=>"MDB_NEXT_NODUP", macro=>"1"},
              {name=>"MDB_PREV", macro=>"1"},
              {name=>"MDB_PREV_DUP", macro=>"1"},
              {name=>"MDB_PREV_NODUP", macro=>"1"},
              {name=>"MDB_SET", macro=>"1"},
              {name=>"MDB_SET_KEY", macro=>"1"},
              {name=>"MDB_SET_RANGE", macro=>"1"});
  ExtUtils::Constant::WriteConstants(
                                     NAME         => $NAME,
                                     NAMES        => \@names,
                                     DEFAULT_TYPE => 'IV',
                                     C_FILE       => 'const-c.inc',
                                     XS_FILE      => 'const-xs.inc',
                                  );

}
else {
  use File::Copy;
  use File::Spec;
  foreach my $file ('const-c.inc', 'const-xs.inc') {
    my $fallback = File::Spec->catfile('fallback', $file);
    copy ($fallback, $file) or die "Can't copy $fallback to $file: $!";
  }
}

sub MY::postamble {
    if($myextlib) {
	if ($^O =~ /MSWin32/ && !defined($ENV{SYSTEMROOT})) {
	    if ($Config{'make'} =~ /dmake/i) {
		return <<'EOT';
$(MYEXTLIB): liblmdb/Makefile
@[
	cd liblmdb
	$(MAKE) liblmdb$(LIB_EXT)
	cd ..
]
EOT
	    } elsif ($Config{'make'} =~ /nmake/i) {
		return <<'EOT';
$(MYEXTLIB): liblmdb/Makefile
	cd liblmdb
	$(MAKE) liblmdb$(LIB_EXT)
	cd ..
EOT
	    } 
	} else {
	    return <<'EOT';
$(MYEXTLIB): liblmdb/Makefile
	cd liblmdb && $(MAKE) liblmdb$(LIB_EXT)
EOT
	}
    }
}