summaryrefslogtreecommitdiff
path: root/CMAKE/CheckFortranTypeSizes.cmake
blob: 585ca26e7209c8b15485ee78ee630bfb1e727d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# This module perdorms several try-compiles to determine the default integer
# size being used by the fortran compiler
#
# After execution, the following variables are set.  If they are un set then
# size detection was not possible
#
# 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_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 2011
#=============================================================================

# 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
         ${_TYPE_NAME}*${__TEST_SIZE}, TARGET :: a
         ${_TYPE_NAME}, POINTER :: pa
         pa => a
       END PROGRAM
")
    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()