find_package(Java REQUIRED) find_package(JNI REQUIRED) include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) # Add the option to package VTK for custom Java packaging option(VTK_JAVA_INSTALL "Use the Java rules to build the native libraries." OFF) option(VTK_JAVA_CLEANUP_INSTALL "Should java packaging cleanup install directory." OFF) mark_as_advanced(VTK_JAVA_CLEANUP_INSTALL) if(VTK_JAVA_INSTALL) # Make sure we embed the runtime libraries when packaging the Java binaries if(WIN32) # install system runtimes. set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION "bin") include(InstallRequiredSystemLibraries) endif() set(VTK_CUSTOM_LIBRARY_SUFFIX "" CACHE STRING "" FORCE) mark_as_advanced(VTK_CUSTOM_LIBRARY_SUFFIX) if(APPLE) set(CMAKE_INSTALL_NAME_DIR @loader_path CACHE STRING "" FORCE) mark_as_advanced(CMAKE_INSTALL_NAME_DIR) endif() if(NOT MAVEN_LOCAL_NATIVE_NAME) set(MAVEN_LOCAL_NATIVE_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}" CACHE STRING "") endif() if(NOT MAVEN_NATIVE_ARTIFACTS) set(MAVEN_NATIVE_ARTIFACTS "${MAVEN_LOCAL_NATIVE_NAME}" CACHE STRING "") endif() if(NOT MAVEN_LOCAL_REPOSITORY) set(MAVEN_LOCAL_REPOSITORY "\${user.home}/vtk-maven-repos" CACHE STRING "") endif() if(NOT MAVEN_VTK_GROUP_ID) set(MAVEN_VTK_GROUP_ID "kitware.community" CACHE STRING "") endif() mark_as_advanced(MAVEN_LOCAL_REPOSITORY MAVEN_NATIVE_ARTIFACTS MAVEN_LOCAL_NATIVE_NAME MAVEN_VTK_GROUP_ID) set(MAVEN_DEPENDENCY_XML) endif() # Add the option for build the SWT component to VTK. option(VTK_JAVA_SWT_COMPONENT "Should SWT component for Java be built (it requires Eclipse)?" OFF) if(VTK_JAVA_SWT_COMPONENT) find_package(SWT REQUIRED) endif() # Add the option for build the JOGL component to VTK. set(JOGL_VERSION "2.3.2") option(VTK_JAVA_JOGL_COMPONENT "Need JOGL jar files" OFF) if(VTK_JAVA_JOGL_COMPONENT) set(MAVEN_REPO "$ENV{HOME}/.m2/repository") find_file(JOGL_LIB jogl-all-${JOGL_VERSION}.jar PATHS ${MAVEN_REPO}/org/jogamp/jogl/jogl-all/${JOGL_VERSION} ) find_file(JOGL_GLUE gluegen-rt-${JOGL_VERSION}.jar PATHS ${MAVEN_REPO}/org/jogamp/gluegen/gluegen-rt/${JOGL_VERSION}) mark_as_advanced(JOGL_LIB JOGL_GLUE) if(NOT JOGL_LIB) message(ERROR " CMake can not build VTK with VTK_JAVA_JOGL_COMPONENT ON if the JOGL jar file is not provided. Please set the JOGL_LIB variable. ") endif() if(NOT JOGL_GLUE) message(ERROR " CMake can not build VTK with VTK_JAVA_JOGL_COMPONENT ON if the GLUE jar file is not provided. Please set the JOGL_GLUE variable. ") endif() endif() set(WrappingJava_SRCS vtkJavaUtil.cxx ) vtk_module_library(vtkWrappingJava ${WrappingJava_SRCS}) # javac runs out memory on Mac so increase heapsize if(APPLE) set(JAVAC_OPTIONS -J-Xmx512m) endif() get_property(java_modules GLOBAL PROPERTY VTK_JAVA_WRAPPED) foreach(module IN LISTS java_modules) if(NOT ${module}_EXCLUDE_FROM_WRAPPING) include(${${module}_BINARY_DIR}/JavaDependencies.cmake OPTIONAL) list(APPEND _MODULES_TO_WRAP ${module}) endif() endforeach() if(NOT VTK_JAR_PATH) set(VTK_JAR_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") endif() set(VTK_JAVA_SOURCE_FILES ${VTK_JAVA_DEPENDENCIES}) string(REGEX REPLACE "\\.java" ".class;" VTK_JAVA_CLASS_FILES ${VTK_JAVA_SOURCE_FILES}) # Setup custom targets if (BUILD_TESTING) add_custom_target(VTKJavaTestClasses ALL DEPENDS ${VTK_BINARY_DIR}/java/javac_tests_stamp.txt) endif() add_custom_target(VTKJavaJar ALL DEPENDS ${VTK_JAR_PATH}/vtk.jar) add_custom_target(VTKJavaClasses ALL DEPENDS ${VTK_BINARY_DIR}/java/javac_stamp.txt) add_dependencies(VTKJavaJar VTKJavaClasses) if (BUILD_TESTING) add_dependencies(VTKJavaTestClasses VTKJavaJar) endif() # Some platforms have libjvm in a subdirectory from # the rest of the java libraries and are missing the symlink. if(JAVA_AWT_LIBRARY) foreach(__java_library ${JAVA_AWT_LIBRARY}) get_filename_component(JAVA_LIB_DIR ${__java_library} PATH) if(EXISTS ${JAVA_LIB_DIR}/xawt) link_directories(${JAVA_LIB_DIR}/xawt) endif() if(EXISTS ${JAVA_LIB_DIR}/client) link_directories(${JAVA_LIB_DIR}/client) endif() if(EXISTS ${JAVA_LIB_DIR}/server) link_directories(${JAVA_LIB_DIR}/server) endif() endforeach() endif() set(CMAKE_SKIP_RPATH 0) include_directories(${vtkCommonCore_SOURCE_DIR}) include_directories(${vtkCommonCore_BINARY_DIR}) add_executable(VTKJavaExecutable VTKJava.cxx) set(JAVA_LIBRARIES) foreach(module ${_MODULES_TO_WRAP}) string(REGEX REPLACE "^vtk" "" _module_no_prefix "${module}") if(APPLE AND NOT VTK_JAVA_INSTALL) set(src ${VTK_JAR_PATH}/libvtk${_module_no_prefix}Java.dylib) set(tgt ${VTK_JAR_PATH}/libvtk${_module_no_prefix}Java.jnilib) add_custom_command(OUTPUT ${tgt} COMMAND ln ARGS -sf ${src} ${tgt} DEPENDS ${src}) set(JAVA_LIBRARIES ${JAVA_LIBRARIES} ${tgt}) endif() target_link_libraries(VTKJavaExecutable ${module}Java) add_custom_target(VTKJava${_module_no_prefix} ALL) add_dependencies(VTKJava${_module_no_prefix} VTKJavaExecutable) add_dependencies(VTKJava${_module_no_prefix} ${module}JavaJavaClasses) add_dependencies(VTKJavaJar VTKJava${_module_no_prefix}) # Make sure all .java files are build before any .class files are built. foreach(otherModule ${_MODULES_TO_WRAP}) add_dependencies(VTKJava${_module_no_prefix} ${otherModule}JavaJavaClasses) endforeach() # Make sure all the VTKJava${kit} projects build *before* VTKJavaClasses. add_dependencies(VTKJavaClasses VTKJava${_module_no_prefix}) add_dependencies(VTKJavaClasses ${module}Java) endforeach() # KITS is used in vtkSettings.java.in ( module name no prefix ) string(REGEX REPLACE "vtk" "" KITS "${_MODULES_TO_WRAP}") configure_file(${VTK_SOURCE_DIR}/Wrapping/Java/vtk/vtkSettings.java.in ${VTK_BINARY_DIR}/java/vtk/vtkSettings.java) # configure vtkNativeLibrary.java to enable loading of VTK module libraries set(VTK_JAVA_NATIVE_LIBRARIES) foreach(module ${VTK_MODULES_ALL}) if(NOT ${module}_EXCLUDE_FROM_WRAPPING) string(TOUPPER ${module} _enum_name) set(_enabled "false") if(${${module}_ENABLED}) set(_enabled "true") endif() set(_enum_contr_call " ${_enum_name}(\"${module}Java\", ${_enabled}),\n") set(VTK_JAVA_NATIVE_LIBRARIES "${VTK_JAVA_NATIVE_LIBRARIES}${_enum_contr_call}") endif() endforeach() # replace last , with ; string(REGEX REPLACE "^(.*),\n$" "\\1;\n" VTK_JAVA_NATIVE_LIBRARIES ${VTK_JAVA_NATIVE_LIBRARIES}) configure_file(${VTK_SOURCE_DIR}/Wrapping/Java/vtk/vtkNativeLibrary.java.in ${VTK_BINARY_DIR}/java/vtk/vtkNativeLibrary.java) # Add to class list so classes get cleaned up list(APPEND VTK_JAVA_CLASS_FILES ${VTK_BINARY_DIR}/java/vtk/vtkSettings.class) set(VTK_JAVA_DEPENDENCIES CellType vtkReferenceInformation vtkJavaGarbageCollector vtkJavaMemoryManager vtkJavaMemoryManagerImpl vtkNativeLibrary vtkSettings ) set(VTK_JAVA_SAMPLE_DEPENDENCIES) if(vtkRenderingCore_ENABLED) if (BUILD_TESTING) set(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} vtkJavaTesting) endif() set(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} AxesActor vtkRenderWindowPanel ) endif() if(vtkInteractionWidgets_ENABLED) set(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} vtkCanvas ) endif() if(vtkRenderingCore_ENABLED AND vtkIOImage_ENABLED) set(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} vtkPanel rendering/vtkAbstractComponent rendering/vtkAbstractEventInterceptor rendering/vtkComponent rendering/vtkEventInterceptor rendering/vtkInteractorForwarder rendering/awt/vtkAwtComponent rendering/awt/vtkInternalAwtComponent rendering/awt/vtkPanelComponent ) if(VTK_JAVA_SWT_COMPONENT) set(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} rendering/swt/vtkSwtComponent rendering/swt/vtkInternalSwtComponent rendering/swt/vtkSwtInteractorForwarderDecorator ) endif() if(VTK_JAVA_JOGL_COMPONENT) set(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} rendering/jogl/vtkAbstractJoglComponent rendering/jogl/vtkJoglCanvasComponent rendering/jogl/vtkJoglPanelComponent sample/rendering/JoglConeRendering ) endif() set(VTK_JAVA_SAMPLE_DEPENDENCIES ${VTK_JAVA_SAMPLE_DEPENDENCIES} InternalFrames Demo SimpleVTK VTKCanvas ReleaseVtkPanel rendering/AwtConeRendering rendering/annotation/LabeledCubeAxesActor ) if(VTK_JAVA_SWT_COMPONENT) set(VTK_JAVA_SAMPLE_DEPENDENCIES ${VTK_JAVA_SAMPLE_DEPENDENCIES} rendering/SwtConeRendering ) endif() endif() if(vtkFiltersModeling_ENABLED AND vtkIOImage_ENABLED) set(VTK_JAVA_SAMPLE_DEPENDENCIES ${VTK_JAVA_SAMPLE_DEPENDENCIES} ImagePlaneWidget ) endif() # Copy over the sample Java files foreach(jfile ${VTK_JAVA_SAMPLE_DEPENDENCIES}) set(src ${VTK_SOURCE_DIR}/Wrapping/Java/vtk/sample/${jfile}.java) set(dst ${VTK_JAVA_HOME}/sample/${jfile}.java) list(APPEND VTK_JAVA_SOURCE_FILES ${dst}) set(class ${VTK_JAVA_HOME}/sample/${jfile}.class) # Add to class list so classes get cleaned up list(APPEND VTK_JAVA_CLASS_FILES ${class}) configure_file(${src} ${dst} COPYONLY) endforeach() # Copy over the handcrafted Java classes foreach(jfile ${VTK_JAVA_DEPENDENCIES}) set(src ${VTK_SOURCE_DIR}/Wrapping/Java/vtk/${jfile}.java) set(dst ${VTK_JAVA_HOME}/${jfile}.java) list(APPEND VTK_JAVA_SOURCE_FILES ${dst}) set(class ${VTK_JAVA_HOME}/${jfile}.class) # Add to class list so classes get cleaned up list(APPEND VTK_JAVA_CLASS_FILES ${class}) if(jfile MATCHES "vtkSettings" OR jfile MATCHES "vtkNativeLibrary") else() configure_file(${src} ${dst} COPYONLY) endif() endforeach() if(WIN32) set(SEPARATOR "\\;") else() set(SEPARATOR ":") endif() if(VTK_JAVA_SWT_COMPONENT) set(SWT_FILES "${VTK_BINARY_DIR}/java/vtk/rendering/swt/*.java") endif() if(VTK_JAVA_JOGL_COMPONENT) set(JOGL_FILES "${VTK_BINARY_DIR}/java/vtk/rendering/jogl/*.java" "${VTK_BINARY_DIR}/java/vtk/sample/rendering/JoglConeRendering.java") endif() # Handle Java class path set(JAVA_COMPILATION_CLASSPATH "${VTK_JAVA_HOME}/..") if(ECLIPSE_SWT_LIBRARIES) set(JAVA_COMPILATION_CLASSPATH "${JAVA_COMPILATION_CLASSPATH}${SEPARATOR}${ECLIPSE_SWT_LIBRARIES}") endif() if(JOGL_LIB) set(JAVA_COMPILATION_CLASSPATH "${JAVA_COMPILATION_CLASSPATH}${SEPARATOR}${JOGL_LIB}") endif() if(JOGL_GLUE) set(JAVA_COMPILATION_CLASSPATH "${JAVA_COMPILATION_CLASSPATH}${SEPARATOR}${JOGL_GLUE}") endif() # Set the javac source version set(VTK_JAVA_SOURCE_VERSION "1.6" CACHE STRING "javac source version") mark_as_advanced(VTK_JAVA_SOURCE_VERSION) set(VTK_JAVA_TARGET_VERSION "1.6" CACHE STRING "javac target version") mark_as_advanced(VTK_JAVA_TARGET_VERSION) # On machines with long paths to VTK (or windows where the command line length # is short), we cannot just list all the java files on the command line. So # we put them in a response file and give that to javac # FIXME - Ideally we should make this run every build, but this is not well # supported right now... add_custom_command( OUTPUT ${VTK_BINARY_DIR}/java/javac_stamp.rsp DEPENDS ${VTK_JAVA_SOURCE_FILES} COMMAND ${CMAKE_COMMAND} -DVTK_JAVA_SWT_COMPONENT=${VTK_JAVA_SWT_COMPONENT} -DVTK_JAVA_JOGL_COMPONENT=${VTK_JAVA_JOGL_COMPONENT} -DVTK_BINARY_DIR=${VTK_BINARY_DIR} -DRSP_FILENAME=${VTK_BINARY_DIR}/java/javac_stamp.rsp -P ${CMAKE_CURRENT_SOURCE_DIR}/MakeJavacResponseFile.cmake COMMENT "Creating javac response file" ) # Compile the Java classes add_custom_command( OUTPUT ${VTK_BINARY_DIR}/java/javac_stamp.txt DEPENDS ${VTK_BINARY_DIR}/java/javac_stamp.rsp ${VTK_JAVA_SOURCE_FILES} COMMAND ${JAVA_COMPILE} ${JAVAC_OPTIONS} -source ${VTK_JAVA_SOURCE_VERSION} -target ${VTK_JAVA_TARGET_VERSION} -classpath ${JAVA_COMPILATION_CLASSPATH} -sourcepath ${VTK_SOURCE_DIR}/Wrapping/Java/ -d ${VTK_BINARY_DIR}/java @${VTK_BINARY_DIR}/java/javac_stamp.rsp COMMAND ${CMAKE_COMMAND} -E touch ${VTK_BINARY_DIR}/java/javac_stamp.txt COMMENT "Compiling Java Classes" ) # Create the JAR file containing all compiled classes and add_custom_command( COMMAND ${JAVA_ARCHIVE} -cvf "${VTK_JAR_PATH}/vtk.jar" -C ${VTK_BINARY_DIR}/java vtk DEPENDS ${VTK_BINARY_DIR}/java/javac_stamp.txt ${JAVA_LIBRARIES} OUTPUT ${VTK_JAR_PATH}/vtk.jar COMMENT "Java Archive" ) if(BUILD_TESTING) foreach(jfile Regression ConcurrencyGC JavaDelete ManualGC JavaGCAndDelete) list(APPEND VTK_JAVA_TESTS ${VTK_SOURCE_DIR}/Wrapping/Java/vtk/test/${jfile}.java) # Add to class list so classes get cleaned up list(APPEND VTK_JAVA_CLASS_FILES ${VTK_BINARY_DIR}/Wrapping/Java/vtk/test/${jfile}.class) endforeach() # Compile Java Tests add_custom_command( OUTPUT ${VTK_BINARY_DIR}/java/javac_tests_stamp.txt COMMAND ${JAVA_COMPILE} ${JAVAC_OPTIONS} -classpath ${VTK_JAR_PATH}/vtk.jar${SEPARATOR}${VTK_BINARY_DIR}/Wrapping/Java -source ${VTK_JAVA_SOURCE_VERSION} -target ${VTK_JAVA_TARGET_VERSION} -sourcepath ${VTK_SOURCE_DIR}/Wrapping/Java -d ${VTK_BINARY_DIR}/Wrapping/Java ${VTK_JAVA_TESTS} COMMAND ${CMAKE_COMMAND} -E touch ${VTK_BINARY_DIR}/java/javac_tests_stamp.txt DEPENDS ${VTK_JAR_PATH}/vtk.jar ${VTK_JAVA_TESTS} COMMENT "Compiling Java Tests" ) # Since vtkTesting is within vtkTestingRendering we need blockers if(vtkTestingRendering_ENABLED) # Require Rendering if(vtkRendering${VTK_RENDERING_BACKEND}_ENABLED) # If JAVA_DATAMODEL_FLAG is set, pass it as first argument. Otherwise, it's empty. # For example, use "-d64" to force 64-bit java jvm. # ExternalData_add_test(VTKData JavaRendering ${JAVA_RUNTIME} ${VTK_TEST_JAVA_DATAMODEL_FLAG} -classpath "${VTK_JAR_PATH}/vtk.jar${SEPARATOR}${VTK_BINARY_DIR}/Wrapping/Java" vtk.test.Regression -D ${VTK_TEST_DATA_DIR} -V DATA{Baseline/Cone.png,:} -T ${VTK_TEST_OUTPUT_DIR} ) endif() add_test(JavaGCRegression ${JAVA_RUNTIME} ${VTK_TEST_JAVA_DATAMODEL_FLAG} -classpath ${VTK_JAR_PATH}/vtk.jar${SEPARATOR}${VTK_BINARY_DIR}/Wrapping/Java vtk.test.ConcurrencyGC -T ${VTK_TEST_OUTPUT_DIR} ) add_test(JavaDeleteRegression ${JAVA_RUNTIME} ${VTK_TEST_JAVA_DATAMODEL_FLAG} -classpath ${VTK_JAR_PATH}/vtk.jar${SEPARATOR}${VTK_BINARY_DIR}/Wrapping/Java vtk.test.JavaDelete -T ${VTK_TEST_OUTPUT_DIR} ) add_test(JavaManualGC ${JAVA_RUNTIME} ${VTK_TEST_JAVA_DATAMODEL_FLAG} -classpath ${VTK_JAR_PATH}/vtk.jar${SEPARATOR}${VTK_BINARY_DIR}/Wrapping/Java vtk.test.ManualGC -T ${VTK_TEST_OUTPUT_DIR} ) add_test(JavaDeleteAndGC ${JAVA_RUNTIME} ${VTK_TEST_JAVA_DATAMODEL_FLAG} -classpath ${VTK_JAR_PATH}/vtk.jar${SEPARATOR}${VTK_BINARY_DIR}/Wrapping/Java vtk.test.JavaGCAndDelete -T ${VTK_TEST_OUTPUT_DIR} ) endif() endif() # Make sure .class files are cleaned up set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${VTK_JAVA_CLASS_FILES}") install(FILES ${VTK_JAR_PATH}/vtk.jar DESTINATION ${VTK_INSTALL_LIBRARY_DIR} COMPONENT RuntimeLibraries) #----------------------------------------------------------------------------- # Post-Install script for Custom Java Packaging # This install rule MUST stay at the bottom of that CMakeLists file as # it has to be the last install rule that get executed if(VTK_JAVA_INSTALL) set(MAVEN_NATIVE_ARTIFACT_XML) foreach(native_name ${MAVEN_NATIVE_ARTIFACTS}) set(MAVEN_NATIVE_ARTIFACT_XML "${MAVEN_NATIVE_ARTIFACT_XML}\n vtk-${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}-natives-${native_name}.jarnatives-${native_name}jar") endforeach() if(VTK_JAVA_JOGL_COMPONENT) set(MAVEN_DEPENDENCY_XML "${MAVEN_DEPENDENCY_XML}\n org.jogamp.jogljogl-all-main${JOGL_VERSION}\n org.jogamp.gluegengluegen-rt-main${JOGL_VERSION}") endif() configure_file(JavaInstall.cmake.in ${VTK_BINARY_DIR}/JavaInstall.cmake @ONLY) configure_file(Maven/pom.xml.in ${VTK_BINARY_DIR}/pom.xml @ONLY) configure_file(Maven/README.txt.in ${VTK_BINARY_DIR}/MAVEN-README.txt @ONLY) install(SCRIPT ${VTK_BINARY_DIR}/JavaInstall.cmake) endif()