ENH: do not error when sunpro or mipspro fortran used
[cmake.git] / Modules / CheckTypeSize.cmake
blobcc5dcebce83dd118870709f91e4046282321fb8e
1 # - Check sizeof a type
2 #  CHECK_TYPE_SIZE(TYPE VARIABLE [BUILTIN_TYPES_ONLY])
3 # Check if the type exists and determine size of type.  if the type
4 # exists, the size will be stored to the variable. This also
5 # calls check_include_file for sys/types.h stdint.h
6 # and stddef.h, setting HAVE_SYS_TYPES_H, HAVE_STDINT_H, 
7 # and HAVE_STDDEF_H.  This is because many types are stored
8 # in these include files.  
9 #  VARIABLE - variable to store size if the type exists.
10 #  HAVE_${VARIABLE} - does the variable exists or not
11 #  BUILTIN_TYPES_ONLY - The third argument is optional and if 
12 #                       it is set to the string BUILTIN_TYPES_ONLY
13 #                       this macro will not check for any header files.
14 # The following variables may be set before calling this macro to
15 # modify the way the check is run:
17 #  CMAKE_REQUIRED_FLAGS = string of compile command line flags
18 #  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
19 #  CMAKE_REQUIRED_INCLUDES = list of include directories
20 #  CMAKE_REQUIRED_LIBRARIES = list of libraries to link
22 # These variables are referenced in CheckTypeSizeC.c so we have 
23 # to check for them.
25 include(CheckIncludeFile)
27 MACRO(CHECK_TYPE_SIZE TYPE VARIABLE)
28   IF(NOT "${ARGV2}" STREQUAL "BUILTIN_TYPES_ONLY")
29     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
30     check_include_file(stdint.h HAVE_STDINT_H)
31     check_include_file(stddef.h HAVE_STDDEF_H)
32   ENDIF(NOT "${ARGV2}" STREQUAL "BUILTIN_TYPES_ONLY")
33     
34   IF("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
35     MESSAGE(STATUS "Check size of ${TYPE}")
36     SET(CHECK_TYPE_SIZE_TYPE "${TYPE}")
37     SET(MACRO_CHECK_TYPE_SIZE_FLAGS
38       "${CMAKE_REQUIRED_FLAGS}")
39     FOREACH(def HAVE_SYS_TYPES_H HAVE_STDINT_H HAVE_STDDEF_H)
40       IF("${def}")
41         SET(MACRO_CHECK_TYPE_SIZE_FLAGS
42           "${MACRO_CHECK_TYPE_SIZE_FLAGS} -D${def}")
43       ENDIF("${def}")
44     ENDFOREACH(def)
45     SET(CHECK_TYPE_SIZE_PREINCLUDE)
46     SET(CHECK_TYPE_SIZE_PREMAIN)
47     SET(CHECK_TYPE_SIZE_ADD_LIBRARIES)
48     SET(CHECK_TYPE_SIZE_ADD_INCLUDES)
50     FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES})
51       SET(CHECK_TYPE_SIZE_PREMAIN "${CHECK_TYPE_SIZE_PREMAIN}#include \"${def}\"\n")
52     ENDFOREACH(def)
53     IF(CMAKE_REQUIRED_LIBRARIES)
54       SET(CHECK_TYPE_SIZE_ADD_LIBRARIES
55         "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
56     ENDIF(CMAKE_REQUIRED_LIBRARIES)
57     IF(CMAKE_REQUIRED_INCLUDES)
58       SET(CHECK_TYPE_SIZE_ADD_INCLUDES
59         "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
60     ENDIF(CMAKE_REQUIRED_INCLUDES)
62     CONFIGURE_FILE("${CMAKE_ROOT}/Modules/CheckTypeSizeC.c.in"
63       "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSizeC.c" IMMEDIATE @ONLY)
64     FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSizeC.c"
65       CHECK_TYPE_SIZE_FILE_CONTENT)
66     TRY_COMPILE(HAVE_${VARIABLE}
67       ${CMAKE_BINARY_DIR}
68       "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSizeC.c"
69       COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
70       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_TYPE_SIZE_FLAGS}
71       "${CHECK_TYPE_SIZE_ADD_LIBRARIES}"
72       "${CHECK_TYPE_SIZE_ADD_INCLUDES}"
73       OUTPUT_VARIABLE OUTPUT
74       COPY_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize.bin" )
76     IF(HAVE_${VARIABLE})
77       FILE(STRINGS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize.bin"
78         CMAKE_CHECKTYPESIZE_STRINGS LIMIT_COUNT 2 REGEX "INFO:sizeof")
80       SET(CMAKE_CHECKTYPESIZE_FIRST_RESULT "FIRST_LOOP")
81       FOREACH(info ${CMAKE_CHECKTYPESIZE_STRINGS})
82         IF("${info}" MATCHES ".*INFO:sizeof\\[0*([^]]*)\\].*")
83           STRING(REGEX REPLACE ".*INFO:sizeof\\[0*([^]]*)\\].*" "\\1" ${VARIABLE} "${info}")
84         ENDIF("${info}" MATCHES ".*INFO:sizeof\\[0*([^]]*)\\].*")
85         IF("${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "FIRST_LOOP")
86           SET(CMAKE_CHECKTYPESIZE_FIRST_RESULT "${${VARIABLE}}")
87         ENDIF("${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "FIRST_LOOP")
88         IF(NOT "${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "${${VARIABLE}}")
89           MESSAGE(SEND_ERROR "CHECK_TYPE_SIZE found different results, consider setting CMAKE_OSX_ARCHITECTURES or CMAKE_TRY_COMPILE_OSX_ARCHITECTURES to one or no architecture !")
90         ENDIF(NOT "${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "${${VARIABLE}}")
92       ENDFOREACH(info ${CMAKE_CHECKTYPESIZE_STRINGS})
93       MESSAGE(STATUS "Check size of ${TYPE} - done")
94       FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
95         "Determining size of ${TYPE} passed with the following output:\n${OUTPUT}\n\n")
96     ELSE(HAVE_${VARIABLE})
97       MESSAGE(STATUS "Check size of ${TYPE} - failed")
98       FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
99         "Determining size of ${TYPE} failed with the following output:\n${OUTPUT}\nCheckTypeSizeC.c:\n${CHECK_TYPE_SIZE_FILE_CONTENT}\n\n")
100       SET(${VARIABLE})
101     ENDIF(HAVE_${VARIABLE})
102     SET(${VARIABLE} "${${VARIABLE}}" CACHE INTERNAL "Result of CHECK_TYPE_SIZE" FORCE)
103   ENDIF("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
104 ENDMACRO(CHECK_TYPE_SIZE)