Commit | Line | Data |
d50cb536 |
1 | #!/usr/bin/perl |
d50cb536 |
2 | use ExtUtils::MakeMaker; |
b83c0eaa |
3 | use Getopt::Std; |
d50cb536 |
4 | use Config; |
b83c0eaa |
5 | $ARCHNAME = $Config{archname}; |
6 | use File::Basename; |
d50cb536 |
7 | |
b83c0eaa |
8 | getopts('e'); # embedding? |
d50cb536 |
9 | |
b83c0eaa |
10 | #require "JNIConfig"; |
d50cb536 |
11 | |
b83c0eaa |
12 | if ($^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 | # |
23 | my @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 ); |
26 | if (! 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 | # |
36 | my @INCLUDE = find_includes(); |
37 | $INC = join(" -I", ("", @INCLUDE)); |
38 | |
39 | # Let's find out the name of the Java shared library |
40 | # |
41 | my @JAVALIBS = find_libs(); |
42 | |
43 | # Find out some defines based on the library we are linking to |
44 | # |
45 | foreach (@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 | # |
60 | foreach (@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? |
75 | if ($LIBPATH =~ /native/) { |
76 | print "Looks like native threads...\n"; |
77 | $CCFLAGS .= " -D_REENTRANT"; |
78 | } |
79 | |
80 | if ($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. |
89 | if ($^O eq 'solaris') { |
90 | $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!! |
91 | $CCFLAGS .= " -D_REENTRANT"; |
92 | } |
93 | |
94 | my %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"]; |
104 | if ($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 | # |
111 | WriteMakefile(%Makefile); |
112 | |
113 | # subroutine to find a library |
114 | # |
115 | sub 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 | # |
143 | sub 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 | # |
160 | sub 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 | |