CheckTypeSize.cmake 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # - Check sizeof a type
  2. # CHECK_TYPE_SIZE(TYPE VARIABLE)
  3. # Check if the type exists and determine size of type. if the type
  4. # exists, the size will be stored to the variable.
  5. # VARIABLE - variable to store size if the type exists.
  6. # HAVE_${VARIABLE} - does the variable exists or not
  7. # The following variables may be set before calling this macro to
  8. # modify the way the check is run:
  9. #
  10. # CMAKE_REQUIRED_FLAGS = string of compile command line flags
  11. # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
  12. # CMAKE_REQUIRED_INCLUDES = list of include directories
  13. # CMAKE_REQUIRED_LIBRARIES = list of libraries to link
  14. MACRO(CHECK_TYPE_SIZE TYPE VARIABLE)
  15. SET(CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 1)
  16. IF(NOT DEFINED ${VARIABLE})
  17. IF("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
  18. SET(CHECK_TYPE_SIZE_TYPE "${TYPE}")
  19. SET(MACRO_CHECK_TYPE_SIZE_FLAGS
  20. "${CMAKE_REQUIRED_FLAGS}")
  21. FOREACH(def HAVE_SYS_TYPES_H HAVE_STDINT_H HAVE_STDDEF_H)
  22. IF("${def}")
  23. SET(MACRO_CHECK_TYPE_SIZE_FLAGS
  24. "${MACRO_CHECK_TYPE_SIZE_FLAGS} -D${def}")
  25. ENDIF("${def}")
  26. ENDFOREACH(def)
  27. SET(CHECK_TYPE_SIZE_PREINCLUDE)
  28. SET(CHECK_TYPE_SIZE_PREMAIN)
  29. FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES})
  30. SET(CHECK_TYPE_SIZE_PREMAIN "${CHECK_TYPE_SIZE_PREMAIN}#include \"${def}\"\n")
  31. ENDFOREACH(def)
  32. CONFIGURE_FILE("${CMAKE_ROOT}/Modules/CheckTypeSize.c.in"
  33. "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c" IMMEDIATE @ONLY)
  34. FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
  35. CHECK_TYPE_SIZE_FILE_CONTENT)
  36. MESSAGE(STATUS "Check size of ${TYPE}")
  37. IF(CMAKE_REQUIRED_LIBRARIES)
  38. SET(CHECK_TYPE_SIZE_ADD_LIBRARIES
  39. "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
  40. ELSE(CMAKE_REQUIRED_LIBRARIES)
  41. SET(CHECK_TYPE_SIZE_ADD_LIBRARIES)
  42. ENDIF(CMAKE_REQUIRED_LIBRARIES)
  43. IF(CMAKE_REQUIRED_INCLUDES)
  44. SET(CHECK_TYPE_SIZE_ADD_INCLUDES
  45. "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
  46. ELSE(CMAKE_REQUIRED_INCLUDES)
  47. SET(CHECK_TYPE_SIZE_ADD_INCLUDES)
  48. ENDIF(CMAKE_REQUIRED_INCLUDES)
  49. TRY_RUN(${VARIABLE} HAVE_${VARIABLE}
  50. ${CMAKE_BINARY_DIR}
  51. "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
  52. COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
  53. CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_TYPE_SIZE_FLAGS}
  54. "${CHECK_TYPE_SIZE_ADD_LIBRARIES}"
  55. "${CHECK_TYPE_SIZE_ADD_INCLUDES}"
  56. OUTPUT_VARIABLE OUTPUT)
  57. IF(HAVE_${VARIABLE})
  58. MESSAGE(STATUS "Check size of ${TYPE} - done")
  59. FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  60. "Determining size of ${TYPE} passed with the following output:\n${OUTPUT}\n\n")
  61. ELSE(HAVE_${VARIABLE})
  62. MESSAGE(STATUS "Check size of ${TYPE} - failed")
  63. FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  64. "Determining size of ${TYPE} failed with the following output:\n${OUTPUT}\nCheckTypeSize.c:\n${CHECK_TYPE_SIZE_FILE_CONTENT}\n\n")
  65. ENDIF(HAVE_${VARIABLE})
  66. ENDIF("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
  67. ENDIF(NOT DEFINED ${VARIABLE})
  68. SET(CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS )
  69. ENDMACRO(CHECK_TYPE_SIZE)