diff --git a/CMake/UseJava.cmake b/CMake/UseJava.cmake new file mode 100644 index 0000000000000000000000000000000000000000..3723f2e0c3ae61d4383260549e072ddb28049eb1 --- /dev/null +++ b/CMake/UseJava.cmake @@ -0,0 +1,825 @@ +# - Use Module for Java +# This file provides functions for Java. It is assumed that FindJava.cmake +# has already been loaded. See FindJava.cmake for information on how to +# load Java into your CMake project. +# +# Available Functions: +# +# add_jar(TARGET_NAME SRC1 SRC2 .. SRCN RCS1 RCS2 .. RCSN) +# +# This command creates a <TARGET_NAME>.jar. It compiles the given source +# files (SRC) and adds the given resource files (RCS) to the jar file. +# If only resource files are given then just a jar file is created. +# +# Additional instructions: +# To add compile flags to the target you can set these flags with +# the following variable: +# +# set(CMAKE_JAVA_COMPILE_FLAGS -nowarn) +# +# To add a path or a jar file to the class path you can do this +# with the CMAKE_JAVA_INCLUDE_PATH variable. +# +# set(CMAKE_JAVA_INCLUDE_PATH /usr/share/java/shibboleet.jar) +# +# To use a different output name for the target you can set it with: +# +# set(CMAKE_JAVA_TARGET_OUTPUT_NAME shibboleet.jar) +# add_jar(foobar foobar.java) +# +# To add a VERSION to the target output name you can set it using +# CMAKE_JAVA_TARGET_VERSION. This will create a jar file with the name +# shibboleet-1.0.0.jar and will create a symlink shibboleet.jar +# pointing to the jar with the version information. +# +# set(CMAKE_JAVA_TARGET_VERSION 1.2.0) +# add_jar(shibboleet shibbotleet.java) +# +# If the target is a JNI library, utilize the following commands to +# create a JNI symbolic link: +# +# set(CMAKE_JNI_TARGET TRUE) +# set(CMAKE_JAVA_TARGET_VERSION 1.2.0) +# add_jar(shibboleet shibbotleet.java) +# install_jar(shibboleet ${LIB_INSTALL_DIR}/shibboleet) +# install_jni_symlink(shibboleet ${JAVA_LIB_INSTALL_DIR}) +# +# If a single target needs to produce more than one jar from its +# java source code, to prevent the accumulation of duplicate class +# files in subsequent jars, set/reset CMAKE_JAR_CLASSES_PREFIX prior +# to calling the add_jar() function: +# +# set(CMAKE_JAR_CLASSES_PREFIX com/redhat/foo) +# add_jar(foo foo.java) +# +# set(CMAKE_JAR_CLASSES_PREFIX com/redhat/bar) +# add_jar(bar bar.java) +# +# Variables set: +# The add_jar() functions sets some variables which can be used in the +# same scope where add_jar() is called. +# +# <target>_INSTALL_FILES The files which should be installed. This +# is used by install_jar(). +# <target>_JNI_SYMLINK The JNI symlink which should be +# installed. +# This is used by install_jni_symlink(). +# <target>_JAR_FILE The location of the jar file so that you +# can include it. +# <target>_CLASS_DIR The directory where the class files can +# be found. For example to use them with +# javah. +# +# find_jar( +# <VAR> +# name | NAMES name1 [name2 ...] +# [PATHS path1 [path2 ... ENV var]] +# [VERSIONS version1 [version2]] +# [DOC "cache documentation string"] +# ) +# +# This command is used to find a full path to the named jar. A cache +# entry named by <VAR> is created to stor the result of this command. If +# the full path to a jar is found the result is stored in the variable +# and the search will not repeated unless the variable is cleared. If +# nothing is found, the result will be <VAR>-NOTFOUND, and the search +# will be attempted again next time find_jar is invoked with the same +# variable. +# The name of the full path to a file that is searched for is specified +# by the names listed after NAMES argument. Additional search locations +# can be specified after the PATHS argument. If you require special a +# version of a jar file you can specify it with the VERSIONS argument. +# The argument after DOC will be used for the documentation string in +# the cache. +# +# install_jar(TARGET_NAME DESTINATION) +# +# This command installs the TARGET_NAME files to the given DESTINATION. +# It should be called in the same scope as add_jar() or it will fail. +# +# install_jni_symlink(TARGET_NAME DESTINATION) +# +# This command installs the TARGET_NAME JNI symlinks to the given +# DESTINATION. It should be called in the same scope as add_jar() +# or it will fail. +# +# create_javadoc +# +# Create jave documentation based on files or packages. For more +# details please read the javadoc manpage. +# +# There are two main signatures for create_javadoc. The first +# signature works with package names on a path with source files: +# +# create_javadoc( +# <VAR> +# PACKAGES pkg1 [pkg2 ...] +# [SOURCEPATH <sourcepath>] +# [CLASSPATH <classpath>] +# [INSTALLPATH <install path>] +# [DOCTITLE "the documentation title"] +# [WINDOWTITLE "the title of the document"] +# [AUTHOR TRUE|FALSE] +# [USE TRUE|FALSE] +# [VERSION TRUE|FALSE] +# ) +# +# Example: +# create_javadoc(my_example_doc +# PACKAGES com.exmaple.foo com.example.bar +# SOURCEPATH ${CMAKE_CURRENT_SOURCE_PATH} +# CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH} +# WINDOWTITLE "My example" +# DOCTITLE "<h1>My example</h1>" +# AUTHOR TRUE +# USE TRUE +# VERSION TRUE +# ) +# +# The second signature for create_javadoc works on a given list of +# files. +# +# create_javadoc( +# <VAR> +# FILES file1 [file2 ...] +# [CLASSPATH <classpath>] +# [INSTALLPATH <install path>] +# [DOCTITLE "the documentation title"] +# [WINDOWTITLE "the title of the document"] +# [AUTHOR TRUE|FALSE] +# [USE TRUE|FALSE] +# [VERSION TRUE|FALSE] +# ) +# +# Example: +# create_javadoc(my_example_doc +# FILES ${example_SRCS} +# CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH} +# WINDOWTITLE "My example" +# DOCTITLE "<h1>My example</h1>" +# AUTHOR TRUE +# USE TRUE +# VERSION TRUE +# ) +# +# Both signatures share most of the options. These options are the +# same as what you can find in the javadoc manpage. Please look at +# the manpage for CLASSPATH, DOCTITLE, WINDOWTITLE, AUTHOR, USE and +# VERSION. +# +# The documentation will be by default installed to +# +# ${CMAKE_INSTALL_PREFIX}/share/javadoc/<VAR> +# +# if you don't set the INSTALLPATH. +# + +#============================================================================= +# Copyright 2010-2011 Andreas schneider <asn@redhat.com> +# Copyright 2010 Ben Boeckel <ben.boeckel@kitware.com> +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +function (__java_copy_file src dest comment) + add_custom_command( + OUTPUT ${dest} + COMMAND cmake -E copy_if_different + ARGS ${src} + ${dest} + DEPENDS ${src} + COMMENT ${comment}) +endfunction (__java_copy_file src dest comment) + +# define helper scripts +set(_JAVA_CLASS_FILELIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaClassFilelist.cmake) +set(_JAVA_SYMLINK_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaSymlinks.cmake) + +function(add_jar _TARGET_NAME) + set(_JAVA_SOURCE_FILES ${ARGN}) + + if (LIBRARY_OUTPUT_PATH) + set(CMAKE_JAVA_LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}) + else (LIBRARY_OUTPUT_PATH) + set(CMAKE_JAVA_LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}) + endif (LIBRARY_OUTPUT_PATH) + + set(CMAKE_JAVA_INCLUDE_PATH + ${CMAKE_JAVA_INCLUDE_PATH} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_JAVA_OBJECT_OUTPUT_PATH} + ${CMAKE_JAVA_LIBRARY_OUTPUT_PATH} + ) + + if (WIN32 AND NOT CYGWIN) + set(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") + else (WIN32 AND NOT CYGWIN) + set(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") + endif(WIN32 AND NOT CYGWIN) + + foreach (JAVA_INCLUDE_DIR ${CMAKE_JAVA_INCLUDE_PATH}) + set(CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_PATH_FINAL}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${JAVA_INCLUDE_DIR}") + endforeach(JAVA_INCLUDE_DIR) + + set(CMAKE_JAVA_CLASS_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_TARGET_NAME}.dir") + + set(_JAVA_TARGET_OUTPUT_NAME "${_TARGET_NAME}.jar") + if (CMAKE_JAVA_TARGET_OUTPUT_NAME AND CMAKE_JAVA_TARGET_VERSION) + set(_JAVA_TARGET_OUTPUT_NAME "${CMAKE_JAVA_TARGET_OUTPUT_NAME}-${CMAKE_JAVA_TARGET_VERSION}.jar") + set(_JAVA_TARGET_OUTPUT_LINK "${CMAKE_JAVA_TARGET_OUTPUT_NAME}.jar") + elseif (CMAKE_JAVA_TARGET_VERSION) + set(_JAVA_TARGET_OUTPUT_NAME "${_TARGET_NAME}-${CMAKE_JAVA_TARGET_VERSION}.jar") + set(_JAVA_TARGET_OUTPUT_LINK "${_TARGET_NAME}.jar") + elseif (CMAKE_JAVA_TARGET_OUTPUT_NAME) + set(_JAVA_TARGET_OUTPUT_NAME "${CMAKE_JAVA_TARGET_OUTPUT_NAME}.jar") + endif (CMAKE_JAVA_TARGET_OUTPUT_NAME AND CMAKE_JAVA_TARGET_VERSION) + # reset + set(CMAKE_JAVA_TARGET_OUTPUT_NAME) + + set(_JAVA_CLASS_FILES) + set(_JAVA_COMPILE_FILES) + set(_JAVA_DEPENDS) + set(_JAVA_RESOURCE_FILES) + foreach(_JAVA_SOURCE_FILE ${_JAVA_SOURCE_FILES}) + get_filename_component(_JAVA_EXT ${_JAVA_SOURCE_FILE} EXT) + get_filename_component(_JAVA_FILE ${_JAVA_SOURCE_FILE} NAME_WE) + get_filename_component(_JAVA_PATH ${_JAVA_SOURCE_FILE} PATH) + get_filename_component(_JAVA_FULL ${_JAVA_SOURCE_FILE} ABSOLUTE) + + file(RELATIVE_PATH _JAVA_REL_BINARY_PATH ${CMAKE_CURRENT_BINARY_DIR} ${_JAVA_FULL}) + file(RELATIVE_PATH _JAVA_REL_SOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${_JAVA_FULL}) + string(LENGTH ${_JAVA_REL_BINARY_PATH} _BIN_LEN) + string(LENGTH ${_JAVA_REL_SOURCE_PATH} _SRC_LEN) + if (${_BIN_LEN} LESS ${_SRC_LEN}) + set(_JAVA_REL_PATH ${_JAVA_REL_BINARY_PATH}) + else (${_BIN_LEN} LESS ${_SRC_LEN}) + set(_JAVA_REL_PATH ${_JAVA_REL_SOURCE_PATH}) + endif (${_BIN_LEN} LESS ${_SRC_LEN}) + get_filename_component(_JAVA_REL_PATH ${_JAVA_REL_PATH} PATH) + + if (_JAVA_EXT MATCHES ".java") + list(APPEND _JAVA_COMPILE_FILES ${_JAVA_SOURCE_FILE}) + set(_JAVA_CLASS_FILE "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/${_JAVA_REL_PATH}/${_JAVA_FILE}.class") + set(_JAVA_CLASS_FILES ${_JAVA_CLASS_FILES} ${_JAVA_CLASS_FILE}) + + elseif (_JAVA_EXT MATCHES ".jar") + list(APPEND CMAKE_JAVA_INCLUDE_PATH ${_JAVA_SOURCE_FILE}) + + elseif (_JAVA_EXT STREQUAL "") + list(APPEND CMAKE_JAVA_INCLUDE_PATH ${JAVA_JAR_TARGET_${_JAVA_SOURCE_FILE}} ${JAVA_JAR_TARGET_${_JAVA_SOURCE_FILE}_CLASSPATH}) + list(APPEND _JAVA_DEPENDS ${JAVA_JAR_TARGET_${_JAVA_SOURCE_FILE}}) + + else (_JAVA_EXT MATCHES ".java") + __java_copy_file(${CMAKE_CURRENT_SOURCE_DIR}/${_JAVA_SOURCE_FILE} + ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/${_JAVA_SOURCE_FILE} + "Copying ${_JAVA_SOURCE_FILE} to the build directory") + list(APPEND _JAVA_RESOURCE_FILES ${_JAVA_SOURCE_FILE}) + endif (_JAVA_EXT MATCHES ".java") + endforeach(_JAVA_SOURCE_FILE) + + # create an empty java_class_filelist + if (NOT EXISTS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist) + file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "") + endif() + + if (_JAVA_COMPILE_FILES) + # Compile the java files and create a list of class files + add_custom_command( + # NOTE: this command generates an artificial dependency file + OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME} + COMMAND ${Java_JAVAC_EXECUTABLE} + ${CMAKE_JAVA_COMPILE_FLAGS} + -classpath "${CMAKE_JAVA_INCLUDE_PATH_FINAL}" + -d ${CMAKE_JAVA_CLASS_OUTPUT_PATH} + ${_JAVA_COMPILE_FILES} + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME} + DEPENDS ${_JAVA_COMPILE_FILES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building Java objects for ${_TARGET_NAME}.jar" + ) + add_custom_command( + OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist + COMMAND ${CMAKE_COMMAND} + -DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH} + -DCMAKE_JAR_CLASSES_PREFIX="${CMAKE_JAR_CLASSES_PREFIX}" + -P ${_JAVA_CLASS_FILELIST_SCRIPT} + DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + endif (_JAVA_COMPILE_FILES) + + # create the jar file + if (CMAKE_JNI_TARGET) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + COMMAND ${Java_JAR_EXECUTABLE} + -cf ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + ${_JAVA_RESOURCE_FILES} @java_class_filelist + COMMAND ${CMAKE_COMMAND} + -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} + -D_JAVA_TARGET_OUTPUT_NAME=${_JAVA_TARGET_OUTPUT_NAME} + -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK} + -P ${_JAVA_SYMLINK_SCRIPT} + COMMAND ${CMAKE_COMMAND} + -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} + -D_JAVA_TARGET_OUTPUT_NAME=${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK} + -P ${_JAVA_SYMLINK_SCRIPT} + DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist + WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH} + COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}" + ) + else () + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + COMMAND ${Java_JAR_EXECUTABLE} + -cf ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + ${_JAVA_RESOURCE_FILES} @java_class_filelist + COMMAND ${CMAKE_COMMAND} + -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} + -D_JAVA_TARGET_OUTPUT_NAME=${_JAVA_TARGET_OUTPUT_NAME} + -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK} + -P ${_JAVA_SYMLINK_SCRIPT} + WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH} + DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist + COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}" + ) + endif (CMAKE_JNI_TARGET) + + # Add the target and make sure we have the latest resource files. + add_custom_target(${_TARGET_NAME} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}) + + set(${_TARGET_NAME}_INSTALL_FILES + ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + PARENT_SCOPE) + if (_JAVA_TARGET_OUTPUT_LINK) + set(${_TARGET_NAME}_INSTALL_FILES + ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK} + PARENT_SCOPE) + if (CMAKE_JNI_TARGET) + set(${_TARGET_NAME}_JNI_SYMLINK + ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK} + PARENT_SCOPE) + endif (CMAKE_JNI_TARGET) + endif (_JAVA_TARGET_OUTPUT_LINK) + set(${_TARGET_NAME}_JAR_FILE + ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} PARENT_SCOPE) + set(${_TARGET_NAME}_CLASS_DIR + ${CMAKE_JAVA_CLASS_OUTPUT_PATH} + PARENT_SCOPE) +endfunction(add_jar) + +function(INSTALL_JAR _TARGET_NAME _DESTINATION) + if (${_TARGET_NAME}_INSTALL_FILES) + install( + FILES + ${${_TARGET_NAME}_INSTALL_FILES} + DESTINATION + ${_DESTINATION} + ) + else (${_TARGET_NAME}_INSTALL_FILES) + message(SEND_ERROR "The target ${_TARGET_NAME} is not known in this scope.") + endif (${_TARGET_NAME}_INSTALL_FILES) +endfunction(INSTALL_JAR _TARGET_NAME _DESTINATION) + +function(INSTALL_JNI_SYMLINK _TARGET_NAME _DESTINATION) + if (${_TARGET_NAME}_JNI_SYMLINK) + install( + FILES + ${${_TARGET_NAME}_JNI_SYMLINK} + DESTINATION + ${_DESTINATION} + ) + else (${_TARGET_NAME}_JNI_SYMLINK) + message(SEND_ERROR "The target ${_TARGET_NAME} is not known in this scope.") + endif (${_TARGET_NAME}_JNI_SYMLINK) +endfunction(INSTALL_JNI_SYMLINK _TARGET_NAME _DESTINATION) + +function (find_jar VARIABLE) + set(_jar_names) + set(_jar_files) + set(_jar_versions) + set(_jar_paths + /usr/share/java/ + /usr/local/share/java/ + ${Java_JAR_PATHS}) + set(_jar_doc "NOTSET") + + set(_state "name") + + foreach (arg ${ARGN}) + if (${_state} STREQUAL "name") + if (${arg} STREQUAL "VERSIONS") + set(_state "versions") + elseif (${arg} STREQUAL "NAMES") + set(_state "names") + elseif (${arg} STREQUAL "PATHS") + set(_state "paths") + elseif (${arg} STREQUAL "DOC") + set(_state "doc") + else (${arg} STREQUAL "NAMES") + set(_jar_names ${arg}) + if (_jar_doc STREQUAL "NOTSET") + set(_jar_doc "Finding ${arg} jar") + endif (_jar_doc STREQUAL "NOTSET") + endif (${arg} STREQUAL "VERSIONS") + elseif (${_state} STREQUAL "versions") + if (${arg} STREQUAL "NAMES") + set(_state "names") + elseif (${arg} STREQUAL "PATHS") + set(_state "paths") + elseif (${arg} STREQUAL "DOC") + set(_state "doc") + else (${arg} STREQUAL "NAMES") + set(_jar_versions ${_jar_versions} ${arg}) + endif (${arg} STREQUAL "NAMES") + elseif (${_state} STREQUAL "names") + if (${arg} STREQUAL "VERSIONS") + set(_state "versions") + elseif (${arg} STREQUAL "PATHS") + set(_state "paths") + elseif (${arg} STREQUAL "DOC") + set(_state "doc") + else (${arg} STREQUAL "VERSIONS") + set(_jar_names ${_jar_names} ${arg}) + if (_jar_doc STREQUAL "NOTSET") + set(_jar_doc "Finding ${arg} jar") + endif (_jar_doc STREQUAL "NOTSET") + endif (${arg} STREQUAL "VERSIONS") + elseif (${_state} STREQUAL "paths") + if (${arg} STREQUAL "VERSIONS") + set(_state "versions") + elseif (${arg} STREQUAL "NAMES") + set(_state "names") + elseif (${arg} STREQUAL "DOC") + set(_state "doc") + else (${arg} STREQUAL "VERSIONS") + set(_jar_paths ${_jar_paths} ${arg}) + endif (${arg} STREQUAL "VERSIONS") + elseif (${_state} STREQUAL "doc") + if (${arg} STREQUAL "VERSIONS") + set(_state "versions") + elseif (${arg} STREQUAL "NAMES") + set(_state "names") + elseif (${arg} STREQUAL "PATHS") + set(_state "paths") + else (${arg} STREQUAL "VERSIONS") + set(_jar_doc ${arg}) + endif (${arg} STREQUAL "VERSIONS") + endif (${_state} STREQUAL "name") + endforeach (arg ${ARGN}) + + if (${_jar_names} STREQUAL "") + message(FATAL_ERROR "find_jar: No name to search for given") + endif (${_jar_names} STREQUAL "") + + foreach (jar_name ${_jar_names}) + foreach (version ${_jar_versions}) + set(_jar_files ${_jar_files} ${jar_name}-${version}.jar) + endforeach (version ${_jar_versions}) + set(_jar_files ${_jar_files} ${jar_name}.jar) + endforeach (jar_name ${_jar_names}) + + find_file(${VARIABLE} + NAMES ${_jar_files} + PATHS ${_jar_paths} + DOC ${_jar_doc} + NO_DEFAULT_PATH) +endfunction (find_jar VARIABLE) + +function(create_javadoc _target) + set(_javadoc_packages) + set(_javadoc_files) + set(_javadoc_sourcepath) + set(_javadoc_classpath) + set(_javadoc_installpath "${CMAKE_INSTALL_PREFIX}/share/javadoc") + set(_javadoc_doctitle) + set(_javadoc_windowtitle) + set(_javadoc_author FALSE) + set(_javadoc_version FALSE) + set(_javadoc_use FALSE) + + set(_state "package") + + foreach (arg ${ARGN}) + if (${_state} STREQUAL "package") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_packages ${arg}) + set(_state "packages") + endif () + elseif (${_state} STREQUAL "packages") + if (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + list(APPEND _javadoc_packages ${arg}) + endif () + elseif (${_state} STREQUAL "files") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + list(APPEND _javadoc_files ${arg}) + endif () + elseif (${_state} STREQUAL "sourcepath") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + list(APPEND _javadoc_sourcepath ${arg}) + endif () + elseif (${_state} STREQUAL "classpath") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + list(APPEND _javadoc_classpath ${arg}) + endif () + elseif (${_state} STREQUAL "installpath") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_installpath ${arg}) + endif () + elseif (${_state} STREQUAL "doctitle") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_doctitle ${arg}) + endif () + elseif (${_state} STREQUAL "windowtitle") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_windowtitle ${arg}) + endif () + elseif (${_state} STREQUAL "author") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_author ${arg}) + endif () + elseif (${_state} STREQUAL "use") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_use ${arg}) + endif () + elseif (${_state} STREQUAL "version") + if (${arg} STREQUAL "PACKAGES") + set(_state "packages") + elseif (${arg} STREQUAL "FILES") + set(_state "files") + elseif (${arg} STREQUAL "SOURCEPATH") + set(_state "sourcepath") + elseif (${arg} STREQUAL "CLASSPATH") + set(_state "classpath") + elseif (${arg} STREQUAL "INSTALLPATH") + set(_state "installpath") + elseif (${arg} STREQUAL "DOCTITLE") + set(_state "doctitle") + elseif (${arg} STREQUAL "WINDOWTITLE") + set(_state "windowtitle") + elseif (${arg} STREQUAL "AUTHOR") + set(_state "author") + elseif (${arg} STREQUAL "USE") + set(_state "use") + elseif (${arg} STREQUAL "VERSION") + set(_state "version") + else () + set(_javadoc_version ${arg}) + endif () + endif (${_state} STREQUAL "package") + endforeach (arg ${ARGN}) + + set(_javadoc_builddir ${CMAKE_CURRENT_BINARY_DIR}/javadoc/${_target}) + set(_javadoc_options -d ${_javadoc_builddir}) + + if (_javadoc_sourcepath) + set(_start TRUE) + foreach(_path ${_javadoc_sourcepath}) + if (_start) + set(_sourcepath ${_path}) + set(_start FALSE) + else (_start) + set(_sourcepath ${_sourcepath}:${_path}) + endif (_start) + endforeach(_path ${_javadoc_sourcepath}) + set(_javadoc_options ${_javadoc_options} -sourcepath ${_sourcepath}) + endif (_javadoc_sourcepath) + + if (_javadoc_classpath) + set(_start TRUE) + foreach(_path ${_javadoc_classpath}) + if (_start) + set(_classpath ${_path}) + set(_start FALSE) + else (_start) + set(_classpath ${_classpath}:${_path}) + endif (_start) + endforeach(_path ${_javadoc_classpath}) + set(_javadoc_options ${_javadoc_options} -classpath "${_classpath}") + endif (_javadoc_classpath) + + if (_javadoc_doctitle) + set(_javadoc_options ${_javadoc_options} -doctitle '${_javadoc_doctitle}') + endif (_javadoc_doctitle) + + if (_javadoc_windowtitle) + set(_javadoc_options ${_javadoc_options} -windowtitle '${_javadoc_windowtitle}') + endif (_javadoc_windowtitle) + + if (_javadoc_author) + set(_javadoc_options ${_javadoc_options} -author) + endif (_javadoc_author) + + if (_javadoc_use) + set(_javadoc_options ${_javadoc_options} -use) + endif (_javadoc_use) + + if (_javadoc_version) + set(_javadoc_options ${_javadoc_options} -version) + endif (_javadoc_version) + + add_custom_target(${_target}_javadoc ALL + COMMAND ${Java_JAVADOC_EXECUTABLE} ${_javadoc_options} + ${_javadoc_files} + ${_javadoc_packages} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + + install( + DIRECTORY ${_javadoc_builddir} + DESTINATION ${_javadoc_installpath} + ) +endfunction(create_javadoc) diff --git a/CMake/UseJavaClassFilelist.cmake b/CMake/UseJavaClassFilelist.cmake new file mode 100644 index 0000000000000000000000000000000000000000..c842bf71a4e4ea1e215d7e42212465570551f689 --- /dev/null +++ b/CMake/UseJavaClassFilelist.cmake @@ -0,0 +1,52 @@ +# +# This script create a list of compiled Java class files to be added to a +# jar file. This avoids including cmake files which get created in the +# binary directory. +# + +#============================================================================= +# Copyright 2010-2011 Andreas schneider <asn@redhat.com> +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +if (CMAKE_JAVA_CLASS_OUTPUT_PATH) + if (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}") + + set(_JAVA_GLOBBED_FILES) + if (CMAKE_JAR_CLASSES_PREFIX) + foreach(JAR_CLASS_PREFIX ${CMAKE_JAR_CLASSES_PREFIX}) + message(STATUS "JAR_CLASS_PREFIX: ${JAR_CLASS_PREFIX}") + + file(GLOB_RECURSE _JAVA_GLOBBED_TMP_FILES "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/${JAR_CLASS_PREFIX}/*.class") + if (_JAVA_GLOBBED_TMP_FILES) + list(APPEND _JAVA_GLOBBED_FILES ${_JAVA_GLOBBED_TMP_FILES}) + endif (_JAVA_GLOBBED_TMP_FILES) + endforeach(JAR_CLASS_PREFIX ${CMAKE_JAR_CLASSES_PREFIX}) + else() + file(GLOB_RECURSE _JAVA_GLOBBED_FILES "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/*.class") + endif (CMAKE_JAR_CLASSES_PREFIX) + + set(_JAVA_CLASS_FILES) + # file(GLOB_RECURSE foo RELATIVE) is broken so we need this. + foreach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES}) + file(RELATIVE_PATH _JAVA_CLASS_FILE ${CMAKE_JAVA_CLASS_OUTPUT_PATH} ${_JAVA_GLOBBED_FILE}) + set(_JAVA_CLASS_FILES ${_JAVA_CLASS_FILES}${_JAVA_CLASS_FILE}\n) + endforeach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES}) + + # write to file + file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist ${_JAVA_CLASS_FILES}) + + else (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}") + message(SEND_ERROR "FATAL: Java class output path doesn't exist") + endif (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}") +else (CMAKE_JAVA_CLASS_OUTPUT_PATH) + message(SEND_ERROR "FATAL: Can't find CMAKE_JAVA_CLASS_OUTPUT_PATH") +endif (CMAKE_JAVA_CLASS_OUTPUT_PATH) diff --git a/CMake/UseJavaSymlinks.cmake b/CMake/UseJavaSymlinks.cmake new file mode 100644 index 0000000000000000000000000000000000000000..c66ee1ea1911cfa7b7483efc3c2400a369c60ff2 --- /dev/null +++ b/CMake/UseJavaSymlinks.cmake @@ -0,0 +1,32 @@ +# +# Helper script for UseJava.cmake +# + +#============================================================================= +# Copyright 2010-2011 Andreas schneider <asn@redhat.com> +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +if (UNIX AND _JAVA_TARGET_OUTPUT_LINK) + if (_JAVA_TARGET_OUTPUT_NAME) + find_program(LN_EXECUTABLE + NAMES + ln + ) + + execute_process( + COMMAND ${LN_EXECUTABLE} -sf "${_JAVA_TARGET_OUTPUT_NAME}" "${_JAVA_TARGET_OUTPUT_LINK}" + WORKING_DIRECTORY ${_JAVA_TARGET_DIR} + ) + else (_JAVA_TARGET_OUTPUT_NAME) + message(SEND_ERROR "FATAL: Can't find _JAVA_TARGET_OUTPUT_NAME") + endif (_JAVA_TARGET_OUTPUT_NAME) +endif (UNIX AND _JAVA_TARGET_OUTPUT_LINK) diff --git a/CMake/UseSWIGLocal.cmake b/CMake/UseSWIGLocal.cmake new file mode 100644 index 0000000000000000000000000000000000000000..98bcc995113d1460b64e83624a264987a7ae56a0 --- /dev/null +++ b/CMake/UseSWIGLocal.cmake @@ -0,0 +1,266 @@ +# - SWIG module for CMake +# Defines the following macros: +# SWIG_ADD_MODULE(name language [ files ]) +# - Define swig module with given name and specified language +# SWIG_LINK_LIBRARIES(name [ libraries ]) +# - Link libraries to swig module +# All other macros are for internal use only. +# To get the actual name of the swig module, +# use: ${SWIG_MODULE_${name}_REAL_NAME}. +# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify +# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add +# special flags to all swig calls. +# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify +# where to write all the swig generated module (swig -outdir option) +# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used +# to specify extra dependencies for the generated modules. +# If the source file generated by swig need some special flag you can use +# SET_SOURCE_FILES_PROPERTIES( ${swig_generated_file_fullname} +# PROPERTIES COMPILE_FLAGS "-bla") + + +#============================================================================= +# Copyright 2004-2009 Kitware, Inc. +# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com> +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +SET(SWIG_CXX_EXTENSION "cxx") +SET(SWIG_EXTRA_LIBRARIES "") + +SET(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py") + +# +# For given swig module initialize variables associated with it +# +MACRO(SWIG_MODULE_INITIALIZE name language) + STRING(TOUPPER "${language}" swig_uppercase_language) + STRING(TOLOWER "${language}" swig_lowercase_language) + SET(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}") + SET(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}") + + IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xUNKNOWNx$") + MESSAGE(FATAL_ERROR "SWIG Error: Language \"${language}\" not found") + ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xUNKNOWNx$") + + SET(SWIG_MODULE_${name}_REAL_NAME "${name}") + IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPYTHONx$") + # when swig is used without the -interface it will produce in the module.py + # a 'import _modulename' statement, which implies having a corresponding + # _modulename.so (*NIX), _modulename.pyd (Win32). + SET(SWIG_MODULE_${name}_REAL_NAME "_${name}") + ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPYTHONx$") + IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xRUBYx$") + STRING(TOLOWER "${name}" ruby_module_name) + SET(SWIG_MODULE_${name}_REAL_NAME "${ruby_module_name}") + ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xRUBYx$") + IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPERLx$") + SET(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow") + ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPERLx$") +ENDMACRO(SWIG_MODULE_INITIALIZE) + +# +# For a given language, input file, and output file, determine extra files that +# will be generated. This is internal swig macro. +# + +MACRO(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile) + GET_SOURCE_FILE_PROPERTY(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename + ${infile} SWIG_MODULE_NAME) + IF(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND") + GET_FILENAME_COMPONENT(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE) + ENDIF(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND") + FOREACH(it ${SWIG_${language}_EXTRA_FILE_EXTENSION}) + SET(${outfiles} ${${outfiles}} + "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}") + ENDFOREACH(it) +ENDMACRO(SWIG_GET_EXTRA_OUTPUT_FILES) + +# +# Take swig (*.i) file and add proper custom commands for it +# +MACRO(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile) + SET(swig_full_infile ${infile}) + GET_FILENAME_COMPONENT(swig_source_file_path "${infile}" PATH) + GET_FILENAME_COMPONENT(swig_source_file_name_we "${infile}" NAME_WE) + GET_SOURCE_FILE_PROPERTY(swig_source_file_generated ${infile} GENERATED) + GET_SOURCE_FILE_PROPERTY(swig_source_file_cplusplus ${infile} CPLUSPLUS) + GET_SOURCE_FILE_PROPERTY(swig_source_file_flags ${infile} SWIG_FLAGS) + IF("${swig_source_file_flags}" STREQUAL "NOTFOUND") + SET(swig_source_file_flags "") + ENDIF("${swig_source_file_flags}" STREQUAL "NOTFOUND") + SET(swig_source_file_fullname "${infile}") + IF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}") + STRING(REGEX REPLACE + "^${CMAKE_CURRENT_SOURCE_DIR}" "" + swig_source_file_relative_path + "${swig_source_file_path}") + ELSE(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}") + IF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}") + STRING(REGEX REPLACE + "^${CMAKE_CURRENT_BINARY_DIR}" "" + swig_source_file_relative_path + "${swig_source_file_path}") + SET(swig_source_file_generated 1) + ELSE(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}") + SET(swig_source_file_relative_path "${swig_source_file_path}") + IF(swig_source_file_generated) + SET(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}") + ELSE(swig_source_file_generated) + SET(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}") + ENDIF(swig_source_file_generated) + ENDIF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}") + ENDIF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}") + + SET(swig_generated_file_fullname + "${CMAKE_CURRENT_BINARY_DIR}") + IF(swig_source_file_relative_path) + SET(swig_generated_file_fullname + "${swig_generated_file_fullname}/${swig_source_file_relative_path}") + ENDIF(swig_source_file_relative_path) + # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir + IF(CMAKE_SWIG_OUTDIR) + SET(swig_outdir ${CMAKE_SWIG_OUTDIR}) + # it may not exist, so create it: + file(MAKE_DIRECTORY ${CMAKE_SWIG_OUTDIR}) + ELSE(CMAKE_SWIG_OUTDIR) + SET(swig_outdir ${CMAKE_CURRENT_BINARY_DIR}) + ENDIF(CMAKE_SWIG_OUTDIR) + SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE} + swig_extra_generated_files + "${swig_outdir}" + "${infile}") + SET(swig_generated_file_fullname + "${swig_generated_file_fullname}/${swig_source_file_name_we}") + # add the language into the name of the file (i.e. TCL_wrap) + # this allows for the same .i file to be wrapped into different languages + SET(swig_generated_file_fullname + "${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap") + + IF(swig_source_file_cplusplus) + SET(swig_generated_file_fullname + "${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}") + ELSE(swig_source_file_cplusplus) + SET(swig_generated_file_fullname + "${swig_generated_file_fullname}.c") + ENDIF(swig_source_file_cplusplus) + + #MESSAGE("Full path to source file: ${swig_source_file_fullname}") + #MESSAGE("Full path to the output file: ${swig_generated_file_fullname}") + GET_DIRECTORY_PROPERTY(cmake_include_directories INCLUDE_DIRECTORIES) + SET(swig_include_dirs) + FOREACH(it ${cmake_include_directories}) + SET(swig_include_dirs ${swig_include_dirs} "-I${it}") + ENDFOREACH(it) + + SET(swig_special_flags) + # default is c, so add c++ flag if it is c++ + IF(swig_source_file_cplusplus) + SET(swig_special_flags ${swig_special_flags} "-c++") + ENDIF(swig_source_file_cplusplus) + SET(swig_extra_flags) + IF(SWIG_MODULE_${name}_EXTRA_FLAGS) + SET(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS}) + ENDIF(SWIG_MODULE_${name}_EXTRA_FLAGS) + ADD_CUSTOM_COMMAND( + OUTPUT "${swig_generated_file_fullname}" ${swig_extra_generated_files} + COMMAND "${SWIG_EXECUTABLE}" + ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}" + ${swig_source_file_flags} + ${CMAKE_SWIG_FLAGS} + -outdir ${swig_outdir} + ${swig_special_flags} + ${swig_extra_flags} + ${swig_include_dirs} + -o "${swig_generated_file_fullname}" + "${swig_source_file_fullname}" + MAIN_DEPENDENCY "${swig_source_file_fullname}" + DEPENDS ${SWIG_MODULE_${name}_EXTRA_DEPS} + COMMENT "Swig source to generate ${SWIG_MODULE_${name}_LANGUAGE} wrapping") + SET_SOURCE_FILES_PROPERTIES("${swig_generated_file_fullname}" ${swig_extra_generated_files} + PROPERTIES GENERATED 1) + SET(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files}) +ENDMACRO(SWIG_ADD_SOURCE_TO_MODULE) + +# +# Create Swig module +# +MACRO(SWIG_ADD_MODULE name language) + SWIG_MODULE_INITIALIZE(${name} ${language}) + SET(swig_dot_i_sources) + SET(swig_other_sources) + FOREACH(it ${ARGN}) + IF(${it} MATCHES ".*\\.i$") + SET(swig_dot_i_sources ${swig_dot_i_sources} "${it}") + ELSE(${it} MATCHES ".*\\.i$") + SET(swig_other_sources ${swig_other_sources} "${it}") + ENDIF(${it} MATCHES ".*\\.i$") + ENDFOREACH(it) + + SET(swig_generated_sources) + FOREACH(it ${swig_dot_i_sources}) + SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it}) + SET(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}") + ENDFOREACH(it) + GET_DIRECTORY_PROPERTY(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES) + SET_DIRECTORY_PROPERTIES(PROPERTIES + ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}") + ADD_LIBRARY(${SWIG_MODULE_${name}_REAL_NAME} + MODULE + ${swig_generated_sources} + ${swig_other_sources}) + STRING(TOLOWER "${language}" swig_lowercase_language) + IF ("${swig_lowercase_language}" STREQUAL "java") + IF (APPLE) + # In java you want: + # System.loadLibrary("LIBRARY"); + # then JNI will look for a library whose name is platform dependent, namely + # MacOS : libLIBRARY.jnilib + # Windows: LIBRARY.dll + # Linux : libLIBRARY.so + SET_TARGET_PROPERTIES (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib") + ENDIF (APPLE) + ENDIF ("${swig_lowercase_language}" STREQUAL "java") + IF ("${swig_lowercase_language}" STREQUAL "python") + # this is only needed for the python case where a _modulename.so is generated + SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "") + # Python extension modules on Windows must have the extension ".pyd" + # instead of ".dll" as of Python 2.5. Older python versions do support + # this suffix. + # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000 + # <quote> + # Windows: .dll is no longer supported as a filename extension for extension modules. + # .pyd is now the only filename extension that will be searched for. + # </quote> + IF(WIN32 AND NOT CYGWIN) + SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd") + ENDIF(WIN32 AND NOT CYGWIN) + ENDIF ("${swig_lowercase_language}" STREQUAL "python") + IF ("${swig_lowercase_language}" STREQUAL "ruby") + SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "") + IF(APPLE) + SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".bundle") + SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES COMPILE_FLAGS "-bundle") + ENDIF(APPLE) + ENDIF ("${swig_lowercase_language}" STREQUAL "ruby") +ENDMACRO(SWIG_ADD_MODULE) + +# +# Like TARGET_LINK_LIBRARIES but for swig modules +# +MACRO(SWIG_LINK_LIBRARIES name) + IF(SWIG_MODULE_${name}_REAL_NAME) + TARGET_LINK_LIBRARIES(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN}) + ELSE(SWIG_MODULE_${name}_REAL_NAME) + MESSAGE(SEND_ERROR "Cannot find Swig library \"${name}\".") + ENDIF(SWIG_MODULE_${name}_REAL_NAME) +ENDMACRO(SWIG_LINK_LIBRARIES name) + diff --git a/CMakeLists.txt b/CMakeLists.txt index 43286e412c22e54f424af5ac7c575aa333ee8836..c5760673c1fb31cc47cdf70b02a719d60a09d415 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,9 @@ MARK_AS_ADVANCED(TCL_TCLSH DART_ROOT) IF(BUILD_TESTING) ENABLE_TESTING() + # configure the test driver + FIND_PROGRAM(OTB_TEST_DRIVER otbTestDriver PATHS ${OTB_DIR}/bin ${OTB_DIR}/../../bin DOC "Path to the otbTestDriver executable from OTB") + FIND_PATH(OTB_DATA_ROOT README-OTB-Data PATHS $ENV{OTB_DATA_ROOT} ${OTB_SOURCE_DIR}/../OTB-Data) MARK_AS_ADVANCED(OTB_DATA_ROOT) diff --git a/Code/Wrappers/SWIG/CMakeLists.txt b/Code/Wrappers/SWIG/CMakeLists.txt index 43ba3f73c748ccc017dfaee002ce0abfc176668e..e8f39712929e5d49678f56d5c4a830ebb523a9fe 100644 --- a/Code/Wrappers/SWIG/CMakeLists.txt +++ b/Code/Wrappers/SWIG/CMakeLists.txt @@ -1,15 +1,196 @@ -INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -SET(CMAKE_SWIG_FLAGS "") +macro(check_PIC_flag Language) + if ( UNIX AND NOT APPLE ) + if ( NOT ${CMAKE_CXX_FLAGS} MATCHES "-fPIC") + message ( FATAL_ERROR "${Language} wrapping requires CMAKE_CXX_FLAGS (or equivalent) to include -fPIC and ITK built with this flag" ) + endif() + endif() +endmacro() -FILE(GLOB swigfiles "*.i") -FOREACH(swigfile ${swigfiles}) - SET_SOURCE_FILES_PROPERTIES(${swigfile} PROPERTIES CPLUSPLUS ON) - SET_SOURCE_FILES_PROPERTIES(${swigfile} PROPERTIES SWIG_FLAGS "-includeall") -ENDFOREACH(swigfile ${swigfiles}) -set(SWIG_MODULE_otbApplication_EXTRA_DEPS itkBase.i itkMacro.i RefCountMacro.i) +# +# Setup the option for each laguage +# +option ( WRAP_LUA "Wrap Lua" OFF ) + + +find_package ( PythonLibs ) +find_package ( PythonInterp ) +if ( PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND ) + set( WRAP_PYTHON_DEFAULT ON ) +else ( PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND ) + set( WRAP_PYTHON_DEFAULT OFF ) +endif ( PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND ) +check_PIC_flag ( Python ) +option( WRAP_PYTHON "Wrap Python" ${WRAP_PYTHON_DEFAULT} ) + +find_package ( Java COMPONENTS Development Runtime) +find_package ( JNI ) +if ( JAVA_FOUND AND JNI_FOUND ) + set( WRAP_JAVA_DEFAULT ON ) +else ( ${JAVA_FOUND} AND JNI_FOUND ) + set( WRAP_JAVA_DEFAULT OFF ) +endif ( JAVA_FOUND AND JNI_FOUND ) +check_PIC_flag ( Java ) +option ( WRAP_JAVA "Wrap Java" ${WRAP_JAVA_DEFAULT} ) + +find_package ( TCL ) +if ( TCL_FOUND ) + set ( WRAP_TCL_DEFAULT ON ) +else ( TCL_FOUND ) + set ( WRAP_TCL_DEFAULT OFF ) +endif ( TCL_FOUND ) +#option ( WRAP_TCL "Wrap Tcl" ${WRAP_TCL_DEFAULT} ) +option ( WRAP_TCL "Wrap Tcl" OFF ) + +find_package ( Ruby ) +if ( RUBY_FOUND ) + set ( WRAP_RUBY_DEFAULT ON ) +else ( RUBY_FOUND ) + set ( WRAP_RUBY_DEFAULT OFF ) +endif ( RUBY_FOUND ) +check_PIC_flag ( Ruby ) +#option ( WRAP_RUBY "Wrap Ruby" ${WRAP_RUBY_DEFAULT} ) +option ( WRAP_RUBY "Wrap Ruby" OFF ) + +# +# General SWIG configuration +# +if ( WRAP_LUA OR WRAP_PYTHON OR WRAP_JAVA OR WRAP_CSHARP OR WRAP_TCL OR WRAP_R OR WRAP_RUBY ) + find_package ( SWIG 2 REQUIRED ) + include ( UseSWIGLocal ) + set_source_files_properties ( otbApplication.i PROPERTIES CPLUSPLUS ON ) + file ( GLOB SWIG_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*/*.h) + + set ( SWIG_HEADERS ${SWIG_HEADERS} + ${CMAKE_CURRENT_SOURCE_DIR}/itkBase.i + ${CMAKE_CURRENT_SOURCE_DIR}/itkMacro.i + ${CMAKE_CURRENT_SOURCE_DIR}/RefCountMacro.i + + ${CMAKE_CURRENT_SOURCE_DIR}/Python.i + ${CMAKE_CURRENT_SOURCE_DIR}/Java.i +# ${CMAKE_CURRENT_SOURCE_DIR}/CSharp.i +# ${CMAKE_CURRENT_SOURCE_DIR}/CSharpTypemapHelper.i +# ${CMAKE_CURRENT_SOURCE_DIR}/Lua.i +# ${CMAKE_CURRENT_SOURCE_DIR}/Tcl.i + ) + + set ( SWIG_MODULE_otbApplication_EXTRA_DEPS ${SWIG_HEADERS} ) + + include_directories ( ${CMAKE_CURRENT_SOURCE_DIR} ) + +endif() + +# +# python SWIG configuration +# +if ( WRAP_PYTHON ) + find_package ( PythonLibs REQUIRED ) + find_package ( PythonInterp REQUIRED ) + include_directories ( ${PYTHON_INCLUDE_DIR} ) + + # Run swig + set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_GLOBAL_FLAGS}) + set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}) + set(SWIG_MODULE_otbApplication_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS}) + SWIG_add_module ( otbApplication python otbApplication.i otbApplicationPYTHON_wrap.cxx ) + SWIG_link_libraries ( otbApplication ${PYTHON_LIBRARIES} OTBWrapperCore) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "-w") + +endif() + +# +# JAVA SWIG configuration +# +if ( WRAP_JAVA ) + find_package ( Java REQUIRED ) + find_package ( JNI REQUIRED ) + include_directories ( ${JAVA_INCLUDE_PATH} ${JNI_INCLUDE_DIRS} ) + + # Make sure the nested directory structure exists + set(JAVA_SOURCE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/org/otb/application) + set(JAVA_BINARY_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/build) + file(MAKE_DIRECTORY ${JAVA_SOURCE_DIRECTORY}) + file(MAKE_DIRECTORY ${JAVA_BINARY_DIRECTORY}) + + # Nicely write the bridge code in org/itk/simple + set(CMAKE_SWIG_OUTDIR ${JAVA_SOURCE_DIRECTORY}) + set(CMAKE_SWIG_FLAGS -package "org.otb.application" ${CMAKE_SWIG_GLOBAL_FLAGS}) + set(SWIG_MODULE_otbApplicationJava_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS}) + SWIG_add_module ( otbApplicationJava java otbApplication.i otbApplicationJAVA_wrap.cxx) + SWIG_link_libraries(otbApplicationJava OTBWrapperCore) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationJAVA_wrap.cxx COMPILE_FLAGS "-w") + + # Add target for org.otb.Application.jar + add_custom_target(org_otb_Application_jar ALL DEPENDS org.otb.application.jar) + + # Add custom command and target to compile the generated files and put them in a jar file + # Make sure the commands depend on the output library from SWIG + add_custom_command( + OUTPUT org.otb.application.jar + COMMENT "Creating jar file..." + COMMAND ${Java_JAVAC_EXECUTABLE} -d ${JAVA_BINARY_DIRECTORY} ${JAVA_SOURCE_DIRECTORY}/*.java + COMMAND ${Java_JAR_EXECUTABLE} cf ${CMAKE_CURRENT_BINARY_DIR}/org.otb.application.jar -C ${JAVA_BINARY_DIRECTORY} org + DEPENDS ${SWIG_MODULE_otbApplication_REAL_NAME} otbApplicationJava OTBWrapperCore + ) + + # Get the location of the extension directory + string(REGEX REPLACE "include" "jre/lib/ext" JAVA_EXTENSION_DIR ${JAVA_INCLUDE_PATH} ) + + # Add the install target + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.otb.application.jar DESTINATION ${JAVA_EXTENSION_DIR}) + +endif() + +# +# lua SWIG configuration +# +if ( WRAP_LUA ) + option ( USE_SYSTEM_LUA "Use a system provided lua" OFF ) + + if ( USE_SYSTEM_LUA ) + find_package ( Lua51 REQUIRED ) + include_directories ( ${LUA_INCLUDE_DIR} ) + set ( LUA_LIB ${LUA_LIBRARIES} ) + else() + set ( LUA_LIB lua5 ) + include_directories ( ${otbApplication_SOURCE_DIR}/Utilities/lua-5.1.4/src ) + endif() + + + # Run swig + set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_GLOBAL_FLAGS}) + set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}) + set(SWIG_MODULE_otbApplicationLua_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS}) + SWIG_module_initialize ( otbApplicationLua lua ) + SWIG_add_source_to_module ( otbApplicationLua swig_generated_source otbApplication.i ${SWIG_HEADERS} ) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationLUA_wrap.cxx COMPILE_FLAGS "-w") + + add_executable ( otbApplicationLua otbApplicationLuaMain.cxx otbApplicationLUA_wrap.cxx ) + target_link_libraries ( otbApplicationLua ${LUA_LIB} OTBWrapperCore ) + + if ( UNIX ) + target_link_libraries ( otbApplicationLua curses ) + endif() + +endif() + +# +# ruby SWIG configuration +# +if ( WRAP_RUBY ) + find_package ( Ruby REQUIRED ) + include_directories ( ${RUBY_INCLUDE_DIRS} ) + + # Run swig + set(CMAKE_SWIG_FLAGS -autorename -module otbApplication ${CMAKE_SWIG_GLOBAL_FLAGS}) + set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}) + set(SWIG_MODULE_otbApplication_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS}) + SWIG_MODULE_INITIALIZE ( otbApplication ruby ) + + SWIG_add_module ( otbApplication ruby otbApplication.i otbApplicationRUBY_wrap.cxx ) + SWIG_link_libraries ( otbApplication ${RUBY_LIBRARY} OTBWrapperCore) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationRUBY_wrap.cxx COMPILE_FLAGS "-w") + +endif() -SWIG_ADD_MODULE(otbApplication python otbApplication.i ) -SWIG_LINK_LIBRARIES(otbApplication ${PYTHON_LIBRARIES} OTBWrapperCore) diff --git a/Code/Wrappers/SWIG/Java.i b/Code/Wrappers/SWIG/Java.i new file mode 100644 index 0000000000000000000000000000000000000000..aaef5aeea4a9ed0cee05eb7ee090491d174baf55 --- /dev/null +++ b/Code/Wrappers/SWIG/Java.i @@ -0,0 +1,125 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#if SWIGJAVA + +%ignore CreateAnother; +%ignore Delete; +%ignore Register; +%ignore UnRegister; +%ignore GetReferenceCount; +%ignore SetReferenceCount; +%ignore DebugOn; +%ignore DebugOff; +%ignore GetDebug; +%ignore SetDebug; +%ignore GetMTime; +%ignore Modified; +%ignore SetGlobalWarningDisplay; +%ignore GetGlobalWarningDisplay; +%ignore GlobalWarningDisplayOn; +%ignore GlobalWarningDisplayOff; + +%ignore New; + + +//###################################################################### +// Simulating smart pointers in SWIG +// This gets rid of wrapping ITK smart pointers. + +// TODO: always tell swig we're the owner +// TODO: itk classes with no New() must be marked as abstract +%define DECLARE_REF_COUNT_CLASS(itkClass) + + class itkClass##_Pointer + { + public: + itkClass##_Pointer(); + itkClass##_Pointer(itkClass##_Pointer const & p); + itkClass##_Pointer(itkClass * p); + ~itkClass##_Pointer(); + itkClass * operator->() const; + bool IsNotNull() const; + bool IsNull() const; + itkClass * GetPointer() const; + bool operator<(itkClass##_Pointer const & r) const; + bool operator>(itkClass##_Pointer const & r) const; + bool operator<=(itkClass##_Pointer const & r) const; + bool operator>=(itkClass##_Pointer const & r) const; + itkClass##_Pointer & operator=(itkClass##_Pointer const & r); + itkClass##_Pointer & operator=(itkClass## * r); +// itkClass * Print(std::ostream & os) const; + private: + void Register(); + void UnRegister(); + protected: + }; + + + // Extend the itk classtype defined for wrapping to simulate a smart pointer in SWIG. + // Also, make the ctor public to make the 'new' operator available in java + %extend itkClass { + public: + itkClass() { + typedef ::itk::SmartPointer<itkLightObject> Pointer; + Pointer smtPtr = itkClass::New().GetPointer(); + itkClass *rawPtr = dynamic_cast<itkClass *>(smtPtr.GetPointer()); + rawPtr->Register(); + return rawPtr; + }; + ~itkClass() { + self->UnRegister(); + }; + } +/* + %typemap(out) itkClass * { + itkClass* ptrRaw = $1; + if (ptrRaw) { + ptrRaw->Register(); + } + *(itkClass **)&$result = ptrRaw; + } +*/ + %typemap(out) itkClass##_Pointer { + itkClass* ptrRaw = $1.GetPointer(); + if (ptrRaw) { + ptrRaw->Register(); + } + *(itkClass **)&$result = ptrRaw; + } + + %typemap(out) itkClass##_Pointer & { + itkClass* ptrRaw = (*$1).GetPointer(); + if (ptrRaw) { + ptrRaw->Register(); + } + *(itkClass **)&$result = ptrRaw; + } + + // Do not wrap the corresponding itkSmartPointer + %ignore itkClass##_Pointer; + +%enddef + +%pragma(java) jniclasscode=%{ + static { + System.loadLibrary ( "otbApplicationJava" ); + } +%} + + +#endif diff --git a/Code/Wrappers/SWIG/Python.i b/Code/Wrappers/SWIG/Python.i index 7f06fbee1c39372473064a85b2a85ba2c6c559d3..ae718b0b46a72a6e29c62e729b5f6802e55895ed 100644 --- a/Code/Wrappers/SWIG/Python.i +++ b/Code/Wrappers/SWIG/Python.i @@ -1,5 +1,117 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ #if SWIGPYTHON +%ignore CreateAnother; +%ignore Delete; +%ignore Register; +%ignore UnRegister; +%ignore GetReferenceCount; +%ignore SetReferenceCount; +%ignore DebugOn; +%ignore DebugOff; +%ignore GetDebug; +%ignore SetDebug; +%ignore GetMTime; +%ignore Modified; +%ignore SetGlobalWarningDisplay; +%ignore GetGlobalWarningDisplay; +%ignore GlobalWarningDisplayOn; +%ignore GlobalWarningDisplayOff; + + + +// This macro replaces the use of itk::SmartPointer. +// class_name is class name without namespace qualifiers. +// Reference: http://www.nabble.com/attachment/16653644/0/SwigRefCount.i +%define DECLARE_REF_COUNT_CLASS(class_name) + + class class_name##_Pointer + { + public: + class_name##_Pointer(); + class_name##_Pointer(class_name##_Pointer const & p); + class_name##_Pointer(class_name * p); + ~class_name##_Pointer(); + class_name * operator->() const; + bool IsNotNull() const; + bool IsNull() const; + class_name * GetPointer() const; + bool operator<(class_name##_Pointer const & r) const; + bool operator>(class_name##_Pointer const & r) const; + bool operator<=(class_name##_Pointer const & r) const; + bool operator>=(class_name##_Pointer const & r) const; + class_name##_Pointer & operator=(class_name##_Pointer const & r); + class_name##_Pointer & operator=(class_name## * r); +// class_name * Print(std::ostream & os) const; + private: + void Register(); + void UnRegister(); + protected: + }; + + // pointers and references + %typemap(out) class_name *, class_name & { + // always tell SWIG_NewPointerObj we're the owner + $result = SWIG_NewPointerObj((void *) $1, $1_descriptor, 1); + if ($1) { + $1->Register(); + } + } + + // transform smart pointers in raw pointers + %typemap(out) class_name##_Pointer { + // get the raw pointer from the smart pointer + class_name * ptr = $1; + // always tell SWIG_NewPointerObj we're the owner + $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1); + // register the object, it it exists + if (ptr) { + ptr->Register(); + } + } + + // transform smart pointers in raw pointers + %typemap(out) class_name##_Pointer & { + // get the raw pointer from the smart pointer + class_name * ptr = *$1; + // always tell SWIG_NewPointerObj we're the owner + $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1); + // register the object, it it exists + if (ptr) { + ptr->Register(); + } + } + + %extend class_name { + public: + + // make "deletion" in scripting language just decrement ref. count + ~class_name() {self->UnRegister();}; + + } + + %ignore class_name::~class_name; + + %ignore class_name##_Pointer; + +%enddef + %typemap(out) unsigned char &, const unsigned char &, signed char &, const signed char &, unsigned short &, const unsigned short &, signed short &, const signed short &, unsigned int &, const unsigned int &, signed int &, const signed int &, signed long &, const signed long &, unsigned long &, const unsigned long & {$result = PyInt_FromLong( *$1 );} @@ -19,12 +131,23 @@ PyList_SetItem( $result, i, PyString_FromString( it->c_str() ) ); } } - -%extend itkLightObject { - %pythoncode %{ - def __str__( self ): - return self.ToString() - %} -} + // Add a ToString shortcut to all itkLightObject + // This will make it easier for string conversion in target languages + %extend itkLightObject { + public: + std::string ToString() { + std::ostringstream o; + self->Print(o); + return o.str(); + } + } + + %extend itkLightObject { + %pythoncode %{ + def __str__( self ): + return self.ToString() + %} + } + #endif diff --git a/Code/Wrappers/SWIG/RefCountMacro.i b/Code/Wrappers/SWIG/RefCountMacro.i index d25cee40569bf8bc5acf1365822a0a7856548d1b..741058d37e8257fda2a0f1f99324a36053dde938 100644 --- a/Code/Wrappers/SWIG/RefCountMacro.i +++ b/Code/Wrappers/SWIG/RefCountMacro.i @@ -1,79 +1,21 @@ +/*========================================================================= -%include <exception.i> -%include <typemaps.i> - -// This macro replaces the use of itk::SmartPointer. -// class_name is class name without namespace qualifiers. -// Reference: http://www.nabble.com/attachment/16653644/0/SwigRefCount.i -%define DECLARE_REF_COUNT_CLASS(class_name) - - class class_name##_Pointer - { - public: - class_name##_Pointer(); - class_name##_Pointer(class_name##_Pointer const & p); - class_name##_Pointer(class_name * p); - ~class_name##_Pointer(); - class_name * operator->() const; - bool IsNotNull() const; - bool IsNull() const; - class_name * GetPointer() const; - bool operator<(class_name##_Pointer const & r) const; - bool operator>(class_name##_Pointer const & r) const; - bool operator<=(class_name##_Pointer const & r) const; - bool operator>=(class_name##_Pointer const & r) const; - class_name##_Pointer & operator=(class_name##_Pointer const & r); - class_name##_Pointer & operator=(class_name## * r); -// class_name * Print(std::ostream & os) const; - private: - void Register(); - void UnRegister(); - protected: - }; + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ - // pointers and references - %typemap(out) class_name *, class_name & { - // always tell SWIG_NewPointerObj we're the owner - $result = SWIG_NewPointerObj((void *) $1, $1_descriptor, 1); - if ($1) { - $1->Register(); - } - } - // transform smart pointers in raw pointers - %typemap(out) class_name##_Pointer { - // get the raw pointer from the smart pointer - class_name * ptr = $1; - // always tell SWIG_NewPointerObj we're the owner - $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1); - // register the object, it it exists - if (ptr) { - ptr->Register(); - } - } + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. - // transform smart pointers in raw pointers - %typemap(out) class_name##_Pointer & { - // get the raw pointer from the smart pointer - class_name * ptr = *$1; - // always tell SWIG_NewPointerObj we're the owner - $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1); - // register the object, it it exists - if (ptr) { - ptr->Register(); - } - } - %extend class_name { - public: + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. - // make "deletion" in scripting language just decrement ref. count - ~class_name() {self->UnRegister();}; +=========================================================================*/ - } - - %ignore class_name::~class_name; - - %ignore class_name##_Pointer; +%include <exception.i> +%include <typemaps.i> -%enddef diff --git a/Code/Wrappers/SWIG/Ruby.i b/Code/Wrappers/SWIG/Ruby.i new file mode 100644 index 0000000000000000000000000000000000000000..050042a3dd66dc35ed73a51227fa0bed51e4ce80 --- /dev/null +++ b/Code/Wrappers/SWIG/Ruby.i @@ -0,0 +1,125 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#if SWIGRUBY + +%ignore CreateAnother; +%ignore Delete; +%ignore Register; +%ignore UnRegister; +%ignore GetReferenceCount; +%ignore SetReferenceCount; +%ignore DebugOn; +%ignore DebugOff; +%ignore GetDebug; +%ignore SetDebug; +%ignore GetMTime; +%ignore Modified; +%ignore SetGlobalWarningDisplay; +%ignore GetGlobalWarningDisplay; +%ignore GlobalWarningDisplayOn; +%ignore GlobalWarningDisplayOff; + +%ignore New; + + +//###################################################################### +// Simulating smart pointers in SWIG +// This gets rid of wrapping ITK smart pointers. + +// TODO: always tell swig we're the owner +// TODO: itk classes with no New() must be marked as abstract +%define DECLARE_REF_COUNT_CLASS(itkClass) + + class itkClass##_Pointer + { + public: + itkClass##_Pointer(); + itkClass##_Pointer(itkClass##_Pointer const & p); + itkClass##_Pointer(itkClass * p); + ~itkClass##_Pointer(); + itkClass * operator->() const; + bool IsNotNull() const; + bool IsNull() const; + itkClass * GetPointer() const; + bool operator<(itkClass##_Pointer const & r) const; + bool operator>(itkClass##_Pointer const & r) const; + bool operator<=(itkClass##_Pointer const & r) const; + bool operator>=(itkClass##_Pointer const & r) const; + itkClass##_Pointer & operator=(itkClass##_Pointer const & r); + itkClass##_Pointer & operator=(itkClass## * r); +// itkClass * Print(std::ostream & os) const; + private: + void Register(); + void UnRegister(); + protected: + }; + + + // Extend the itk classtype defined for wrapping to simulate a smart pointer in SWIG. + // Also, make the ctor public to make the 'new' operator available in java + %extend itkClass { + public: + itkClass() { + typedef ::itk::SmartPointer<itkLightObject> Pointer; + Pointer smtPtr = itkClass::New().GetPointer(); + itkClass *rawPtr = dynamic_cast<itkClass *>(smtPtr.GetPointer()); + rawPtr->Register(); + return rawPtr; + }; + ~itkClass() { + self->UnRegister(); + }; + } +/* + %typemap(out) itkClass * { + itkClass* ptrRaw = $1; + if (ptrRaw) { + ptrRaw->Register(); + } + *(itkClass **)&$result = ptrRaw; + } +*/ + %typemap(out) itkClass##_Pointer { + itkClass* ptrRaw = $1.GetPointer(); + if (ptrRaw) { + ptrRaw->Register(); + } + *(itkClass **)&$result = ptrRaw; + } + + %typemap(out) itkClass##_Pointer & { + itkClass* ptrRaw = (*$1).GetPointer(); + if (ptrRaw) { + ptrRaw->Register(); + } + *(itkClass **)&$result = ptrRaw; + } + + // Do not wrap the corresponding itkSmartPointer + %ignore itkClass##_Pointer; + +%enddef + +%pragma(java) jniclasscode=%{ + static { + System.loadLibrary ( "otbApplicationJava" ); + } +%} + + +#endif diff --git a/Code/Wrappers/SWIG/itkBase.i b/Code/Wrappers/SWIG/itkBase.i index b6b49ff388f37af41eefd2f74182d9eb6edd46a8..bf1de473a8d98042b2a437c401b7aafc0b315743 100644 --- a/Code/Wrappers/SWIG/itkBase.i +++ b/Code/Wrappers/SWIG/itkBase.i @@ -1,3 +1,21 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + // kindly stolen from the build files of OTB-Wrapping (Typedefs/itkBase.includes, Typedefs/wrap_ITKCommonBase.i) %include "RefCountMacro.i" @@ -5,30 +23,45 @@ %include <exception.i> %include <typemaps.i> -%include <std_iostream.i> -%include <std_sstream.i> -%include <std_string.i> -%include <std_vector.i> -%include <std_list.i> - +// Customize exception handling +%exception { + try { + $action + } catch( itk::ExceptionObject &ex ) { + char error_msg[256]; + sprintf( error_msg, "Exception thrown in SimpleITK $symname: %s", ex.what() ); + SWIG_exception( SWIG_RuntimeError, error_msg ); + } catch( ... ) { + SWIG_exception( SWIG_UnknownError, "Unknown exception thrown in SimpleITK $symname" ); + } +} +/* %exception { try { $action } catch (const std::out_of_range& e) { - SWIG_exception_fail(SWIG_IndexError, e.what()); + SWIG_exception(SWIG_IndexError, e.what()); } catch( const std::exception &ex ) { SWIG_exception( SWIG_RuntimeError, ex.what() ); } catch (...) { SWIG_exception( SWIG_UnknownError, "Unknown exception thrown in otbApplication $symname" ); } } +*/ + +// Some code from STL +// Do not wrap if not necessary as it really slows down compilation +//%include <std_iostream.i> +//%include <std_sstream.i> +%include <std_string.i> +//%include <std_vector.i> +//%include <std_list.i> -// some code from stl //%template(vectorstring) std::vector< std::string >; -%template(liststring) std::list< std::string >; +//%template(liststring) std::list< std::string >; //%template(vectorB) std::vector< bool >; //%template(vectorUC) std::vector< unsigned char >; @@ -69,15 +102,15 @@ class itkLightObject { public: static itkLightObject_Pointer New(); -// virtual itkLightObject_Pointer CreateAnother() const; + virtual itkLightObject_Pointer CreateAnother() const; virtual void Delete(); virtual char const * GetNameOfClass() const; void Print(std::ostream & os, itkIndent indent = 0) const; -// static void BreakOnError(); -// virtual void Register() const; -// virtual void UnRegister() const; -// virtual int GetReferenceCount() const; -// virtual void SetReferenceCount(int arg0); + static void BreakOnError(); + virtual void Register() const; + virtual void UnRegister() const; + virtual int GetReferenceCount() const; + virtual void SetReferenceCount(int arg0); private: itkLightObject(itkLightObject const & arg0); void operator=(itkLightObject const & arg0); @@ -90,34 +123,24 @@ }; DECLARE_REF_COUNT_CLASS( itkLightObject ) - // add a ToString shortcut to all itkLightObject - %extend itkLightObject { - public: - std::string ToString() { - std::ostringstream o; - self->Print(o); - return o.str(); - } - } - class itkObject : public itkLightObject { public: static itkObject_Pointer New(); virtual itkLightObject_Pointer CreateAnother() const; virtual char const * GetNameOfClass() const; -// virtual void DebugOn() const; -// virtual void DebugOff() const; -// bool GetDebug() const; -// void SetDebug(bool debugFlag) const; -// virtual unsigned long GetMTime() const; -// virtual void Modified() const; -// virtual void Register() const; -// virtual void UnRegister() const; -// virtual void SetReferenceCount(int arg0); -// static void SetGlobalWarningDisplay(bool flag); -// static bool GetGlobalWarningDisplay(); -// static void GlobalWarningDisplayOn(); -// static void GlobalWarningDisplayOff(); + virtual void DebugOn() const; + virtual void DebugOff() const; + bool GetDebug() const; + void SetDebug(bool debugFlag) const; + virtual unsigned long GetMTime() const; + virtual void Modified() const; + virtual void Register() const; + virtual void UnRegister() const; + virtual void SetReferenceCount(int arg0); + static void SetGlobalWarningDisplay(bool flag); + static bool GetGlobalWarningDisplay(); + static void GlobalWarningDisplayOn(); + static void GlobalWarningDisplayOff(); unsigned long AddObserver(itkEventObject const & event, itkCommand * arg1); // unsigned long AddObserver(itkEventObject const & event, itkCommand * arg1) const; itkCommand * GetCommand(unsigned long tag); @@ -230,199 +253,35 @@ virtual void PrintTrailer(std::ostream & os, itkIndent indent) const; }; +%define DECLARE_itkEventObject_CLASS(class_name, superclass_name) - class itkNoEvent : public itkEventObject { - public: - itkNoEvent(); - ~itkNoEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkNoEvent(itkNoEvent const & s); - private: - void operator=(itkNoEvent const & arg0); - protected: - }; - - - class itkAnyEvent : public itkEventObject { - public: - itkAnyEvent(); - ~itkAnyEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkAnyEvent(itkAnyEvent const & s); - private: - void operator=(itkAnyEvent const & arg0); - protected: - }; - - - class itkDeleteEvent : public itkAnyEvent { - public: - itkDeleteEvent(); - ~itkDeleteEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkDeleteEvent(itkDeleteEvent const & s); - private: - void operator=(itkDeleteEvent const & arg0); - protected: - }; - - - class itkEndEvent : public itkAnyEvent { - public: - itkEndEvent(); - ~itkEndEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkEndEvent(itkEndEvent const & s); - private: - void operator=(itkEndEvent const & arg0); - protected: - }; - - - class itkExitEvent : public itkAnyEvent { - public: - itkExitEvent(); - ~itkExitEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkExitEvent(itkExitEvent const & s); - private: - void operator=(itkExitEvent const & arg0); - protected: - }; - - - class itkIterationEvent : public itkAnyEvent { - public: - itkIterationEvent(); - ~itkIterationEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkIterationEvent(itkIterationEvent const & s); - private: - void operator=(itkIterationEvent const & arg0); - protected: - }; - - - class itkModifiedEvent : public itkAnyEvent { - public: - itkModifiedEvent(); - ~itkModifiedEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkModifiedEvent(itkModifiedEvent const & s); - private: - void operator=(itkModifiedEvent const & arg0); - protected: - }; - - - class itkPickEvent : public itkAnyEvent { - public: - itkPickEvent(); - ~itkPickEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkPickEvent(itkPickEvent const & s); - private: - void operator=(itkPickEvent const & arg0); - protected: - }; - - - class itkProgressEvent : public itkAnyEvent { - public: - itkProgressEvent(); - ~itkProgressEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkProgressEvent(itkProgressEvent const & s); - private: - void operator=(itkProgressEvent const & arg0); - protected: - }; - - - class itkStartEvent : public itkAnyEvent { - public: - itkStartEvent(); - ~itkStartEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkStartEvent(itkStartEvent const & s); - private: - void operator=(itkStartEvent const & arg0); - protected: - }; - - - class itkStartPickEvent : public itkPickEvent { - public: - itkStartPickEvent(); - ~itkStartPickEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkStartPickEvent(itkStartPickEvent const & s); - private: - void operator=(itkStartPickEvent const & arg0); - protected: - }; - - - class itkUserEvent : public itkAnyEvent { - public: - itkUserEvent(); - ~itkUserEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkUserEvent(itkUserEvent const & s); - private: - void operator=(itkUserEvent const & arg0); - protected: - }; - - - class itkAbortCheckEvent : public itkPickEvent { - public: - itkAbortCheckEvent(); - ~itkAbortCheckEvent(); - virtual char const * GetEventName() const; - virtual bool CheckEvent(itkEventObject const * e) const; - virtual itkEventObject * MakeObject() const; - itkAbortCheckEvent(itkAbortCheckEvent const & s); - private: - void operator=(itkAbortCheckEvent const & arg0); - protected: - }; - - - class itkEndPickEvent : public itkPickEvent { + class class_name : public superclass_name { public: - itkEndPickEvent(); - ~itkEndPickEvent(); + class_name(); + ~class_name(); virtual char const * GetEventName() const; virtual bool CheckEvent(itkEventObject const * e) const; virtual itkEventObject * MakeObject() const; - itkEndPickEvent(itkEndPickEvent const & s); + class_name(class_name const & s); private: - void operator=(itkEndPickEvent const & arg0); + void operator=(class_name const & arg0); protected: }; +%enddef + +DECLARE_itkEventObject_CLASS(itkNoEvent, itkEventObject) +DECLARE_itkEventObject_CLASS(itkAnyEvent, itkEventObject) +DECLARE_itkEventObject_CLASS(itkDeleteEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkEndEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkExitEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkIterationEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkModifiedEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkPickEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkProgressEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkStartEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkStartPickEvent, itkPickEvent) +DECLARE_itkEventObject_CLASS(itkUserEvent, itkAnyEvent) +DECLARE_itkEventObject_CLASS(itkAbortCheckEvent, itkPickEvent) +DECLARE_itkEventObject_CLASS(itkEndPickEvent, itkPickEvent) +DECLARE_itkEventObject_CLASS(itkUserEvent, itkAnyEvent) diff --git a/Code/Wrappers/SWIG/itkMacro.i b/Code/Wrappers/SWIG/itkMacro.i index 59c15e159c2a69aaac33b14a3d0a61c1079e90fc..3cf1333fdf84fe997df655188384ae76ceb97186 100644 --- a/Code/Wrappers/SWIG/itkMacro.i +++ b/Code/Wrappers/SWIG/itkMacro.i @@ -1,3 +1,20 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ %define itkSetStringMacro(name) void Set##name (const char* _arg); diff --git a/Code/Wrappers/SWIG/otbApplication.i b/Code/Wrappers/SWIG/otbApplication.i index a27c423abea4583f0ee6ebcf23ca15c694004b78..e53e91a6efa7ad2905db067fab82fa965183ff82 100644 --- a/Code/Wrappers/SWIG/otbApplication.i +++ b/Code/Wrappers/SWIG/otbApplication.i @@ -1,17 +1,36 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + %module otbApplication + %{ #include "itkBase.includes" #include "otbWrapperSWIGIncludes.h" %} - -%include "itkMacro.i" -%include "itkBase.i" - // Langage specific extension %include "Python.i" +%include "Java.i" +%include "Ruby.i" +%include "itkMacro.i" +%include "itkBase.i" namespace otb { @@ -87,7 +106,6 @@ private: }; DECLARE_REF_COUNT_CLASS( Parameter ) -DECLARE_REF_COUNT_CLASS_LANGAGEEXTENSION( Parameter ) class ParameterGroup : public Parameter { diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt index 553715f16c5dc4001bea11d25ffebc65df8951ad..5664f7ef8b485167b632469839d09f3f7962a4b2 100644 --- a/Testing/CMakeLists.txt +++ b/Testing/CMakeLists.txt @@ -1,3 +1,7 @@ +SET(TEMP ${CMAKE_BINARY_DIR}/Testing/Temporary) +FILE(MAKE_DIRECTORY ${TEMP}) + add_subdirectory(Core) add_subdirectory(Python) +add_subdirectory(Java) add_subdirectory(QtWidget) \ No newline at end of file diff --git a/Testing/Java/CMakeLists.txt b/Testing/Java/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e1f424e9fb59cd6eedff1605124e50da61d05dcf --- /dev/null +++ b/Testing/Java/CMakeLists.txt @@ -0,0 +1,20 @@ +include( UseJava ) + +SET(TEST_DRIVER "${OTB_TEST_DRIVER}" + --add-before-env LD_LIBRARY_PATH "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" + --add-before-env ITK_AUTOLOAD_PATH "${CMAKE_BINARY_DIR}/Example" +) + +set( CMAKE_JAVA_INCLUDE_PATH ${OTB-Wrapper_BINARY_DIR}/Code/Wrappers/SWIG/org.otb.application.jar ) +add_jar( JavaSmoothingTest JavaSmoothingTest.java ) + + + +SET(JAVA_COMMAND "${JAVACOMMAND}" -Djava.library.path=${OTB-Wrapper_BINARY_DIR}/Code/Wrappers/SWIG) + + +add_test( NAME jaTvJavaSmoothingTest + COMMAND ${TEST_DRIVER} Execute + ${JAVA_COMMAND} -cp ${CMAKE_JAVA_INCLUDE_PATH}:JavaSmoothingTest.jar SmoothingTest + ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif + ${TEMP}/ToulouseExtract_WithGeom_ ) diff --git a/Testing/Java/JavaSmoothingTest.java b/Testing/Java/JavaSmoothingTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5d21ce9089e9d97563090a00b788dfdf4775f57e --- /dev/null +++ b/Testing/Java/JavaSmoothingTest.java @@ -0,0 +1,16 @@ +/* + * Example on the use of the Smoothing + */ + +import org.otb.application.*; + + +class SmoothingTest { + + public static void main( String argv[] ) { + + System.out.println( "Available applications : " + Registry.GetAvailableApplications() ); + + } + +} \ No newline at end of file