File: configure.pl

package info (click to toggle)
polymake 4.6-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 32,288 kB
  • sloc: cpp: 156,233; perl: 42,962; javascript: 30,726; ansic: 2,907; java: 2,654; python: 641; sh: 244; xml: 117; makefile: 61
file content (206 lines) | stat: -rw-r--r-- 8,281 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#  Copyright (c) 1997-2021
#  Ewgenij Gawrilow, Michael Joswig, and the polymake team
#  Technische Universität Berlin, Germany
#  https://polymake.org
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the
#  Free Software Foundation; either version 2, or (at your option) any
#  later version: http://www.gnu.org/licenses/gpl.txt.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#-------------------------------------------------------------------------------


@conf_vars=qw( JDKHome JNIheaders NativeCFLAGS NativeARCHFLAGS NativeSO ANT JAVACMD );


sub allowed_options {
   my ($allowed_options, $allowed_with)=@_;
   @$allowed_with{ qw( java jni-headers ant ) }=();
}


sub usage {
   print STDERR <<'.';
  --with-java=PATH          ( ${JAVA_HOME} )     where to find Java compiler and runtime environment
  --with-jni-headers=PATH   ( ${java}/include )  where to find jni.h and other headers for native methods
  --with-ant=PATH           ( find via $PATH )   ant executable (Java building tool)
.
}


sub proceed {
   my ($options)=@_;

   # locate the Java VM interpreter

   my $found_by;
   if (defined (my $java=$options->{java})) {
      if (-d $java) {
         if (-f "$java/bin/java" && -x _) {
            $JAVACMD="$java/bin/java";
         } else {
            die "Value of --with-java option does not look like a JDK top directory: $java/bin/java does not exist.\n";
         }
      } elsif (-f _ && -x _) {
         $JAVACMD=$java;
      } elsif ($java !~ m{/}) {
         $JDKHome=Polymake::Configure::find_program_in_path($java)
           or die "Invalid value of --with-java option: program not found along your PATH.\n";
         $JAVACMD=$java;
      } else {
         die "Invalid value of --with-java option: path does not exist.\n";
      }
   } elsif (defined ($java=$ENV{JAVACMD}) && -f $java && -x _) {
     $found_by="JAVACMD";
     $JAVACMD=$java;

   } elsif (defined ($java=$ENV{JAVA_BINDIR}) && -f "$java/java" && -x _) {
     $found_by="JAVA_BINDIR";
     $JAVACMD="$java/java";

   } elsif (defined ($java=$ENV{JAVA_HOME}) && -f "$java/bin/java" && -x _) {
     $found_by="JAVA_HOME";
     $JAVACMD="$java/bin/java";

   } elsif (defined ($java=$ENV{JDK_HOME}) && -f "$java/bin/java" && -x _) {
     $found_by="JDK_HOME";
     $JAVACMD="$java/bin/java";

   } elsif (defined ($java=$ENV{JAVA_ROOT}) && -f "$java/bin/java" && -x _) {
     $found_by="JAVA_ROOT";
     $JAVACMD="$java/bin/java";

   } else {
     $JDKHome=Polymake::Configure::find_program_in_path("java")
       or die "Can't find the Java run-time interpreter on your machine.\n",
              defined($ENV{JAVACMD})
              ? "Environment variable JAVACMD is set, but it does not point to an executable program\n" :
              defined($ENV{JAVA_HOME})
              ? "Environment variable JAVA_HOME is set, but it does not point to a JDK installation directory\n"
              : "Program `java' not found along your PATH.\n",
              "\nPlease specify a valid location in the option --with-java\n",
              "or disable using Java components completely: --without-java.\n",
              "Please note that in the latter case the visualization interfaces\n",
              "to JReality and JavaView will be disabled permanently.\n";
     $JAVACMD="java";
     $found_by="PATH";
   }
   $JDKHome //= $JAVACMD;
   # check Java version

   my ($java_version)= `$JAVACMD -version 2>&1` =~ /version "([\d.]+)/s;
   Polymake::Configure::v_cmp($java_version, "1.7") >= 0
     or die "Java run-time interpreter $JAVACMD",
            $found_by eq "PATH"
            ? " found along your program PATH"
            : $found_by && " found by environment variable $found_by",
            " reports its version as $java_version, while minimal required is 1.7\n",
            "\nPlease upgrade your Java run-time system or JDK to a modern version,\n",
            $found_by && "or specify a correct location in the option --with-java,\n",
            "or disable using Java components completely: --without-java\n",
            "Please note that in the latter case the visualization interfaces\n",
            "to JReality and JavaView will be disabled permanently.\n";

   # locate JNI headers
   if (defined ($JNIheaders=$options->{'jni-headers'})) {
     -f "$JNIheaders/jni.h"
       or die "Value of --with-jni-headers option does not look like JNI include path: $JNIheaders/jni.h does not exist.\n";
   } else {
     my $path=$JDKHome;
     for (;;) {
       if ($path =~ m|/bin/java$|) {
         if (-f "$`/include/jni.h") {
           # Oracle package structure
           $JNIheaders="$`/include";
           last;
         }
         if (-f "$`/../include/jni.h") {
            # OpenJDK package structure
            $JNIheaders=Cwd::abs_path("$`/../include");
            last;
         }
       } elsif ($path =~ m|/Commands/java$|) {
         # MacOS X naming convention
         if (-f "$`/Headers/jni.h") {
           $JNIheaders="$`/Headers";
           last;
         }
       }
       # this trick works under FreeBSD having a wrapper script for all java commands
       local $ENV{JAVAVM_DRYRUN}=1;
       if (`$path 2>/dev/null` =~ /^JAVA_HOME=(.*)$/m && -f "$1/include/jni.h") {
         $JNIheaders="$1/include";
         last;
       }
       (-l $path and $path=readlink($path))
         or die <<".";
$JAVACMD seems to belong to a pure Java runtime installation:
JNI headers (most prominently jni.h) were not found.
You may specify the location of the jdk using the option --with-java or by
setting the JAVA_HOME environment variable.
If the JNI headers happen to reside at a different location, please specify it
in the option --with-jni-headers, but double-check upfront whether they really
suit the chosen Java environment.
Otherwise, please install a complete JDK, or disable building Java components
completely: --without-java.
Please note that in the latter case the visualization interfaces
to JReality and JavaView will be disabled permanently.
.
     }
   }
   # this is needed for calling ANT
   $JDKHome =~ s{(.*)/(?:bin|Commands)/java$}{$1};

   $ANT=$options->{ant};
   if ($ANT ne ".none.") {
      if (defined $ANT) {
         Polymake::Configure::check_program($ANT);
      } else {
         Polymake::Configure::find_program($ANT, "ant")
           or die "ant utility not found; please install it (together with optional targets, if packaged separately)\n",
                  "Specify its location in the option --with-ant if it is installed at a non-standard location.\n";
      }
      my ($ant_version)= `$ANT -version` =~ /version ([\d.]+)/;
      Polymake::Configure::v_cmp($ant_version, "1.7.1") >= 0
         or die "$ANT reports its version as $ant_version, while minimal required version is 1.7.1\n";
      # Java 10 needs javac with nativeheaderdir instead of javah task which requires ant 1.9.8
      Polymake::Configure::v_cmp($java_version, "10") >= 0 and Polymake::Configure::v_cmp($ant_version, "1.9.8") < 0
         and die "$ANT reports its version as $ant_version, while minimal required version for Java 10 is 1.9.8\n";

      $NativeSO="so";

      # MacOS specific magic
      if ($^O eq "darwin") {
         $NativeSO="jnilib";
         if (length($ARCHFLAGS)) {
            $NativeARCHFLAGS = `lipo -info $JAVACMD` =~ s/.* are: (.*)$/$1/mr;
            $NativeARCHFLAGS =~ s/(\S+)/-arch $1/g;
         }
      }

      $NativeCFLAGS = '-I${bundled.java.JNIheaders}';
      if (-f (my $platform_jni_dir=glob("$JNIheaders/*/jni_md.h"))) {
         $platform_jni_dir =~ m{/([^/]+)/[^/]+$};
         $NativeCFLAGS .= " -I\${bundled.java.JNIheaders}/$1";
      }
   }

   # report the summary

   return join(", ",
               $JAVACMD ne "java" ? ("java=$JAVACMD") : (),
               $ANT ne ".none." ?
               ( $ANT ne "ant" ? ("ant=$ANT") : (),
                 "JNI headers at $JNIheaders" ) : ()
              );
}

# Local Variables:
# cperl-indent-level:3
# indent-tabs-mode:nil
# End: