update to JPL snapshot v09141999, with minor tweaks (from Brian
[p5sagit/p5-mst-13.2.git] / jpl / JNI / Makefile.PL
CommitLineData
d50cb536 1#!/usr/bin/perl
d50cb536 2use ExtUtils::MakeMaker;
b83c0eaa 3use Getopt::Std;
d50cb536 4use Config;
b83c0eaa 5$ARCHNAME = $Config{archname};
6use File::Basename;
d50cb536 7
b83c0eaa 8getopts('e'); # embedding?
d50cb536 9
b83c0eaa 10#require "JNIConfig";
d50cb536 11
b83c0eaa 12if ($^O eq 'solaris') {
13 $LIBPATH = " -R$Config{archlib}/CORE -L$Config{archlib}/CORE";
14} elsif ($^O eq 'MSWin32') {
15 $LIBPATH = " -L$Config{archlib}\\CORE";
16} else {
17 $LIBPATH = " -L$Config{archlib}/CORE";
18}
19#$LIBS = " -lperl";
d50cb536 20
b83c0eaa 21# Figure out where Java might live
22#
23my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3
24 /usr/local/lib/kaffe C:\\JDK1.1.8
25 C:\\JDK1.2.1 );
26if (! defined $ENV{JAVA_HOME}) {
27 print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";
28 print "If this fails, you might want to try setting JAVA_HOME and\n";
29 print "running me again.\n";
30} else {
31 @JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );
32}
33
34# Let's find out where jni.h lives
35#
36my @INCLUDE = find_includes();
37$INC = join(" -I", ("", @INCLUDE));
38
39# Let's find out the name of the Java shared library
40#
41my @JAVALIBS = find_libs();
42
43# Find out some defines based on the library we are linking to
44#
45foreach (@JAVALIBS) {
46 if ( /javai.lib$/ or /jvm.lib$/) { # We're on Win32
47 $INC =~ s#/#\\#g;
48 $INC =~ s#\\$##;
49 $CCFLAGS .= "-DWIN32 -Z7 -D_DEBUG";
50 $MYEXTLIB = "$libjava " .
51 "$Config{installarchlib}\\CORE\\perlcore.lib " .
52 "$Config{installarchlib}\\CORE\\perlcapi.lib";
53 } elsif (/libkaffevm.so$/) {
54 $CCFLAGS .= "-DKAFFE";
55 }
56}
57
58# Let's find out the path of the library we need to link against.
59#
60foreach (@JAVALIBS) {
61 if ( /javai.lib$/ or /jvm.lib$/) { # We're on Win32
62 $_ =~ s#/#\\\\#g;
63 }
64 my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));
65 $libname =~ s/^lib//;
66 if ($^O eq 'solaris') {
67 $LIBPATH .= " -R$libpath -L$libpath"
68 } else {
69 $LIBPATH .= " -L$libpath"
70 }
71 $LIBS .= " -l$libname";
72}
73
74# Do we need -D_REENTRANT?
75if ($LIBPATH =~ /native/) {
76 print "Looks like native threads...\n";
77 $CCFLAGS .= " -D_REENTRANT";
78}
79
80if ($opt_e) {
81 print "We're embedding Perl in Java via libPerlInterpreter.so.\n";
82 eval `../setvars -perl`;
83 $CCFLAGS .= " -DEMBEDDEDPERL";
84 $LIBPATH .= " -R$ENV{JPL_HOME}/lib/$ARCHNAME -L$ENV{JPL_HOME}/lib/$ARCHNAME";
85 $LIBS .= " -lPerlInterpreter";
86}
87
88# Needed for JNI.
89if ($^O eq 'solaris') {
90 $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!
91 $CCFLAGS .= " -D_REENTRANT";
92}
93
94my %Makefile = (
95 NAME => 'JNI',
d50cb536 96 VERSION_FROM => 'JNI.pm',
b83c0eaa 97 DEFINE => '',
d50cb536 98 LINKTYPE => 'dynamic',
b83c0eaa 99 INC => $INC,
100 CCFLAGS => "$Config{ccflags} $CCFLAGS",
d50cb536 101);
b83c0eaa 102
103$Makefile{LIBS} = ["$LIBPATH $LIBS"];
104if ($MYEXTLIB) {
105 $Makefile{MYEXTLIB} = $MYEXTLIB;
106}
107
108# See lib/ExtUtils/MakeMaker.pm for details of how to influence
109# the contents of the Makefile that is written.
110#
111WriteMakefile(%Makefile);
112
113# subroutine to find a library
114#
115sub find_stuff {
116
117 my ($candidates, $locations) = @_;
118
119 my $lib;
120 $wanted = sub {
121 foreach my $name (@$candidates) {
122 if (/$name$/ and ! /green_threads/ and !/include-old/) {
123 $lib = $File::Find::name;
124 }
125 }
126 };
127
128 use File::Find;
129 foreach my $guess (@$locations) {
130 next unless -d $guess;
131 find (\&$wanted, $guess);
132 }
133 if (! $lib) {
134 print "Could not find @$candidates\n";
135 } else {
136 print "Found @$candidates as $lib\n\n";
137 }
138 return $lib;
139}
140
141# Extra lib for Java 1.2
142#
143sub find_libs {
144
145 my $libjava = find_stuff(['libjava.so', 'libkaffevm.so', 'javai.lib', 'jvm.lib'],
146 \@JAVA_HOME_GUESSES);
147 my $libjvm = find_stuff(['libjvm.so'], \@JAVA_HOME_GUESSES);
148 if ($libjvm) { # JDK 1.2
149 my $libhpi = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
150 my $libawt = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
151 return($libjava, $libjvm, $libhpi, $libawt);
152 } else {
153 return($libjava);
154 }
155
156}
157
158# We need to find jni.h and jni_md.h
159#
160sub find_includes {
161
162 my @CANDIDATES = qw(jni.h jni_md.h);
163 my @includes;
164
165 sub find_inc {
166 foreach my $name (@CANDIDATES) {
167 if (/$name$/) {
168 my ($hname, $hpath, $hsuffix) =
169 fileparse($File::Find::name, ("\.h", "\.H"));
170 unless ($hpath =~ /include-old/) {
171 print "Found $hname$hsuffix in $hpath\n";
172 push @includes, $hpath;
173 }
174 }
175 }
176 }
177
178 use File::Find;
179 foreach my $guess (@JAVA_HOME_GUESSES) {
180 next unless -d $guess;
181 find (\&find_inc, $guess);
182 }
183 if (! @includes) {
184 die "Could not find Java includes!";
185 } else {
186 print join("\n", @includes), "\n";
187 }
188 return @includes;
189}
190