#!/usr/bin/perl
use ExtUtils::MakeMaker;
use Getopt::Std;
use Config;
$ARCHNAME = $Config{archname};
use File::Basename;
getopts('e'); # embedding?
$CCFLAGS .= $ENV{CCFLAGS} if defined $ENV{CCFLAGS};
# $USE_KAFFE is a boolean that tells us whether or not we should use Kaffe.
# Set by find_includes (it seemed as good a place as any).
# Note that we don't check to see the version of Kaffe is one we support.
# Currently, the only one we support is the one from CVS.
my $USE_KAFFE = 0;
#require "JNIConfig";
if ($^O eq 'solaris') {
$LIBPATH = " -R$Config{archlib}/CORE -L$Config{archlib}/CORE";
} elsif ($^O eq 'MSWin32') {
$LIBPATH = " -L$Config{archlib}\\CORE";
# MSR - added MS VC++ default library path
# bjepson - fixed to support path names w/spaces in them.
push(@WINLIBS, (split"\;",$ENV{LIB}));
grep s/\\$//, @WINLIBS; # eliminate trailing \
grep s/\/$//, @WINLIBS; # eliminate trailing /
$LIBPATH .= join(" ", "", map { qq["-L$_" ] } @WINLIBS);
} else {
$LIBPATH = " -L$Config{archlib}/CORE";
}
#$LIBS = " -lperl";
# Figure out where Java might live
#
# MSR - added JDK 1.3
#
my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3
C:\\JDK1.1.8 C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );
my @KAFFE_PREFIX_GUESSES = qw(/usr/local /usr);
if (! defined $ENV{JAVA_HOME}) {
print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";
print "If this fails, you might want to try setting JAVA_HOME and\n";
print "running me again.\n";
} else {
@JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );
}
if (! defined $ENV{KAFFE_PREFIX}) {
print "\nYou didn't define KAFFE_PREFIX, so I'm trying a few guesses.",
"\nIf this fails, and you are using Kaffe, you might want to try\n",
"setting KAFFE_PREFIX and running me again.\n",
"If you want to ignore any possible Kaffe installation, set the\n",
"KAFFE_PREFIX to and empty string.\n\n";
} else {
@KAFFE_PREFIX_GUESSES = ($ENV{KAFFE_PREFIX} eq "") ? () :
( $ENV{KAFFE_PREFIX} );
}
my(@KAFFE_INCLUDE_GUESSES, @KAFFE_LIB_GUESSES);
foreach my $kaffePrefix (@KAFFE_PREFIX_GUESSES) {
push(@KAFFE_INCLUDE_GUESSES, "$kaffePrefix/include/kaffe");
push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib");
push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib/kaffe");
}
$guess .= "/include/kaffe";
# Let's find out where jni.h lives
#
my @INCLUDE = find_includes();
if ($^O eq 'MSWin32') {
# MSR - added MS VC++ default include path
push(@INCLUDE,(split"\;",$ENV{INCLUDE}));
grep s/\\$//, @INCLUDE; # remove trailing \
grep s/\/$//, @INCLUDE; # remove trailing \
$INC = join("", map { qq["-I$_" ] } @INCLUDE);
} else {
$INC = join(" -I", ("", @INCLUDE));
}
# Let's find out the name of the Java shared library
#
my @JAVALIBS = find_libs();
# Find out some defines based on the library we are linking to
#
foreach (@JAVALIBS) {
if ( $^O eq 'MSWin32') { # We're on Win32
$INC =~ s#/#\\#g;
$INC =~ s#\\$##;
print $INC, "\n";
$CCFLAGS .= " -DWIN32 -Z7 -D_DEBUG";
$MYEXTLIB = "$libjava";
}
}
$CCFLAGS .= " -DKAFFE" if ($USE_KAFFE);
# Let's find out the path of the library we need to link against.
#
foreach (@JAVALIBS) {
if ($^O eq 'MSWin32') { # We're on Win32
$_ =~ s#/#\\\\#g;
}
my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));
$libname =~ s/^lib//;
if ($^O eq 'solaris') {
$LIBPATH .= " -R$libpath -L$libpath"
} else {
$LIBPATH .= " -L$libpath"
}
$LIBS .= " -l$libname";
}
# Do we need -D_REENTRANT?
if ($LIBPATH =~ /native/) {
print "Looks like native threads...\n";
$CCFLAGS .= " -D_REENTRANT";
}
if ($opt_e) {
print "We're embedding Perl in Java via libPerlInterpreter.so.\n";
eval `../setvars -perl`;
$CCFLAGS .= " -DEMBEDDEDPERL";
$LIBPATH .= " -R$ENV{JPL_HOME}/lib/$ARCHNAME -L$ENV{JPL_HOME}/lib/$ARCHNAME";
$LIBS .= " -lPerlInterpreter";
}
# Needed for JNI.
if ($^O eq 'solaris') {
$LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!
$CCFLAGS .= " -D_REENTRANT";
}
# MSR - clean up LIBS
$LIBS =~ s/-l$//;
#
# Next, build JNI/Config.pm. This is a superfluous thing for the SUN and
# Microsoft JDKs, but absolutely necessary for Kaffe. I think at some
# point, the Microsoft and SUN implementations should use JNI::Config, too.
#
if (! -d "JNI") {
mkdir("JNI", 0755) || die "Unable to make JNI directory: $!";
}
open(JNICONFIG, ">JNI/Config.pm") || die "Unable to open JNI/Config.pm: $!";
print JNICONFIG "# DO NOT EDIT! Autogenerated by JNI/Makefile.PL\n\n",
"package JNI::Config;\nuse strict;\nuse Carp;\n",
"\nuse vars qw(\$KAFFE \$LIB_JAVA \$CLASS_HOME ",
"\$LIB_HOME);\n\n",
"\$KAFFE = $USE_KAFFE;\n\$LIB_JAVA = \"$JAVALIBS[0]\";\n";
if ($USE_KAFFE) {
my $path = $JAVALIBS[0];
$path =~ s%/(kaffe/)?libkaffevm.so$%%;
print JNICONFIG "\$LIB_HOME = \"$path/kaffe\";\n";
$path =~ s%/lib%%;
print JNICONFIG "\$CLASS_HOME = \"$path/share/kaffe\";\n";
}
print JNICONFIG "\n\n1;\n";
close JNICONFIG;
my %Makefile = (
NAME => 'JNI',
VERSION_FROM => 'JNI.pm',
DEFINE => '',
LINKTYPE => 'dynamic',
INC => $INC,
CCFLAGS => "$Config{ccflags} $CCFLAGS",
($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),
clean => {FILES => "JNI/* JNI"}
);
$Makefile{LIBS} = ["$LIBPATH $LIBS"];
if ($MYEXTLIB) {
$Makefile{MYEXTLIB} = $MYEXTLIB;
}
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
#
WriteMakefile(%Makefile);
if ($USE_KAFFE) {
my $path = $JAVALIBS[0];
$path =~ s%/libkaffevm.so$%%;
print "\n\n***NOTE: be sure to have:\n",
" LD_LIBRARY_PATH=$path\n",
" in your enviornment (or installed as a system dynamic\n",
" library location) when you compile and run this.\n";
}
# subroutine to find a library
#
sub find_stuff {
my ($candidates, $locations) = @_;
my $lib;
$wanted = sub {
foreach my $name (@$candidates) {
if (/$name$/ and ! /green_threads/ and !/include-old/) {
$lib = $File::Find::name;
}
}
};
use File::Find;
foreach my $guess (@$locations) {
next unless -d $guess;
find (\&$wanted, $guess);
}
if (! $lib) {
print "Could not find @$candidates\n";
} else {
print "Found @$candidates as $lib\n\n";
}
return $lib;
}
# Extra lib for Java 1.2
#
# if we want KAFFE, check for it, otherwise search for Java
sub find_libs {
my($libjava, $libawt, $libjvm);
if ($USE_KAFFE) {
$libjava = find_stuff(['libkaffevm.so'], \@KAFFE_LIB_GUESSES);
$libawt = find_stuff(['libawt.so'], \@KAFFE_LIB_GUESSES);
} else {
$libjava = find_stuff(['libjava.so', 'javai.lib', 'jvm.lib'],
\@JAVA_HOME_GUESSES);
$libjvm = find_stuff(['libjvm.so'], \@JAVA_HOME_GUESSES);
$libawt = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
if (defined $libjvm) { # JDK 1.2
my $libhpi = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
return($libjava, $libjvm, $libhpi, $libawt);
}
}
return($libjava, $libawt);
}
# We need to find jni.h and jni_md.h
#
# Always do find_includes as the first operation, as it has the side effect
# of deciding whether or not we are looking for Kaffe. --bkuhn
sub find_includes {
my @CANDIDATES = qw(jni.h jni_md.h);
my @includes;
sub find_inc {
foreach my $name (@CANDIDATES) {
if (/$name$/) {
my ($hname, $hpath, $hsuffix) =
fileparse($File::Find::name, ("\.h", "\.H"));
unless ($hpath =~ /include-old/) {
print "Found $hname$hsuffix in $hpath\n";
push @includes, $hpath;
}
}
}
}
use File::Find;
foreach my $guess (@KAFFE_INCLUDE_GUESSES) {
next unless -d $guess;
find (\&find_inc, $guess);
}
# If we have found includes, then we are using Kaffe.
if (@includes > 0) {
$USE_KAFFE = 1;
} else {
foreach my $guess (@JAVA_HOME_GUESSES) {
next unless -d $guess;
find (\&find_inc, $guess);
}
}
die "Could not find Java includes!" unless (@includes);
return @includes;
}
|