FindJava.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindJava
  5. --------
  6. Find Java
  7. This module finds if Java is installed and determines where the
  8. include files and libraries are. The caller may set variable ``JAVA_HOME``
  9. to specify a Java installation prefix explicitly.
  10. See also the :module:`FindJNI` module to find Java Native Interface (JNI).
  11. Specify one or more of the following components as you call this find module. See example below.
  12. ::
  13. Runtime = Java Runtime Environment used to execute Java byte-compiled applications
  14. Development = Development tools (java, javac, javah, jar and javadoc), includes Runtime component
  15. IdlJ = Interface Description Language (IDL) to Java compiler
  16. JarSigner = Signer and verifier tool for Java Archive (JAR) files
  17. This module sets the following result variables:
  18. ::
  19. Java_JAVA_EXECUTABLE = the full path to the Java runtime
  20. Java_JAVAC_EXECUTABLE = the full path to the Java compiler
  21. Java_JAVAH_EXECUTABLE = the full path to the Java header generator
  22. Java_JAVADOC_EXECUTABLE = the full path to the Java documentation generator
  23. Java_IDLJ_EXECUTABLE = the full path to the Java idl compiler
  24. Java_JAR_EXECUTABLE = the full path to the Java archiver
  25. Java_JARSIGNER_EXECUTABLE = the full path to the Java jar signer
  26. Java_VERSION_STRING = Version of java found, eg. 1.6.0_12
  27. Java_VERSION_MAJOR = The major version of the package found.
  28. Java_VERSION_MINOR = The minor version of the package found.
  29. Java_VERSION_PATCH = The patch version of the package found.
  30. Java_VERSION_TWEAK = The tweak version of the package found (after '_')
  31. Java_VERSION = This is set to: $major[.$minor[.$patch[.$tweak]]]
  32. The minimum required version of Java can be specified using the
  33. :command:`find_package` syntax, e.g.
  34. .. code-block:: cmake
  35. find_package(Java 1.8)
  36. NOTE: ``${Java_VERSION}`` and ``${Java_VERSION_STRING}`` are not guaranteed to
  37. be identical. For example some java version may return:
  38. ``Java_VERSION_STRING = 1.8.0_17`` and ``Java_VERSION = 1.8.0.17``
  39. another example is the Java OEM, with: ``Java_VERSION_STRING = 1.8.0-oem``
  40. and ``Java_VERSION = 1.8.0``
  41. For these components the following variables are set:
  42. ::
  43. Java_FOUND - TRUE if all components are found.
  44. Java_<component>_FOUND - TRUE if <component> is found.
  45. Example Usages:
  46. ::
  47. find_package(Java)
  48. find_package(Java 1.8 REQUIRED)
  49. find_package(Java COMPONENTS Runtime)
  50. find_package(Java COMPONENTS Development)
  51. #]=======================================================================]
  52. include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
  53. # The HINTS option should only be used for values computed from the system.
  54. set(_JAVA_HINTS)
  55. if(_JAVA_HOME)
  56. list(APPEND _JAVA_HINTS ${_JAVA_HOME}/bin)
  57. endif()
  58. if (WIN32)
  59. macro (_JAVA_GET_INSTALLED_VERSIONS _KIND)
  60. execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\${_KIND}
  61. RESULT_VARIABLE _JAVA_RESULT
  62. OUTPUT_VARIABLE _JAVA_VERSIONS
  63. ERROR_QUIET)
  64. if (NOT _JAVA_RESULT)
  65. string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\${_KIND}\\\\[0-9.]+" _JAVA_VERSIONS "${_JAVA_VERSIONS}")
  66. if (_JAVA_VERSIONS)
  67. # sort versions. Most recent first
  68. ## handle version 9 apart from other versions to get correct ordering
  69. set (_JAVA_V9 ${_JAVA_VERSIONS})
  70. list (FILTER _JAVA_VERSIONS EXCLUDE REGEX "${_KIND}\\\\9")
  71. list (SORT _JAVA_VERSIONS)
  72. list (REVERSE _JAVA_VERSIONS)
  73. list (FILTER _JAVA_V9 INCLUDE REGEX "${_KIND}\\\\9")
  74. list (SORT _JAVA_V9)
  75. list (REVERSE _JAVA_V9)
  76. list (APPEND _JAVA_VERSIONS ${_JAVA_V9})
  77. foreach (_JAVA_HINT IN LISTS _JAVA_VERSIONS)
  78. list(APPEND _JAVA_HINTS "[${_JAVA_HINT};JavaHome]/bin")
  79. endforeach()
  80. endif()
  81. endif()
  82. endmacro()
  83. # search for installed versions for version 9 and upper
  84. _JAVA_GET_INSTALLED_VERSIONS("JDK")
  85. _JAVA_GET_INSTALLED_VERSIONS("JRE")
  86. list(APPEND _JAVA_HINTS
  87. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/bin"
  88. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/bin"
  89. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/bin"
  90. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/bin"
  91. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/bin"
  92. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/bin"
  93. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/bin"
  94. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.9;JavaHome]/bin"
  95. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.8;JavaHome]/bin"
  96. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.7;JavaHome]/bin"
  97. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.6;JavaHome]/bin"
  98. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.5;JavaHome]/bin"
  99. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.4;JavaHome]/bin"
  100. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.3;JavaHome]/bin"
  101. )
  102. endif()
  103. # Hard-coded guesses should still go in PATHS. This ensures that the user
  104. # environment can always override hard guesses.
  105. set(_JAVA_PATHS
  106. /usr/lib/java/bin
  107. /usr/share/java/bin
  108. /usr/local/java/bin
  109. /usr/local/java/share/bin
  110. /usr/java/j2sdk1.4.2_04
  111. /usr/lib/j2sdk1.4-sun/bin
  112. /usr/java/j2sdk1.4.2_09/bin
  113. /usr/lib/j2sdk1.5-sun/bin
  114. /opt/sun-jdk-1.5.0.04/bin
  115. /usr/local/jdk-1.7.0/bin
  116. /usr/local/jdk-1.6.0/bin
  117. )
  118. find_program(Java_JAVA_EXECUTABLE
  119. NAMES java
  120. HINTS ${_JAVA_HINTS}
  121. PATHS ${_JAVA_PATHS}
  122. )
  123. if(Java_JAVA_EXECUTABLE)
  124. execute_process(COMMAND "${Java_JAVA_EXECUTABLE}" -version
  125. RESULT_VARIABLE res
  126. OUTPUT_VARIABLE var
  127. ERROR_VARIABLE var # sun-java output to stderr
  128. OUTPUT_STRIP_TRAILING_WHITESPACE
  129. ERROR_STRIP_TRAILING_WHITESPACE)
  130. if( res )
  131. if(var MATCHES "Unable to locate a Java Runtime to invoke|No Java runtime present, requesting install")
  132. set(Java_JAVA_EXECUTABLE Java_JAVA_EXECUTABLE-NOTFOUND)
  133. elseif(${Java_FIND_REQUIRED})
  134. message( FATAL_ERROR "Error executing java -version" )
  135. else()
  136. message( STATUS "Warning, could not run java -version")
  137. endif()
  138. else()
  139. # Extract version components (up to 4 levels) from "java -version" output.
  140. set(_java_version_regex [[(([0-9]+)(\.([0-9]+)(\.([0-9]+)(_([0-9]+))?)?)?.*)]])
  141. if(var MATCHES "java version \"${_java_version_regex}\"")
  142. # Sun, GCJ, older OpenJDK
  143. set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
  144. set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
  145. if (CMAKE_MATCH_4)
  146. set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
  147. else()
  148. set(Java_VERSION_MINOR 0)
  149. endif()
  150. if (CMAKE_MATCH_6)
  151. set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
  152. else()
  153. set(Java_VERSION_PATCH 0)
  154. endif()
  155. set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
  156. elseif(var MATCHES "openjdk version \"${_java_version_regex}\"")
  157. # OpenJDK
  158. set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
  159. set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
  160. if (CMAKE_MATCH_4)
  161. set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
  162. else()
  163. set(Java_VERSION_MINOR 0)
  164. endif()
  165. if (CMAKE_MATCH_6)
  166. set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
  167. else()
  168. set(Java_VERSION_PATCH 0)
  169. endif()
  170. set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
  171. elseif(var MATCHES "openjdk version \"([0-9]+)-[A-Za-z]+\"")
  172. # OpenJDK 9 early access builds or locally built
  173. set(Java_VERSION_STRING "1.${CMAKE_MATCH_1}.0")
  174. set(Java_VERSION_MAJOR "1")
  175. set(Java_VERSION_MINOR "${CMAKE_MATCH_1}")
  176. set(Java_VERSION_PATCH "0")
  177. set(Java_VERSION_TWEAK "")
  178. elseif(var MATCHES "java full version \"kaffe-${_java_version_regex}\"")
  179. # Kaffe style
  180. set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
  181. set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
  182. set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
  183. set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
  184. set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
  185. else()
  186. if(NOT Java_FIND_QUIETLY)
  187. string(REPLACE "\n" "\n " ver_msg "\n${var}")
  188. message(WARNING "Java version not recognized:${ver_msg}\nPlease report.")
  189. endif()
  190. set(Java_VERSION_STRING "")
  191. set(Java_VERSION_MAJOR "")
  192. set(Java_VERSION_MINOR "")
  193. set(Java_VERSION_PATCH "")
  194. set(Java_VERSION_TWEAK "")
  195. endif()
  196. set(Java_VERSION "${Java_VERSION_MAJOR}")
  197. if(NOT "x${Java_VERSION}" STREQUAL "x")
  198. foreach(c MINOR PATCH TWEAK)
  199. if(NOT "x${Java_VERSION_${c}}" STREQUAL "x")
  200. string(APPEND Java_VERSION ".${Java_VERSION_${c}}")
  201. else()
  202. break()
  203. endif()
  204. endforeach()
  205. endif()
  206. endif()
  207. endif()
  208. find_program(Java_JAR_EXECUTABLE
  209. NAMES jar
  210. HINTS ${_JAVA_HINTS}
  211. PATHS ${_JAVA_PATHS}
  212. )
  213. find_program(Java_JAVAC_EXECUTABLE
  214. NAMES javac
  215. HINTS ${_JAVA_HINTS}
  216. PATHS ${_JAVA_PATHS}
  217. )
  218. find_program(Java_JAVAH_EXECUTABLE
  219. NAMES javah
  220. HINTS ${_JAVA_HINTS}
  221. PATHS ${_JAVA_PATHS}
  222. )
  223. find_program(Java_JAVADOC_EXECUTABLE
  224. NAMES javadoc
  225. HINTS ${_JAVA_HINTS}
  226. PATHS ${_JAVA_PATHS}
  227. )
  228. find_program(Java_IDLJ_EXECUTABLE
  229. NAMES idlj
  230. HINTS ${_JAVA_HINTS}
  231. PATHS ${_JAVA_PATHS}
  232. )
  233. find_program(Java_JARSIGNER_EXECUTABLE
  234. NAMES jarsigner
  235. HINTS ${_JAVA_HINTS}
  236. PATHS ${_JAVA_PATHS}
  237. )
  238. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  239. if(Java_FIND_COMPONENTS)
  240. set(_JAVA_REQUIRED_VARS)
  241. foreach(component ${Java_FIND_COMPONENTS})
  242. # User just want to execute some Java byte-compiled
  243. If(component STREQUAL "Runtime")
  244. list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE)
  245. if(Java_JAVA_EXECUTABLE)
  246. set(Java_Runtime_FOUND TRUE)
  247. endif()
  248. elseif(component STREQUAL "Development")
  249. list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAVAC_EXECUTABLE
  250. Java_JAR_EXECUTABLE Java_JAVADOC_EXECUTABLE)
  251. if(Java_VERSION VERSION_LESS "10")
  252. list(APPEND _JAVA_REQUIRED_VARS Java_JAVAH_EXECUTABLE)
  253. if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
  254. AND Java_JAVAH_EXECUTABLE AND Java_JAR_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
  255. set(Java_Development_FOUND TRUE)
  256. endif()
  257. else()
  258. if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
  259. AND Java_JAR_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
  260. set(Java_Development_FOUND TRUE)
  261. endif()
  262. endif()
  263. elseif(component STREQUAL "IdlJ")
  264. list(APPEND _JAVA_REQUIRED_VARS Java_IDLJ_EXECUTABLE)
  265. if(Java_IDLJ_EXECUTABLE)
  266. set(Java_IdlJ_FOUND TRUE)
  267. endif()
  268. elseif(component STREQUAL "JarSigner")
  269. list(APPEND _JAVA_REQUIRED_VARS Java_JARSIGNER_EXECUTABLE)
  270. if(Java_JARSIGNER_EXECUTABLE)
  271. set(Java_JarSigner_FOUND TRUE)
  272. endif()
  273. else()
  274. message(FATAL_ERROR "Comp: ${component} is not handled")
  275. endif()
  276. endforeach()
  277. list (REMOVE_DUPLICATES _JAVA_REQUIRED_VARS)
  278. find_package_handle_standard_args(Java
  279. REQUIRED_VARS ${_JAVA_REQUIRED_VARS} HANDLE_COMPONENTS
  280. VERSION_VAR Java_VERSION
  281. )
  282. if(Java_FOUND)
  283. foreach(component ${Java_FIND_COMPONENTS})
  284. set(Java_${component}_FOUND TRUE)
  285. endforeach()
  286. endif()
  287. else()
  288. # Check for Development
  289. if(Java_VERSION VERSION_LESS "10")
  290. find_package_handle_standard_args(Java
  291. REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
  292. Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE
  293. VERSION_VAR Java_VERSION_STRING
  294. )
  295. else()
  296. find_package_handle_standard_args(Java
  297. REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
  298. Java_JAVADOC_EXECUTABLE
  299. VERSION_VAR Java_VERSION_STRING
  300. )
  301. endif()
  302. endif()
  303. mark_as_advanced(
  304. Java_JAVA_EXECUTABLE
  305. Java_JAR_EXECUTABLE
  306. Java_JAVAC_EXECUTABLE
  307. Java_JAVAH_EXECUTABLE
  308. Java_JAVADOC_EXECUTABLE
  309. Java_IDLJ_EXECUTABLE
  310. Java_JARSIGNER_EXECUTABLE
  311. )
  312. # LEGACY
  313. set(JAVA_RUNTIME ${Java_JAVA_EXECUTABLE})
  314. set(JAVA_ARCHIVE ${Java_JAR_EXECUTABLE})
  315. set(JAVA_COMPILE ${Java_JAVAC_EXECUTABLE})