Respecting users JAVA_HOME; be quiet when running java_home in OSX
[scilab.git] / scilab / m4 / java.m4
1 ## Macros "stolen" from jacl (http://tcljava.sourceforge.net/)
2 ## They made a great job on this part !
3
4 #------------------------------------------------------------------------
5 # AC_MSG_LOG( MSG, ?LOGONLY? )
6 #
7 #    Write the message out to the config.log file and the console.
8 #    If 1 is passed as the second argument, then write to the
9 #    config.log file only.
10 #
11 # Arguments:
12 #    1. The message to log
13 #    2. Optional boolean, if true then write to config.log only
14 #------------------------------------------------------------------------
15
16 AC_DEFUN([AC_MSG_LOG], [
17     echo $1 >&AS_MESSAGE_LOG_FD
18     m4_ifval([$2],,[echo $1])
19 ])
20
21 #------------------------------------------------------------------------
22 # AC_GREP_FILE( PATTERN, FILE, ACTION-IF-FOUND, [ACTION-IF-NOT-FOUND])
23 #
24 #    Use grep to search for a pattern in a file. If the pattern
25 #    is not found then return a non zero exit status. No information
26 #    will be echoed to the screen by this macro.
27 #
28 # Arguments:
29 #    1. The pattern to search for
30 #    2. The name of the file to be grep'ed
31 #    3. The script to execute if PATTERN is found in FILE
32 #    4. The script to execute if PATTERN is not found in FILE (optional)
33 #------------------------------------------------------------------------
34
35 AC_DEFUN([AC_GREP_FILE], [
36     AC_MSG_LOG([grep in $2 for pattern '"$1"'], 1)
37     if (grep "$1" $2 > /dev/null 2>&1) ; then
38         AC_MSG_LOG([grep result : yes], 1)
39         $3
40     else
41         AC_MSG_LOG([grep result : no], 1)
42         m4_ifval([$4], [
43             $4
44         ])dnl
45     fi
46 ])
47
48
49 #------------------------------------------------------------------------
50 # AC_PROG_JAVAC
51 #
52 #    If JAVAC is not already defined, then search for "javac" on
53 #    the path. If a java compiler is found, then test it to make
54 #    sure it actually works.
55 #
56 # Arguments:
57 #    NONE
58 #
59 # VARIABLES SET:
60 #    JAVAC can be set to the path name of the java compiler
61 #    JAVAC_FLAGS can be set to compiler specific flags
62 #    ac_java_jvm_dir can be set to the jvm's root directory
63 #------------------------------------------------------------------------
64
65 AC_DEFUN([AC_PROG_JAVAC], [
66 # Mac OS X
67     if test "x$JAVAC" = "x" ; then
68     case "$host_os" in
69          *darwin* )
70          # Don't follow the symlink since Java under MacOS is messy
71          # Uses the wrapper providing by Apple to retrieve the path
72          # See: http://developer.apple.com/mac/library/qa/qa2001/qa1170.html
73            JAVAC=$(/usr/libexec/java_home --arch x86_64 --failfast --version 1.6+)/bin/javac
74                DONT_FOLLOW_SYMLINK=yes
75          ;;
76     esac
77     fi
78     if test "x$JAVAC" = "x" ; then
79         AC_PATH_PROG(JAVAC, javac)
80         if test "x$JAVAC" = "x" ; then
81             AC_MSG_ERROR([javac not found on PATH ... did you try with --with-jdk=DIR])
82         fi
83     fi
84     if test ! -f "$JAVAC" ; then
85         AC_MSG_ERROR([javac '$JAVAC' does not exist.
86         Perhaps Java is not installed or you passed a bad dir to a --with option.])
87     fi
88
89     # Check for installs which uses a symlink. If it is the case, try to resolve JAVA_HOME from it
90     if test -h "$JAVAC" -a "x$DONT_FOLLOW_SYMLINK" != "xyes"; then
91         FOLLOW_SYMLINKS($JAVAC,"javac")
92         JAVAC=$SYMLINK_FOLLOWED_TO
93         TMP=`dirname $SYMLINK_FOLLOWED_TO`
94         TMP=`dirname $TMP`
95         ac_java_jvm_dir=$TMP
96         echo "Java base directory (probably) available here : $ac_java_jvm_dir"
97     fi
98
99
100
101     # If we were searching for javac, then set ac_java_jvm_dir
102     if test "x$ac_java_jvm_dir" = "x"; then
103         TMP=`dirname $JAVAC`
104         TMP=`dirname $TMP`
105         ac_java_jvm_dir=$TMP
106     fi
107
108     # Look for a setting for the CLASSPATH, we might need one to run JAVAC
109     AC_JAVA_CLASSPATH
110
111     # FIXME : add detection of command line arguments for JAVAC
112
113     JAVAC_FLAGS=-g
114     JAVAC_D_FLAG=-d
115
116     dnl Test out the Java compiler with an empty class
117     AC_MSG_CHECKING([to see if the java compiler works])
118     AC_JAVA_TRY_COMPILE(,,"no",works=yes)
119     if test "$works" = "yes" ; then
120         AC_MSG_RESULT($works)
121     else
122         AC_MSG_ERROR([Could not compile simple Java program with '$JAVAC'. Try with the Sun JDK (1.5 or 6).])
123     fi
124
125     AC_MSG_LOG([Using JAVAC=$JAVAC])
126 ])
127
128
129 #------------------------------------------------------------------------
130 # AC_JAVA_TRY_COMPILE(imports, main-body, try-to-run, action-if-worked, [action-if-failed])
131 #
132 #    Try to compile a Java program. This works a lot like AC_TRY_COMPILE
133 #    except is supports Java instead of C or C++. This macro will create
134 #    a file named Test.java and try to compile it.
135 #
136 # Arguments:
137 #    imports should contain Java import statements like [import java.util.*;]
138 #       main-body should contain the code to appear in the main() method
139 #    action-if-worked should contain the code to run if the compile worked
140 #    action-if-failed should contain the code to run if the compile failed (optional)
141 #------------------------------------------------------------------------
142
143 AC_DEFUN([AC_JAVA_TRY_COMPILE], [
144     cat << \EOF > conftest.java
145 // [#]line __oline__ "configure"
146 import java.util.regex.Pattern;
147
148 [$1]
149
150 public class conftest {
151     public static void main(String[[]] argv) {
152         [$2]
153     }
154
155     private static int compare(String v1, String v2) {
156         String s1 = normalisedVersion(v1);
157         String s2 = normalisedVersion(v2);
158         return s1.compareTo(s2);
159     }
160
161     private static String normalisedVersion(String version) {
162         return normalisedVersion(version, ".", 4);
163     }
164
165     private static String normalisedVersion(String version, String sep, int maxWidth) {
166         String[[]] split = Pattern.compile(sep, Pattern.LITERAL).split(version);
167         StringBuilder sb = new StringBuilder();
168         for (String s : split) {
169             sb.append(String.format("%" + maxWidth + 's', s));
170         }
171         return sb.toString();
172     }
173 }
174 EOF
175
176     CLASSPATH=$ac_java_classpath
177     export CLASSPATH
178     cmd="$JAVAC ${JAVAC_FLAGS} conftest.java"
179     if (echo $cmd >&AS_MESSAGE_LOG_FD ; eval $cmd >conftest.java.output 2>&AS_MESSAGE_LOG_FD) ; then
180        if test "$3" = "no"; then
181            echo "yes" >&AS_MESSAGE_LOG_FD
182               $4
183        else
184               cmd="$JAVA conftest"
185               if (echo $cmd >&AS_MESSAGE_LOG_FD ; eval $cmd >conftest.java.output 2>&AS_MESSAGE_LOG_FD); then
186                echo "yes" >&AS_MESSAGE_LOG_FD
187                   $4
188             else
189                 echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
190                 cat conftest.java >&AS_MESSAGE_LOG_FD
191                 if test -s conftest.java.output; then
192                    STDOUT=`cat conftest.java.output`
193                 fi
194                 echo "configure: CLASSPATH was $CLASSPATH" >&AS_MESSAGE_LOG_FD
195                 m4_ifval([$5],
196                 [  $5
197                 ])dnl
198             fi
199         fi
200         if test -f conftest.java.output; then
201            rm conftest.java.output
202         fi
203     else
204         echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
205         cat conftest.java >&AS_MESSAGE_LOG_FD
206         echo "configure: CLASSPATH was $CLASSPATH" >&AS_MESSAGE_LOG_FD
207         m4_ifval([$5],
208         [  $5
209         ])dnl
210     fi
211 ])
212
213
214 #------------------------------------------------------------------------
215 # AC_JAVA_DETECT_JVM
216 #
217 #    Figure out what JVM to build with. If no JVM was already defined
218 #    using a --with command line option then we search for one
219 #    by looking for the javac executable.
220 #
221 # Arguments:
222 #    NONE
223 #
224 # VARIABLES SET:
225 #    JAVAC
226 #    ac_java_jvm_version can be set to 1.4, 1.5, 1.6 or 1.7
227 #    ac_java_jvm_dir can be set to the jvm's root directory
228 #
229 # DEPENDS ON:
230 #    This macro can depend on the values set by the following macros:
231 #    AC_JAVA_WITH_JDK
232 #    AC_PROG_JAVAC
233 #------------------------------------------------------------------------
234
235 AC_DEFUN([AC_JAVA_DETECT_JVM], [
236     AC_MSG_CHECKING([JAVA_HOME variable])
237     # check if JAVA_HOME is set. If it is the case, try to use if first
238     if test ! -z "$JAVA_HOME" && test "x$ac_java_jvm_dir" = "x"; then
239         if test -x $JAVA_HOME/bin/javac${EXEEXT}; then
240             AC_MSG_RESULT([JAVA_HOME variable found, use it as JVM root directory])
241                 ac_java_jvm_dir=`cd $JAVA_HOME ; pwd`
242             JAVAC=$ac_java_jvm_dir/bin/javac${EXEEXT}
243         else
244             AC_MSG_RESULT([JAVA_HOME variable found, but unable to find javac
245 Maybe JAVA_HOME is pointing to a JRE (Java Runtime Environment) instead of a JDK (Java Developement Kit) ? )])
246         fi
247     else
248         AC_MSG_RESULT([not defined])
249     fi
250
251 # Mac OS default path
252     if test "x$JAVAC" = "x" && test "x$ac_java_jvm_dir" != "x"; then
253         case "$host_os" in
254              *darwin* )
255             AC_MSG_RESULT([Darwin (Mac OS X) found. Use the standard paths.])
256             # See: http://developer.apple.com/mac/library/qa/qa2001/qa1170.html
257             ac_java_jvm_dir=$(/usr/libexec/java_home --arch x86_64 --failfast --version 1.6+)
258             JAVAC=$ac_java_jvm_dir/bin/javac
259             ;;
260         esac
261     fi
262
263     # if we do not know the jvm dir, javac will be found on the PATH
264     if test "x$JAVAC" = "x" && test "x$ac_java_jvm_dir" != "x"; then
265         ac_java_jvm_dir=`cd $ac_java_jvm_dir ; pwd`
266         JAVAC=$ac_java_jvm_dir/bin/javac${EXEEXT}
267     fi
268
269     # Search for and test the javac compiler
270     AC_PROG_JAVAC
271
272     AC_MSG_LOG([Java found in $ac_java_jvm_dir])
273
274     # Try to detect non JDK JVMs. If we can't, then just assume a jdk
275
276     AC_MSG_CHECKING([type of jvm])
277
278     if test "x$ac_java_jvm_name" = "x" ; then
279         AC_JAVA_TRY_COMPILE([import gnu.java.io.EncodingManager;],,"no",ac_java_jvm_name=gcj)
280     fi
281
282     if test "x$ac_java_jvm_name" = "x" ; then
283        ac_java_jvm_name=jdk
284     fi
285
286     AC_MSG_RESULT([$ac_java_jvm_name])
287
288     case "$ac_java_jvm_name" in
289         gcj) DO=nothing ;;
290         jdk) DO=nothing ;;
291         *) AC_MSG_ERROR(['$ac_java_jvm_name' is not a supported JVM]) ;;
292     esac
293
294     # Try to detect the version of java that is installed
295
296     AC_MSG_CHECKING([java API version])
297
298     # The class java.nio.charset.Charset is new to 1.4
299     AC_JAVA_TRY_COMPILE([import java.nio.charset.Charset;], , "no", ac_java_jvm_version=1.4)
300
301     # The class java.lang.StringBuilder is new to 1.5
302     AC_JAVA_TRY_COMPILE([import java.lang.StringBuilder;], , "no", ac_java_jvm_version=1.5)
303
304     # The class java.util.ArrayDeque is new to 1.6
305     AC_JAVA_TRY_COMPILE([import java.util.ArrayDeque;], , "no", ac_java_jvm_version=1.6)
306
307     # The class java.nio.file.Path is new to 1.7
308     AC_JAVA_TRY_COMPILE([import java.nio.file.Path;], , "no", ac_java_jvm_version=1.7)
309
310     if test "x$ac_java_jvm_version" = "x" ; then
311         AC_MSG_ERROR([Could not detect Java version, 1.4 or newer is required])
312     fi
313
314     AC_MSG_RESULT([$ac_java_jvm_version])
315
316 ])
317
318
319 #------------------------------------------------------------------------
320 # AC_JAVA_CLASSPATH
321 #
322 #    Find out which .zip or .jar files need to be included on
323 #    the CLASSPATH if we are setting it via an env variable.
324 #
325 # Arguments:
326 #    NONE
327 #
328 # VARIABLES SET:
329 #    ac_java_classpath
330 #
331 # DEPENDS ON:
332 #    This macro is used by the AC_JAVA_DETECT_JVM macro.
333 #    It depends on the ac_java_jvm_dir variable.
334 #------------------------------------------------------------------------
335
336 AC_DEFUN([AC_JAVA_CLASSPATH], [
337     AC_MSG_CHECKING([for zip or jar files to include on CLASSPATH])
338
339     if test "x$ac_java_jvm_dir" = "x" ; then
340         AC_MSG_ERROR([jvm directory not set])
341     fi
342
343     # GNU gcj does not need to set the CLASSPATH.
344
345     # Assume that JDK 1.4 and newer systems will
346     # not need to explicitly set the CLASSPATH.
347
348     # Append CLASSPATH if env var is set. Avoid append
349     # under msys because CLASSPATH is in Win32 format
350     # and we can't combine it with a msys path.
351     if test "x$CLASSPATH" != "x" && test "$ac_cv_tcl_win32" != "yes" ; then
352         AC_MSG_LOG([Adding user supplied CLASSPATH env var])
353         ac_java_classpath="${ac_java_classpath}:${CLASSPATH}"
354     fi
355
356     AC_MSG_LOG([Using CLASSPATH=$ac_java_classpath],1)
357     AC_MSG_RESULT($ac_java_classpath)
358 ])
359
360
361 #------------------------------------------------------------------------
362 # AC_JAVA_JNI_INCLUDE
363 #
364 #    Figure out where jni.h and jni_md.h include files are installed.
365 #
366 # Arguments:
367 #    NONE
368 #
369 # VARIABLES SET:
370 #    ac_java_jvm_jni_include_flags : Flags that we pass to the compiler
371 #           so that it can locate JNI headers. (for example: -I/usr/jdk/include)
372 #
373 # DEPENDS ON:
374 #    This macro must be run after the AC_JAVA_DETECT_JVM macro as
375 #    it depends on the ac_java_jvm_dir variable.
376 #------------------------------------------------------------------------
377
378 AC_DEFUN([AC_JAVA_JNI_INCLUDE], [
379
380     # JAVA_HOME specificed, check if we can find jni.h in this path
381     if test !  -z "$JAVA_HOME"; then
382         ac_java_jvm_dir=$JAVA_HOME
383     fi
384     # Look for jni.h in the subdirectory $ac_java_jvm_dir/include
385
386     F=$ac_java_jvm_dir/include/jni.h
387     if test -f "$F" ; then
388          ac_java_jvm_jni_include_flags="-I`dirname $F`"
389     else
390          F=`ls $ac_java_jvm_dir/include/*/jni.h 2>/dev/null`
391          if test -f "$F" ; then
392              ac_java_jvm_jni_include_flags="-I`dirname $F`"
393          else
394         case "$host_os" in
395              *darwin* )
396                        ac_java_jvm_jni_include_flags="-I/Developer/SDKs/MacOSX${macosx_version}.sdk/System/Library/Frameworks/JavaVM.framework/Headers -I$(/usr/libexec/java_home --arch x86_64 --failfast --version 1.6+)/include/ -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/"
397                   ;;
398               *)
399                        AC_MSG_ERROR([Could not locate Java's jni.h include file])
400                ;;
401                esac
402          fi
403     fi
404
405     # Look for jni_md.h in an arch specific subdirectory
406     # we assume that there is only one arch subdirectory,
407     # if that is not the case we would need to use $host
408
409     F=`ls $ac_java_jvm_dir/include/*/jni_md.h 2>/dev/null`
410     if test -f "$F" ; then
411         ac_java_jvm_jni_include_flags="$ac_java_jvm_jni_include_flags -I`dirname $F`"
412     fi
413
414     AC_MSG_LOG([Using the following JNI include flags $ac_java_jvm_jni_include_flags])
415
416     # Make sure a simple #include <jni.h> will compile.
417
418     AC_REQUIRE([AC_PROG_CC])
419
420     AC_CACHE_CHECK(if jni.h can be included,
421         ac_cv_java_jvm_jni_working,[
422         AC_LANG_PUSH(C)
423         ac_saved_cflags=$CFLAGS
424         CFLAGS="$CFLAGS $ac_java_jvm_jni_include_flags"
425         AC_TRY_COMPILE([
426             #include <jni.h>
427         ],[return 0;],
428         ac_cv_java_jvm_jni_working=yes,
429         AC_MSG_ERROR([could not compile file that includes jni.h. If you run Mac OS X please make sure you have 'Java developer package'. This is available on http://connect.apple.com/ ]))
430         AC_LANG_POP()
431         CFLAGS=$ac_saved_cflags
432     ])
433
434     # FIXME: should we look for or require a include/native_threads dir?
435 ])
436
437
438
439 #------------------------------------------------------------------------
440 # AC_JAVA_JNI_LIBS
441 #
442 #    Figure out where the native threads libraries for JNI live.
443 #
444 # Arguments:
445 #    NONE
446 #
447 # VARIABLES SET:
448 #    ac_java_jvm_ld_preload : list of libraries to include in LD_PRELOAD
449 #    ac_java_jvm_ld_bind_now : if set to 1, then use LD_BIND_NOW=1
450 #    ac_java_jvm_jni_lib_flags : library flags that we will pass to the compiler.
451 #        For instance, we might pass -L/usr/jdk/lib -ljava
452 #    ac_java_jvm_jni_lib_runtime_path : colon separated path of directories
453 #        that is typically passed to rld.
454 #
455 # DEPENDS ON:
456 #    This macro must be run after the AC_JAVA_DETECT_JVM macro as
457 #    it depends on the ac_java_jvm_dir variable.
458 #------------------------------------------------------------------------
459
460 AC_DEFUN([AC_JAVA_JNI_LIBS], [
461     machine=`uname -m`
462     case "$machine" in
463         i?86)
464           machine=i386
465           ;;
466         i86pc)
467         # Solaris 10 x86
468           machine=i386
469           ;;
470         sun*|sparc64)
471        # Sun
472           machine=sparc
473           ;;
474         powerpc|ppc64)
475           machine=ppc
476           ;;
477         armv*)
478           machine=arm
479           ;;
480         sh*)
481             machine=sh
482           ;;
483         mips64)
484             machine=mips
485           ;;
486     esac
487
488     AC_MSG_LOG([Looking for JNI libs with $machine as machine hardware name])
489
490     # Check for known JDK installation layouts
491
492     # Gives the name of the symbol we want to look for.
493     # Mac OS X add a trailing _Impl
494     libSymbolToTest="JNI_GetCreatedJavaVMs"
495
496     if test "$ac_java_jvm_name" = "jdk"; then
497         # Sun/Blackdown 1.4 for Linux (client JVM)
498
499         F=jre/lib/$machine/libjava.so
500         if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
501             AC_MSG_LOG([Looking for $ac_java_jvm_dir/$F])
502             if test -f $ac_java_jvm_dir/$F ; then
503                 AC_MSG_LOG([Found $ac_java_jvm_dir/$F])
504                 D=`dirname $ac_java_jvm_dir/$F`
505                 ac_java_jvm_jni_lib_runtime_path=$D
506                 ac_java_jvm_jni_lib_flags="-L$D -ljava -lverify"
507                 D=$ac_java_jvm_dir/jre/lib/$machine/client
508         if test ! -f $D/libjvm.so; then # Check if it is in the client or server directory
509             # Try the server directory
510             D=$ac_java_jvm_dir/jre/lib/$machine/server
511             if test ! -f $D/libjvm.so; then
512                 AC_MSG_ERROR([Could not find libjvm.so in
513                 jre/lib/$machine/client/ or in jre/lib/$machine/server/.
514                 Please report to http://bugzilla.scilab.org/])
515             fi
516         fi
517                 ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
518                 ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D -ljvm"
519                 D=$ac_java_jvm_dir/jre/lib/$machine/native_threads
520                 if test -d $D; then
521                   ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
522                   ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D"
523                 fi
524             fi
525         fi
526
527         # Sun JDK 1.5 for AMD64 Linux (server JVM)
528
529         F=jre/lib/amd64/libjava.so
530         if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
531             AC_MSG_LOG([Looking for $ac_java_jvm_dir/$F])
532             if test -f $ac_java_jvm_dir/$F ; then
533                 AC_MSG_LOG([Found $ac_java_jvm_dir/$F])
534
535                 D=`dirname $ac_java_jvm_dir/$F`
536                 ac_java_jvm_jni_lib_runtime_path=$D
537                 ac_java_jvm_jni_lib_flags="-L$D -ljava -lverify"
538
539                 D=$ac_java_jvm_dir/jre/lib/amd64/server
540                 ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
541                 ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D -ljvm"
542             fi
543         fi
544
545         # Eclipse/IBM Java Compiler
546
547         F=jre/lib/i386/client/libjvm.so
548         if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
549             AC_MSG_LOG([Looking for $ac_java_jvm_dir/$F])
550             if test -f $ac_java_jvm_dir/$F ; then
551                 AC_MSG_LOG([Found $ac_java_jvm_dir/$F])
552
553                 D=`dirname $ac_java_jvm_dir/$F`
554                 ac_java_jvm_jni_lib_runtime_path=$D
555                 ac_java_jvm_jni_lib_flags="-L$D -ljvm"
556
557                 D=$ac_java_jvm_dir/jre/lib/i386/server
558                 ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
559                 ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D -ljvm"
560             fi
561         fi
562
563         # IBM Java Compiler under Suse (and probably others)
564
565         F=jre/bin/classic/libjvm.so
566         if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
567             AC_MSG_LOG([Looking for $ac_java_jvm_dir/$F])
568             if test -f $ac_java_jvm_dir/$F ; then
569                 AC_MSG_LOG([Found $ac_java_jvm_dir/$F])
570
571                 D=`dirname $ac_java_jvm_dir/$F`
572                 ac_java_jvm_jni_lib_runtime_path=$D
573                 ac_java_jvm_jni_lib_flags="-L$D -ljvm"
574
575                 D=$ac_java_jvm_dir/bin/
576                 ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
577                 ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D -ljava"
578             fi
579         fi
580
581         # Sun JDK 1.4 and 1.5 for Win32 (client JVM)
582
583         F=lib/jvm.lib
584         if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
585             AC_MSG_LOG([Looking for $ac_java_jvm_dir/$F])
586             if test -f $ac_java_jvm_dir/$F ; then
587                 # jre/bin/client must contain jvm.dll
588                 # jre/bin/server directory could also contain jvm.dll,
589                 # just assume the user wants to use the client JVM.
590                 DLL=jre/bin/client/jvm.dll
591                 if test -f $ac_java_jvm_dir/$DLL ; then
592                     AC_MSG_LOG([Found $ac_java_jvm_dir/$F])
593                     D1=$ac_java_jvm_dir/jre/bin
594                     D2=$ac_java_jvm_dir/jre/bin/client
595                     ac_java_jvm_jni_lib_runtime_path="${D1}:${D2}"
596                     ac_java_jvm_jni_lib_flags="$ac_java_jvm_dir/$F"
597                 fi
598             fi
599         fi
600     fi
601
602         # Under GNU/Debian on a mipsel CPU, uname -m is still returning mips
603         # causing a confusion with mips... Therefor, I have to hardcode this
604         # test
605         # Note that most of the code is duplicated from
606         # Sun/Blackdown 1.4 for Linux (client JVM) tests
607         F=jre/lib/mipsel/libjava.so
608         if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
609             AC_MSG_LOG([Looking for $ac_java_jvm_dir/$F])
610             if test -f $ac_java_jvm_dir/$F ; then
611                 AC_MSG_LOG([Found $ac_java_jvm_dir/$F])
612                 D=`dirname $ac_java_jvm_dir/$F`
613                 ac_java_jvm_jni_lib_runtime_path=$D
614                 ac_java_jvm_jni_lib_flags="-L$D -ljava -lverify"
615                 D=$ac_java_jvm_dir/jre/lib/mipsel/client
616         if test ! -f $D/libjvm.so; then # Check if it is in the client or server directory
617             # Try the server directory
618             D=$ac_java_jvm_dir/jre/lib/mipsel/server
619         fi
620                 ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
621                 ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D -ljvm"
622                 D=$ac_java_jvm_dir/jre/lib/mipsel/native_threads
623                 if test -d $D; then
624                   ac_java_jvm_jni_lib_runtime_path="${ac_java_jvm_jni_lib_runtime_path}:$D"
625                   ac_java_jvm_jni_lib_flags="$ac_java_jvm_jni_lib_flags -L$D"
626                 fi
627             fi
628         fi
629
630     # Generate error for unsupported JVM layout
631
632     if test "x$ac_java_jvm_jni_lib_flags" = "x" ; then
633         AC_MSG_ERROR([Could not detect the location of the Java
634             shared library. You will need to update java.m4
635             to add support for this JVM configuration.])
636     fi
637
638     AC_MSG_LOG([Using the following JNI library flags $ac_java_jvm_jni_lib_flags])
639     AC_MSG_LOG([Using the following runtime library path $ac_java_jvm_jni_lib_runtime_path])
640
641     AC_MSG_LOG([Using LD_PRELOAD=$ac_java_jvm_ld_preload],1)
642     AC_MSG_LOG([Using LD_BIND_NOW=$ac_java_jvm_ld_bind_now],1)
643
644     # Make sure we can compile and link a trivial JNI program
645
646     AC_REQUIRE([AC_PROG_CC])
647
648     AC_CACHE_CHECK(to see if we can link a JNI application,
649         ac_cv_java_jvm_working_jni_link,[
650         AC_LANG_PUSH(C)
651         ac_saved_cflags=$CFLAGS
652         ac_saved_libs=$LIBS
653         CFLAGS="$CFLAGS $ac_java_jvm_jni_include_flags"
654         LIBS="$LIBS $ac_java_jvm_jni_lib_flags"
655         AC_TRY_LINK([
656             #include <jni.h>
657         ],[$libSymbolToTest(NULL,0,NULL);],
658             ac_cv_java_jvm_working_jni_link=yes,
659             ac_cv_java_jvm_working_jni_link=no)
660         AC_LANG_POP()
661         CFLAGS=$ac_saved_cflags
662         LIBS=$ac_saved_libs
663     ])
664
665     # gcc can't link with some JDK .lib files under Win32.
666     # Work around this problem by linking with win/libjvm.dll.a
667
668     if test "$ac_cv_java_jvm_working_jni_link" != "yes" &&
669       test "$ac_cv_tcl_win32" = "yes"; then
670         AC_LANG_PUSH(C)
671         ac_saved_cflags=$CFLAGS
672         ac_saved_libs=$LIBS
673         CFLAGS="$CFLAGS $ac_java_jvm_jni_include_flags"
674         LIBS="$LIBS -L$srcdir/win -ljvm"
675         AC_TRY_LINK([
676             #include <jni.h>
677         ],[$libSymbolToTest(NULL,0,NULL);],
678             ac_cv_java_jvm_working_jni_link=yes,
679             ac_cv_java_jvm_working_jni_link=no)
680         AC_LANG_POP()
681         CFLAGS=$ac_saved_cflags
682         LIBS=$ac_saved_libs
683
684         if test "$ac_cv_java_jvm_working_jni_link" = "yes"; then
685             AC_MSG_LOG([Using custom JNI link lib])
686             ac_java_jvm_jni_lib_flags="-L$srcdir/win -ljvm"
687         fi
688     fi
689
690     if test "$ac_cv_java_jvm_working_jni_link" != "yes"; then
691         AC_MSG_ERROR([could not link file that includes jni.h
692         Either the configure script does not know how to deal with
693         this JVM configuration or the JVM install is broken or corrupted.])
694     fi
695 ])
696
697
698 #------------------------------------------------------------------------
699 # AC_JAVA_WITH_JDK
700 #
701 #    Check to see if the --with-jdk command line option is given.
702 #    If it was, then set ac_java_with_jdk to the DIR argument.
703 #
704 # Arguments:
705 #    NONE
706 #
707 # VARIABLES SET:
708 #    ac_java_with_jdk can be set to the directory where the jdk lives
709 #    ac_java_jvm_name can be set to "jdk"
710 #------------------------------------------------------------------------
711
712 AC_DEFUN([AC_JAVA_WITH_JDK], [
713     AC_ARG_WITH(jdk,
714     AC_HELP_STRING([--with-jdk=DIR],[use JDK from DIR]),
715     ok=$withval, ok=no)
716     if test "$ok" = "no" ; then
717         NO=op
718     elif test "$ok" = "yes" || test ! -d "$ok"; then
719         AC_MSG_ERROR([--with-jdk=DIR option, must pass a valid DIR])
720     elif test "$ok" != "no" ; then
721         AC_MSG_RESULT([Use JDK path specified ($ok)])
722         ac_java_jvm_dir=$ok
723         ac_java_jvm_name=jdk
724     fi
725 ])
726
727 #------------------------------------------------------------------------
728 # AC_JAVA_TOOLS
729 #
730 #    Figure out the paths of any Java tools we will need later on.
731 #
732 # Arguments:
733 #    NONE
734 #
735 # VARIABLES SET:
736 #    JAVA
737 #    JAVA_G
738 #    JAVAC
739 #    JAVAH
740 #    JAR
741 #    JDB
742 #    JAVADOC
743 #
744 # DEPENDS ON:
745 #    This macro must be run after the AC_JAVA_DETECT_JVM macro as
746 #    it depends on the ac_java_jvm_name, ac_java_jvm_version and
747 #    ac_java_jvm_dir variables
748 #------------------------------------------------------------------------
749
750 AC_DEFUN([AC_JAVA_TOOLS], [
751
752     ac_java_jvm_bin_dir=$ac_java_jvm_dir/bin
753
754     AC_JAVA_TOOLS_CHECK(JAVA, java, $ac_java_jvm_bin_dir)
755
756     # Don't error if java_g can not be found
757     AC_JAVA_TOOLS_CHECK(JAVA_G, java_g, $ac_java_jvm_bin_dir, 1)
758
759     if test "x$JAVA_G" = "x" ; then
760         JAVA_G=$JAVA
761     fi
762
763     TOOL=javah
764     AC_JAVA_TOOLS_CHECK(JAVAH, $TOOL, $ac_java_jvm_bin_dir)
765
766     AC_JAVA_TOOLS_CHECK(JAR, jar, $ac_java_jvm_bin_dir)
767
768     AC_JAVA_TOOLS_CHECK(JAVADOC, javadoc, $ac_java_jvm_bin_dir)
769
770     # Don't error if jdb can not be found
771     AC_JAVA_TOOLS_CHECK(JDB, jdb, $ac_java_jvm_bin_dir, 1)
772
773     case "$ac_java_jvm_version" in
774         *)
775             # JDK on Win32 does not allow connection with suspend=n
776             if test "$ac_cv_tcl_win32" = "yes"; then
777                 suspend="y"
778             else
779                 suspend="n"
780             fi
781             JDB_ATTACH_FLAGS="-attach 8757"
782             JAVA_G_FLAGS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8757,server=y,suspend=$suspend"
783             JDB_ATTACH_FLAGS="-attach 8757"
784             ;;
785     esac
786 ])
787
788
789
790 #------------------------------------------------------------------------
791 # AC_JAVA_ANT
792 #
793 #    Figure out if ant is available and where
794 #
795 # Arguments:
796 #    PATH
797 #
798 # VARIABLES SET:
799 #    ANT
800 #
801 #------------------------------------------------------------------------
802
803 AC_DEFUN([AC_JAVA_ANT], [
804     AC_ARG_WITH(ant,
805     AC_HELP_STRING([--with-ant=DIR],[Use ant from DIR]),
806     ANTPATH=$withval, ANTPATH=no)
807     if test "$ANTPATH" = "no" ; then
808         AC_JAVA_TOOLS_CHECK(ANT, ant)
809     elif test ! -d "$ANTPATH"; then
810         AC_MSG_ERROR([--with-ant=DIR option, must pass a valid DIR])
811     else
812         AC_JAVA_TOOLS_CHECK(ANT, ant, $ANTPATH/bin $ANTPATH)
813     fi
814 ])
815
816 #------------------------------------------------------------------------
817 # AC_JAVA_CHECK_PACKAGE
818 #
819 # Check if the package (generally a jar file) is available and the class
820 # usable
821 #
822 # Arguments:
823 #    1. name of the package
824 #   2. name of the class to test
825 #   3. used by (Comment)
826 #   4. Do not stop on error
827 # VARIABLES SET:
828 #
829 #
830 #------------------------------------------------------------------------
831
832 AC_DEFUN([AC_JAVA_CHECK_PACKAGE], [
833     AC_MSG_CHECKING($1)
834     PACKAGE_JAR_FILE=
835     found_jar=no
836     saved_ac_java_classpath=$ac_java_classpath
837     DEFAULT_JAR_DIR="/usr/share/java /usr/lib/java /usr/share/java /usr/share/java/jar /opt/java/lib /usr/local/java /usr/local/java/jar /usr/local/share/java /usr/local/share/java/jar /usr/local/lib/java $(find /usr/share/java/ -maxdepth 1 -type d 2>/dev/null) $(find /usr/lib64/ -maxdepth 1 -type d 2>/dev/null) $(find  /usr/lib/ -maxdepth 1 -type d 2>/dev/null)  $(find /usr/share/*/lib -maxdepth 1 -type d 2>/dev/null)"
838     for jardir in "`pwd`/thirdparty" "`pwd`/jar" $DEFAULT_JAR_DIR; do
839       for jar in "$jardir/$1.jar" "$jardir/lib$1.jar" "$jardir/lib$1-java.jar" "$jardir/$1*.jar"; do
840
841 # TODO check the behaviour when spaces
842         jars_resolved=`ls $jar 2>/dev/null`
843         for jar_resolved in $jars_resolved; do # If several jars matches
844           if test -e "$jar_resolved"; then
845             export ac_java_classpath="$jar_resolved:$ac_java_classpath"
846             AC_JAVA_TRY_COMPILE([import $2;], , "no", [
847               AC_MSG_RESULT([$jar_resolved])
848               found_jar=yes
849               PACKAGE_JAR_FILE=$jar_resolved
850               break 3
851             ], [
852             ac_java_classpath=$saved_ac_java_classpath
853
854             ])
855           fi
856         done
857       done
858     done
859     if test "$found_jar" = "no"; then
860       AC_MSG_RESULT([no])
861       if test "$4" = "yes"; then
862          AC_MSG_WARN([Could not find or use the Java package/jar $1 used by $3 (looking for package $2)])
863       else
864           AC_MSG_ERROR([Could not find or use the Java package/jar $1 used by $3 (looking for package $2)])
865       fi
866     fi
867 ])
868
869 #------------------------------------------------------------------------
870 # AC_JAVA_TOOLS_CHECK(VARIABLE, TOOL, PATH, NOERR)
871 #
872 #    Helper function that will look for the given tool on the
873 #    given PATH. If cross compiling and the tool can not
874 #    be found on the PATH, then search for the same tool
875 #    on the users PATH. If the tool still can not be found
876 #    then give up with an error unless NOERR is 1.
877 #
878 # Arguments:
879 #    1. The variable name we pass to AC_PATH_PROG
880 #    2. The name of the tool
881 #    3. The path to search on
882 #    4. Pass 1 if you do not want any error generated
883 #------------------------------------------------------------------------
884
885 AC_DEFUN([AC_JAVA_TOOLS_CHECK], [
886     if test "$cross_compiling" = "yes" ; then
887         AC_PATH_PROG($1, $2)
888     else
889         AC_PATH_PROG($1, $2, , $3)
890     fi
891
892     # Check to see if $1 could not be found
893
894     m4_ifval([$4],,[
895     if test "x[$]$1" = "x" ; then
896         AC_MSG_ERROR([Cannot find $2])
897     fi
898     ])
899 ])