The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Copyright (c) 2001 Ping Liang
# All rights reserved.
#
# This program is free software; you can use, redistribute and/or
# modify it under the same terms as Perl itself.
#
# $Id: Makefile.PL,v 1.3 2002/01/01 20:41:53 liang Exp $

use strict;
use File::Find;
use File::Basename;
use Config;
use ExtUtils::MakeMaker;

use vars qw(@java_so);

my ($java_home, @so_path, $my_objects);
my ($i, $this_dir, $l_list, $answer, @dir_list);
my (@libjvm_dir_list, @libjava_dir_list, @libhpi_dir_list);
my (@path);
my $os = $^O;
my $so = $Config{so};
my $obj_ext = $Config{obj_ext};

### ask about where is java installed.
@path = split /:/, $ENV{"PATH"};
for ($i = 0; $i < $#path; $i++) {
  if (-e $path[$i] . "/java") {
    # omit the current directory (bin).
    $java_home = dirname($path[$i]);
  }
}
print "\n";
print "Where is Java installed (aka JAVA_HOME)?\n";
print "For example, in JDK for Linux, it is usually /usr/java/jdkx.x.x.\n";
print "[$java_home]: ";
$answer = <STDIN>;
chomp($answer);
$java_home = $answer unless $answer eq "";

if(! -d $java_home) {
    die "Sorry but I have to know where is Java installed.";
}

### get path for libjava.so
sub get_libjava_dir {
  if (basename($File::Find::name) eq "libjava.$so") {
    $this_dir = $File::Find::dir;
  }
}
@dir_list = ($java_home);
find(\&get_libjava_dir, @dir_list);
die unless ($this_dir ne "");
push(@java_so, $this_dir);
$l_list = " -lpthread -ljava";

### get path for libjvm.so
sub get_libjvm_dir {
  if (basename($File::Find::name) eq "libjvm.$so") {
    push(@libjvm_dir_list, $File::Find::dir);
  }
}
@dir_list = ($java_home);
find(\&get_libjvm_dir, @dir_list);
print "\n";
print "There are the following JVMs you can choose from,\n";
for (my $i = 0; $i <= $#libjvm_dir_list; $i++) {
  print "($i) " . $libjvm_dir_list[$i] . "\n";
}
print "Which JVMs you want to use: ";
$answer = <STDIN>;
chomp($answer);
$answer = 0 unless ($answer ne "");
push(@java_so, $libjvm_dir_list[$answer]);
$l_list .= " -ljvm";

if ($libjvm_dir_list[$answer] =~ /\/classic/) {
  ### get path libhpi.so
  sub get_libhpi_dir {
    if (basename($File::Find::name) eq "libhpi.$so") {
      push(@libhpi_dir_list, $File::Find::dir);
    }
  }
  @dir_list = ($java_home);
  find(\&get_libhpi_dir, @dir_list);
  print "\nThere are the following JVM types you can choose from:\n";
  for (my $i = 0; $i <= $#libhpi_dir_list; $i++) {
    print "($i) " . $libhpi_dir_list[$i] . "\n";
  }
  print "Which type do you want to use: ";
  $answer = <STDIN>;
  chomp($answer);
  $answer = 0 unless ($answer ne "");
  push(@java_so, $libhpi_dir_list[$answer]);
  $l_list .= " -lhpi";
}

#print join(" ", map { "-L$_" } @java_so) . $l_list . "\n";

print "\n";

WriteMakefile(
	      'NAME'	=> 'PBJ::JNI::Native',
	      'VERSION_FROM' => 'Native.pm',
	      'LIBS'	=> join(" ", map { "-L$_" } @java_so) . $l_list,
	      'DEFINE'	=> '',
	      'INC'	=> "-I$java_home/include -I$java_home/include/$os",
	      'OBJECT'  => "Utils$obj_ext Native$obj_ext",
	      "AUTHOR"  => 'Ping Liang <ping@cpan.org>',
	      "PMLIBDIRS" => [ 'java' ],
	      "depend" => { "\$(OBJECT)" => '$(INST_ARCHAUTODIR)/libCallback.so' },
	      "clean" => { FILES => "Callback.h Callback.class libCallback.so" },
	     );

sub MY::postamble {
  '
Callback.h: $(INST_ARCHAUTODIR)/Callback.class
	javah -classpath $(INST_ARCHAUTODIR) Callback

$(INST_ARCHAUTODIR)/Callback.class: Callback.java
	javac -d $(INST_ARCHAUTODIR) Callback.java
	javac -d $(INST_ARCHAUTODIR) CallbackTest.java

$(INST_ARCHAUTODIR)/libCallback.$(DLEXT): Callback$(OBJ_EXT)
	$(LD) $(LDDLFLAGS) $(OPTIMIZE) -o $@ Callback$(OBJ_EXT)

Callback$(OBJ_EXT): Callback.c Callback.h
	$(CCCMD) $(INC) $(CCFLAGS) $(OPTIMIZE) -I$(PERL_INC) -o $@ Callback.c
';
}