FindJava.cmake 12 KB

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