From 11fc6b0945b66e94a31ba13c7d5e35628a7492ce Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Thu, 23 Apr 2015 11:20:47 +1200 Subject: [PATCH 01/14] Set Fieldml to work like all the other dependencies of Iron. --- CMakeLists.txt | 41 ++++++++++++++--------------------------- io/CMakeLists.txt | 2 +- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a59d22..ce46b51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,12 +36,12 @@ # ***** END LICENSE BLOCK ***** */ -# Set the minimum version of cmake required to 2.6 -CMAKE_MINIMUM_REQUIRED( VERSION 2.6 ) +# Set the minimum version of cmake required to 3.0 +CMAKE_MINIMUM_REQUIRED( VERSION 3.0 ) -# Set this nampspace to keep these options seperate from other project options +# Set this namespace to keep these options seperate from other project options SET( FIELDML_NAMESPACE_NAME FIELDML ) -PROJECT(fieldml) +PROJECT(fieldml VERSION 0.5.0) MACRO( OPTION_WITH_DEFAULT OPTION_NAME OPTION_STRING OPTION_DEFAULT ) IF( NOT DEFINED ${OPTION_NAME} ) @@ -64,9 +64,6 @@ ENDMACRO( CACHE_VAR_WITH_DEFAULT OPTION_NAME OPTION_DEFAULT OPTION_TYPE OPTION_S SET( LIBRARY_TARGET_NAME fieldml ) STRING( TOUPPER ${LIBRARY_TARGET_NAME} UPPERCASE_LIBRARY_TARGET_NAME ) -SET( FIELDML_API_MAJOR_VERSION "0" ) -SET( FIELDML_API_MINOR_VERSION "5" ) -SET( FIELDML_API_PATCH_VERSION "0" ) CACHE_VAR_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TYPE "Release" STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel" ) @@ -110,28 +107,18 @@ GET_DIRECTORY_PROPERTY(MPI_INCLUDE_DIRS DIRECTORY io DEFINITION MPI_INCLUDE_DIRS GET_DIRECTORY_PROPERTY(HDF5_USE_MPI DIRECTORY io DEFINITION HDF5_USE_MPI) ADD_SUBDIRECTORY( test ) -foreach(arg ${MPI_LIBRARIES}) - set(MPI_MINE_LIBRARIES "${MPI_MINE_LIBRARIES} ${arg}") -endforeach(arg ${MPI_LIBRARIES}) +FOREACH(_ARG ${MPI_LIBRARIES}) + SET(MPI_MINE_LIBRARIES "${MPI_MINE_LIBRARIES} ${_ARG}") +ENDFOREACH() IF( ${FIELDML_NAMESPACE_NAME}_INSTALL_CONFIG ) - SET( LIBRARY_CONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/fieldml-config.cmake ) - SET( CONFIG_FILE_CONTENTS - "\nIF( NOT DEFINED _${FIELDML_NAMESPACE_NAME}_CONFIG_CMAKE )" - "\nSET( _${FIELDML_NAMESPACE_NAME}_CONFIG_CMAKE TRUE )" - "\nGET_FILENAME_COMPONENT( SELF_DIR \"\${CMAKE_CURRENT_LIST_FILE}\" PATH )" - "\nINCLUDE( \${SELF_DIR}/fieldml-targets.cmake )" - "\nGET_FILENAME_COMPONENT( ${FIELDML_NAMESPACE_NAME}_INCLUDE_DIRS \"\${SELF_DIR}/../../include\" ABSOLUTE )" - "\nSET( ${FIELDML_NAMESPACE_NAME}_INCLUDE_DIRS \"\${${FIELDML_NAMESPACE_NAME}_INCLUDE_DIRS}\" \"${LIBXML2_INCLUDE_DIR}\" \"${HDF5_INCLUDE_DIRS}\" \"${MPI_INCLUDE_DIRS}\" )" - "\nSET( ${FIELDML_NAMESPACE_NAME}_LIBRARIES ${FIELDML_API_LIBRARY_TARGET_NAME} ${FIELDML_IO_API_LIBRARY_TARGET_NAME} ${HDF5_MINE_LIBRARIES} ${MPI_MINE_LIBRARIES})" - "\nSET( ${FIELDML_NAMESPACE_NAME}_DEFINITIONS ${LIBXML2_DEFINITIONS} )" - "\nSET( ${FIELDML_NAMESPACE_NAME}_FOUND TRUE )" - "\nENDIF( NOT DEFINED _${FIELDML_NAMESPACE_NAME}_CONFIG_CMAKE )" - "\n" ) - FILE( WRITE ${LIBRARY_CONFIG_FILE} ${CONFIG_FILE_CONTENTS} ) - INSTALL( FILES ${LIBRARY_CONFIG_FILE} DESTINATION lib/cmake ) - INSTALL( EXPORT fieldml-targets - DESTINATION lib/cmake ) + INCLUDE(CMakePackageConfigHelpers) + WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_CURRENT_BINARY_DIR}/fieldml-config-version.cmake + COMPATIBILITY AnyNewerVersion) + INSTALL( EXPORT fieldml-config + DESTINATION ${PACKAGE_CONFIG_DIR} ) + INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/fieldml-config-version.cmake + DESTINATION ${PACKAGE_CONFIG_DIR} ) ENDIF( ${FIELDML_NAMESPACE_NAME}_INSTALL_CONFIG ) IF ( FIELDML_BUILD_JAVA ) diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index 8cf9644..fbe3625 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -147,7 +147,7 @@ IF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) ENDIF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) # Define install rules -INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-targets ${LIBRARY_INSTALL_TYPE} +INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-config ${LIBRARY_INSTALL_TYPE} DESTINATION lib ) INSTALL( FILES ${FIELDML_IO_API_PUBLIC_HDRS} DESTINATION include ) From f3bc791890bc8264eb3f1f8936659bbad6b422ea Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 28 May 2015 11:21:49 +0200 Subject: [PATCH 02/14] corrected the export names so that "FIELDML-API" can be found (was FIELDML) --- CMakeLists.txt | 23 +++++++++-------------- io/CMakeLists.txt | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce46b51..77e1fb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,20 +78,17 @@ SET( CMAKE_INSTALL_PREFIX ${${UPPERCASE_LIBRARY_TARGET_NAME}_INSTALL_PREFIX} ${UPPERCASE_LIBRARY_TARGET_NAME}_INSTALL_PREFIX" FORCE ) OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB "Build static zlib" TRUE ) -OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_INSTALL_CONFIG "Do you want to install CMake configuration files?" TRUE ) - OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_USE_HDF5 "Do you want to use hdf5?" FALSE ) OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_JAVA "Do you want to build the Java bindings" FALSE ) - # Specific library options OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST "Build ${LIBRARY_TARGET_NAME} test application" FALSE ) # Define library type settings IF( NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST ) SET( EXCLUDE_TEST EXCLUDE_FROM_ALL ) -ENDIF( NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST ) +ENDIF() # Run ADD_SUBDIRECTORY command SET( LIBRARY_TARGET_NAME fieldml_api ) @@ -111,15 +108,13 @@ FOREACH(_ARG ${MPI_LIBRARIES}) SET(MPI_MINE_LIBRARIES "${MPI_MINE_LIBRARIES} ${_ARG}") ENDFOREACH() -IF( ${FIELDML_NAMESPACE_NAME}_INSTALL_CONFIG ) - INCLUDE(CMakePackageConfigHelpers) - WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_CURRENT_BINARY_DIR}/fieldml-config-version.cmake - COMPATIBILITY AnyNewerVersion) - INSTALL( EXPORT fieldml-config - DESTINATION ${PACKAGE_CONFIG_DIR} ) - INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/fieldml-config-version.cmake - DESTINATION ${PACKAGE_CONFIG_DIR} ) -ENDIF( ${FIELDML_NAMESPACE_NAME}_INSTALL_CONFIG ) +INCLUDE(CMakePackageConfigHelpers) +INSTALL(EXPORT fieldml-api-config + DESTINATION ${PACKAGE_CONFIG_DIR} ) +WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake + COMPATIBILITY AnyNewerVersion) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake + DESTINATION ${PACKAGE_CONFIG_DIR} ) IF ( FIELDML_BUILD_JAVA ) FIND_PACKAGE(SWIG REQUIRED) @@ -157,4 +152,4 @@ IF ( FIELDML_BUILD_JAVA ) DEPENDS ${classfiles}) ADD_CUSTOM_TARGET(jnijar ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar) -ENDIF ( FIELDML_BUILD_JAVA ) +ENDIF() diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index fbe3625..37bc76b 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -147,7 +147,7 @@ IF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) ENDIF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) # Define install rules -INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-config ${LIBRARY_INSTALL_TYPE} +INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-api-config ${LIBRARY_INSTALL_TYPE} DESTINATION lib ) INSTALL( FILES ${FIELDML_IO_API_PUBLIC_HDRS} DESTINATION include ) From 34944268855b8b6f34740fc521a65b8f8b64646a Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 11 Jun 2015 11:38:38 +0200 Subject: [PATCH 03/14] rewritten large parts of the cmakelists in new cmake way --- CMakeLists.txt | 166 ++++++++++++++++---------------------------- JavaBindings.cmake | 34 +++++++++ core/CMakeLists.txt | 67 ++++++------------ io/CMakeLists.txt | 119 ++++++++++--------------------- 4 files changed, 150 insertions(+), 236 deletions(-) create mode 100644 JavaBindings.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 77e1fb7..0eb4704 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,122 +34,72 @@ # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** */ - # Set the minimum version of cmake required to 3.0 CMAKE_MINIMUM_REQUIRED( VERSION 3.0 ) # Set this namespace to keep these options seperate from other project options SET( FIELDML_NAMESPACE_NAME FIELDML ) -PROJECT(fieldml VERSION 0.5.0) - -MACRO( OPTION_WITH_DEFAULT OPTION_NAME OPTION_STRING OPTION_DEFAULT ) - IF( NOT DEFINED ${OPTION_NAME} ) - SET( ${OPTION_NAME} ${OPTION_DEFAULT} ) - ENDIF( NOT DEFINED ${OPTION_NAME} ) - - OPTION( ${OPTION_NAME} "${OPTION_STRING}" ${${OPTION_NAME}} ) -ENDMACRO( OPTION_WITH_DEFAULT OPTION_NAME OPTION_STRING OPTION_DEFAULT ) - -MACRO( CACHE_VAR_WITH_DEFAULT OPTION_NAME OPTION_DEFAULT OPTION_TYPE OPTION_STRING ) - IF( NOT DEFINED ${OPTION_NAME} ) - SET( ${OPTION_NAME} ${OPTION_DEFAULT} ) - ENDIF( NOT DEFINED ${OPTION_NAME} ) - - SET( ${OPTION_NAME} "${OPTION_DEFAULT}" CACHE ${OPTION_TYPE} "${OPTION_STRING}" ) -ENDMACRO( CACHE_VAR_WITH_DEFAULT OPTION_NAME OPTION_DEFAULT OPTION_TYPE OPTION_STRING ) - -# Set up library options -# Generic library options -SET( LIBRARY_TARGET_NAME fieldml ) - -STRING( TOUPPER ${LIBRARY_TARGET_NAME} UPPERCASE_LIBRARY_TARGET_NAME ) - -CACHE_VAR_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TYPE "Release" STRING - "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel" ) -SET( CMAKE_BUILD_TYPE ${${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TYPE} CACHE - INTERNAL "Internalise this variable and manipulate with - ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TYPE" FORCE ) -CACHE_VAR_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_INSTALL_PREFIX - "${CMAKE_INSTALL_PREFIX}" PATH - "Install path prefix, prepended onto install directories." ) -SET( CMAKE_INSTALL_PREFIX ${${UPPERCASE_LIBRARY_TARGET_NAME}_INSTALL_PREFIX} - CACHE INTERNAL "Internalise this variable and manipulate with - ${UPPERCASE_LIBRARY_TARGET_NAME}_INSTALL_PREFIX" FORCE ) -OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB "Build static zlib" TRUE ) - -OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_USE_HDF5 "Do you want to use hdf5?" FALSE ) - -OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_JAVA "Do you want to build the Java bindings" FALSE ) - -# Specific library options -OPTION_WITH_DEFAULT( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST "Build ${LIBRARY_TARGET_NAME} test application" FALSE ) - -# Define library type settings -IF( NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST ) - SET( EXCLUDE_TEST EXCLUDE_FROM_ALL ) -ENDIF() - -# Run ADD_SUBDIRECTORY command -SET( LIBRARY_TARGET_NAME fieldml_api ) -SET( FIELDML_API_LIBRARY_TARGET_NAME ${LIBRARY_TARGET_NAME} ) -ADD_SUBDIRECTORY( core ) -SET( LIBRARY_TARGET_NAME fieldml_io_api ) -SET( FIELDML_IO_API_LIBRARY_TARGET_NAME ${LIBRARY_TARGET_NAME} ) -ADD_SUBDIRECTORY( io ) -GET_DIRECTORY_PROPERTY(HDF5_INCLUDE_DIRS DIRECTORY io DEFINITION HDF5_INCLUDE_DIRS) -GET_DIRECTORY_PROPERTY(HDF5_MINE_LIBRARIES DIRECTORY io DEFINITION HDF5_MINE_LIBRARIES) -GET_DIRECTORY_PROPERTY(MPI_LIBRARIES DIRECTORY io DEFINITION MPI_MINE_LIBRARIES) -GET_DIRECTORY_PROPERTY(MPI_INCLUDE_DIRS DIRECTORY io DEFINITION MPI_INCLUDE_DIRS) -GET_DIRECTORY_PROPERTY(HDF5_USE_MPI DIRECTORY io DEFINITION HDF5_USE_MPI) -ADD_SUBDIRECTORY( test ) - -FOREACH(_ARG ${MPI_LIBRARIES}) - SET(MPI_MINE_LIBRARIES "${MPI_MINE_LIBRARIES} ${_ARG}") -ENDFOREACH() +PROJECT(fieldml VERSION 0.5.0 LANGUAGES CXX Fortran) + +option(USE_HDF5 "Do you want to use netgen (HDF5)?" NO) +option(HDF5_WITH_MPI "Do you want to use MPI with HDF5?" NO) +option(BUILD_TESTS "Build tests" ON) +option(JAVA_BINDINGS "Do you want to build the Java bindings" NO) +set(PACKAGE_CONFIG_DIR "lib/cmake" CACHE STRING "Directory for package config files (relative to CMAKE_INSTALL_PREFIX)") +# Further options: +# CMAKE_POSITION_INDEPENDENT_CODE=YES for -fPIC constant (is also passed in from OpenCMISS-main build script) + +FIND_PACKAGE(LibXml2 REQUIRED) + +if (NOT CMAKE_DEBUG_POSTFIX) + SET(CMAKE_DEBUG_POSTFIX d) +endif() + +# Add actual fieldml code and io +add_subdirectory(core) +add_subdirectory(io) +#GET_DIRECTORY_PROPERTY(HDF5_INCLUDE_DIRS DIRECTORY io DEFINITION HDF5_INCLUDE_DIRS) +#GET_DIRECTORY_PROPERTY(HDF5_MINE_LIBRARIES DIRECTORY io DEFINITION HDF5_MINE_LIBRARIES) +#GET_DIRECTORY_PROPERTY(MPI_LIBRARIES DIRECTORY io DEFINITION MPI_MINE_LIBRARIES) +#GET_DIRECTORY_PROPERTY(MPI_INCLUDE_DIRS DIRECTORY io DEFINITION MPI_INCLUDE_DIRS) +#GET_DIRECTORY_PROPERTY(HDF5_USE_MPI DIRECTORY io DEFINITION HDF5_USE_MPI) +if (BUILD_TESTS) + add_subdirectory(test) +endif() + +#FOREACH(_ARG ${MPI_LIBRARIES}) +# SET(MPI_MINE_LIBRARIES "${M#PI_MINE_LIBRARIES} ${_ARG}") +#ENDFOREACH() + +if(JAVA_BINDINGS) + include(${CMAKE_CURRENT_SOURCE_DIR}/JavaBindings.cmake) +endif() + +# Create interface library for easy inclusion +add_library(fieldml-api INTERFACE) +target_link_libraries(fieldml-api INTERFACE fieldml-core fieldml-io) +install(TARGETS fieldml-api EXPORT fieldml-api-config) INCLUDE(CMakePackageConfigHelpers) INSTALL(EXPORT fieldml-api-config - DESTINATION ${PACKAGE_CONFIG_DIR} ) + DESTINATION ${PACKAGE_CONFIG_DIR}) WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake COMPATIBILITY AnyNewerVersion) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake - DESTINATION ${PACKAGE_CONFIG_DIR} ) - -IF ( FIELDML_BUILD_JAVA ) - FIND_PACKAGE(SWIG REQUIRED) - FIND_PACKAGE(JNI) - FIND_PACKAGE(Java) - INCLUDE_DIRECTORIES(${JNI_INCLUDE_DIRS}) - INCLUDE_DIRECTORIES(io/src) - INCLUDE_DIRECTORIES(core/src) - INCLUDE(${SWIG_USE_FILE}) - - INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) - INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) - - SET(CMAKE_SWIG_FLAGS "-Iio/src;-Icore/src;-package;fieldml.jni") - SET(CMAKE_SWIG_OUTDIR "fieldml/jni") - - SET_SOURCE_FILES_PROPERTIES(jni/fieldml_api.i PROPERTIES CPLUSPLUS ON) - SET_SOURCE_FILES_PROPERTIES(jni/fieldml_io.i PROPERTIES CPLUSPLUS ON) - - # If you change these version, also change the .i files. - SWIG_ADD_MODULE(fieldml_jni_0.5 java jni/fieldml_api.i) - SWIG_ADD_MODULE(fieldml_io_0.5 java jni/fieldml_io.i) - SWIG_LINK_LIBRARIES(fieldml_jni_0.5 fieldml_api fieldml_io_api) - SWIG_LINK_LIBRARIES(fieldml_io_0.5 fieldml_api fieldml_io_api) - - # Also make the jar file... - SET(javafiles "fieldml/jni/FieldmlApiConstants.java;fieldml/jni/FieldmlApi.java;fieldml/jni/FieldmlApiJNI.java;fieldml/jni/FieldmlDataDescriptionType.java;fieldml/jni/FieldmlDataResourceType.java;fieldml/jni/FieldmlDataSourceType.java;fieldml/jni/FieldmlEnsembleMembersType.java;fieldml/jni/FieldmlHandleType.java;fieldml/jni/FieldmlIo.java;fieldml/jni/FieldmlIoJNI.java;fieldml/jni/SWIGTYPE_p_FmlBoolean.java;fieldml/jni/SWIGTYPE_p_FmlObjectHandle.java;fieldml/jni/SWIGTYPE_p_FmlSessionHandle.java;fieldml/jni/SWIGTYPE_p_int32_t.java") - SET(classfiles "fieldml/jni/FieldmlApi.class;fieldml/jni/FieldmlApiConstants.class;fieldml/jni/FieldmlApiJNI.class;fieldml/jni/FieldmlDataDescriptionType.class;fieldml/jni/FieldmlDataDescriptionType\\$$SwigNext.class;fieldml/jni/FieldmlDataResourceType.class;fieldml/jni/FieldmlDataResourceType\\$$SwigNext.class;fieldml/jni/FieldmlDataSourceType.class;fieldml/jni/FieldmlDataSourceType\\$$SwigNext.class;fieldml/jni/FieldmlEnsembleMembersType.class;fieldml/jni/FieldmlEnsembleMembersType\\$$SwigNext.class;fieldml/jni/FieldmlHandleType.class;fieldml/jni/FieldmlHandleType\\$$SwigNext.class;fieldml/jni/FieldmlIoConstants.class;fieldml/jni/FieldmlIo.class;fieldml/jni/FieldmlIoConstants.class;fieldml/jni/FieldmlIoJNI.class;fieldml/jni/SWIGTYPE_p_FmlBoolean.class;fieldml/jni/SWIGTYPE_p_FmlObjectHandle.class;fieldml/jni/SWIGTYPE_p_FmlSessionHandle.class;fieldml/jni/SWIGTYPE_p_int32_t.class") - - ADD_CUSTOM_COMMAND(OUTPUT ${classfiles} - COMMAND ${Java_JAVAC_EXECUTABLE} ARGS ${javafiles} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml_apiJAVA_wrap.cxx) - ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar - COMMAND ${Java_JAR_EXECUTABLE} ARGS cf ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar ${classfiles} - DEPENDS ${classfiles}) - ADD_CUSTOM_TARGET(jnijar ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar) - -ENDIF() +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake + "include(CMakeFindDependencyMacro)\r\n" + "set(_OLD_IMPORT_PREFIX \${_IMPORT_PREFIX})\r\n" +) +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "find_dependency(LibXml2 ${LIBXML2_VERSION})\r\n") +if (USE_HDF5) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "find_dependency(HDF5 ${HDF5_VERSION})\r\n") +endif() +if (JAVA_BINDINGS) + # TODO + #file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "find_dependency(OpenMP)\r\n") +endif() +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "set(_IMPORT_PREFIX \${_OLD_IMPORT_PREFIX})") +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake + ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake + DESTINATION ${PACKAGE_CONFIG_DIR}) \ No newline at end of file diff --git a/JavaBindings.cmake b/JavaBindings.cmake new file mode 100644 index 0000000..eb6ae07 --- /dev/null +++ b/JavaBindings.cmake @@ -0,0 +1,34 @@ +FIND_PACKAGE(SWIG REQUIRED) + FIND_PACKAGE(JNI) + FIND_PACKAGE(Java) + INCLUDE_DIRECTORIES(${JNI_INCLUDE_DIRS}) + INCLUDE_DIRECTORIES(io/src) + INCLUDE_DIRECTORIES(core/src) + INCLUDE(${SWIG_USE_FILE}) + + INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + + SET(CMAKE_SWIG_FLAGS "-Iio/src;-Icore/src;-package;fieldml.jni") + SET(CMAKE_SWIG_OUTDIR "fieldml/jni") + + SET_SOURCE_FILES_PROPERTIES(jni/fieldml_api.i PROPERTIES CPLUSPLUS ON) + SET_SOURCE_FILES_PROPERTIES(jni/fieldml_io.i PROPERTIES CPLUSPLUS ON) + + # If you change these version, also change the .i files. + SWIG_ADD_MODULE(fieldml_jni_0.5 java jni/fieldml_api.i) + SWIG_ADD_MODULE(fieldml_io_0.5 java jni/fieldml_io.i) + SWIG_LINK_LIBRARIES(fieldml_jni_0.5 fieldml_api fieldml_io_api) + SWIG_LINK_LIBRARIES(fieldml_io_0.5 fieldml_api fieldml_io_api) + + # Also make the jar file... + SET(javafiles "fieldml/jni/FieldmlApiConstants.java;fieldml/jni/FieldmlApi.java;fieldml/jni/FieldmlApiJNI.java;fieldml/jni/FieldmlDataDescriptionType.java;fieldml/jni/FieldmlDataResourceType.java;fieldml/jni/FieldmlDataSourceType.java;fieldml/jni/FieldmlEnsembleMembersType.java;fieldml/jni/FieldmlHandleType.java;fieldml/jni/FieldmlIo.java;fieldml/jni/FieldmlIoJNI.java;fieldml/jni/SWIGTYPE_p_FmlBoolean.java;fieldml/jni/SWIGTYPE_p_FmlObjectHandle.java;fieldml/jni/SWIGTYPE_p_FmlSessionHandle.java;fieldml/jni/SWIGTYPE_p_int32_t.java") + SET(classfiles "fieldml/jni/FieldmlApi.class;fieldml/jni/FieldmlApiConstants.class;fieldml/jni/FieldmlApiJNI.class;fieldml/jni/FieldmlDataDescriptionType.class;fieldml/jni/FieldmlDataDescriptionType\\$$SwigNext.class;fieldml/jni/FieldmlDataResourceType.class;fieldml/jni/FieldmlDataResourceType\\$$SwigNext.class;fieldml/jni/FieldmlDataSourceType.class;fieldml/jni/FieldmlDataSourceType\\$$SwigNext.class;fieldml/jni/FieldmlEnsembleMembersType.class;fieldml/jni/FieldmlEnsembleMembersType\\$$SwigNext.class;fieldml/jni/FieldmlHandleType.class;fieldml/jni/FieldmlHandleType\\$$SwigNext.class;fieldml/jni/FieldmlIoConstants.class;fieldml/jni/FieldmlIo.class;fieldml/jni/FieldmlIoConstants.class;fieldml/jni/FieldmlIoJNI.class;fieldml/jni/SWIGTYPE_p_FmlBoolean.class;fieldml/jni/SWIGTYPE_p_FmlObjectHandle.class;fieldml/jni/SWIGTYPE_p_FmlSessionHandle.class;fieldml/jni/SWIGTYPE_p_int32_t.class") + + ADD_CUSTOM_COMMAND(OUTPUT ${classfiles} + COMMAND ${Java_JAVAC_EXECUTABLE} ARGS ${javafiles} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml_apiJAVA_wrap.cxx) + ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar + COMMAND ${Java_JAR_EXECUTABLE} ARGS cf ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar ${classfiles} + DEPENDS ${classfiles}) + ADD_CUSTOM_TARGET(jnijar ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jni/fieldml.jar) \ No newline at end of file diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e15924d..eb29c98 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -35,22 +35,6 @@ # # ***** END LICENSE BLOCK ***** */ -PROJECT( core ) - -SET( CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX} ) -FIND_PACKAGE( LibXml2 REQUIRED ) - -IF( ${FIELDML_NAMESPACE_NAME}_BUILD_STATIC_LIB ) - SET( LIBRARY_BUILD_TYPE STATIC ) - SET( LIBRARY_INSTALL_TYPE ARCHIVE ) -ELSE( ${FIELDML_NAMESPACE_NAME}_BUILD_STATIC_LIB ) - SET( LIBRARY_BUILD_TYPE SHARED ) - SET( LIBRARY_INSTALL_TYPE LIBRARY ) - IF( WIN32 ) - SET( LIBRARY_INSTALL_TYPE RUNTIME ) - ENDIF( WIN32 ) -ENDIF( ${FIELDML_NAMESPACE_NAME}_BUILD_STATIC_LIB ) - SET( FIELDML_API_SRCS src/ErrorContextAutostack.cpp src/Evaluators.cpp @@ -85,40 +69,29 @@ SET( FIELDML_API_PRIVATE_HDRS src/Util.h ) SET( FIELDML_API_PUBLIC_HDRS src/fieldml_api.h ) - -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" ) - SET_SOURCE_FILES_PROPERTIES(${FIELDML_API_SRCS} - PROPERTIES COMPILE_FLAGS "-fPIC") -endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" ) -SET( CMAKE_DEBUG_POSTFIX "d" ) -IF( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) - ADD_DEFINITIONS( -DDEBUG ) -ENDIF( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) -IF( WIN32 ) - ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) -ENDIF( WIN32 ) -FOREACH( DEF ${LIBXML2_DEFINITIONS} ) - ADD_DEFINITIONS( -D${DEF} ) -ENDFOREACH( DEF ${LIBXML2_DEFINITIONS} ) -SET( LIBXML2_DEFINITIONS ${LIBXML2_DEFINITIONS} PARENT_SCOPE ) -SET(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR}) -INCLUDE_DIRECTORIES( ${LIBXML2_INCLUDE_DIR} ) +#FOREACH( DEF ${LIBXML2_DEFINITIONS} ) +# ADD_DEFINITIONS( -D${DEF} ) +#ENDFOREACH( DEF ${LIBXML2_DEFINITIONS} ) +#S#ET(LIBXML2_DEFINITIONS ${LIBXML2_DEFINITIONS} PARENT_SCOPE) +#ET(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR}) +#INCLUDE_DIRECTORIES( ${LIBXML2_INCLUDE_DIR} ) # Create library -ADD_LIBRARY( ${LIBRARY_TARGET_NAME} ${LIBRARY_BUILD_TYPE} ${FIELDML_API_SRCS} ${FIELDML_API_PUBLIC_HDRS} ${FIELDML_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) -TARGET_LINK_LIBRARIES( ${LIBRARY_TARGET_NAME} ${LIBXML2_LIBRARIES} ) +add_library(fieldml-core ${LIBRARY_BUILD_TYPE} ${FIELDML_API_SRCS} ${FIELDML_API_PUBLIC_HDRS} + ${FIELDML_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS}) +target_link_libraries(fieldml-core xml2) +target_compile_definitions(fieldml-core PRIVATE $<$:DEBUG>) +if (WIN32) + target_compile_definitions(fieldml-core PRIVATE _CRT_SECURE_NO_WARNINGS) +endif() # Install targets -IF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) - SET_TARGET_PROPERTIES(${LIBRARY_TARGET_NAME} PROPERTIES IMPORT_SUFFIX _dll.lib) - INSTALL( TARGETS ${LIBRARY_TARGET_NAME} ARCHIVE - DESTINATION lib ) -ENDIF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) - -# Define install rules -INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-targets ${LIBRARY_INSTALL_TYPE} - DESTINATION lib ) -INSTALL( FILES ${FIELDML_API_PUBLIC_HDRS} - DESTINATION include ) +if(WIN32 AND BUILD_SHARED_LIBS) + SET_TARGET_PROPERTIES(fieldml-core PROPERTIES IMPORT_SUFFIX _dll.lib) +endif() +install(TARGETS fieldml-core + EXPORT fieldml-api-config + DESTINATION lib) +install(FILES ${FIELDML_API_PUBLIC_HDRS} DESTINATION include) diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index 37bc76b..b9175b6 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -35,62 +35,10 @@ # # ***** END LICENSE BLOCK ***** */ -PROJECT( io ) - -OPTION_WITH_DEFAULT( FIELDML_USE_HDF5 "Do you want to use netgen?" FALSE ) -SET( HDF5_USE_MPI FALSE ) -SET( HDF5_INCLUDE_DIRS "" ) -SET( HDF5_MINE_LIBRARIES "" ) -SET( MPI_INCLUDE_DIRS "" ) -SET( MPI_MINE_LIBRARIES "" ) - -IF( FIELDML_USE_HDF5 ) - FIND_PACKAGE( HDF5 REQUIRED C ) - SET( HDF5_USE_MPI ${HDF5_ENABLE_PARALLEL} ) - IF ( HDF5_USE_MPI ) - FIND_PACKAGE( MPI REQUIRED ) - ENDIF (HDF5_USE_MPI) - ADD_DEFINITIONS( -DFIELDML_HDF5_ARRAY ) - SET( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${FIELDML_HDF5_ARRAY_DEFINE} ) - SET( CMAKE ${CMAKE_C_FLAGS} ${FIELDML_HDF5_ARRAY_DEFINE} ) -ENDIF( FIELDML_USE_HDF5 ) - -IF( ${FIELDML_NAMESPACE_NAME}_BUILD_STATIC_LIB ) - SET( LIBRARY_BUILD_TYPE STATIC ) - SET( LIBRARY_INSTALL_TYPE ARCHIVE ) -ELSE( ${FIELDML_NAMESPACE_NAME}_BUILD_STATIC_LIB ) - SET( LIBRARY_BUILD_TYPE SHARED ) - SET( LIBRARY_INSTALL_TYPE LIBRARY ) - IF( WIN32 ) - SET( LIBRARY_INSTALL_TYPE RUNTIME ) - ENDIF( WIN32 ) -ENDIF( ${FIELDML_NAMESPACE_NAME}_BUILD_STATIC_LIB ) - -IF( FIELDML_USE_HDF5 ) - IF( HDF5_FOUND ) - SET( HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR} ) - SET( HDF5_MINE_LIBRARIES ${HDF5_LIBRARIES} ) - SET( DEPENDENT_LIBS ${DEPENDENT_LIBS} ${HDF5_MINE_LIBRARIES} ) - SET( INCLUDE_DIRS ${INCLUDE_DIRS} ${HDF5_INCLUDE_DIRS} ) - IF( HDF5_USE_MPI ) - IF( MPI_FOUND ) - SET( MPI_INCLUDE_DIRS ${MPI_INCLUDE_PATH} ) - SET( MPI_MINE_LIBRARIES ${MPI_LIBRARIES} ) - SET( DEPENDENT_LIBS ${DEPENDENT_LIBS} ${MPI_MINE_LIBRARIES} ) - SET( INCLUDE_DIRS ${INCLUDE_DIRS} ${MPI_INCLUDE_DIRS} ) - ELSE( MPI_FOUND ) - MESSAGE( FATAL_ERROR "MPI was requested but not found." ) - ENDIF( MPI_FOUND ) - ADD_DEFINITIONS( -DFIELDML_PHDF5_ARRAY ) - SET( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${FIELDML_PHDF5_ARRAY_DEFINE} ) - SET( CMAKE ${CMAKE_C_FLAGS} ${FIELDML_PHDF5_ARRAY_DEFINE} ) - ENDIF( HDF5_USE_MPI ) - ELSE( HDF5_FOUND ) - MESSAGE( FATAL_ERROR "HDF5 was requested but not found." ) - ENDIF( HDF5_FOUND ) -ENDIF( FIELDML_USE_HDF5 ) - -SET( CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX} ) +#SET( HDF5_INCLUDE_DIRS "" ) +#SET( HDF5_MINE_LIBRARIES "" ) +#SET( MPI_INCLUDE_DIRS "" ) +#SET( MPI_MINE_LIBRARIES "" ) SET( FIELDML_IO_API_SRCS src/ArrayDataReader.cpp @@ -120,35 +68,44 @@ SET( FIELDML_IO_API_PUBLIC_HDRS src/FieldmlIoApi.h ) SET( FIELDML_API_PUBLIC_HDRS ../core/src ) - -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" ) - SET_SOURCE_FILES_PROPERTIES(${FIELDML_IO_API_SRCS} - PROPERTIES COMPILE_FLAGS "-fPIC") -endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" ) -SET( CMAKE_DEBUG_POSTFIX "d" ) -IF( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) - ADD_DEFINITIONS( -DDEBUG ) -ENDIF( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) -IF( WIN32 ) - ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) -ENDIF( WIN32 ) -INCLUDE_DIRECTORIES( ${FIELDML_API_PUBLIC_HDRS} ${HDF5_INCLUDE_DIRS} ${MPI_INCLUDE_DIRS} ) +#INCLUDE_DIRECTORIES( ${FIELDML_API_PUBLIC_HDRS} ${HDF5_INCLUDE_DIRS} ${MPI_INCLUDE_DIRS} ) # Create library -ADD_LIBRARY( ${LIBRARY_TARGET_NAME} ${LIBRARY_BUILD_TYPE} ${FIELDML_IO_API_SRCS} ${FIELDML_IO_API_PUBLIC_HDRS} ${FIELDML_IO_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) -TARGET_LINK_LIBRARIES( ${LIBRARY_TARGET_NAME} ${HDF5_MINE_LIBRARIES} ${MPI_MINE_LIBRARIES} ) +add_library(fieldml-io ${LIBRARY_BUILD_TYPE} ${FIELDML_IO_API_SRCS} ${FIELDML_IO_API_PUBLIC_HDRS} ${FIELDML_IO_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) +target_link_libraries(fieldml-io ${HDF5_MINE_LIBRARIES} ${MPI_MINE_LIBRARIES}) +target_include_directories(fieldml-io PRIVATE ../core/src) +target_compile_definitions(fieldml-io PRIVATE $<$:DEBUG>) +if (WIN32) + target_compile_definitions(fieldml-io PRIVATE _CRT_SECURE_NO_WARNINGS) +endif() + +if(USE_HDF5) + find_package(HDF5 REQUIRED C) + target_compile_definitions(fieldml-io PUBLIC FIELDML_HDF5_ARRAY) + SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${FIELDML_HDF5_ARRAY_DEFINE}) + #SET(HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) + #SET(HDF5_MINE_LIBRARIES ${HDF5_LIBRARIES}) + #SET(DEPENDENT_LIBS ${DEPENDENT_LIBS} ${HDF5_MINE_LIBRARIES}) + #SET(INCLUDE_DIRS ${INCLUDE_DIRS} ${HDF5_INCLUDE_DIRS} ) + if(HDF5_WITH_MPI) + find_package(MPI REQUIRED) + target_compile_definitions(fieldml-io PUBLIC FIELDML_PHDF5_ARRAY) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FIELDML_PHDF5_ARRAY_DEFINE}") + #SET( MPI_INCLUDE_DIRS ${MPI_INCLUDE_PATH} ) + #SET( MPI_MINE_LIBRARIES ${MPI_LIBRARIES} ) + #SET( DEPENDENT_LIBS ${DEPENDENT_LIBS} ${MPI_MINE_LIBRARIES} ) + #SET( INCLUDE_DIRS ${INCLUDE_DIRS} ${MPI_INCLUDE_DIRS} ) + endif() +endif() # Install targets -IF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) - SET_TARGET_PROPERTIES(${LIBRARY_TARGET_NAME} PROPERTIES IMPORT_SUFFIX _dll.lib) - INSTALL( TARGETS ${LIBRARY_TARGET_NAME} ARCHIVE - DESTINATION lib ) -ENDIF( WIN32 AND NOT ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_STATIC_LIB ) +if(WIN32 AND BUILD_SHARED_LIBS) + SET_TARGET_PROPERTIES(fieldml PROPERTIES IMPORT_SUFFIX _dll.lib) +endif() -# Define install rules -INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-api-config ${LIBRARY_INSTALL_TYPE} - DESTINATION lib ) -INSTALL( FILES ${FIELDML_IO_API_PUBLIC_HDRS} - DESTINATION include ) +INSTALL(TARGETS fieldml-io + EXPORT fieldml-api-config + DESTINATION lib) +INSTALL(FILES ${FIELDML_IO_API_PUBLIC_HDRS} DESTINATION include) From 6bc7395baabddca0bf17be9b360fedf2d70ca963 Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 11 Jun 2015 13:41:11 +0200 Subject: [PATCH 04/14] rewrote cmakefiles so that the fortran bindings are generated and installed automatically tests are now running (run as normal executables) --- CMakeLists.txt | 47 ++++--- Fortran/InterfaceGen.py | 11 +- cmake/FortranBindings.cmake | 26 ++++ .../JavaBindings.cmake | 0 io/CMakeLists.txt | 4 +- test/CMakeLists.txt | 115 ++++++------------ test/src/fieldml_test.cpp | 4 +- 7 files changed, 108 insertions(+), 99 deletions(-) create mode 100644 cmake/FortranBindings.cmake rename JavaBindings.cmake => cmake/JavaBindings.cmake (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0eb4704..fdfd04e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,17 +40,30 @@ CMAKE_MINIMUM_REQUIRED( VERSION 3.0 ) # Set this namespace to keep these options seperate from other project options SET( FIELDML_NAMESPACE_NAME FIELDML ) -PROJECT(fieldml VERSION 0.5.0 LANGUAGES CXX Fortran) +PROJECT(fieldml VERSION 0.5.0 LANGUAGES CXX) option(USE_HDF5 "Do you want to use netgen (HDF5)?" NO) option(HDF5_WITH_MPI "Do you want to use MPI with HDF5?" NO) option(BUILD_TESTS "Build tests" ON) +option(FORTRAN_BINDINGS "Do you want to build the Fortran bindings" YES) option(JAVA_BINDINGS "Do you want to build the Java bindings" NO) set(PACKAGE_CONFIG_DIR "lib/cmake" CACHE STRING "Directory for package config files (relative to CMAKE_INSTALL_PREFIX)") # Further options: # CMAKE_POSITION_INDEPENDENT_CODE=YES for -fPIC constant (is also passed in from OpenCMISS-main build script) FIND_PACKAGE(LibXml2 REQUIRED) +if(USE_HDF5) + # See the FindHDF5 description + if (BUILD_SHARED_LIBS) + set(HDF5_USE_STATIC_LIBRARIES NO) + else() + set(HDF5_USE_STATIC_LIBRARIES YES) + endif() + find_package(HDF5 REQUIRED CXX) + if(HDF5_WITH_MPI) + find_package(MPI REQUIRED) + endif() +endif() if (NOT CMAKE_DEBUG_POSTFIX) SET(CMAKE_DEBUG_POSTFIX d) @@ -59,30 +72,30 @@ endif() # Add actual fieldml code and io add_subdirectory(core) add_subdirectory(io) -#GET_DIRECTORY_PROPERTY(HDF5_INCLUDE_DIRS DIRECTORY io DEFINITION HDF5_INCLUDE_DIRS) -#GET_DIRECTORY_PROPERTY(HDF5_MINE_LIBRARIES DIRECTORY io DEFINITION HDF5_MINE_LIBRARIES) -#GET_DIRECTORY_PROPERTY(MPI_LIBRARIES DIRECTORY io DEFINITION MPI_MINE_LIBRARIES) -#GET_DIRECTORY_PROPERTY(MPI_INCLUDE_DIRS DIRECTORY io DEFINITION MPI_INCLUDE_DIRS) -#GET_DIRECTORY_PROPERTY(HDF5_USE_MPI DIRECTORY io DEFINITION HDF5_USE_MPI) -if (BUILD_TESTS) - add_subdirectory(test) -endif() -#FOREACH(_ARG ${MPI_LIBRARIES}) -# SET(MPI_MINE_LIBRARIES "${M#PI_MINE_LIBRARIES} ${_ARG}") -#ENDFOREACH() - -if(JAVA_BINDINGS) - include(${CMAKE_CURRENT_SOURCE_DIR}/JavaBindings.cmake) +if (FORTRAN_BINDINGS) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/FortranBindings.cmake) endif() # Create interface library for easy inclusion add_library(fieldml-api INTERFACE) target_link_libraries(fieldml-api INTERFACE fieldml-core fieldml-io) +if (HAVE_Fortran_BINDINGS) + target_link_libraries(fieldml-api INTERFACE fieldml-fortran) +endif() install(TARGETS fieldml-api EXPORT fieldml-api-config) -INCLUDE(CMakePackageConfigHelpers) -INSTALL(EXPORT fieldml-api-config +# Tests +if (BUILD_TESTS) + add_subdirectory(test) +endif() + +if(JAVA_BINDINGS) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/JavaBindings.cmake) +endif() + +include(CMakePackageConfigHelpers) +install(EXPORT fieldml-api-config DESTINATION ${PACKAGE_CONFIG_DIR}) WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake COMPATIBILITY AnyNewerVersion) diff --git a/Fortran/InterfaceGen.py b/Fortran/InterfaceGen.py index a276e4e..711b86b 100644 --- a/Fortran/InterfaceGen.py +++ b/Fortran/InterfaceGen.py @@ -291,5 +291,14 @@ def processFiles(): expose( ParseState.defines ) writeFooter() - + +import sys + +if (len(sys.argv) < 2): + filename = 'fieldml_fortran.f90' +else: + filename = sys.argv[1] +f = file(filename, 'w') +sys.stdout = f processFiles() +f.close() diff --git a/cmake/FortranBindings.cmake b/cmake/FortranBindings.cmake new file mode 100644 index 0000000..2bb9631 --- /dev/null +++ b/cmake/FortranBindings.cmake @@ -0,0 +1,26 @@ +# C-Bindings extra target +find_package(PythonInterp QUIET) +set(HAVE_Fortran_BINDINGS FALSE) +if (PYTHONINTERP_FOUND) + set(HAVE_Fortran_BINDINGS TRUE) + enable_language(Fortran) + set(FIELDML_FORTRAN ${CMAKE_CURRENT_BINARY_DIR}/fieldml_fortran.f90) + + # Generate the file + add_custom_command(OUTPUT ${FIELDML_FORTRAN} + COMMAND ${PYTHON_EXECUTABLE} InterfaceGen.py ${FIELDML_FORTRAN} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Fortran) + + # Compile module and lib + SET(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/fortran_modules) + add_library(fieldml-fortran ${FIELDML_FORTRAN}) + + # install stuff + install(TARGETS fieldml-fortran + EXPORT fieldml-api-config + DESTINATION lib) + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/fortran_modules/ + DESTINATION include) +else() + message(WARNING "No Python interpreter found. Unable to generate Fortran bindings for FieldML.") +endif() \ No newline at end of file diff --git a/JavaBindings.cmake b/cmake/JavaBindings.cmake similarity index 100% rename from JavaBindings.cmake rename to cmake/JavaBindings.cmake diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index b9175b6..eec45e8 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -73,7 +73,6 @@ SET( FIELDML_API_PUBLIC_HDRS # Create library add_library(fieldml-io ${LIBRARY_BUILD_TYPE} ${FIELDML_IO_API_SRCS} ${FIELDML_IO_API_PUBLIC_HDRS} ${FIELDML_IO_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) -target_link_libraries(fieldml-io ${HDF5_MINE_LIBRARIES} ${MPI_MINE_LIBRARIES}) target_include_directories(fieldml-io PRIVATE ../core/src) target_compile_definitions(fieldml-io PRIVATE $<$:DEBUG>) if (WIN32) @@ -81,15 +80,14 @@ if (WIN32) endif() if(USE_HDF5) - find_package(HDF5 REQUIRED C) target_compile_definitions(fieldml-io PUBLIC FIELDML_HDF5_ARRAY) + target_link_libraries(fieldml-io PUBLIC ${HDF5_CXX_LIBRARIES}) SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${FIELDML_HDF5_ARRAY_DEFINE}) #SET(HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) #SET(HDF5_MINE_LIBRARIES ${HDF5_LIBRARIES}) #SET(DEPENDENT_LIBS ${DEPENDENT_LIBS} ${HDF5_MINE_LIBRARIES}) #SET(INCLUDE_DIRS ${INCLUDE_DIRS} ${HDF5_INCLUDE_DIRS} ) if(HDF5_WITH_MPI) - find_package(MPI REQUIRED) target_compile_definitions(fieldml-io PUBLIC FIELDML_PHDF5_ARRAY) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FIELDML_PHDF5_ARRAY_DEFINE}") #SET( MPI_INCLUDE_DIRS ${MPI_INCLUDE_PATH} ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e1027b4..1ac98e3 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -35,80 +35,41 @@ # # ***** END LICENSE BLOCK ***** */ -SET( CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX} ) -FIND_PACKAGE( ZLIB QUIET ) - -SET( TEST_EXE_SRCS src/fieldml_test.cpp ) -SET( TEST_EXE_TARGET_NAME fieldml_test ) - -IF ( HDF5_USE_MPI ) - SET( TEST_PHDF5_EXE_SRCS src/fieldml_phdf5_test.cpp ) - SET( TEST_PHDF5_EXE_TARGET_NAME fieldml_phdf5_test ) -ENDIF (HDF5_USE_MPI) - -SET( SIMPLE_TEST_SRCS src/SimpleTest.cpp ) -SET( SIMPLE_TEST_HDRS src ) - -SET( TEST_ARRAY_READING_EXE_SRCS src/FieldmlTestArrayReading.cpp ) -SET( TEST_ARRAY_READING_EXE_TARGET_NAME fieldml_test_array_reading ) - -SET( TEST_CREATE_EXE_SRCS src/FieldmlTestCreate.cpp ) -SET( TEST_CREATE_EXE_TARGET_NAME fieldml_test_create ) - -SET( FIELDML_API_PUBLIC_HDRS ../core/src ) -SET( FIELDML_IO_API_PUBLIC_HDRS ../io/src ) -SET( INPUT_RESOURCES input/I16BE.h5 ) -SET( OUTPUT_RESOURCES output/visualisation.cmiss ) - -IF( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST ) - OPTION_WITH_DEFAULT( BUILD_TEST_WITH_SZLIB "Build test application with SZLIB" FALSE ) - IF( BUILD_TEST_WITH_SZLIB ) - FIND_PATH(SZIP_INCLUDE_DIR szlib.h - NO_DEFAULT_PATH - ) - FIND_LIBRARY(SZIP_LIBRARY NAMES szip - NO_DEFAULT_PATH - ) - SET( SZIP_INCLUDE_DIR ${SZIP_INCLUDE_DIR} ) - SET( SZIP_LIBRARY ${SZIP_LIBRARY} ) - ENDIF( BUILD_TEST_WITH_SZLIB ) - - INCLUDE_DIRECTORIES( ${FIELDML_API_PUBLIC_HDRS} ${FIELDML_IO_API_PUBLIC_HDRS} ${SIMPLE_TEST_HDRS} ${MPI_INCLUDE_DIRS} ) - - ADD_EXECUTABLE( ${TEST_EXE_TARGET_NAME} ${TEST_EXE_SRCS} ) -IF ( HDF5_USE_MPI ) - ADD_EXECUTABLE( ${TEST_PHDF5_EXE_TARGET_NAME} ${TEST_PHDF5_EXE_SRCS} ) -ENDIF ( HDF5_USE_MPI ) - IF( WIN32 ) - ADD_EXECUTABLE( ${TEST_ARRAY_READING_EXE_TARGET_NAME} ${SIMPLE_TEST_SRCS} ${TEST_ARRAY_READING_EXE_SRCS} ) - ADD_EXECUTABLE( ${TEST_CREATE_EXE_TARGET_NAME} ${SIMPLE_TEST_SRCS} ${TEST_CREATE_EXE_SRCS} ) - ELSE( WIN32 ) - ADD_EXECUTABLE( ${TEST_ARRAY_READING_EXE_TARGET_NAME} ${TEST_ARRAY_READING_EXE_SRCS} ${SIMPLE_TEST_SRCS} ) - ADD_EXECUTABLE( ${TEST_CREATE_EXE_TARGET_NAME} ${TEST_CREATE_EXE_SRCS} ${SIMPLE_TEST_SRCS} ) - ENDIF( WIN32 ) - TARGET_LINK_LIBRARIES( ${TEST_EXE_TARGET_NAME} ${FIELDML_API_LIBRARY_TARGET_NAME} ${FIELDML_IO_API_LIBRARY_TARGET_NAME} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARIES} ${HDF5_LIBRARY} ${SZIP_LIBRARY} ) -IF ( HDF5_USE_MPI ) - TARGET_LINK_LIBRARIES( ${TEST_PHDF5_EXE_TARGET_NAME} ${FIELDML_API_LIBRARY_TARGET_NAME} ${FIELDML_IO_API_LIBRARY_TARGET_NAME} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARIES} ${HDF5_LIBRARY} ${SZIP_LIBRARY} ) -ENDIF ( HDF5_USE_MPI ) - TARGET_LINK_LIBRARIES( ${TEST_ARRAY_READING_EXE_TARGET_NAME} ${FIELDML_API_LIBRARY_TARGET_NAME} ${FIELDML_IO_API_LIBRARY_TARGET_NAME} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARIES} ${HDF5_LIBRARY} ${SZIP_LIBRARY} ) - TARGET_LINK_LIBRARIES( ${TEST_CREATE_EXE_TARGET_NAME} ${FIELDML_API_LIBRARY_TARGET_NAME} ${FIELDML_IO_API_LIBRARY_TARGET_NAME} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARIES} ${HDF5_LIBRARY} ${SZIP_LIBRARY} ) - - INSTALL( TARGETS ${TEST_EXE_TARGET_NAME} EXPORT fieldml-targets - ${LIBRARY_INSTALL_TYPE} - DESTINATION test ) -IF ( HDF5_USE_MPI ) - INSTALL( TARGETS ${TEST_PHDF5_EXE_TARGET_NAME} EXPORT fieldml-targets - ${LIBRARY_INSTALL_TYPE} - DESTINATION test ) -ENDIF ( HDF5_USE_MPI ) - INSTALL( TARGETS ${TEST_ARRAY_READING_EXE_TARGET_NAME} EXPORT fieldml-targets ${LIBRARY_INSTALL_TYPE} - DESTINATION test ) - INSTALL( TARGETS ${TEST_CREATE_EXE_TARGET_NAME} EXPORT fieldml-targets ${LIBRARY_INSTALL_TYPE} - DESTINATION test ) - - - INSTALL( FILES ${INPUT_RESOURCES} DESTINATION test/input ) - INSTALL( FILES ${OUTPUT_RESOURCES} DESTINATION test/output ) - - -ENDIF( ${UPPERCASE_LIBRARY_TARGET_NAME}_BUILD_TEST ) +#find_package(ZLIB ${ZLIB_VERSION} QUIET) + +add_executable(fieldml_test src/fieldml_test.cpp) +target_link_libraries(fieldml_test fieldml-api) +if (USE_HDF5) + target_link_libraries(fieldml_test ${HDF5_CXX_LIBRARIES}) + + if(HDF5_WITH_MPI) + add_executable(fieldml_test_phdf5 src/fieldml_phdf5_test.cpp) + target_link_libraries(fieldml_test_phdf5 fieldml-api ${HDF5_CXX_LIBRARIES}) + endif() +endif() + +add_executable(fieldml_simpletest src/SimpleTest.cpp) +target_link_libraries(fieldml_simpletest fieldml-api) + +add_executable(fieldml_test_array_reading src/FieldmlTestArrayReading.cpp src/SimpleTest.cpp) +target_link_libraries(fieldml_test_array_reading fieldml-api) + +add_executable(fieldml_test_create src/FieldmlTestCreate.cpp src/SimpleTest.cpp) +target_link_libraries(fieldml_test_create fieldml-api) + +option(BUILD_TEST_WITH_SZLIB "Build test application with SZLIB" FALSE) +if(BUILD_TEST_WITH_SZLIB) + FIND_PATH(SZIP_INCLUDE_DIR szlib.h + NO_DEFAULT_PATH + ) + FIND_LIBRARY(SZIP_LIBRARY NAMES szip + NO_DEFAULT_PATH + ) + SET( SZIP_INCLUDE_DIR ${SZIP_INCLUDE_DIR} ) + SET( SZIP_LIBRARY ${SZIP_LIBRARY} ) +endif() + +install(TARGETS fieldml_test fieldml_simpletest fieldml_test_array_reading fieldml_test_create + DESTINATION test) +install(DIRECTORY input DESTINATION test) +install(DIRECTORY output DESTINATION test) \ No newline at end of file diff --git a/test/src/fieldml_test.cpp b/test/src/fieldml_test.cpp index 145b9a9..2ab38a0 100644 --- a/test/src/fieldml_test.cpp +++ b/test/src/fieldml_test.cpp @@ -753,10 +753,12 @@ int main( int argc, char **argv ) testMisc(); testCycles(); - + +#ifdef FIELDML_HDF5_ARRAY testHdf5Read(); testHdf5Write(); +#endif return 0; } From 0250a65756283176d8bf925f1965d7008905e1ad Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 11 Jun 2015 14:44:30 +0200 Subject: [PATCH 05/14] now exporting include directories (only on interface target - need to see if single target inclusion will be required or not) some cleanup --- CMakeLists.txt | 4 +++- core/CMakeLists.txt | 7 ------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fdfd04e..599f5fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,7 +83,9 @@ target_link_libraries(fieldml-api INTERFACE fieldml-core fieldml-io) if (HAVE_Fortran_BINDINGS) target_link_libraries(fieldml-api INTERFACE fieldml-fortran) endif() -install(TARGETS fieldml-api EXPORT fieldml-api-config) +install(TARGETS fieldml-api + EXPORT fieldml-api-config + INCLUDES DESTINATION include) # Tests if (BUILD_TESTS) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index eb29c98..a9d7eb1 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -70,13 +70,6 @@ SET( FIELDML_API_PRIVATE_HDRS SET( FIELDML_API_PUBLIC_HDRS src/fieldml_api.h ) -#FOREACH( DEF ${LIBXML2_DEFINITIONS} ) -# ADD_DEFINITIONS( -D${DEF} ) -#ENDFOREACH( DEF ${LIBXML2_DEFINITIONS} ) -#S#ET(LIBXML2_DEFINITIONS ${LIBXML2_DEFINITIONS} PARENT_SCOPE) -#ET(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR}) -#INCLUDE_DIRECTORIES( ${LIBXML2_INCLUDE_DIR} ) - # Create library add_library(fieldml-core ${LIBRARY_BUILD_TYPE} ${FIELDML_API_SRCS} ${FIELDML_API_PUBLIC_HDRS} ${FIELDML_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS}) From 2ade29643fd24eead555176487f0038f4250d108 Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 11 Jun 2015 17:26:57 +0200 Subject: [PATCH 06/14] forgot to include include-directories for the build interface --- io/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index eec45e8..93eb047 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -73,7 +73,9 @@ SET( FIELDML_API_PUBLIC_HDRS # Create library add_library(fieldml-io ${LIBRARY_BUILD_TYPE} ${FIELDML_IO_API_SRCS} ${FIELDML_IO_API_PUBLIC_HDRS} ${FIELDML_IO_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) -target_include_directories(fieldml-io PRIVATE ../core/src) +target_include_directories(fieldml-io PUBLIC + $ + $) target_compile_definitions(fieldml-io PRIVATE $<$:DEBUG>) if (WIN32) target_compile_definitions(fieldml-io PRIVATE _CRT_SECURE_NO_WARNINGS) From c21ce2dbabef3b436d5571ef7406e627993851d4 Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Mon, 15 Jun 2015 10:53:29 +1200 Subject: [PATCH 07/14] Correct the indentation and make the print statements Python 3 compatible. --- Fortran/InterfaceGen.py | 608 ++++++++++++++++++++-------------------- 1 file changed, 304 insertions(+), 304 deletions(-) diff --git a/Fortran/InterfaceGen.py b/Fortran/InterfaceGen.py index 711b86b..9179687 100644 --- a/Fortran/InterfaceGen.py +++ b/Fortran/InterfaceGen.py @@ -1,304 +1,304 @@ -import datetime - -class ParseState: - InHeader, InStartEnum, InEnums, InEndEnum = range(4) - enumCounter = 0 - functions = [] - defines = [] - enums = [] - - -def expose( names ): - if( len( names ) == 0 ): - return - - line = " PUBLIC " + names[0][0] - enumCounter = 1 - while( enumCounter < len( names ) ): - if( len( line ) + len( names[enumCounter][0] ) > 120 ): - print line + ", &" - line = " & " - else: - line += ", " - line += names[enumCounter][0] - enumCounter += 1 - - print line - print - - -def declareFunction( name, types, names ): - line = " FUNCTION " + name + "(" - if( len( names ) > 0 ): - line += " " + names[0] - for n in names[1:]: - line += ", " + n - line += " ) &" - - print line - print " & BIND(C,NAME=\""+ name + "\")" -# print " USE TYPES" - print " USE ISO_C_BINDING" - - for i, p in enumerate( types ): - if( p == "char" ): - print " CHARACTER(KIND=C_CHAR) :: " + names[i] - elif( p == "char*" ): - print " CHARACTER(KIND=C_CHAR) :: " + names[i] + "(*)" - elif( p == "int*" ) or ( p == "double*"): - print " TYPE(C_PTR), VALUE :: " + names[i] - else: - print " INTEGER(C_INT), VALUE :: " + names[i] - - print " INTEGER(C_INT) :: " + name - print " END FUNCTION " + name - - -def declareConstant( name, value ): - print " INTEGER(C_INT), PARAMETER :: " + name + " =", - print value - - -def writeHeader(): - now = datetime.datetime.now() - - print "!This file was automatically generated from fieldml_api.h on " + now.strftime("%Y-%m-%d %H:%M") - print "MODULE FIELDML_API" - print "" - print " USE ISO_C_BINDING" - print "" - print " IMPLICIT NONE" - print "" - -def writeFooter(): - print "END MODULE FIELDML_API" - -def processFunction( line ): - #Don't need to process functions returning char* or int*, those aren't usable by Fortran. - if( ( line.find( "char*" ) == 0 ) or ( line.find( "char *" ) == 0 ) or ( line.find( "const char *" ) == 0 ) ): - return - if( ( line.find( "int*" ) == 0 ) or ( line.find( "int *" ) == 0 ) or ( line.find( "const int *" ) == 0 ) ): - return - - fStart = line.find( " " ) - if( fStart == -1 ): - return - - fEnd = line.find( "(" ) - if( fEnd == -1 ): - return - - pEnd = line.find( ")" ) - if( pEnd == -1 ): - return - - fName = line[ fStart+1 : fEnd ] - - rawParams = line[ fEnd+1 : pEnd-1 ].strip().split() - - types = [] - names = [] - type = "" - - isType = True - - for i, p in enumerate( rawParams ): - pos = p.find( "," ) - if( pos != -1 ): - p = p[ 0 : pos ] - - if p == "*": - type = type + "*" - continue - if p == "const": - continue - - pos = p.find( "*" ) - if( pos == 0 ): - type = type + "*" - p = p[ 1 : len(p) ] - - if( isType ): - type = p.strip() - isType = False - else: - types.append( type ) - names.append( p.strip() ) - isType = True - - ParseState.functions.append( [ fName, types, names ] ) - - -def processDefine( line ): - pos = line.find( " " ) - if( pos == -1 ): - return - - name = line[ 0 : pos ].strip() - value = line [ pos + 1 : ].strip() - - ParseState.defines.append( [ name, value ] ) - - -def processEnums( line ): - lastPos = 0 - pos = line.find( ",", lastPos ) - while( pos != -1 ): - name = line[ lastPos : pos ].strip() - if( len( name ) != 0 ): - ParseState.enums[len( ParseState.enums ) - 1].append( [ name, ParseState.enumCounter ] ) - ParseState.enumCounter += 1 - lastPos = pos + 1 - pos = line.find( ",", lastPos ) - - name = line[ lastPos : ].strip() - if( len( name ) != 0 ): - ParseState.enums[len( ParseState.enums ) - 1].append( [ name, ParseState.enumCounter ] ) - ParseState.enumCounter += 1 - -def processLine( line, state ): - pos = line.find( "//" ) - if( pos != -1 ): - line = line[ 0 : pos ] - line = line.strip() - - if( len( line ) == 0 ): - return state - - if( state == ParseState.InHeader ): - - #Current code assumes all function declarations are single-line - if( line.find( ");" ) != -1 ): - processFunction( line ) - return ParseState.InHeader - - #Current code assumes all function declarations are single-line - if( line.find( "#define " ) == 0 ): - processDefine( line[ 8 : ] ) - return ParseState.InHeader - - if( line.find( "enum" ) == 0 ): - ParseState.enumCounter = 0 - ParseState.enums.append( [] ) - return processLine( line, ParseState.InStartEnum ) - - if( state == ParseState.InStartEnum ): - pos = line.find( "{" ) - if( pos != -1 ): - return processLine( line[ pos + 1 : ], ParseState.InEnums ) - - if( state == ParseState.InEnums ): - pos = line.find( "}" ) - if( pos != -1 ): - processEnums( line[ 0 : pos ] ) - return processLine( line[ pos + 1 : ], ParseState.InEndEnum ) - else: - processEnums( line ) - - if( state == ParseState.InEndEnum ): - pos = line.find( ";" ) - if( pos != -1 ): - return ParseState.InHeader - - return state - - -def processFiles(): - headerFile = open( "../core/src/fieldml_api.h" ) - - state = ParseState.InHeader - inComment = False - - for line in headerFile: - startSegment = 0 - - if( inComment ): - pos = line.find( "*/" ) - if( pos == -1 ): - continue - inComment = False - startSegment = pos + 2 - - #Does not cope with mixing line and block comments. - endSegment = line.find( "/*", startSegment ) - while( endSegment != -1 ): - state = processLine( line[ startSegment : endSegment ], state ) - startSegment = line.find( "*/", endSegment + 2 ) - if( startSegment == -1 ): - break - endSegment = line.find( "/*", startSegment ) - - if( startSegment == -1 ): - inComment = True - else: - state = processLine( line[ startSegment : ], state ) - - headerFile.close() - - headerFile = open( "../io/src/FieldmlIoApi.h" ) - - state = ParseState.InHeader - inComment = False - - for line in headerFile: - startSegment = 0 - - if( inComment ): - pos = line.find( "*/" ) - if( pos == -1 ): - continue - inComment = False - startSegment = pos + 2 - - #Does not cope with mixing line and block comments. - endSegment = line.find( "/*", startSegment ) - while( endSegment != -1 ): - state = processLine( line[ startSegment : endSegment ], state ) - startSegment = line.find( "*/", endSegment + 2 ) - if( startSegment == -1 ): - break - endSegment = line.find( "/*", startSegment ) - - if( startSegment == -1 ): - inComment = True - else: - state = processLine( line[ startSegment : ], state ) - - headerFile.close() - - - writeHeader() - - for d in ParseState.defines: - declareConstant( d[0], d[1] ) - print - - for enum in ParseState.enums: - for e in enum: - declareConstant( e[0], e[1] ) - print - - print " INTERFACE" - for f in ParseState.functions: - declareFunction( f[0], f[1], f[2] ) - print - print " END INTERFACE" - print - - expose( ParseState.functions ) - for e in ParseState.enums: - expose( e ) - expose( ParseState.defines ) - - writeFooter() - -import sys - -if (len(sys.argv) < 2): - filename = 'fieldml_fortran.f90' -else: - filename = sys.argv[1] -f = file(filename, 'w') -sys.stdout = f -processFiles() -f.close() +import datetime + +class ParseState: + InHeader, InStartEnum, InEnums, InEndEnum = list(range(4)) + enumCounter = 0 + functions = [] + defines = [] + enums = [] + + +def expose( names ): + if( len( names ) == 0 ): + return + + line = " PUBLIC " + names[0][0] + enumCounter = 1 + while( enumCounter < len( names ) ): + if( len( line ) + len( names[enumCounter][0] ) > 120 ): + print(line + ", &") + line = " & " + else: + line += ", " + line += names[enumCounter][0] + enumCounter += 1 + + print(line) + print() + + +def declareFunction( name, types, names ): + line = " FUNCTION " + name + "(" + if( len( names ) > 0 ): + line += " " + names[0] + for n in names[1:]: + line += ", " + n + line += " ) &" + + print(line) + print(" & BIND(C,NAME=\""+ name + "\")") +# print " USE TYPES" + print(" USE ISO_C_BINDING") + + for i, p in enumerate( types ): + if( p == "char" ): + print(" CHARACTER(KIND=C_CHAR) :: " + names[i]) + elif( p == "char*" ): + print(" CHARACTER(KIND=C_CHAR) :: " + names[i] + "(*)") + elif( p == "int*" ) or ( p == "double*"): + print(" TYPE(C_PTR), VALUE :: " + names[i]) + else: + print(" INTEGER(C_INT), VALUE :: " + names[i]) + + print(" INTEGER(C_INT) :: " + name) + print(" END FUNCTION " + name) + + +def declareConstant( name, value ): + print(" INTEGER(C_INT), PARAMETER :: " + name + " =", end=' ') + print(value) + + +def writeHeader(): + now = datetime.datetime.now() + + print("!This file was automatically generated from fieldml_api.h on " + now.strftime("%Y-%m-%d %H:%M")) + print("MODULE FIELDML_API") + print("") + print(" USE ISO_C_BINDING") + print("") + print(" IMPLICIT NONE") + print("") + +def writeFooter(): + print("END MODULE FIELDML_API") + +def processFunction( line ): + #Don't need to process functions returning char* or int*, those aren't usable by Fortran. + if( ( line.find( "char*" ) == 0 ) or ( line.find( "char *" ) == 0 ) or ( line.find( "const char *" ) == 0 ) ): + return + if( ( line.find( "int*" ) == 0 ) or ( line.find( "int *" ) == 0 ) or ( line.find( "const int *" ) == 0 ) ): + return + + fStart = line.find( " " ) + if( fStart == -1 ): + return + + fEnd = line.find( "(" ) + if( fEnd == -1 ): + return + + pEnd = line.find( ")" ) + if( pEnd == -1 ): + return + + fName = line[ fStart+1 : fEnd ] + + rawParams = line[ fEnd+1 : pEnd-1 ].strip().split() + + types = [] + names = [] + type = "" + + isType = True + + for i, p in enumerate( rawParams ): + pos = p.find( "," ) + if( pos != -1 ): + p = p[ 0 : pos ] + + if p == "*": + type = type + "*" + continue + if p == "const": + continue + + pos = p.find( "*" ) + if( pos == 0 ): + type = type + "*" + p = p[ 1 : len(p) ] + + if( isType ): + type = p.strip() + isType = False + else: + types.append( type ) + names.append( p.strip() ) + isType = True + + ParseState.functions.append( [ fName, types, names ] ) + + +def processDefine( line ): + pos = line.find( " " ) + if( pos == -1 ): + return + + name = line[ 0 : pos ].strip() + value = line [ pos + 1 : ].strip() + + ParseState.defines.append( [ name, value ] ) + + +def processEnums( line ): + lastPos = 0 + pos = line.find( ",", lastPos ) + while( pos != -1 ): + name = line[ lastPos : pos ].strip() + if( len( name ) != 0 ): + ParseState.enums[len( ParseState.enums ) - 1].append( [ name, ParseState.enumCounter ] ) + ParseState.enumCounter += 1 + lastPos = pos + 1 + pos = line.find( ",", lastPos ) + + name = line[ lastPos : ].strip() + if( len( name ) != 0 ): + ParseState.enums[len( ParseState.enums ) - 1].append( [ name, ParseState.enumCounter ] ) + ParseState.enumCounter += 1 + +def processLine( line, state ): + pos = line.find( "//" ) + if( pos != -1 ): + line = line[ 0 : pos ] + line = line.strip() + + if( len( line ) == 0 ): + return state + + if( state == ParseState.InHeader ): + + #Current code assumes all function declarations are single-line + if( line.find( ");" ) != -1 ): + processFunction( line ) + return ParseState.InHeader + + #Current code assumes all function declarations are single-line + if( line.find( "#define " ) == 0 ): + processDefine( line[ 8 : ] ) + return ParseState.InHeader + + if( line.find( "enum" ) == 0 ): + ParseState.enumCounter = 0 + ParseState.enums.append( [] ) + return processLine( line, ParseState.InStartEnum ) + + if( state == ParseState.InStartEnum ): + pos = line.find( "{" ) + if( pos != -1 ): + return processLine( line[ pos + 1 : ], ParseState.InEnums ) + + if( state == ParseState.InEnums ): + pos = line.find( "}" ) + if( pos != -1 ): + processEnums( line[ 0 : pos ] ) + return processLine( line[ pos + 1 : ], ParseState.InEndEnum ) + else: + processEnums( line ) + + if( state == ParseState.InEndEnum ): + pos = line.find( ";" ) + if( pos != -1 ): + return ParseState.InHeader + + return state + + +def processFiles(): + headerFile = open( "../core/src/fieldml_api.h" ) + + state = ParseState.InHeader + inComment = False + + for line in headerFile: + startSegment = 0 + + if( inComment ): + pos = line.find( "*/" ) + if( pos == -1 ): + continue + inComment = False + startSegment = pos + 2 + + #Does not cope with mixing line and block comments. + endSegment = line.find( "/*", startSegment ) + while( endSegment != -1 ): + state = processLine( line[ startSegment : endSegment ], state ) + startSegment = line.find( "*/", endSegment + 2 ) + if( startSegment == -1 ): + break + endSegment = line.find( "/*", startSegment ) + + if( startSegment == -1 ): + inComment = True + else: + state = processLine( line[ startSegment : ], state ) + + headerFile.close() + + headerFile = open( "../io/src/FieldmlIoApi.h" ) + + state = ParseState.InHeader + inComment = False + + for line in headerFile: + startSegment = 0 + + if( inComment ): + pos = line.find( "*/" ) + if( pos == -1 ): + continue + inComment = False + startSegment = pos + 2 + + #Does not cope with mixing line and block comments. + endSegment = line.find( "/*", startSegment ) + while( endSegment != -1 ): + state = processLine( line[ startSegment : endSegment ], state ) + startSegment = line.find( "*/", endSegment + 2 ) + if( startSegment == -1 ): + break + endSegment = line.find( "/*", startSegment ) + + if( startSegment == -1 ): + inComment = True + else: + state = processLine( line[ startSegment : ], state ) + + headerFile.close() + + + writeHeader() + + for d in ParseState.defines: + declareConstant( d[0], d[1] ) + print() + + for enum in ParseState.enums: + for e in enum: + declareConstant( e[0], e[1] ) + print() + + print(" INTERFACE") + for f in ParseState.functions: + declareFunction( f[0], f[1], f[2] ) + print() + print(" END INTERFACE") + print() + + expose( ParseState.functions ) + for e in ParseState.enums: + expose( e ) + expose( ParseState.defines ) + + writeFooter() + +import sys + +if (len(sys.argv) < 2): + filename = 'fieldml_fortran.f90' +else: + filename = sys.argv[1] +f = file(filename, 'w') +sys.stdout = f +processFiles() +f.close() From bab16bc51109f7239432a8d4ecd710a9fb39a0d7 Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Mon, 15 Jun 2015 12:39:49 +1200 Subject: [PATCH 08/14] Find a compromise between Python 2 and Python 3 regarding the print statement, also change 'file' to 'open'. --- Fortran/InterfaceGen.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Fortran/InterfaceGen.py b/Fortran/InterfaceGen.py index 9179687..accc9fd 100644 --- a/Fortran/InterfaceGen.py +++ b/Fortran/InterfaceGen.py @@ -24,7 +24,7 @@ def expose( names ): enumCounter += 1 print(line) - print() + print("") def declareFunction( name, types, names ): @@ -55,8 +55,7 @@ def declareFunction( name, types, names ): def declareConstant( name, value ): - print(" INTEGER(C_INT), PARAMETER :: " + name + " =", end=' ') - print(value) + print(" INTEGER(C_INT), PARAMETER :: " + name + " = " + str(value)) def writeHeader(): @@ -271,19 +270,19 @@ def processFiles(): for d in ParseState.defines: declareConstant( d[0], d[1] ) - print() + print("") for enum in ParseState.enums: for e in enum: declareConstant( e[0], e[1] ) - print() + print("") print(" INTERFACE") for f in ParseState.functions: declareFunction( f[0], f[1], f[2] ) - print() + print("") print(" END INTERFACE") - print() + print("") expose( ParseState.functions ) for e in ParseState.enums: @@ -298,7 +297,7 @@ def processFiles(): filename = 'fieldml_fortran.f90' else: filename = sys.argv[1] -f = file(filename, 'w') +f = open(filename, 'w') sys.stdout = f processFiles() f.close() From 6f22b462b16404b2c2dbdd49fe44d73a35913871 Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Wed, 24 Jun 2015 10:56:11 +0200 Subject: [PATCH 09/14] fixed naming of backup _IMPORT_PREFIX --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 599f5fe..454a5df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config- COMPATIBILITY AnyNewerVersion) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "include(CMakeFindDependencyMacro)\r\n" - "set(_OLD_IMPORT_PREFIX \${_IMPORT_PREFIX})\r\n" + "set(${PROJECT_NAME}_IMPORT_PREFIX \${_IMPORT_PREFIX})\r\n" ) file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "find_dependency(LibXml2 ${LIBXML2_VERSION})\r\n") if (USE_HDF5) @@ -113,7 +113,7 @@ if (JAVA_BINDINGS) # TODO #file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "find_dependency(OpenMP)\r\n") endif() -file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "set(_IMPORT_PREFIX \${_OLD_IMPORT_PREFIX})") +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake "set(_IMPORT_PREFIX \${${PROJECT_NAME}_IMPORT_PREFIX})") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-version.cmake ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake From d9c404482ad0cac553376db85fa0b74aad07d533 Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 27 Aug 2015 11:53:26 +0200 Subject: [PATCH 10/14] added eclipse project file --- .project | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .project diff --git a/.project b/.project new file mode 100644 index 0000000..bd81f3e --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + FieldML + + + + + + + + From e51dbe4e1bbe1e5ada41e754ddc46411feef9b7a Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Fri, 4 Sep 2015 11:41:14 +0200 Subject: [PATCH 11/14] lower case changes --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 454a5df..637bb32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,11 +36,11 @@ # ***** END LICENSE BLOCK ***** */ # Set the minimum version of cmake required to 3.0 -CMAKE_MINIMUM_REQUIRED( VERSION 3.0 ) +cmake_minimum_required( VERSION 3.0 ) # Set this namespace to keep these options seperate from other project options -SET( FIELDML_NAMESPACE_NAME FIELDML ) -PROJECT(fieldml VERSION 0.5.0 LANGUAGES CXX) +set( FIELDML_NAMESPACE_NAME FIELDML ) +project(fieldml VERSION 0.5.0 LANGUAGES CXX) option(USE_HDF5 "Do you want to use netgen (HDF5)?" NO) option(HDF5_WITH_MPI "Do you want to use MPI with HDF5?" NO) @@ -51,7 +51,7 @@ set(PACKAGE_CONFIG_DIR "lib/cmake" CACHE STRING "Directory for package config fi # Further options: # CMAKE_POSITION_INDEPENDENT_CODE=YES for -fPIC constant (is also passed in from OpenCMISS-main build script) -FIND_PACKAGE(LibXml2 REQUIRED) +find_package(LibXml2 REQUIRED) if(USE_HDF5) # See the FindHDF5 description if (BUILD_SHARED_LIBS) From 221e1e7a94758c4317ca964a3275a94448be756a Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Wed, 9 Sep 2015 15:57:45 +0200 Subject: [PATCH 12/14] removed library build type explicit declaration (was empty anyways) added correct link lib deps --- core/CMakeLists.txt | 2 +- io/CMakeLists.txt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a9d7eb1..ee3eac6 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -71,7 +71,7 @@ SET( FIELDML_API_PUBLIC_HDRS src/fieldml_api.h ) # Create library -add_library(fieldml-core ${LIBRARY_BUILD_TYPE} ${FIELDML_API_SRCS} ${FIELDML_API_PUBLIC_HDRS} +add_library(fieldml-core ${FIELDML_API_SRCS} ${FIELDML_API_PUBLIC_HDRS} ${FIELDML_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS}) target_link_libraries(fieldml-core xml2) target_compile_definitions(fieldml-core PRIVATE $<$:DEBUG>) diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index 93eb047..498ac69 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -72,7 +72,8 @@ SET( FIELDML_API_PUBLIC_HDRS #INCLUDE_DIRECTORIES( ${FIELDML_API_PUBLIC_HDRS} ${HDF5_INCLUDE_DIRS} ${MPI_INCLUDE_DIRS} ) # Create library -add_library(fieldml-io ${LIBRARY_BUILD_TYPE} ${FIELDML_IO_API_SRCS} ${FIELDML_IO_API_PUBLIC_HDRS} ${FIELDML_IO_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) +add_library(fieldml-io ${FIELDML_IO_API_SRCS} ${FIELDML_IO_API_PUBLIC_HDRS} ${FIELDML_IO_API_PRIVATE_HDRS} ${LIBRARY_WIN32_XTRAS} ) +target_link_libraries(fieldml-io PUBLIC fieldml-core) target_include_directories(fieldml-io PUBLIC $ $) @@ -101,7 +102,7 @@ endif() # Install targets if(WIN32 AND BUILD_SHARED_LIBS) - SET_TARGET_PROPERTIES(fieldml PROPERTIES IMPORT_SUFFIX _dll.lib) + SET_TARGET_PROPERTIES(fieldml-io PROPERTIES IMPORT_SUFFIX _dll.lib) endif() INSTALL(TARGETS fieldml-io From c72c6c34f91d0fe0e70961375b1f0f55e1aa8019 Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Thu, 21 Jan 2016 13:37:48 +1300 Subject: [PATCH 13/14] fix for environments without fortran --- CMakeLists.txt | 5 +++++ cmake/FortranBindings.cmake | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 637bb32..943452d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,11 +41,16 @@ cmake_minimum_required( VERSION 3.0 ) # Set this namespace to keep these options seperate from other project options set( FIELDML_NAMESPACE_NAME FIELDML ) project(fieldml VERSION 0.5.0 LANGUAGES CXX) +enable_language(Fortran OPTIONAL) option(USE_HDF5 "Do you want to use netgen (HDF5)?" NO) option(HDF5_WITH_MPI "Do you want to use MPI with HDF5?" NO) option(BUILD_TESTS "Build tests" ON) option(FORTRAN_BINDINGS "Do you want to build the Fortran bindings" YES) +if (FORTRAN_BINDINGS AND NOT CMAKE_Fortran_COMPILER) + set(FORTRAN_BINDINGS NO) + message(WARNING "No Fortran compiler found but FORTRAN_BINDINGS requested. Disabling.") +endif() option(JAVA_BINDINGS "Do you want to build the Java bindings" NO) set(PACKAGE_CONFIG_DIR "lib/cmake" CACHE STRING "Directory for package config files (relative to CMAKE_INSTALL_PREFIX)") # Further options: diff --git a/cmake/FortranBindings.cmake b/cmake/FortranBindings.cmake index 2bb9631..182a45a 100644 --- a/cmake/FortranBindings.cmake +++ b/cmake/FortranBindings.cmake @@ -3,7 +3,6 @@ find_package(PythonInterp QUIET) set(HAVE_Fortran_BINDINGS FALSE) if (PYTHONINTERP_FOUND) set(HAVE_Fortran_BINDINGS TRUE) - enable_language(Fortran) set(FIELDML_FORTRAN ${CMAKE_CURRENT_BINARY_DIR}/fieldml_fortran.f90) # Generate the file From ce894268d1d2d2895dbe1e6080622fe03109ba7b Mon Sep 17 00:00:00 2001 From: Daniel Wirtz Date: Fri, 29 Jan 2016 15:15:06 +1300 Subject: [PATCH 14/14] updated install location of fortran modules --- cmake/FortranBindings.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/FortranBindings.cmake b/cmake/FortranBindings.cmake index 182a45a..f0c8d91 100644 --- a/cmake/FortranBindings.cmake +++ b/cmake/FortranBindings.cmake @@ -18,8 +18,10 @@ if (PYTHONINTERP_FOUND) install(TARGETS fieldml-fortran EXPORT fieldml-api-config DESTINATION lib) - install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/fortran_modules/ - DESTINATION include) + install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/ + DESTINATION include + FILES_MATCHING PATTERN "fieldml_api.mod" + ) else() message(WARNING "No Python interpreter found. Unable to generate Fortran bindings for FieldML.") endif() \ No newline at end of file