Modified README.bs2000
[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";
cffc5690 50 $MYEXTLIB = $libjava;
b83c0eaa 51 } elsif (/libkaffevm.so$/) {
52 $CCFLAGS .= "-DKAFFE";
53 }
54}
55
56# Let's find out the path of the library we need to link against.
57#
58foreach (@JAVALIBS) {
59 if ( /javai.lib$/ or /jvm.lib$/) { # We're on Win32
60 $_ =~ s#/#\\\\#g;
61 }
62 my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));
63 $libname =~ s/^lib//;
64 if ($^O eq 'solaris') {
65 $LIBPATH .= " -R$libpath -L$libpath"
66 } else {
67 $LIBPATH .= " -L$libpath"
68 }
69 $LIBS .= " -l$libname";
70}
71
72# Do we need -D_REENTRANT?
73if ($LIBPATH =~ /native/) {
74 print "Looks like native threads...\n";
75 $CCFLAGS .= " -D_REENTRANT";
76}
77
78if ($opt_e) {
79 print "We're embedding Perl in Java via libPerlInterpreter.so.\n";
80 eval `../setvars -perl`;
81 $CCFLAGS .= " -DEMBEDDEDPERL";
82 $LIBPATH .= " -R$ENV{JPL_HOME}/lib/$ARCHNAME -L$ENV{JPL_HOME}/lib/$ARCHNAME";
83 $LIBS .= " -lPerlInterpreter";
84}
85
86# Needed for JNI.
87if ($^O eq 'solaris') {
88 $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!
89 $CCFLAGS .= " -D_REENTRANT";
90}
91
92my %Makefile = (
93 NAME => 'JNI',
d50cb536 94 VERSION_FROM => 'JNI.pm',
b83c0eaa 95 DEFINE => '',
d50cb536 96 LINKTYPE => 'dynamic',
b83c0eaa 97 INC => $INC,
98 CCFLAGS => "$Config{ccflags} $CCFLAGS",
cffc5690 99 ($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),
d50cb536 100);
b83c0eaa 101
102$Makefile{LIBS} = ["$LIBPATH $LIBS"];
103if ($MYEXTLIB) {
104 $Makefile{MYEXTLIB} = $MYEXTLIB;
105}
106
107# See lib/ExtUtils/MakeMaker.pm for details of how to influence
108# the contents of the Makefile that is written.
109#
110WriteMakefile(%Makefile);
111
112# subroutine to find a library
113#
114sub find_stuff {
115
116 my ($candidates, $locations) = @_;
117
24142eb2 118 my ($pos,$lib);
b83c0eaa 119 $wanted = sub {
120 foreach my $name (@$candidates) {
24142eb2 121 $pos = $File::Find::name;
122 if (/$name$/ && $pos !~ /green_threads/ && $pos !~ /include-old/) {
123 $lib = $pos;
b83c0eaa 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