From 371072e9e1677e883d3feed167b53e075fb129b3 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Sun, 12 Jul 2020 21:36:03 -0400 Subject: CheckTypeSize: Use C++-style headers to check for std:: types In order to check for types like `std::uint8_t` in C++, we need to include `` instead of ``. --- Modules/CheckTypeSize.cmake | 54 ++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/Modules/CheckTypeSize.cmake b/Modules/CheckTypeSize.cmake index 2b07b7c..17beadc 100644 --- a/Modules/CheckTypeSize.cmake +++ b/Modules/CheckTypeSize.cmake @@ -89,17 +89,38 @@ function(__check_type_size_impl type var map builtin language) message(CHECK_START "Check size of ${type}") endif() + # Perform language check + if(language STREQUAL "C") + set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.c) + elseif(language STREQUAL "CXX") + set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.cpp) + else() + message(FATAL_ERROR "Unknown language:\n ${language}\nSupported languages: C, CXX.\n") + endif() + # Include header files. set(headers) if(builtin) - if(HAVE_SYS_TYPES_H) - string(APPEND headers "#include \n") - endif() - if(HAVE_STDINT_H) - string(APPEND headers "#include \n") - endif() - if(HAVE_STDDEF_H) - string(APPEND headers "#include \n") + if(language STREQUAL "CXX" AND type MATCHES "^std::") + if(HAVE_SYS_TYPES_H) + string(APPEND headers "#include \n") + endif() + if(HAVE_CSTDINT) + string(APPEND headers "#include \n") + endif() + if(HAVE_CSTDDEF) + string(APPEND headers "#include \n") + endif() + else() + if(HAVE_SYS_TYPES_H) + string(APPEND headers "#include \n") + endif() + if(HAVE_STDINT_H) + string(APPEND headers "#include \n") + endif() + if(HAVE_STDDEF_H) + string(APPEND headers "#include \n") + endif() endif() endif() foreach(h ${CMAKE_EXTRA_INCLUDE_FILES}) @@ -107,14 +128,6 @@ function(__check_type_size_impl type var map builtin language) endforeach() # Perform the check. - - if(language STREQUAL "C") - set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.c) - elseif(language STREQUAL "CXX") - set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.cpp) - else() - message(FATAL_ERROR "Unknown language:\n ${language}\nSupported languages: C, CXX.\n") - endif() set(bin ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.bin) configure_file(${__check_type_size_dir}/CheckTypeSize.c.in ${src} @ONLY) try_compile(HAVE_${var} ${CMAKE_BINARY_DIR} ${src} @@ -232,8 +245,13 @@ macro(CHECK_TYPE_SIZE TYPE VARIABLE) check_include_file(stddef.h HAVE_STDDEF_H) elseif(_language STREQUAL "CXX") check_include_file_cxx(sys/types.h HAVE_SYS_TYPES_H) - check_include_file_cxx(stdint.h HAVE_STDINT_H) - check_include_file_cxx(stddef.h HAVE_STDDEF_H) + if("${TYPE}" MATCHES "^std::") + check_include_file_cxx(cstdint HAVE_CSTDINT) + check_include_file_cxx(cstddef HAVE_CSTDDEF) + else() + check_include_file_cxx(stdint.h HAVE_STDINT_H) + check_include_file_cxx(stddef.h HAVE_STDDEF_H) + endif() endif() endif() unset(_CHECK_TYPE_SIZE_BUILTIN_TYPES_ONLY) -- cgit v0.12 From 7f786c6a40b8a6a422cb4fce40f7aa17a037e1c1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 20 Jul 2020 15:53:12 -0400 Subject: Tests: Cover CheckTypeSize with uint8_t and std::uint8_t --- Tests/Module/CheckTypeSize/CMakeLists.txt | 2 ++ Tests/Module/CheckTypeSize/CheckTypeSize.cxx | 26 ++++++++++++++++++++++++++ Tests/Module/CheckTypeSize/config.hxx.in | 10 ++++++++++ 3 files changed, 38 insertions(+) diff --git a/Tests/Module/CheckTypeSize/CMakeLists.txt b/Tests/Module/CheckTypeSize/CMakeLists.txt index 16989fe2..102cf0c 100644 --- a/Tests/Module/CheckTypeSize/CMakeLists.txt +++ b/Tests/Module/CheckTypeSize/CMakeLists.txt @@ -21,6 +21,8 @@ check_type_size("((struct somestruct*)0)->somechar" SIZEOF_STRUCTMEMBER_CHAR) # Check CXX types check_type_size(bool SIZEOF_BOOL LANGUAGE CXX) +check_type_size(uint8_t SIZEOF_UINT8_T LANGUAGE CXX) +check_type_size(std::uint8_t SIZEOF_STD_UINT8_T LANGUAGE CXX) set(CMAKE_EXTRA_INCLUDE_FILES someclass.hxx) check_type_size("((ns::someclass*)0)->someint" SIZEOF_NS_CLASSMEMBER_INT LANGUAGE CXX) diff --git a/Tests/Module/CheckTypeSize/CheckTypeSize.cxx b/Tests/Module/CheckTypeSize/CheckTypeSize.cxx index 15dc890..45cd393 100644 --- a/Tests/Module/CheckTypeSize/CheckTypeSize.cxx +++ b/Tests/Module/CheckTypeSize/CheckTypeSize.cxx @@ -11,6 +11,12 @@ #ifdef HAVE_STDDEF_H # include #endif +#ifdef HAVE_CSTDINT +# include +#endif +#ifdef HAVE_CSTDDEF +# include +#endif #include @@ -122,6 +128,26 @@ int main() NODEF(SIZEOF_SSIZE_T); #endif +/* uint8_t */ +#if defined(SIZEOF_UINT8_T) + CHECK(uint8_t, SIZEOF_UINT8_T); +# if !defined(HAVE_SIZEOF_UINT8_T) + NODEF(HAVE_SIZEOF_UINT8_T); +# endif +#elif defined(HAVE_SIZEOF_UINT8_T) + NODEF(SIZEOF_UINT8_T); +#endif + +/* std::uint8_t */ +#if defined(SIZEOF_STD_UINT8_T) + CHECK(std::uint8_t, SIZEOF_STD_UINT8_T); +# if !defined(HAVE_SIZEOF_STD_UINT8_T) + NODEF(HAVE_SIZEOF_STD_UINT8_T); +# endif +#elif defined(HAVE_SIZEOF_STD_UINT8_T) + NODEF(SIZEOF_STD_UINT8_T); +#endif + /* ns::someclass::someint */ #if defined(SIZEOF_NS_CLASSMEMBER_INT) CHECK(y.someint, SIZEOF_NS_CLASSMEMBER_INT); diff --git a/Tests/Module/CheckTypeSize/config.hxx.in b/Tests/Module/CheckTypeSize/config.hxx.in index 8c66ade..9a80689 100644 --- a/Tests/Module/CheckTypeSize/config.hxx.in +++ b/Tests/Module/CheckTypeSize/config.hxx.in @@ -1,11 +1,21 @@ #cmakedefine HAVE_SYS_TYPES_H #cmakedefine HAVE_STDINT_H #cmakedefine HAVE_STDDEF_H +#cmakedefine HAVE_CSTDINT +#cmakedefine HAVE_CSTDDEF /* bool */ #cmakedefine HAVE_SIZEOF_BOOL @SIZEOF_BOOL_CODE@ +/* uint8_t */ +#cmakedefine HAVE_SIZEOF_UINT8_T +@SIZEOF_UINT8_T_CODE@ + +/* std::uint8_t */ +#cmakedefine HAVE_SIZEOF_STD_UINT8_T +@SIZEOF_STD_UINT8_T_CODE@ + /* struct ns::somestruct::someint */ #cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_INT @SIZEOF_NS_STRUCTMEMBER_INT_CODE@ -- cgit v0.12