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.