Re-worked type-size checks to search for differnt sizes for different types
authorjulie <julielangou@users.noreply.github.com>
Sat, 26 Feb 2011 20:51:01 +0000 (20:51 +0000)
committerjulie <julielangou@users.noreply.github.com>
Sat, 26 Feb 2011 20:51:01 +0000 (20:51 +0000)
- Chuck Atkins (Kitware)

CMAKE/CheckFortranTypeSizes.cmake

index e7c6ad6b2e3dc66c4974c2efcf3135cd6f9f795b..9cc12ce172b5a0dd178f24c018f8341eb9448cd7 100644 (file)
@@ -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()