diff options
-rw-r--r-- | CMAKE/CheckFortranTypeSizes.cmake | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/CMAKE/CheckFortranTypeSizes.cmake b/CMAKE/CheckFortranTypeSizes.cmake index e7c6ad6b..9cc12ce1 100644 --- a/CMAKE/CheckFortranTypeSizes.cmake +++ b/CMAKE/CheckFortranTypeSizes.cmake @@ -4,44 +4,50 @@ # After execution, the following variables are set. If they are un set then # size detection was not possible # -# SIZEOF_CHARACTER - Number of bytes used to store the default CHARACTER type -# SIZEOF_LOGICAL - Number of bytes used to store the default LOGICAL type # SIZEOF_INTEGER - Number of bytes used to store the default INTEGER type # SIZEOF_REAL - Number of bytes used to store the default REAL type -# SIZEOF_COMPLEX - Number of bytes used to store the default COMPLEX type +# SIZEOF_LOGICAL - Number of bytes used to store the default LOGICAL type +# SIZEOF_CHARACTER - Number of bytes used to store the default CHARACTER type # #============================================================================= # Author: Chuck Atkins -# Copyright 2010 +# Copyright 2011 #============================================================================= -macro( CHECK_FORTRAN_TYPE_SIZES ) - if( NOT CMAKE_Fortran_COMPILER_SUPPORTS_F90 ) - message( FATAL_ERROR "Type size tests require Fortran 90 support" ) - endif() - foreach( _TEST_TYPE "CHARACTER" "LOGICAL" "INTEGER" "REAL" "COMPLEX" ) - string( REPLACE " " "_" _TEST_TYPE_VAR "${_TEST_TYPE}" ) - foreach( _TEST_SIZE 1 2 4 8 16 32 ) - set( _TEST_FILE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortran${_TEST_TYPE_VAR}Size${_TEST_SIZE}.f90 ) - file( WRITE ${_TEST_FILE} +# Check the size of a single fortran type +macro( _CHECK_FORTRAN_TYPE_SIZE _TYPE_NAME _TEST_SIZES ) + + foreach( __TEST_SIZE ${_TEST_SIZES} ) + set( __TEST_FILE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortran${_TYPE_NAME}Size${__TEST_SIZE}.f90 ) + file( WRITE ${__TEST_FILE} " PROGRAM check_size - ${_TEST_TYPE}*${_TEST_SIZE}, TARGET :: a - ${_TEST_TYPE}, POINTER :: pa + ${_TYPE_NAME}*${__TEST_SIZE}, TARGET :: a + ${_TYPE_NAME}, POINTER :: pa pa => a END PROGRAM ") - try_compile( SIZEOF_${_TEST_TYPE_VAR} ${CMAKE_BINARY_DIR} ${_TEST_FILE} ) - if( SIZEOF_${_TEST_TYPE_VAR} ) - message( STATUS "Testing default ${_TEST_TYPE}*${_TEST_SIZE} - found" ) - set( SIZEOF_${_TEST_TYPE_VAR} ${_TEST_SIZE} CACHE INTERNAL "Size of the default ${_TEST_TYPE} type" FORCE ) - break() - endif() - endforeach() - if( NOT SIZEOF_${_TEST_TYPE_VAR} ) - message( WARNING "Unable to determine default size of type ${_TEST_TYPE}" ) - unset( SIZEOF_${_TEST_TYPE_VAR} CACHE ) + try_compile( SIZEOF_${_TYPE_NAME} ${CMAKE_BINARY_DIR} ${__TEST_FILE} ) + if( SIZEOF_${_TYPE_NAME} ) + message( STATUS "Testing default ${_TYPE_NAME}*${__TEST_SIZE} - found" ) + set( SIZEOF_${_TYPE_NAME} ${__TEST_SIZE} CACHE INTERNAL "Size of the default ${_TYPE_NAME} type" FORCE ) + break() + else() + message( STATUS "Testing default ${_TYPE_NAME}*${__TEST_SIZE} -" ) endif() endforeach() + +endmacro() + + +macro( CHECK_FORTRAN_TYPE_SIZES ) + if( NOT CMAKE_Fortran_COMPILER_SUPPORTS_F90 ) + message( FATAL_ERROR "Type size tests require Fortran 90 support" ) + endif() + + _CHECK_FORTRAN_TYPE_SIZE( "INTEGER" "2;4;8;16" ) + _CHECK_FORTRAN_TYPE_SIZE( "REAL" "4;8;12;16" ) + _CHECK_FORTRAN_TYPE_SIZE( "LOGICAL" "1;2;4;8;16" ) + _CHECK_FORTRAN_TYPE_SIZE( "CHARACTER" "1;2;4;8;16" ) endmacro() |