2 @defgroup module-wrapping-java Module Java CMake APIs
6 @file vtkModuleWrapJava.cmake
7 @brief APIs
for wrapping modules
for Java
12 @brief Generate sources
for using a module
's classes from Java 14 This function generates the wrapped sources for a module. It places the list of 15 generated source files and Java source files in variables named in the second 16 and third arguments, respectively. 19 _vtk_module_wrap_java_sources(<module> <sources> <classes>) 22 function (_vtk_module_wrap_java_sources module sources java_sources) 23 _vtk_module_get_module_property("${module}" 24 PROPERTY "exclude_wrap" 25 VARIABLE _vtk_java_exclude_wrap) 26 if (_vtk_java_exclude_wrap) 30 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_java_library_name}Java") 32 set(_vtk_java_args_file "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_java_library_name}Java/${_vtk_java_library_name}-java.$<CONFIGURATION>.args") 33 set(_vtk_java_init_data_file "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_java_library_name}Java/${_vtk_java_library_name}-java-init.data") 35 set(_vtk_java_hierarchy_depends "${module}") 36 _vtk_module_get_module_property("${module}" 37 PROPERTY "private_depends" 38 VARIABLE _vtk_java_private_depends) 39 list(APPEND _vtk_java_hierarchy_depends ${_vtk_java_private_depends}) 41 set(_vtk_java_command_depends) 42 foreach (_vtk_java_hierarchy_depend IN LISTS _vtk_java_hierarchy_depends) 43 _vtk_module_get_module_property("${_vtk_java_hierarchy_depend}" 45 VARIABLE _vtk_java_hierarchy_file) 46 if (_vtk_java_hierarchy_file) 47 list(APPEND _vtk_java_hierarchy_files "${_vtk_java_hierarchy_file}") 48 get_property(_vtk_java_is_imported 49 TARGET "${_vtk_java_hierarchy_depend}" 51 if (_vtk_java_is_imported OR CMAKE_GENERATOR MATCHES "Ninja") 52 list(APPEND _vtk_java_command_depends "${_vtk_java_hierarchy_file}") 54 _vtk_module_get_module_property("${_vtk_java_hierarchy_depend}" 55 PROPERTY "library_name" 56 VARIABLE _vtk_java_hierarchy_library_name) 57 if (TARGET "${_vtk_java_hierarchy_library_name}-hierarchy") 58 list(APPEND _vtk_java_command_depends "${_vtk_java_hierarchy_library_name}-hierarchy") 61 "The ${_vtk_java_hierarchy_depend} hierarchy file is attached to a non-imported target " 62 "and a hierarchy target (${_vtk_java_hierarchy_library_name}-hierarchy) is " 69 set(_vtk_java_genex_compile_definitions 70 "$<TARGET_PROPERTY:${_vtk_java_target_name},COMPILE_DEFINITIONS>") 71 set(_vtk_java_genex_include_directories 72 "$<TARGET_PROPERTY:${_vtk_java_target_name},INCLUDE_DIRECTORIES>") 74 OUTPUT "${_vtk_java_args_file}" 75 CONTENT "$<$<BOOL:${_vtk_java_genex_compile_definitions}>:\n-D\'$<JOIN:${_vtk_java_genex_compile_definitions},\'\n-D\'>\'>\n 76 $<$<BOOL:${_vtk_java_genex_include_directories}>:\n-I\'$<JOIN:${_vtk_java_genex_include_directories},\'\n-I\'>\'>\n 77 $<$<BOOL:${_vtk_java_hierarchy_files}>:\n--types \'$<JOIN:${_vtk_java_hierarchy_files},\'\n--types \'>\'>\n") 79 set(_vtk_java_sources) 80 set(_vtk_java_java_sources) 82 _vtk_module_get_module_property("${module}" 84 VARIABLE _vtk_java_headers) 85 set(_vtk_java_classes) 86 foreach (_vtk_java_header IN LISTS _vtk_java_headers) 87 get_filename_component(_vtk_java_basename "${_vtk_java_header}" NAME_WE) 88 list(APPEND _vtk_java_classes 89 "${_vtk_java_basename}") 91 # The vtkWrapJava tool has special logic for the `vtkRenderWindow` class. 92 # This extra logic requires its wrappers to be compiled as ObjC++ code 94 set(_vtk_java_ext "cxx") 95 if (APPLE AND _vtk_java_basename STREQUAL "vtkRenderWindow") 96 set(_vtk_java_ext "mm") 99 set(_vtk_java_source_output 100 "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_java_library_name}Java/${_vtk_java_basename}Java.${_vtk_java_ext}") 101 list(APPEND _vtk_java_sources 102 "${_vtk_java_source_output}") 104 set(_vtk_java_wrap_target "VTK::WrapJava") 105 set(_vtk_java_macros_args) 106 if (TARGET VTKCompileTools::WrapJava) 107 set(_vtk_java_wrap_target "VTKCompileTools::WrapJava") 108 if (TARGET VTKCompileTools_macros) 109 list(APPEND _vtk_java_command_depends 110 "VTKCompileTools_macros") 111 list(APPEND _vtk_java_macros_args 113 -imacros "${_VTKCompileTools_macros_file}") 117 set(_vtk_java_parse_target "VTK::ParseJava") 118 if (TARGET VTKCompileTools::ParseJava) 119 set(_vtk_java_parse_target "VTKCompileTools::ParseJava") 123 OUTPUT "${_vtk_java_source_output}" 124 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} 125 "$<TARGET_FILE:${_vtk_java_wrap_target}>" 126 "@${_vtk_java_args_file}" 127 -o "${_vtk_java_source_output}" 128 "${_vtk_java_header}" 129 ${_vtk_java_macros_args} 131 CXX "${_vtk_java_header}" 132 COMMENT "Generating Java wrapper sources for ${_vtk_java_basename}" 134 "${_vtk_java_header}" 135 "${_vtk_java_args_file}" 136 "$<TARGET_FILE:${_vtk_java_wrap_target}>" 137 ${_vtk_java_command_depends}) 139 set(_vtk_java_java_source_output 140 "${_vtk_java_JAVA_OUTPUT}/${_vtk_java_basename}.java") 141 list(APPEND _vtk_java_java_sources 142 "${_vtk_java_java_source_output}") 145 OUTPUT "${_vtk_java_java_source_output}" 146 COMMAND "${_vtk_java_parse_target}" 147 "@${_vtk_java_args_file}" 148 -o "${_vtk_java_java_source_output}" 149 "${_vtk_java_header}" 150 ${_vtk_java_macros_args} 152 CXX "${_vtk_java_header}" 153 COMMENT "Generating Java sources for ${_vtk_java_basename}" 155 "${_vtk_java_header}" 156 "${_vtk_java_args_file}" 157 "$<TARGET_FILE:${_vtk_java_parse_target}>" 158 ${_vtk_java_command_depends}) 162 "${_vtk_java_sources}" 165 set("${java_sources}" 166 "${_vtk_java_java_sources}" 172 @brief Generate a JNI library for a set of modules 174 A single JNI library may consist of the Java wrappings of multiple modules. 175 This is useful for kit-based builds where the modules part of the same kit 176 belong to the same JNI library as well. 179 _vtk_module_wrap_java_library(<name> <module>...) 182 The first argument is the name of the JNI library. The remaining arguments are 183 modules to include in the JNI library. 185 The remaining information it uses is assumed to be provided by the 186 @ref vtk_module_wrap_java function. 188 function (_vtk_module_wrap_java_library name) 189 set(_vtk_java_library_sources) 190 set(_vtk_java_library_java_sources) 191 set(_vtk_java_library_link_depends) 192 foreach (_vtk_java_module IN LISTS ARGN) 193 _vtk_module_get_module_property("${_vtk_java_module}" 194 PROPERTY "exclude_wrap" 195 VARIABLE _vtk_java_exclude_wrap) 196 if (_vtk_java_exclude_wrap) 199 _vtk_module_real_target(_vtk_java_target_name "${_vtk_java_module}") 200 _vtk_module_get_module_property("${_vtk_java_module}" 201 PROPERTY "library_name" 202 VARIABLE _vtk_java_library_name) 203 _vtk_module_wrap_java_sources("${_vtk_java_module}" _vtk_java_sources _vtk_java_java_sources) 204 list(APPEND _vtk_java_library_sources 205 ${_vtk_java_sources}) 206 list(APPEND _vtk_java_library_java_sources 207 ${_vtk_java_java_sources}) 209 _vtk_module_get_module_property("${_vtk_java_module}" 211 VARIABLE _vtk_java_module_depends) 212 foreach (_vtk_java_module_depend IN LISTS _vtk_java_module_depends) 213 _vtk_module_get_module_property("${_vtk_java_module_depend}" 214 PROPERTY "exclude_wrap" 215 VARIABLE _vtk_java_module_depend_exclude_wrap) 216 if (_vtk_java_module_depend_exclude_wrap) 220 _vtk_module_get_module_property("${_vtk_java_module_depend}" 221 PROPERTY "library_name" 222 VARIABLE _vtk_java_depend_library_name) 224 # XXX(kits): This doesn't work
for kits.
225 list(APPEND _vtk_java_library_link_depends
226 "${_vtk_java_depend_library_name}Java")
230 if (NOT _vtk_java_library_sources)
234 if (_vtk_java_library_link_depends)
235 list(REMOVE_DUPLICATES _vtk_java_library_link_depends)
238 set(_vtk_java_target "${
name}Java
") 240 # XXX(java): Should this be a `MODULE`? If not, we should probably export 241 # these targets, but then we'll need logic akin to the `vtkModuleWrapPython` 242 # logic for loading wrapped modules from other packages. 243 add_library("${_vtk_java_target}
" SHARED 244 ${_vtk_java_library_sources}) 245 add_custom_target("${_vtk_java_target}-java-sources
" 247 ${_vtk_java_library_java_sources}) 248 add_dependencies("${_vtk_java_target}
" 249 "${_vtk_java_target}-java-sources
") 251 set_property(TARGET "${_vtk_java_target}
" 256 set_property(TARGET "${_vtk_java_target}
" 260 set_property(TARGET "${_vtk_java_target}
" 262 "_vtk_module_java_files
" "${_vtk_java_library_java_sources}
") 264 if (_vtk_java_JNILIB_DESTINATION) 266 TARGETS "${_vtk_java_target}
" 269 DESTINATION "${_vtk_java_JNILIB_DESTINATION}
" 270 COMPONENT "${_vtk_java_JNILIB_COMPONENT}
" 273 DESTINATION "${_vtk_java_JNILIB_DESTINATION}
" 274 COMPONENT "${_vtk_java_JNILIB_COMPONENT}
") 279 TARGETS "${_vtk_java_target}
") 281 target_link_libraries("${_vtk_java_target}
" 284 # XXX(java): If we use modules, remove this. 285 ${_vtk_java_library_link_depends} 290 @ingroup module-wrapping-java 291 @brief Wrap a set of modules for use in Java 294 vtk_module_wrap_java( 296 [WRAPPED_MODULES <varname>] 298 [JAVA_OUTPUT <destination>]) 301 * `MODULES`: (Required) The list of modules to wrap. 302 * `WRAPPED_MODULES`: (Recommended) Not all modules are wrappable. This 303 variable will be set to contain the list of modules which were wrapped. 304 * `JAVA_OUTPUT`: Defaults to 305 `${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/vtkJava`. Java source files are 306 written to this directory. After generation, the files may be compiled as 308 * `LIBRARY_DESTINATION` (Recommended): If provided, dynamic loader 309 information will be added to modules for loading dependent libraries. 310 * `JNILIB_DESTINATION`: Where to install JNI libraries. 311 * `JNILIB_COMPONENT`: Defaults to `jni`. The install component to use for JNI 314 For each wrapped module, a `<module>Java` target will be created. These targets 315 will have a `_vtk_module_java_files` property which is the list of generated 316 Java source files for that target. 318 For dependency purposes, the `<module>Java-java-sources` target may also be 321 function (vtk_module_wrap_java) 322 cmake_parse_arguments(_vtk_java 324 "JAVA_OUTPUT;WRAPPED_MODULES;LIBRARY_DESTINATION;JNILIB_DESTINATION;JNILIB_COMPONENT
" 328 if (_vtk_java_UNPARSED_ARGUMENTS) 331 "${_vtk_java_UNPARSED_ARGUMENTS}
") 334 if (NOT _vtk_java_JAVA_OUTPUT) 335 set(_vtk_java_JAVA_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/vtkJava
") 338 if (NOT _vtk_java_JNILIB_COMPONENT) 339 set(_vtk_java_JNILIB_COMPONENT "jni
") 343 set(CMAKE_BUILD_RPATH_USE_ORIGIN 1) 346 set(_vtk_java_origin_rpath_prefix 349 set(_vtk_java_origin_rpath_prefix 353 list(APPEND CMAKE_INSTALL_RPATH 354 # For sibling wrapped modules. 355 "${_vtk_java_origin_rpath_prefix}
") 357 if (DEFINED _vtk_java_LIBRARY_DESTINATION AND DEFINED _vtk_java_JNILIB_DESTINATION) 358 file(RELATIVE_PATH _vtk_java_relpath 359 "/prefix/${_vtk_java_JNILIB_DESTINATION}
" 360 "/prefix/${_vtk_java_LIBRARY_DESTINATION}
") 362 list(APPEND CMAKE_INSTALL_RPATH 364 "${_vtk_java_origin_rpath_prefix}/${_vtk_java_relpath}
") 368 if (DEFINED _vtk_java_JNILIB_DESTINATION) 369 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_vtk_java_JNILIB_DESTINATION}
") 370 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_vtk_java_JNILIB_DESTINATION}
") 373 if (NOT _vtk_java_MODULES) 375 "No modules were requested
for java wrapping.
") 379 set(_vtk_java_all_wrapped_modules) 380 foreach (_vtk_java_module IN LISTS _vtk_java_MODULES) 381 _vtk_module_get_module_property("${_vtk_java_module}
" 382 PROPERTY "library_name
" 383 VARIABLE _vtk_java_exclude_wrap) 384 _vtk_module_get_module_property("${_vtk_java_module}
" 385 PROPERTY "library_name
" 386 VARIABLE _vtk_java_library_name) 387 _vtk_module_wrap_java_library("${_vtk_java_library_name}
" "${_vtk_java_module}
") 389 if (TARGET "${_vtk_java_library_name}Java
") 390 list(APPEND _vtk_java_all_wrapped_modules 391 "${_vtk_java_module}
") 395 if (NOT _vtk_java_all_wrapped_modules) 397 "No modules given could be wrapped.
") 400 if (DEFINED _vtk_java_WRAPPED_MODULES) 401 set("${_vtk_java_WRAPPED_MODULES}
" 402 "${_vtk_java_all_wrapped_modules}
"
function vtk_module_wrap_java()
Wrap a set of modules for use in Java