cmake_policy(SET CMP0048 NEW) cmake_policy(SET CMP0096 OLD) enable_language(C) include(CheckTypeSize) check_type_size(unsigned __sizeOfUnsigned BUILTIN_TYPES_ONLY LANGUAGE C) # We can't use math() to compute this because it only supports up to # 64-bit signed integers, so hard-code the types we expect to encounter if(__sizeOfUnsigned EQUAL 0) message(STATUS "Multi-architecture build, skipping project version check") return() elseif(__sizeOfUnsigned EQUAL 4) set(maxVal 4294967295) elseif(__sizeOfUnsigned EQUAL 8) set(maxVal 18446744073709551615) else() message(FATAL_ERROR "Test needs to be updated for unsigned integer size ${__sizeOfUnsigned}") endif() # The real value of this test is when an address sanitizer is enabled. # It catches situations where the size of the buffer used to compute or # hold the version components as strings is too small. project(ProjectA VERSION ${maxVal}.${maxVal}.${maxVal}.${maxVal} LANGUAGES NONE) if(NOT ${PROJECT_VERSION_MAJOR} EQUAL ${maxVal}) message(FATAL_ERROR "Project version number parsing failed round trip.\n" "Expected: ${maxVal}\n" "Computed: ${PROJECT_VERSION_MAJOR}" ) endif()