Artistic fine-tuning.
[p5sagit/p5-mst-13.2.git] / jpl / JNI / Makefile.PL
1 #!/usr/bin/perl
2 use ExtUtils::MakeMaker;
3 use Getopt::Std;
4 use Config;
5 $ARCHNAME = $Config{archname};
6 use File::Basename;
7
8 getopts('e'); # embedding?
9
10 #require "JNIConfig";
11
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";
20
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     } 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 #
58 foreach (@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?
73 if ($LIBPATH =~ /native/) {
74     print "Looks like native threads...\n";
75     $CCFLAGS .= " -D_REENTRANT";
76 }
77
78 if ($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.
87 if ($^O eq 'solaris') {
88     $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!
89     $CCFLAGS .= " -D_REENTRANT";
90 }
91
92 my %Makefile = (
93     NAME        => 'JNI',
94     VERSION_FROM => 'JNI.pm',
95     DEFINE        => '',
96     LINKTYPE => 'dynamic',
97     INC        => $INC,
98     CCFLAGS => "$Config{ccflags} $CCFLAGS", 
99     ($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),
100 );
101
102 $Makefile{LIBS} = ["$LIBPATH $LIBS"];
103 if ($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 #
110 WriteMakefile(%Makefile);
111
112 # subroutine to find a library
113 #
114 sub find_stuff {
115
116     my ($candidates, $locations) = @_;
117
118     my $lib;
119     $wanted = sub {
120         foreach my $name (@$candidates) {
121             if (/$name$/ and ! /green_threads/ and !/include-old/) {
122                     $lib = $File::Find::name;
123             }
124         }
125     };
126     
127     use File::Find;
128     foreach my $guess (@$locations) {
129         next unless -d $guess;
130         find (\&$wanted, $guess);
131     }
132     if (! $lib) {
133         print "Could not find @$candidates\n";
134     } else {
135         print "Found @$candidates as $lib\n\n";
136     }
137     return $lib;
138 }
139
140 # Extra lib for Java 1.2
141 #
142 sub find_libs {
143
144     my $libjava = find_stuff(['libjava.so', 'libkaffevm.so', 'javai.lib', 'jvm.lib'],
145                         \@JAVA_HOME_GUESSES);
146     my $libjvm  = find_stuff(['libjvm.so'],  \@JAVA_HOME_GUESSES);
147     if ($libjvm) { # JDK 1.2
148         my $libhpi  = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
149         my $libawt  = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
150         return($libjava, $libjvm, $libhpi, $libawt);
151     } else {
152         return($libjava);
153     }
154
155 }
156
157 # We need to find jni.h and jni_md.h
158 #
159 sub find_includes {
160
161     my @CANDIDATES = qw(jni.h jni_md.h);
162     my @includes;
163
164     sub find_inc {
165         foreach my $name (@CANDIDATES) {
166             if (/$name$/) {
167                 my ($hname, $hpath, $hsuffix) = 
168                     fileparse($File::Find::name, ("\.h", "\.H"));
169                 unless ($hpath =~ /include-old/) {
170                     print "Found $hname$hsuffix in $hpath\n";
171                     push @includes, $hpath;
172                 }
173             }
174         }
175     }
176     
177     use File::Find;
178     foreach my $guess (@JAVA_HOME_GUESSES) {
179         next unless -d $guess;
180         find (\&find_inc, $guess);
181     }
182     if (! @includes) {
183         die "Could not find Java includes!";
184     } else {
185         print join("\n", @includes), "\n";
186     }
187     return @includes;
188 }
189