VTK  9.0.2
vtkModuleWrapJava.cmake
Go to the documentation of this file.
1 #[==[
2 @defgroup module-wrapping-java Module Java CMake APIs
3 #]==]
4 
5 #[==[
6 @file vtkModuleWrapJava.cmake
7 @brief APIs for wrapping modules for Java
8 #]==]
9 
10 #[==[
11 @ingroup module-impl
12 @brief Generate sources for using a module's classes from Java
13 
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.
17 
18 ~~~
19 _vtk_module_wrap_java_sources(<module> <sources> <classes>)
20 ~~~
21 #]==]
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)
27  return ()
28  endif ()
29 
30  file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_java_library_name}Java")
31 
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")
34 
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})
40 
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}"
44  PROPERTY "hierarchy"
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}"
50  PROPERTY "IMPORTED")
51  if (_vtk_java_is_imported OR CMAKE_GENERATOR MATCHES "Ninja")
52  list(APPEND _vtk_java_command_depends "${_vtk_java_hierarchy_file}")
53  else ()
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")
59  else ()
60  message(FATAL_ERROR
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 "
63  "missing.")
64  endif ()
65  endif ()
66  endif ()
67  endforeach ()
68 
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>")
73  file(GENERATE
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")
78 
79  set(_vtk_java_sources)
80  set(_vtk_java_java_sources)
81 
82  _vtk_module_get_module_property("${module}"
83  PROPERTY "headers"
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}")
90 
91  # The vtkWrapJava tool has special logic for the `vtkRenderWindow` class.
92  # This extra logic requires its wrappers to be compiled as ObjC++ code
93  # instead.
94  set(_vtk_java_ext "cxx")
95  if (APPLE AND _vtk_java_basename STREQUAL "vtkRenderWindow")
96  set(_vtk_java_ext "mm")
97  endif ()
98 
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}")
103 
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
112  -undef
113  -imacros "${_VTKCompileTools_macros_file}")
114  endif ()
115  endif ()
116 
117  set(_vtk_java_parse_target "VTK::ParseJava")
118  if (TARGET VTKCompileTools::ParseJava)
119  set(_vtk_java_parse_target "VTKCompileTools::ParseJava")
120  endif ()
121 
122  add_custom_command(
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}
130  IMPLICIT_DEPENDS
131  CXX "${_vtk_java_header}"
132  COMMENT "Generating Java wrapper sources for ${_vtk_java_basename}"
133  DEPENDS
134  "${_vtk_java_header}"
135  "${_vtk_java_args_file}"
136  "$<TARGET_FILE:${_vtk_java_wrap_target}>"
137  ${_vtk_java_command_depends})
138 
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}")
143 
144  add_custom_command(
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}
151  IMPLICIT_DEPENDS
152  CXX "${_vtk_java_header}"
153  COMMENT "Generating Java sources for ${_vtk_java_basename}"
154  DEPENDS
155  "${_vtk_java_header}"
156  "${_vtk_java_args_file}"
157  "$<TARGET_FILE:${_vtk_java_parse_target}>"
158  ${_vtk_java_command_depends})
159  endforeach ()
160 
161  set("${sources}"
162  "${_vtk_java_sources}"
163  PARENT_SCOPE)
164 
165  set("${java_sources}"
166  "${_vtk_java_java_sources}"
167  PARENT_SCOPE)
168 endfunction ()
169 
170 #[==[
171 @ingroup module-impl
172 @brief Generate a JNI library for a set of modules
173 
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.
177 
178 ~~~
179 _vtk_module_wrap_java_library(<name> <module>...)
180 ~~~
181 
182 The first argument is the name of the JNI library. The remaining arguments are
183 modules to include in the JNI library.
184 
185 The remaining information it uses is assumed to be provided by the
186 @ref vtk_module_wrap_java function.
187 #]==]
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)
197  continue ()
198  endif ()
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})
208 
209  _vtk_module_get_module_property("${_vtk_java_module}"
210  PROPERTY "depends"
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)
217  continue ()
218  endif ()
219 
220  _vtk_module_get_module_property("${_vtk_java_module_depend}"
221  PROPERTY "library_name"
222  VARIABLE _vtk_java_depend_library_name)
223 
224  # XXX(kits): This doesn't work for kits.
225  list(APPEND _vtk_java_library_link_depends
226  "${_vtk_java_depend_library_name}Java")
227  endforeach ()
228  endforeach ()
229 
230  if (NOT _vtk_java_library_sources)
231  return ()
232  endif ()
233 
234  if (_vtk_java_library_link_depends)
235  list(REMOVE_DUPLICATES _vtk_java_library_link_depends)
236  endif ()
237 
238  set(_vtk_java_target "${name}Java")
239 
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"
246  DEPENDS
247  ${_vtk_java_library_java_sources})
248  add_dependencies("${_vtk_java_target}"
249  "${_vtk_java_target}-java-sources")
250  if (MINGW)
251  set_property(TARGET "${_vtk_java_target}"
252  PROPERTY
253  PREFIX "")
254  endif ()
255  if (APPLE)
256  set_property(TARGET "${_vtk_java_target}"
257  PROPERTY
258  SUFFIX ".jnilib")
259  endif ()
260  set_property(TARGET "${_vtk_java_target}"
261  PROPERTY
262  "_vtk_module_java_files" "${_vtk_java_library_java_sources}")
263 
264  if (_vtk_java_JNILIB_DESTINATION)
265  install(
266  TARGETS "${_vtk_java_target}"
267  # Windows
268  RUNTIME
269  DESTINATION "${_vtk_java_JNILIB_DESTINATION}"
270  COMPONENT "${_vtk_java_JNILIB_COMPONENT}"
271  # Other platforms
272  LIBRARY
273  DESTINATION "${_vtk_java_JNILIB_DESTINATION}"
274  COMPONENT "${_vtk_java_JNILIB_COMPONENT}")
275  endif ()
276 
277  vtk_module_autoinit(
278  MODULES ${ARGN}
279  TARGETS "${_vtk_java_target}")
280 
281  target_link_libraries("${_vtk_java_target}"
282  PRIVATE
283  ${ARGN}
284  # XXX(java): If we use modules, remove this.
285  ${_vtk_java_library_link_depends}
286  VTK::Java)
287 endfunction ()
288 
289 #[==[
290 @ingroup module-wrapping-java
291 @brief Wrap a set of modules for use in Java
292 
293 ~~~
294 vtk_module_wrap_java(
295  MODULES <module>...
296  [WRAPPED_MODULES <varname>]
297 
298  [JAVA_OUTPUT <destination>])
299 ~~~
300 
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
307  needed.
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
312  libraries.
313 
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.
317 
318 For dependency purposes, the `<module>Java-java-sources` target may also be
319 used.
320 #]==]
321 function (vtk_module_wrap_java)
322  cmake_parse_arguments(_vtk_java
323  ""
324  "JAVA_OUTPUT;WRAPPED_MODULES;LIBRARY_DESTINATION;JNILIB_DESTINATION;JNILIB_COMPONENT"
325  "MODULES"
326  ${ARGN})
327 
328  if (_vtk_java_UNPARSED_ARGUMENTS)
329  message(FATAL_ERROR
330  "Unparsed arguments for vtk_module_wrap_java: "
331  "${_vtk_java_UNPARSED_ARGUMENTS}")
332  endif ()
333 
334  if (NOT _vtk_java_JAVA_OUTPUT)
335  set(_vtk_java_JAVA_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/vtkJava")
336  endif ()
337 
338  if (NOT _vtk_java_JNILIB_COMPONENT)
339  set(_vtk_java_JNILIB_COMPONENT "jni")
340  endif ()
341 
342  # Set up rpaths
343  set(CMAKE_BUILD_RPATH_USE_ORIGIN 1)
344  if (UNIX)
345  if (APPLE)
346  set(_vtk_java_origin_rpath_prefix
347  "@loader_path")
348  else ()
349  set(_vtk_java_origin_rpath_prefix
350  "$ORIGIN")
351  endif ()
352 
353  list(APPEND CMAKE_INSTALL_RPATH
354  # For sibling wrapped modules.
355  "${_vtk_java_origin_rpath_prefix}")
356 
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}")
361 
362  list(APPEND CMAKE_INSTALL_RPATH
363  # For libraries.
364  "${_vtk_java_origin_rpath_prefix}/${_vtk_java_relpath}")
365  endif ()
366  endif ()
367 
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}")
371  endif ()
372 
373  if (NOT _vtk_java_MODULES)
374  message(WARNING
375  "No modules were requested for java wrapping.")
376  return ()
377  endif ()
378 
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}")
388 
389  if (TARGET "${_vtk_java_library_name}Java")
390  list(APPEND _vtk_java_all_wrapped_modules
391  "${_vtk_java_module}")
392  endif ()
393  endforeach ()
394 
395  if (NOT _vtk_java_all_wrapped_modules)
396  message(FATAL_ERROR
397  "No modules given could be wrapped.")
398  endif ()
399 
400  if (DEFINED _vtk_java_WRAPPED_MODULES)
401  set("${_vtk_java_WRAPPED_MODULES}"
402  "${_vtk_java_all_wrapped_modules}"
403  PARENT_SCOPE)
404  endif ()
405 endfunction ()
function vtk_module_wrap_java()
Wrap a set of modules for use in Java.
@ name
Definition: vtkX3D.h:225