string(TIMESTAMP): Fix %s placeholder for year 2038 on Windows

`difftime` returns a `double`, so commit 6727270b75 (CMake: Extend
TIMESTAMP sub-commands with new unix time format specifier, 2016-02-16,
v3.6.0-rc1~338^2) cast it to `long` to get an integer result.  However,
in the MSVC ABI, `long` is a 32-bit integer.  Use an explicit 64-bit
integer type instead.

Fixes: #26716
This commit is contained in:
Brad King 2025-02-23 09:56:59 -05:00
parent e185e7d706
commit 74519e1c83
5 changed files with 19 additions and 2 deletions

View File

@ -16,6 +16,7 @@
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <sstream>
#include <utility>
@ -275,7 +276,8 @@ std::string cmTimestamp::AddTimestampComponent(
return std::string();
}
return std::to_string(static_cast<long int>(difftime(timeT, unixEpoch)));
return std::to_string(
static_cast<int64_t>(std::difftime(timeT, unixEpoch)));
}
case 'f': // microseconds
{

View File

@ -660,7 +660,10 @@ add_RunCMake_test(return)
add_RunCMake_test(SarifOutput)
add_RunCMake_test(separate_arguments)
add_RunCMake_test(set_property)
add_RunCMake_test(string)
add_RunCMake_test(string
-DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}
)
add_RunCMake_test(test_include_dirs)
add_RunCMake_test(BundleUtilities)
if(APPLE)

View File

@ -21,6 +21,14 @@ run_cmake(JoinNoArgs)
run_cmake(JoinNoVar)
run_cmake(Timestamp)
if(NOT CMAKE_SYSTEM_NAME STREQUAL "AIX" # FIXME: Needs 64-bit build
AND NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS" # FIXME: Needs 64-bit build
AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
CMAKE_SYSTEM_PROCESSOR MATCHES "^(hppa|parisc64|sparc|sparc64)$" # FIXME: 32-bit time_t?
)
)
run_cmake(Timestamp2038)
endif()
run_cmake(TimestampEmpty)
run_cmake(TimestampInvalid)
run_cmake(TimestampInvalid2)

View File

@ -0,0 +1 @@
^RESULT=2038-01-20 05:00:00.000000 Wednesday=Wed January=Jan 38 day=020 wd=3 week=03 w_iso=03 %I=05 epoch=2147576400 TZ=GMT tz=\+0000$

View File

@ -0,0 +1,3 @@
set(ENV{SOURCE_DATE_EPOCH} "2147576400")
string(TIMESTAMP RESULT "%Y-%m-%d %H:%M:%S.%f %A=%a %B=%b %y day=%j wd=%w week=%U w_iso=%V %%I=%I epoch=%s TZ=%Z tz=%z" UTC)
message("RESULT=${RESULT}")