[Cmake-commits] [cmake-commits] king committed CMakeLists.txt 1.152 1.153 FundamentalType.h.in 1.3 1.4 kwsysPlatformTestsC.c 1.3 1.4

cmake-commits at cmake.org cmake-commits at cmake.org
Fri Nov 20 08:38:22 EST 2009


Update of /cvsroot/CMake/CMake/Source/kwsys
In directory public:/mounts/ram/cvs-serv30648/Source/kwsys

Modified Files:
	CMakeLists.txt FundamentalType.h.in kwsysPlatformTestsC.c 
Log Message:
Fix KWSys FundamentalType for Universal Binaries

The FundamentalType header needs to know type sizes at preprocessing
time.  This commit teaches it to avoid using CHECK_TYPE_SIZE because the
macro does not work for types whose size varies across architectuers in
Mac OS X universal binaries.  Fortunately the Mac compilers provide just
enough information to detect the needed type sizes during preprocessing.

We now use preprocessor macros instead of configuration tests whenever
they are available.  As a side effect this reduces the number of
try-compiles needed with GCC.

See issue #9913.


Index: kwsysPlatformTestsC.c
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/kwsys/kwsysPlatformTestsC.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C 2 -d -r1.3 -r1.4
*** kwsysPlatformTestsC.c	28 Sep 2009 15:37:23 -0000	1.3
--- kwsysPlatformTestsC.c	20 Nov 2009 13:38:18 -0000	1.4
***************
*** 61,62 ****
--- 61,100 ----
  }
  #endif
+ 
+ /*--------------------------------------------------------------------------*/
+ #ifdef TEST_KWSYS_C_TYPE_MACROS
+ char* info_macros =
+ #if defined(__SIZEOF_SHORT__)
+ "INFO:macro[__SIZEOF_SHORT__]\n"
+ #endif
+ #if defined(__SIZEOF_INT__)
+ "INFO:macro[__SIZEOF_INT__]\n"
+ #endif
+ #if defined(__SIZEOF_LONG__)
+ "INFO:macro[__SIZEOF_LONG__]\n"
+ #endif
+ #if defined(__SIZEOF_LONG_LONG__)
+ "INFO:macro[__SIZEOF_LONG_LONG__]\n"
+ #endif
+ #if defined(__SHORT_MAX__)
+ "INFO:macro[__SHORT_MAX__]\n"
+ #endif
+ #if defined(__INT_MAX__)
+ "INFO:macro[__INT_MAX__]\n"
+ #endif
+ #if defined(__LONG_MAX__)
+ "INFO:macro[__LONG_MAX__]\n"
+ #endif
+ #if defined(__LONG_LONG_MAX__)
+ "INFO:macro[__LONG_LONG_MAX__]\n"
+ #endif
+   "";
+ 
+ int KWSYS_PLATFORM_TEST_C_MAIN_ARGS(argc, argv)
+ {
+   int require = 0;
+   require += info_macros[argc];
+   (void)argv;
+   return require;
+ }
+ #endif

Index: CMakeLists.txt
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/kwsys/CMakeLists.txt,v
retrieving revision 1.152
retrieving revision 1.153
diff -C 2 -d -r1.152 -r1.153
*** CMakeLists.txt	20 Nov 2009 13:37:33 -0000	1.152
--- CMakeLists.txt	20 Nov 2009 13:38:17 -0000	1.153
***************
*** 479,495 ****
  
  IF(KWSYS_USE_FundamentalType)
!   # Determine type sizes.
!   CHECK_TYPE_SIZE("char"      KWSYS_SIZEOF_CHAR)
!   CHECK_TYPE_SIZE("short"     KWSYS_SIZEOF_SHORT)
!   CHECK_TYPE_SIZE("int"       KWSYS_SIZEOF_INT)
!   CHECK_TYPE_SIZE("long"      KWSYS_SIZEOF_LONG)
!   CHECK_TYPE_SIZE("long long" KWSYS_SIZEOF_LONG_LONG)
!   CHECK_TYPE_SIZE("__int64"   KWSYS_SIZEOF___INT64)
!   IF(NOT KWSYS_SIZEOF_LONG_LONG)
!     SET(KWSYS_SIZEOF_LONG_LONG 0)
!   ENDIF(NOT KWSYS_SIZEOF_LONG_LONG)
!   IF(NOT KWSYS_SIZEOF___INT64)
!     SET(KWSYS_SIZEOF___INT64 0)
!   ENDIF(NOT KWSYS_SIZEOF___INT64)
  
    # Check uniqueness of types.
--- 479,530 ----
  
  IF(KWSYS_USE_FundamentalType)
!   # Look for type size helper macros.
!   KWSYS_PLATFORM_INFO_TEST(C KWSYS_C_TYPE_MACROS
!     "Checking for C type size macros")
!   SET(macro_regex ".*INFO:macro\\[([^]]*)\\].*")
!   FOREACH(info ${KWSYS_C_TYPE_MACROS})
!     IF("${info}" MATCHES "${macro_regex}")
!       STRING(REGEX REPLACE "${macro_regex}" "\\1" macro "${info}")
!       SET(KWSYS_C_HAS_MACRO_${macro} 1)
!     ENDIF()
!   ENDFOREACH()
! 
!   # Determine type sizes at preprocessing time if possible, and
!   # otherwise fall back to a try-compile.
!   SET(KWSYS_C_TYPE_NAME_CHAR      "char")
!   SET(KWSYS_C_TYPE_NAME_SHORT     "short")
!   SET(KWSYS_C_TYPE_NAME_INT       "int")
!   SET(KWSYS_C_TYPE_NAME_LONG      "long")
!   SET(KWSYS_C_TYPE_NAME_LONG_LONG "long long")
!   SET(KWSYS_C_TYPE_NAME___INT64   "__int64")
!   FOREACH(type CHAR SHORT INT LONG LONG_LONG __INT64)
!     IF(KWSYS_C_HAS_MACRO___SIZEOF_${type}__)
!       # Use __SIZEOF_${type}__ macro.
!       SET(KWSYS_SIZEOF_${type} TRUE)
!       SET(KWSYS_C_CODE_SIZEOF_${type} "#define ${KWSYS_NAMESPACE}_SIZEOF_${type} __SIZEOF_${type}__")
!     ELSEIF(KWSYS_C_HAS_MACRO___${type}_MAX__)
!       # Use __${type}_MAX__ macro.
!       SET(KWSYS_SIZEOF_${type} TRUE)
!       SET(KWSYS_C_CODE_SIZEOF_${type} "#if __${type}_MAX__ == 0x7f
! # define ${KWSYS_NAMESPACE}_SIZEOF_${type} 1
! #elif __${type}_MAX__ == 0x7fff
! # define ${KWSYS_NAMESPACE}_SIZEOF_${type} 2
! #elif __${type}_MAX__ == 0x7fffffff
! # define ${KWSYS_NAMESPACE}_SIZEOF_${type} 4
! #elif __${type}_MAX__>>32 == 0x7fffffff
! # define ${KWSYS_NAMESPACE}_SIZEOF_${type} 8
! #else
! # error \"Cannot determine sizeof(${KWSYS_C_TYPE_NAME_${type}}).\"
! #endif")
!     ELSE()
!       # Configure a hard-coded type size.
!       CHECK_TYPE_SIZE("${KWSYS_C_TYPE_NAME_${type}}" KWSYS_SIZEOF_${type})
!       IF(NOT KWSYS_SIZEOF_${type})
!         SET(KWSYS_SIZEOF_${type} 0)
!       ENDIF()
!       SET(KWSYS_C_CODE_SIZEOF_${type}
!         "#define ${KWSYS_NAMESPACE}_SIZEOF_${type} ${KWSYS_SIZEOF_${type}}")
!     ENDIF()
!   ENDFOREACH()
  
    # Check uniqueness of types.

Index: FundamentalType.h.in
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/kwsys/FundamentalType.h.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -C 2 -d -r1.3 -r1.4
*** FundamentalType.h.in	28 Sep 2009 15:37:22 -0000	1.3
--- FundamentalType.h.in	20 Nov 2009 13:38:18 -0000	1.4
***************
*** 37,46 ****
  
  /* The size of fundamental types.  Types that do not exist have size 0.  */
! #define @KWSYS_NAMESPACE at _SIZEOF_CHAR @KWSYS_SIZEOF_CHAR@
! #define @KWSYS_NAMESPACE at _SIZEOF_SHORT @KWSYS_SIZEOF_SHORT@
! #define @KWSYS_NAMESPACE at _SIZEOF_INT @KWSYS_SIZEOF_INT@
! #define @KWSYS_NAMESPACE at _SIZEOF_LONG @KWSYS_SIZEOF_LONG@
! #define @KWSYS_NAMESPACE at _SIZEOF_LONG_LONG @KWSYS_SIZEOF_LONG_LONG@
! #define @KWSYS_NAMESPACE at _SIZEOF___INT64 @KWSYS_SIZEOF___INT64@
  
  /* Whether types "long long" and "__int64" are enabled.  If a type is
--- 37,46 ----
  
  /* The size of fundamental types.  Types that do not exist have size 0.  */
! @KWSYS_C_CODE_SIZEOF_CHAR@
! @KWSYS_C_CODE_SIZEOF_SHORT@
! @KWSYS_C_CODE_SIZEOF_INT@
! @KWSYS_C_CODE_SIZEOF_LONG@
! @KWSYS_C_CODE_SIZEOF_LONG_LONG@
! @KWSYS_C_CODE_SIZEOF___INT64@
  
  /* Whether types "long long" and "__int64" are enabled.  If a type is



More information about the Cmake-commits mailing list