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