diff --git a/.project b/.project
new file mode 100644
index 0000000..bd81f3e
--- /dev/null
+++ b/.project
@@ -0,0 +1,11 @@
+
+
+ FieldML
+
+
+
+
+
+
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0a59d22..943452d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,140 +34,92 @@
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK ***** */
-
-# Set the minimum version of cmake required to 2.6
-CMAKE_MINIMUM_REQUIRED( VERSION 2.6 )
-
-# Set this nampspace to keep these options seperate from other project options
-SET( FIELDML_NAMESPACE_NAME FIELDML )
-PROJECT(fieldml)
-
-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 )
-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" )
-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}_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 )
-
-# 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(arg ${MPI_LIBRARIES})
-
-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 )
-ENDIF( ${FIELDML_NAMESPACE_NAME}_INSTALL_CONFIG )
-
-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 ( FIELDML_BUILD_JAVA )
+# 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 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:
+# 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)
+endif()
+
+# Add actual fieldml code and io
+add_subdirectory(core)
+add_subdirectory(io)
+
+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
+ INCLUDES DESTINATION include)
+
+# 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)
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/fieldml-api-config-dependencies.cmake
+ "include(CMakeFindDependencyMacro)\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)
+ 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 \${${PROJECT_NAME}_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/Fortran/InterfaceGen.py b/Fortran/InterfaceGen.py
index a276e4e..accc9fd 100644
--- a/Fortran/InterfaceGen.py
+++ b/Fortran/InterfaceGen.py
@@ -1,295 +1,303 @@
-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()
-
-processFiles()
+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 + " = " + str(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 = open(filename, 'w')
+sys.stdout = f
+processFiles()
+f.close()
diff --git a/cmake/FortranBindings.cmake b/cmake/FortranBindings.cmake
new file mode 100644
index 0000000..f0c8d91
--- /dev/null
+++ b/cmake/FortranBindings.cmake
@@ -0,0 +1,27 @@
+# C-Bindings extra target
+find_package(PythonInterp QUIET)
+set(HAVE_Fortran_BINDINGS FALSE)
+if (PYTHONINTERP_FOUND)
+ set(HAVE_Fortran_BINDINGS TRUE)
+ 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_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
diff --git a/cmake/JavaBindings.cmake b/cmake/JavaBindings.cmake
new file mode 100644
index 0000000..eb6ae07
--- /dev/null
+++ b/cmake/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..ee3eac6 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,22 @@ 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} )
# 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 ${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 8cf9644..498ac69 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,45 @@ 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 ${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
+ $
+ $)
+target_compile_definitions(fieldml-io PRIVATE $<$:DEBUG>)
+if (WIN32)
+ target_compile_definitions(fieldml-io PRIVATE _CRT_SECURE_NO_WARNINGS)
+endif()
+
+if(USE_HDF5)
+ 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)
+ 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-io PROPERTIES IMPORT_SUFFIX _dll.lib)
+endif()
-# Define install rules
-INSTALL( TARGETS ${LIBRARY_TARGET_NAME} EXPORT fieldml-targets ${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)
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;
}