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 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
|
################################################################################
# cmake module for finding Java
# The name JavaExtended is used instead of JAVA, as this cause an infinite loop
# on windows, because on windows, there is no difference between the built-in
# FindJava.cmake and FindJAVA.cmake.
#
# sets following variables:
#
# JAVA_FOUND - TRUE/FALSE (javadoc in ignored for the test)
#
# JAVA_HOME - base dir where subdirs bin, lib, jre and include are located
# JAVA_BIN_PATH - path to subdirectory "${JAVA_HOME}/bin"
#
# JAVA_RUNTIME - path to ${JAVA_BIN_PATH}/java
# JAVA_COMPILE - path to ${JAVA_BIN_PATH}/javac
# JAVA_ARCHIVE - path to ${JAVA_BIN_PATH}/jar
# JAVA_DOC - path to ${JAVA_BIN_PATH}/javadoc
#
# JAVA_COMPILE_FLAG_CONDITIONAL - "-g:lines,source" or "-g:lines,source,vars"
#
# JAVA_MAJOR_VERSION
# JAVA_MINOR_VERSION
# JAVA_PATCH_LEVEL
#
# JAVA_VERSION - ${JAVA_MAJOR_VERSION}.${JAVA_MINOR_VERSION}.${JAVA_PATCH_LEVEL}
#
# @author Jan Engels, DESY, hoijui
################################################################################
INCLUDE(FindPackageHandleStandardArgs)
SET( JAVA_FOUND FALSE )
IF ("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
set(JAVA_COMPILE_FLAG_CONDITIONAL "-g:lines,source")
ELSE ("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
set(JAVA_COMPILE_FLAG_CONDITIONAL "-g:lines,source,vars")
ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
IF( NOT DEFINED ENV{JDK_HOME} AND
NOT DEFINED ENV{JAVA_HOME} AND
NOT DEFINED JAVA_HOME AND
NOT DEFINED JDK_HOME )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Autodetecting Java..." )
ENDIF()
# use the CMake FindJava.cmake module
FIND_PACKAGE( Java )
IF( JAVA_RUNTIME AND JAVA_COMPILE AND JAVA_ARCHIVE )
IF( CMAKE_HOST_UNIX AND NOT CMAKE_HOST_APPLE )
# look for the file binary
FIND_PROGRAM( FILE_BIN
file
/bin
/usr/bin
/usr/local/bin
/sbin
)
IF( FILE_BIN )
# initialize some variables
SET( java_bin "${JAVA_RUNTIME}" )
SET( java_link_found TRUE )
SET( java_link_error FALSE )
# dereference links
WHILE( java_link_found AND NOT java_link_error )
# check if the java binary is a symbolic link
EXEC_PROGRAM( ${FILE_BIN} ARGS "${java_bin}"
OUTPUT_VARIABLE out_tmp
RETURN_VALUE out_ret )
IF( out_ret )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Error dereferencing links to Java Home!!" )
MESSAGE( STATUS "${out_tmp}" )
ENDIF()
SET( java_link_error TRUE )
ENDIF()
IF( NOT java_link_error )
# set variable if link is found
STRING( REGEX MATCH " symbolic link to " java_link_found "${out_tmp}" )
IF( java_link_found )
# get the file to where the link points to
STRING( REGEX REPLACE ".* symbolic link to[^/.]+([^'`ยด]+).*" "\\1" out_regex "${out_tmp}" )
# check if the link is absolute
STRING( REGEX REPLACE "^\\/.*$" "true" out_regex_is_absolute "${out_regex}" )
IF( "${out_regex_is_absolute}" STREQUAL "true" )
SET( out_absolute "${out_regex}" )
ELSE( "${out_regex_is_absolute}" STREQUAL "true" )
# get the links parent dir
STRING( REGEX REPLACE "(.*)\\/[^/]+$" "\\1" java_bin_dir "${java_bin}" )
# make the link absolute, if it is relative
FIND_FILE( out_absolute NAMES "${out_regex}" PATHS "${java_bin_dir}" )
ENDIF( "${out_regex_is_absolute}" STREQUAL "true" )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Java binary ${java_bin} is a symbolic link to ${out_regex}" )
ENDIF()
SET( java_bin "${out_absolute}" )
ENDIF()
ENDIF()
ENDWHILE()
# check if something went wrong
IF( NOT java_link_error )
# if we found the JRE, switch to the JDK
STRING( REGEX REPLACE "jre/bin/java$" "bin/java" java_bin "${java_bin}" )
# if not, set JAVA_RUNTIME to the dereferenced link
SET( JAVA_RUNTIME "${java_bin}" )
ENDIF()
ENDIF()
ENDIF( CMAKE_HOST_UNIX AND NOT CMAKE_HOST_APPLE )
IF( NOT JDK_HOME )
# extract java home dir name out of full path to java runtime
STRING( REGEX REPLACE ".*\\/([^/]+)\\/[^/]+\\/java$" "\\1" java_home_dir_name ${JAVA_RUNTIME} )
# check if we are in a child jre
STRING( COMPARE EQUAL "${java_home_dir_name}" "jre" java_child_jre )
IF( ${java_child_jre} )
# extract jdk home path out of full path to java runtime
STRING( REGEX REPLACE "(.*)\\/[^/]+\\/[^/]+\\/java$" "\\1" JDK_HOME ${JAVA_RUNTIME} )
ENDIF( ${java_child_jre} )
ENDIF( NOT JDK_HOME )
IF( NOT JAVA_HOME )
IF( JDK_HOME )
SET( JAVA_HOME "${JDK_HOME}" )
ELSE( JDK_HOME )
# extract java home path out of full path to java runtime
STRING( REGEX REPLACE "(.*)\\/[^/]+\\/java$" "\\1" JAVA_HOME ${JAVA_RUNTIME} )
ENDIF( JDK_HOME )
ENDIF( NOT JAVA_HOME )
# extract java bin path out of full path to java runtime
STRING( REGEX REPLACE "(.*)\\/java$" "\\1" JAVA_BIN_PATH ${JAVA_RUNTIME} )
#SET( JAVA_BIN_PATH "${JAVA_HOME}/bin" )
ELSE()
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Failed to autodetect Java!!" )
ENDIF()
ENDIF( JAVA_RUNTIME AND JAVA_COMPILE AND JAVA_ARCHIVE )
ELSE()
# definition of JAVA_HOME or JDK_HOME in cmake has priority over env vars
IF( DEFINED JDK_HOME OR DEFINED JAVA_HOME )
# ensure that both variables are set correctly (JDK_HOME as well as JAVA_HOME)
IF( DEFINED JDK_HOME AND DEFINED JAVA_HOME )
IF( NOT "${JDK_HOME}" STREQUAL "${JAVA_HOME}" )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS
"WARNING: JDK_HOME and JAVA_HOME are set to different paths!!" )
MESSAGE( STATUS "JDK_HOME: ${JDK_HOME}" )
MESSAGE( STATUS "JAVA_HOME: ${JAVA_HOME}" )
MESSAGE( STATUS "${JAVA_HOME} will be used in this installation!!" )
ENDIF()
ENDIF()
ELSE()
IF( NOT DEFINED JAVA_HOME )
SET( JAVA_HOME "${JDK_HOME}" )
ENDIF()
ENDIF()
ELSE()
# in case JDK_HOME or JAVA_HOME already set ensure that both variables
# are set correctly (JDK_HOME as well as JAVA_HOME)
IF( DEFINED ENV{JDK_HOME} AND DEFINED ENV{JAVA_HOME} )
IF( NOT "$ENV{JDK_HOME}" STREQUAL "$ENV{JAVA_HOME}" )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS
"WARNING: JDK_HOME and JAVA_HOME are set to different paths!!" )
MESSAGE( STATUS "JDK_HOME: $ENV{JDK_HOME}" )
MESSAGE( STATUS "JAVA_HOME: $ENV{JAVA_HOME}" )
MESSAGE( STATUS "$ENV{JAVA_HOME} will be used in this installation!!" )
ENDIF()
ENDIF()
SET( JAVA_HOME "$ENV{JAVA_HOME}" )
ELSE()
IF( DEFINED ENV{JAVA_HOME} )
SET( JAVA_HOME "$ENV{JAVA_HOME}" )
ENDIF()
IF( DEFINED ENV{JDK_HOME} )
SET( JAVA_HOME "$ENV{JDK_HOME}" )
ENDIF()
ENDIF()
ENDIF()
set(JAVA_BINSEARCH_PATH
${JAVA_HOME}/bin
${JAVA_HOME}/Commands # FIXME MacOS
NO_DEFAULT_PATH )
# find java, javac, jar and javadoc
SET( JAVA_RUNTIME JAVA_RUNTIME-NOTFOUND )
FIND_PROGRAM( JAVA_RUNTIME
java
${JAVA_BINSEARCH_PATH}
NO_DEFAULT_PATH )
SET( JAVA_COMPILE JAVA_COMPILE-NOTFOUND )
FIND_PROGRAM( JAVA_COMPILE
javac
${JAVA_BINSEARCH_PATH}
NO_DEFAULT_PATH )
SET( JAVA_ARCHIVE JAVA_ARCHIVE-NOTFOUND )
FIND_PROGRAM( JAVA_ARCHIVE
jar
${JAVA_BINSEARCH_PATH}
NO_DEFAULT_PATH )
SET( JAVA_DOC JAVA_DOC-NOTFOUND )
FIND_PROGRAM( JAVA_DOC
javadoc
${JAVA_BINSEARCH_PATH}
NO_DEFAULT_PATH )
IF( NOT JAVA_RUNTIME AND NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Could not find java!!" )
ENDIF()
IF( NOT JAVA_COMPILE AND NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Could not find javac!!" )
ENDIF()
IF( NOT JAVA_ARCHIVE AND NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Could not find jar!!" )
ENDIF()
IF( NOT JAVA_DOC AND NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Could not find javadoc!!" )
ENDIF()
ENDIF()
# Handle the QUIETLY and REQUIRED arguments and set JAVA_FOUND to TRUE
# if the vars at the end are valid
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Java DEFAULT_MSG JAVA_RUNTIME JAVA_COMPILE JAVA_ARCHIVE)
IF( JAVA_FOUND )
# parse the output of java -version
EXEC_PROGRAM( "${JAVA_RUNTIME}" ARGS "-version"
OUTPUT_VARIABLE out_tmp
RETURN_VALUE out_ret )
IF( out_ret )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Error executing java -version!! Java version variables will not be set!!" )
ENDIF()
ELSE()
# extract major/minor version and patch level from "java -version" output
STRING( REGEX REPLACE ".* version \"([0-9]+)\\.[0-9]+\\.[0-9]+.*"
"\\1" JAVA_MAJOR_VERSION "${out_tmp}" )
STRING( REGEX REPLACE ".* version \"[0-9]+\\.([0-9]+)\\.[0-9]+.*"
"\\1" JAVA_MINOR_VERSION "${out_tmp}" )
STRING( REGEX REPLACE ".* version \"[0-9]+\\.[0-9]+\\.([0-9]+).*"
"\\1" JAVA_PATCH_LEVEL "${out_tmp}" )
SET( JAVA_VERSION "${JAVA_MAJOR_VERSION}.${JAVA_MINOR_VERSION}.${JAVA_PATCH_LEVEL}" )
IF( NOT JAVA_FIND_QUIETLY )
MESSAGE( STATUS "Java version ${JAVA_VERSION} configured successfully!" )
ENDIF()
ENDIF()
ENDIF()
# Show these variables only in the advanced view in the GUI, and make them global
MARK_AS_ADVANCED(
JAVA_FOUND
JAVA_HOME
JAVA_BIN_PATH
JAVA_RUNTIME
JAVA_COMPILE
JAVA_ARCHIVE
JAVA_DOC
JAVA_COMPILE_FLAG_CONDITIONAL
JAVA_MAJOR_VERSION
JAVA_MINOR_VERSION
JAVA_PATCH_LEVEL
JAVA_VERSION
)
|