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; }