2005-12-14 21:51:08 +03:00
# - Check sizeof a type
2005-12-15 18:41:19 +03:00
# CHECK_TYPE_SIZE(TYPE VARIABLE)
2002-12-30 19:02:31 +03:00
# Check if the type exists and determine size of type. if the type
# exists, the size will be stored to the variable.
2005-12-14 21:51:08 +03:00
# VARIABLE - variable to store size if the type exists.
# HAVE_${VARIABLE} - does the variable exists or not
2006-02-14 23:29:13 +03:00
# The following variables may be set before calling this macro to
# modify the way the check is run:
#
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
# CMAKE_REQUIRED_INCLUDES = list of include directories
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
2002-12-30 19:02:31 +03:00
MACRO ( CHECK_TYPE_SIZE TYPE VARIABLE )
2007-06-05 01:08:46 +04:00
IF ( "HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$" )
MESSAGE ( STATUS "Check size of ${TYPE}" )
SET ( CHECK_TYPE_SIZE_TYPE "${TYPE}" )
2007-06-07 21:51:17 +04:00
SET ( MACRO_CHECK_TYPE_SIZE_FLAGS
2007-06-05 01:08:46 +04:00
" $ { C M A K E _ R E Q U I R E D _ F L A G S } " )
FOREACH ( def HAVE_SYS_TYPES_H HAVE_STDINT_H HAVE_STDDEF_H )
IF ( "${def}" )
2007-06-07 21:51:17 +04:00
SET ( MACRO_CHECK_TYPE_SIZE_FLAGS
2007-06-05 01:08:46 +04:00
" $ { M A C R O _ C H E C K _ T Y P E _ S I Z E _ F L A G S } - D $ { d e f } " )
ENDIF ( "${def}" )
ENDFOREACH ( def )
SET ( CHECK_TYPE_SIZE_PREINCLUDE )
SET ( CHECK_TYPE_SIZE_PREMAIN )
SET ( CHECK_TYPE_SIZE_ADD_LIBRARIES )
SET ( CHECK_TYPE_SIZE_ADD_INCLUDES )
FOREACH ( def ${ CMAKE_EXTRA_INCLUDE_FILES } )
SET ( CHECK_TYPE_SIZE_PREMAIN "${CHECK_TYPE_SIZE_PREMAIN}#include \" ${ def } \"\n")
ENDFOREACH ( def )
IF ( CMAKE_REQUIRED_LIBRARIES )
2007-06-07 21:51:17 +04:00
SET ( CHECK_TYPE_SIZE_ADD_LIBRARIES
2007-06-05 01:08:46 +04:00
" - D L I N K _ L I B R A R I E S : S T R I N G = $ { C M A K E _ R E Q U I R E D _ L I B R A R I E S } " )
ENDIF ( CMAKE_REQUIRED_LIBRARIES )
IF ( CMAKE_REQUIRED_INCLUDES )
SET ( CHECK_TYPE_SIZE_ADD_INCLUDES
" - D I N C L U D E _ D I R E C T O R I E S : S T R I N G = $ { C M A K E _ R E Q U I R E D _ I N C L U D E S } " )
ENDIF ( CMAKE_REQUIRED_INCLUDES )
CONFIGURE_FILE ( "${CMAKE_ROOT}/Modules/CheckTypeSizeC.c.in"
" $ { C M A K E _ B I N A R Y _ D I R } $ { C M A K E _ F I L E S _ D I R E C T O R Y } / C M a k e T m p / C h e c k T y p e S i z e C . c " I M M E D I A T E @ O N L Y )
FILE ( READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSizeC.c"
C H E C K _ T Y P E _ S I Z E _ F I L E _ C O N T E N T )
TRY_COMPILE ( HAVE_ ${ VARIABLE }
$ { C M A K E _ B I N A R Y _ D I R }
" $ { C M A K E _ B I N A R Y _ D I R } $ { C M A K E _ F I L E S _ D I R E C T O R Y } / C M a k e T m p / C h e c k T y p e S i z e C . c "
C O M P I L E _ D E F I N I T I O N S $ { C M A K E _ R E Q U I R E D _ D E F I N I T I O N S }
C M A K E _ F L A G S - D C O M P I L E _ D E F I N I T I O N S : S T R I N G = $ { M A C R O _ C H E C K _ T Y P E _ S I Z E _ F L A G S }
" $ { C H E C K _ T Y P E _ S I Z E _ A D D _ L I B R A R I E S } "
" $ { C H E C K _ T Y P E _ S I Z E _ A D D _ I N C L U D E S } "
O U T P U T _ V A R I A B L E O U T P U T
C O P Y _ F I L E " $ { C M A K E _ B I N A R Y _ D I R } $ { C M A K E _ F I L E S _ D I R E C T O R Y } / C h e c k T y p e S i z e . b i n " )
IF ( HAVE_ ${ VARIABLE } )
FILE ( STRINGS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize.bin"
C M A K E _ C H E C K T Y P E S I Z E _ S T R I N G S L I M I T _ C O U N T 2 R E G E X " I N F O : s i z e o f " )
SET ( CMAKE_CHECKTYPESIZE_FIRST_RESULT "FIRST_LOOP" )
FOREACH ( info ${ CMAKE_CHECKTYPESIZE_STRINGS } )
IF ( "${info}" MATCHES ".*INFO:sizeof\\[0*([^]]*)\\].*" )
STRING ( REGEX REPLACE ".*INFO:sizeof\\[0*([^]]*)\\].*" "\\1" ${ VARIABLE } "${info}" )
ENDIF ( "${info}" MATCHES ".*INFO:sizeof\\[0*([^]]*)\\].*" )
IF ( "${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "FIRST_LOOP" )
SET ( CMAKE_CHECKTYPESIZE_FIRST_RESULT "${${VARIABLE}}" )
ENDIF ( "${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "FIRST_LOOP" )
IF ( NOT "${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "${${VARIABLE}}" )
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 !" )
ENDIF ( NOT "${CMAKE_CHECKTYPESIZE_FIRST_RESULT}" STREQUAL "${${VARIABLE}}" )
ENDFOREACH ( info ${ CMAKE_CHECKTYPESIZE_STRINGS } )
MESSAGE ( STATUS "Check size of ${TYPE} - done" )
2007-06-07 21:51:17 +04:00
FILE ( APPEND ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CMakeOutput.log
2007-06-05 01:08:46 +04:00
" D e t e r m i n i n g s i z e o f $ { T Y P E } p a s s e d w i t h t h e f o l l o w i n g o u t p u t : \ n $ { O U T P U T } \ n \ n " )
ELSE ( HAVE_ ${ VARIABLE } )
MESSAGE ( STATUS "Check size of ${TYPE} - failed" )
2007-06-07 21:51:17 +04:00
FILE ( APPEND ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CMakeError.log
2007-06-05 01:08:46 +04:00
" D e t e r m i n i n g s i z e o f $ { T Y P E } f a i l e d w i t h t h e f o l l o w i n g o u t p u t : \ n $ { O U T P U T } \ n C h e c k T y p e S i z e . c : \ n $ { C H E C K _ T Y P E _ S I Z E _ F I L E _ C O N T E N T } \ n \ n " )
SET ( ${ VARIABLE } )
ENDIF ( HAVE_ ${ VARIABLE } )
SET ( ${ VARIABLE } "${${VARIABLE}}" CACHE INTERNAL "Result of CHECK_TYPE_SIZE" FORCE )
ENDIF ( "HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$" )
2002-12-30 19:02:31 +03:00
ENDMACRO ( CHECK_TYPE_SIZE )