Commit | Line | Data |
---|---|---|
dee37ec1 JH |
1 | #!/usr/bin/perl\r |
2 | use ExtUtils::MakeMaker;\r | |
3 | use Getopt::Std;\r | |
4 | use Config;\r | |
5 | $ARCHNAME = $Config{archname};\r | |
6 | use File::Basename;\r | |
7 | \r | |
8 | getopts('e'); # embedding?\r | |
9 | \r | |
10 | $CCFLAGS .= $ENV{CCFLAGS} if defined $ENV{CCFLAGS};\r | |
11 | \r | |
12 | # $USE_KAFFE is a boolean that tells us whether or not we should use Kaffe.\r | |
13 | # Set by find_includes (it seemed as good a place as any).\r | |
14 | \r | |
15 | # Note that we don't check to see the version of Kaffe is one we support.\r | |
16 | # Currently, the only one we support is the one from CVS.\r | |
17 | \r | |
18 | my $USE_KAFFE = 0;\r | |
19 | \r | |
20 | #require "JNIConfig";\r | |
21 | \r | |
22 | if ($^O eq 'solaris') {\r | |
23 | $LIBPATH = " -R$Config{archlib}/CORE -L$Config{archlib}/CORE";\r | |
24 | } elsif ($^O eq 'MSWin32') {\r | |
25 | $LIBPATH = " -L$Config{archlib}\\CORE";\r | |
26 | # MSR - added MS VC++ default library path\r | |
27 | # bjepson - fixed to support path names w/spaces in them.\r | |
28 | push(@WINLIBS, (split"\;",$ENV{LIB}));\r | |
29 | grep s/\\$//, @WINLIBS; # eliminate trailing \\r | |
30 | grep s/\/$//, @WINLIBS; # eliminate trailing /\r | |
31 | $LIBPATH .= join(" ", "", map { qq["-L$_" ] } @WINLIBS);\r | |
32 | } else {\r | |
33 | $LIBPATH = " -L$Config{archlib}/CORE";\r | |
34 | }\r | |
35 | #$LIBS = " -lperl";\r | |
36 | \r | |
37 | # Figure out where Java might live\r | |
38 | #\r | |
39 | # MSR - added JDK 1.3\r | |
40 | #\r | |
41 | \r | |
42 | my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3\r | |
43 | C:\\JDK1.1.8 C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );\r | |
44 | \r | |
45 | my @KAFFE_PREFIX_GUESSES = qw(/usr/local /usr);\r | |
46 | \r | |
47 | if (! defined $ENV{JAVA_HOME}) {\r | |
48 | print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";\r | |
49 | print "If this fails, you might want to try setting JAVA_HOME and\n";\r | |
50 | print "running me again.\n";\r | |
51 | } else {\r | |
52 | @JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );\r | |
53 | }\r | |
54 | \r | |
55 | if (! defined $ENV{KAFFE_PREFIX}) {\r | |
56 | print "\nYou didn't define KAFFE_PREFIX, so I'm trying a few guesses.",\r | |
57 | "\nIf this fails, and you are using Kaffe, you might want to try\n",\r | |
58 | "setting KAFFE_PREFIX and running me again.\n",\r | |
59 | "If you want to ignore any possible Kaffe installation, set the\n",\r | |
60 | "KAFFE_PREFIX to and empty string.\n\n";\r | |
61 | } else {\r | |
62 | @KAFFE_PREFIX_GUESSES = ($ENV{KAFFE_PREFIX} eq "") ? () :\r | |
63 | ( $ENV{KAFFE_PREFIX} );\r | |
64 | }\r | |
65 | \r | |
66 | my(@KAFFE_INCLUDE_GUESSES, @KAFFE_LIB_GUESSES);\r | |
67 | foreach my $kaffePrefix (@KAFFE_PREFIX_GUESSES) {\r | |
68 | push(@KAFFE_INCLUDE_GUESSES, "$kaffePrefix/include/kaffe");\r | |
69 | push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib");\r | |
70 | push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib/kaffe");\r | |
71 | }\r | |
72 | $guess .= "/include/kaffe";\r | |
73 | \r | |
74 | # Let's find out where jni.h lives\r | |
75 | #\r | |
76 | my @INCLUDE = find_includes();\r | |
77 | \r | |
78 | if ($^O eq 'MSWin32') {\r | |
79 | # MSR - added MS VC++ default include path\r | |
80 | push(@INCLUDE,(split"\;",$ENV{INCLUDE}));\r | |
81 | grep s/\\$//, @INCLUDE; # remove trailing \\r | |
82 | grep s/\/$//, @INCLUDE; # remove trailing \\r | |
83 | $INC = join("", map { qq["-I$_" ] } @INCLUDE);\r | |
84 | \r | |
85 | } else {\r | |
86 | $INC = join(" -I", ("", @INCLUDE));\r | |
87 | }\r | |
88 | \r | |
89 | # Let's find out the name of the Java shared library\r | |
90 | #\r | |
91 | my @JAVALIBS = find_libs();\r | |
92 | \r | |
93 | # Find out some defines based on the library we are linking to\r | |
94 | #\r | |
95 | foreach (@JAVALIBS) {\r | |
96 | if ( $^O eq 'MSWin32') { # We're on Win32\r | |
97 | $INC =~ s#/#\\#g;\r | |
98 | $INC =~ s#\\$##;\r | |
99 | print $INC, "\n";\r | |
100 | $CCFLAGS .= " -DWIN32 -Z7 -D_DEBUG";\r | |
101 | $MYEXTLIB = "$libjava";\r | |
102 | }\r | |
103 | }\r | |
104 | \r | |
105 | $CCFLAGS .= " -DKAFFE" if ($USE_KAFFE);\r | |
106 | \r | |
107 | # Let's find out the path of the library we need to link against.\r | |
108 | #\r | |
109 | foreach (@JAVALIBS) {\r | |
110 | if ($^O eq 'MSWin32') { # We're on Win32\r | |
111 | $_ =~ s#/#\\\\#g;\r | |
112 | }\r | |
113 | my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));\r | |
114 | $libname =~ s/^lib//;\r | |
115 | if ($^O eq 'solaris') {\r | |
116 | $LIBPATH .= " -R$libpath -L$libpath"\r | |
117 | } else {\r | |
118 | $LIBPATH .= " -L$libpath"\r | |
119 | }\r | |
120 | $LIBS .= " -l$libname";\r | |
121 | }\r | |
122 | \r | |
123 | # Do we need -D_REENTRANT?\r | |
124 | if ($LIBPATH =~ /native/) {\r | |
125 | print "Looks like native threads...\n";\r | |
126 | $CCFLAGS .= " -D_REENTRANT";\r | |
127 | }\r | |
128 | \r | |
129 | if ($opt_e) {\r | |
130 | print "We're embedding Perl in Java via libPerlInterpreter.so.\n";\r | |
131 | eval `../setvars -perl`;\r | |
132 | $CCFLAGS .= " -DEMBEDDEDPERL";\r | |
133 | $LIBPATH .= " -R$ENV{JPL_HOME}/lib/$ARCHNAME -L$ENV{JPL_HOME}/lib/$ARCHNAME";\r | |
134 | $LIBS .= " -lPerlInterpreter";\r | |
135 | }\r | |
136 | \r | |
137 | # Needed for JNI.\r | |
138 | if ($^O eq 'solaris') {\r | |
139 | $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!\r | |
140 | $CCFLAGS .= " -D_REENTRANT";\r | |
141 | }\r | |
142 | \r | |
143 | # MSR - clean up LIBS\r | |
144 | $LIBS =~ s/-l$//;\r | |
145 | \r | |
146 | #\r | |
147 | # Next, build JNI/Config.pm. This is a superfluous thing for the SUN and\r | |
148 | # Microsoft JDKs, but absolutely necessary for Kaffe. I think at some\r | |
149 | # point, the Microsoft and SUN implementations should use JNI::Config, too.\r | |
150 | #\r | |
151 | \r | |
152 | if (! -d "JNI") {\r | |
153 | mkdir("JNI", 0755) || die "Unable to make JNI directory: $!";\r | |
154 | }\r | |
155 | open(JNICONFIG, ">JNI/Config.pm") || die "Unable to open JNI/Config.pm: $!";\r | |
156 | \r | |
157 | print JNICONFIG "# DO NOT EDIT! Autogenerated by JNI/Makefile.PL\n\n",\r | |
158 | "package JNI::Config;\nuse strict;\nuse Carp;\n",\r | |
159 | "\nuse vars qw(\$KAFFE \$LIB_JAVA \$CLASS_HOME ",\r | |
160 | "\$LIB_HOME);\n\n",\r | |
161 | "\$KAFFE = $USE_KAFFE;\n\$LIB_JAVA = \"$JAVALIBS[0]\";\n";\r | |
162 | if ($USE_KAFFE) {\r | |
163 | my $path = $JAVALIBS[0];\r | |
164 | $path =~ s%/(kaffe/)?libkaffevm.so$%%;\r | |
165 | \r | |
166 | print JNICONFIG "\$LIB_HOME = \"$path/kaffe\";\n";\r | |
167 | $path =~ s%/lib%%;\r | |
168 | print JNICONFIG "\$CLASS_HOME = \"$path/share/kaffe\";\n";\r | |
169 | }\r | |
170 | print JNICONFIG "\n\n1;\n";\r | |
171 | close JNICONFIG;\r | |
172 | \r | |
173 | \r | |
174 | my %Makefile = (\r | |
175 | NAME => 'JNI',\r | |
176 | VERSION_FROM => 'JNI.pm',\r | |
177 | DEFINE => '',\r | |
178 | LINKTYPE => 'dynamic',\r | |
179 | INC => $INC,\r | |
180 | CCFLAGS => "$Config{ccflags} $CCFLAGS", \r | |
181 | ($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),\r | |
182 | \r | |
183 | clean => {FILES => "JNI/* JNI"}\r | |
184 | );\r | |
185 | \r | |
186 | $Makefile{LIBS} = ["$LIBPATH $LIBS"];\r | |
187 | if ($MYEXTLIB) {\r | |
188 | $Makefile{MYEXTLIB} = $MYEXTLIB;\r | |
189 | }\r | |
190 | \r | |
191 | # See lib/ExtUtils/MakeMaker.pm for details of how to influence\r | |
192 | # the contents of the Makefile that is written.\r | |
193 | #\r | |
194 | WriteMakefile(%Makefile);\r | |
195 | \r | |
196 | if ($USE_KAFFE) {\r | |
197 | my $path = $JAVALIBS[0];\r | |
198 | $path =~ s%/libkaffevm.so$%%;\r | |
199 | print "\n\n***NOTE: be sure to have:\n",\r | |
200 | " LD_LIBRARY_PATH=$path\n",\r | |
201 | " in your enviornment (or installed as a system dynamic\n",\r | |
202 | " library location) when you compile and run this.\n";\r | |
203 | }\r | |
204 | \r | |
205 | # subroutine to find a library\r | |
206 | #\r | |
207 | sub find_stuff {\r | |
208 | \r | |
209 | my ($candidates, $locations) = @_;\r | |
210 | my $lib;\r | |
211 | $wanted = sub {\r | |
212 | foreach my $name (@$candidates) {\r | |
213 | if (/$name$/ and ! /green_threads/ and !/include-old/) {\r | |
214 | $lib = $File::Find::name;\r | |
215 | }\r | |
216 | }\r | |
217 | };\r | |
218 | \r | |
219 | use File::Find;\r | |
220 | foreach my $guess (@$locations) {\r | |
221 | next unless -d $guess;\r | |
222 | find (\&$wanted, $guess);\r | |
223 | }\r | |
224 | if (! $lib) {\r | |
225 | print "Could not find @$candidates\n";\r | |
226 | } else {\r | |
227 | print "Found @$candidates as $lib\n\n";\r | |
228 | }\r | |
229 | return $lib;\r | |
230 | }\r | |
231 | \r | |
232 | # Extra lib for Java 1.2\r | |
233 | #\r | |
234 | # if we want KAFFE, check for it, otherwise search for Java\r | |
235 | \r | |
236 | sub find_libs {\r | |
237 | my($libjava, $libawt, $libjvm);\r | |
238 | \r | |
239 | if ($USE_KAFFE) {\r | |
240 | $libjava = find_stuff(['libkaffevm.so'], \@KAFFE_LIB_GUESSES);\r | |
241 | $libawt = find_stuff(['libawt.so'], \@KAFFE_LIB_GUESSES);\r | |
242 | } else {\r | |
243 | $libjava = find_stuff(['libjava.so', 'javai.lib', 'jvm.lib'],\r | |
244 | \@JAVA_HOME_GUESSES);\r | |
245 | $libjvm = find_stuff(['libjvm.so'], \@JAVA_HOME_GUESSES);\r | |
246 | $libawt = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);\r | |
247 | if (defined $libjvm) { # JDK 1.2\r | |
248 | my $libhpi = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);\r | |
249 | return($libjava, $libjvm, $libhpi, $libawt);\r | |
250 | }\r | |
251 | }\r | |
252 | return($libjava, $libawt);\r | |
253 | }\r | |
254 | \r | |
255 | # We need to find jni.h and jni_md.h\r | |
256 | #\r | |
257 | \r | |
258 | # Always do find_includes as the first operation, as it has the side effect\r | |
259 | # of deciding whether or not we are looking for Kaffe. --bkuhn\r | |
260 | \r | |
261 | sub find_includes {\r | |
262 | \r | |
263 | my @CANDIDATES = qw(jni.h jni_md.h);\r | |
264 | my @includes;\r | |
265 | \r | |
266 | sub find_inc {\r | |
267 | foreach my $name (@CANDIDATES) {\r | |
268 | if (/$name$/) {\r | |
269 | my ($hname, $hpath, $hsuffix) = \r | |
270 | fileparse($File::Find::name, ("\.h", "\.H"));\r | |
271 | unless ($hpath =~ /include-old/) {\r | |
272 | print "Found $hname$hsuffix in $hpath\n";\r | |
273 | push @includes, $hpath;\r | |
274 | } \r | |
275 | }\r | |
276 | }\r | |
277 | }\r | |
278 | \r | |
279 | use File::Find;\r | |
280 | foreach my $guess (@KAFFE_INCLUDE_GUESSES) {\r | |
281 | next unless -d $guess;\r | |
282 | find (\&find_inc, $guess);\r | |
283 | }\r | |
284 | # If we have found includes, then we are using Kaffe.\r | |
285 | if (@includes > 0) {\r | |
286 | $USE_KAFFE = 1;\r | |
287 | } else {\r | |
288 | foreach my $guess (@JAVA_HOME_GUESSES) {\r | |
289 | next unless -d $guess;\r | |
290 | find (\&find_inc, $guess);\r | |
291 | }\r | |
292 | }\r | |
293 | die "Could not find Java includes!" unless (@includes);\r | |
294 | \r | |
295 | return @includes;\r | |
296 | }\r | |
297 | \r |