Linux build : fix undefined pragma
[scilab.git] / scilab / m4 / java-thirdparty.m4
1 dnl
2 dnl Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 dnl Copyright (C) DIGITEO - 2010 - Sylvestre Ledru
4 dnl Copyright (C) Scilab Enterprises - 2015 - Clement David
5 dnl 
6 dnl Copyright (C) 2012 - 2016 - Scilab Enterprises
7 dnl
8 dnl This file is hereby licensed under the terms of the GNU GPL v2.0,
9 dnl pursuant to article 5.3.4 of the CeCILL v.2.1.
10 dnl This file was originally licensed under the terms of the CeCILL v2.1,
11 dnl and continues to be available under such terms.
12 dnl For more information, see the COPYING file which you should have received
13 dnl along with this program.
14 dnl
15
16 #------------------------------------------------------------------------
17 # AC_JAVA_COMPILE_CHECKER_CLASS (internally used)
18 #
19 # Compile a shared conftestSharedChecker.java class that will be used by 
20 # AC_JAVA_CHECK_PACKAGE later. Using only one shared class to check all 
21 # java package slightly reduce the configure time.
22 #
23 # Arguments: None
24 # VARIABLES SET:
25 #   None but the conftestSharedChecker.class will exist
26 #
27 #------------------------------------------------------------------------
28 AC_DEFUN([AC_JAVA_COMPILE_CHECKER_CLASS], [
29     cat << \EOF > conftestSharedChecker.java
30 // [#]line __oline__ "configure"
31 import java.util.regex.Pattern;
32 import java.io.File;
33 import java.io.IOException;
34 import java.lang.reflect.Field;
35 import java.lang.reflect.InvocationTargetException;
36 import java.lang.reflect.Method;
37 import java.net.URL;
38 import java.net.URLClassLoader;
39 import java.util.ArrayList;
40
41 public class conftestSharedChecker {
42
43     /**
44      * Required arguments :
45      *  argv[[0]]: name of the jar package
46      *  argv[[1]]: name of the class (with the package prefix)
47      *  argv[[2]]: possible paths of the jar package (separated by ':')
48      *
49      * Optional arguments:
50      *  argv[[3]]: field or method used to retrieve the version
51      *  argv[[4]]: expected version
52      *  argv[[5]]: String comparator :
53      *      "="  for exact version
54      */
55     public static void main(String[[]] argv) {
56         final String packageName = argv[[0]];
57         final String className = argv[[1]];
58         final String[[]] jarList = argv[[2]].split(":");
59
60         ArrayList<URL> found = new ArrayList<>();
61         for(String jar : jarList)
62         {
63             try {
64                 File f = new File(jar);
65                 if (f.exists()) {
66                     found.add(f.toURI().toURL());
67                 }
68             } catch (IOException ex) {
69                 System.err.println(ex.toString());
70             }
71         }
72         
73         URLClassLoader localClassLoader = new URLClassLoader(found.toArray(new URL[[found.size()]]));
74         URL klassURL = null;
75         Class<?> klass = null;
76         try {
77             String resourceName = className.replace(".", "/") + ".class";
78             klassURL = localClassLoader.getResource(resourceName);
79             klass = localClassLoader.loadClass(className);
80         } catch (ClassNotFoundException ex) {
81             System.err.println(className + " not found");
82             System.exit(-1);
83         }
84         
85         String pathURL = klassURL.getPath().substring(0, klassURL.getPath().indexOf('!'));
86         String path = pathURL.substring(pathURL.indexOf(':') + 1);
87         System.err.println("found: " + path);
88         
89         if (argv.length > 3) {
90             checkVersion(klass, argv);
91         }
92         
93         System.out.println(path);
94     }
95
96     private static void checkVersion(Class<?> klass, String[[]] argv) throws SecurityException, IllegalArgumentException {
97         final String versionMethod = argv[[3]];
98         final String expected = argv[[4]];
99         final String atLeastOrEqual;
100         if (argv.length > 5)
101             atLeastOrEqual = argv[[5]];
102         else
103             atLeastOrEqual = "<=";
104         
105         try {
106             try {
107                 Field field = klass.getField(versionMethod);
108                 Object value = field.get(null);
109                 compareAndDisplay(atLeastOrEqual, expected, value);
110             } catch (NoSuchFieldException fe) {
111                 Method method = null;
112                 try {
113                     method = klass.getMethod(versionMethod);
114                 } catch (NoSuchMethodException ex) {
115                     System.err.println(ex.toString());
116                     System.exit(-3);
117                 }
118                 
119                 try {
120                     Object value = method.invoke(null);
121                     compareAndDisplay(atLeastOrEqual, expected, value);
122                 } catch (NullPointerException ex) {
123                     Object value = method.invoke(klass.newInstance());
124                     compareAndDisplay(atLeastOrEqual, expected, value);
125                 }
126             }
127         } catch (IllegalAccessException ex) {
128             System.err.println(ex);
129             System.exit(-2);
130         } catch (InvocationTargetException ex) {
131             System.err.println(ex);
132             System.exit(-2);
133         } catch (InstantiationException ex) {
134             System.err.println(ex);
135             System.exit(-2);
136         }
137     }
138
139     private static void compareAndDisplay(String atLeastOrEqual, String expected, Object value) {
140         int cmp = compare(expected, value.toString());
141         
142         switch(atLeastOrEqual) {
143             case ">":
144                 if (cmp > 0) {
145                     return;
146                 } else {
147                     System.err.println("expected "+atLeastOrEqual+""+expected+" but got "+value);
148                     System.exit(-4);
149                 }
150             case "==":
151                 if (cmp == 0) {
152                     return;
153                 } else {
154                     System.err.println("expected "+atLeastOrEqual+""+expected+" but got "+value);
155                     System.exit(-4);
156                 }
157             case "<=":
158                 if (cmp <= 0) {
159                     return;
160                 } else {
161                     System.err.println("expected "+atLeastOrEqual+""+expected+" but got "+value);
162                     System.exit(-4);
163                 }
164             default:
165                 System.err.println("unable to compare with "+atLeastOrEqual);
166                 System.exit(-4);
167         }
168     }
169     
170     private static int compare(String v1, String v2) {
171         String s1 = normalisedVersion(v1);
172         String s2 = normalisedVersion(v2);
173
174         System.err.println("compare: " + v1 + " normalised to " + s1);
175         System.err.println("compare: " + v2 + " normalised to " + s2);
176         return s1.compareTo(s2);
177     }
178
179     private static String normalisedVersion(String version) {
180         return normalisedVersion(version, ".", 4);
181     }
182
183     private static String normalisedVersion(String version, String sep, int maxWidth) {
184         String[[]] split = Pattern.compile(sep, Pattern.LITERAL).split(version);
185         StringBuilder sb = new StringBuilder();
186         for (String s : split) {
187             sb.append(String.format("%" + maxWidth + 's', s));
188         }
189         return sb.toString();
190     }
191 }
192 EOF
193
194     CLASSPATH=$ac_java_classpath
195     export CLASSPATH
196     cmd="$JAVAC ${JAVAC_FLAGS} conftestSharedChecker.java"
197     if (echo $cmd >&AS_MESSAGE_LOG_FD ; eval $cmd >conftestSharedChecker.java.output 2>&AS_MESSAGE_LOG_FD) ; then
198         echo "configure: conftestSharedChecker.class available" >&AS_MESSAGE_LOG_FD
199     else
200         echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
201         cat conftestSharedChecker.java >&AS_MESSAGE_LOG_FD
202         echo "configure: CLASSPATH was $CLASSPATH" >&AS_MESSAGE_LOG_FD
203     fi
204 ])
205
206
207 #------------------------------------------------------------------------
208 # AC_JAVA_CHECK_JAR
209 #
210 # Check if the package (generally a jar file) is available and the class
211 # usable
212 #
213 # Arguments:
214 #   1. name of the package
215 #   2. name of the class to test
216 #   3. used by (Comment)
217 #   4. (optional) warn if "yes" else error on not found
218 #   5. (optional, needed to check the version) version field or method
219 #   6. (optional, needed to check the version) version value to check
220 #   7. (optional) "=" or "<=" to compare version
221 #------------------------------------------------------------------------
222 AC_DEFUN([AC_JAVA_CHECK_JAR], [
223     AC_REQUIRE([AC_JAVA_COMPILE_CHECKER_CLASS])
224
225     AC_MSG_CHECKING($1)
226     PACKAGE_JAR_FILE=
227
228     DEFAULT_JAR_DIR="$(pwd)/thirdparty/ $(pwd)/jar/ /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 | sort) $(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) /opt/java/lib/"
229    
230     jar_resolved="$(find $DEFAULT_JAR_DIR -maxdepth 1 \( -type f -name '$1.jar' -or -name 'lib$1.jar' -or -name 'lib$1-java.jar' -or -name '$1*.jar' \) 2>/dev/null |tr '\n' ':')."
231
232     if test ! -f conftestSharedChecker.class ; then
233         AC_JAVA_COMPILE_CHECKER_CLASS()
234     fi
235
236     CLASSPATH=$ac_java_classpath
237     export CLASSPATH
238     cmd="$JAVA conftestSharedChecker $1 $2 $jar_resolved $5 $6 $7"
239     if (echo $cmd >&AS_MESSAGE_LOG_FD ; eval $cmd >conftestSharedChecker.java.output 2>&AS_MESSAGE_LOG_FD); then
240         PACKAGE_JAR_FILE=$(tail -n 1 conftestSharedChecker.java.output);
241         AC_MSG_RESULT([$PACKAGE_JAR_FILE])
242         echo "yes" >&AS_MESSAGE_LOG_FD
243         # append the found file to the classpath to manage jar dependency
244         ac_java_classpath="$ac_java_classpath:$PACKAGE_JAR_FILE"
245     else
246       AC_MSG_RESULT([no])
247       if test "$4" = "yes"; then
248          AC_MSG_WARN([Could not find or use the Java package/jar $1 used by $3 (looking for package $2)])
249       else
250           AC_MSG_ERROR([Could not find or use the Java package/jar $1 used by $3 (looking for package $2)])
251       fi
252     fi
253     if test -f conftestSharedChecker.java.output; then
254         rm conftestSharedChecker.java.output
255     fi
256 ])
257
258 #------------------------------------------------------------------------
259 # AC_JAVA_CHECK_VERSION_MANIFEST(NAME, JAR, MIN_VERSION, [PRE_PROCESSING], [GREATER_OR_EQUALS])
260 #
261 # Check if the minimal version of a software/package is available or not.
262 # Note that since java does not provide an universal mechanism to detect
263 # the version of a package, we assume that the "Specification-Version" of
264 # the MANIFEST.MF is correct.
265 #
266 # Arguments:
267 #    1. The name of the package (only used in the display of feedbacks)
268 #    2. The name of the jar files used to build against
269 #    3. What is the minimal version expected
270 #    4. Manifest attribute name
271 #    5. Specify if we want the exact version or greater. (equals or greater by
272 #      default).
273 #
274 #------------------------------------------------------------------------
275
276 AC_DEFUN([AC_JAVA_CHECK_VERSION_MANIFEST], [
277     AC_MSG_CHECKING([minimal version ($4 $3) of $1])
278     export JARFILE=$2;
279     if test "x$5" == "x"; then
280     AC_JAVA_TRY_COMPILE([import java.io.IOException;
281 import java.util.jar.JarFile;], [String minVersion="$3";
282         try {
283             String version = new JarFile(System.getenv("JARFILE")).getManifest().getMainAttributes().getValue("$4");
284             System.out.println(version);
285             if (compare(minVersion, version) > 0) {
286                 System.exit(-1);
287             }
288         } catch (IOException e) {
289             System.err.println(e.getMessage());
290             System.exit(1);
291         } ], "yes", echo "yes" , AC_MSG_ERROR([Wrong version of $1. Expected at least $3. Found $STDOUT]))
292     else
293     AC_JAVA_TRY_COMPILE([import java.io.IOException;
294 import java.util.jar.JarFile;], [String minVersion="$3";
295         try {
296             String version = new JarFile(System.getenv("JARFILE")).getManifest().getMainAttributes().getValue("$4");
297             System.out.println("$4" + ": " + version);
298             if (compare(minVersion, version) != 0) {
299                 System.exit(-1);
300             }
301         } catch (IOException e) {
302             System.err.println(e.getMessage());
303             System.exit(1);
304         } ], "yes", echo "yes" , AC_MSG_ERROR([Wrong version of $1. Expected exact version $4. Found $STDOUT]))
305     fi
306     unset JARFILE
307 ])
308