cmTimestamp: Support SOURCE_DATE_EPOCH to override current time

See https://reproducible-builds.org/ for why this is good and
https://reproducible-builds.org/specs/source-date-epoch/ for the
definition of this variable.
This commit is contained in:
Bernhard M. Wiedemann 2017-01-25 07:15:40 +01:00 committed by Brad King
parent a007f15344
commit 243aed525a
16 changed files with 47 additions and 0 deletions

View File

@ -329,6 +329,12 @@ If no explicit ``<format string>`` is given it will default to:
Write a string which can be used as an identifier in C.
.. note::
If the ``SOURCE_DATE_EPOCH`` environment variable is set,
its value will be used instead of the current time.
See https://reproducible-builds.org/specs/source-date-epoch/ for details.
UUID
""""

View File

@ -0,0 +1,5 @@
SOURCE_DATE_EPOCH
-----------------
* The :command:`string(TIMESTAMP)` will now honor the ``SOURCE_DATE_EPOCH``
environment variable and use its value instead of the current time.

View File

@ -5,6 +5,7 @@
#include <cmConfigure.h>
#include <cstring>
#include <sstream>
#include <stdlib.h>
#include "cmSystemTools.h"
@ -12,6 +13,16 @@ std::string cmTimestamp::CurrentTime(const std::string& formatString,
bool utcFlag)
{
time_t currentTimeT = time(CM_NULLPTR);
std::string source_date_epoch;
cmSystemTools::GetEnv("SOURCE_DATE_EPOCH", source_date_epoch);
if (!source_date_epoch.empty()) {
std::istringstream iss(source_date_epoch);
iss >> currentTimeT;
if (iss.fail() || !iss.eof()) {
cmSystemTools::Error("Cannot parse SOURCE_DATE_EPOCH as integer");
exit(27);
}
}
if (currentTimeT == time_t(-1)) {
return std::string();
}

View File

@ -6,6 +6,11 @@ run_cmake(AppendNoArgs)
run_cmake(Concat)
run_cmake(ConcatNoArgs)
run_cmake(Timestamp)
run_cmake(TimestampEmpty)
run_cmake(TimestampInvalid)
run_cmake(TimestampInvalid2)
run_cmake(Uuid)
run_cmake(UuidMissingNamespace)
run_cmake(UuidMissingNamespaceValue)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
RESULT=2005-08-07 23:19:49 Sun Aug 05 day=219 wd=0 week=32 %%I=11

View File

@ -0,0 +1,3 @@
set(ENV{SOURCE_DATE_EPOCH} "1123456789")
string(TIMESTAMP RESULT "%Y-%m-%d %H:%M:%S %a %b %y day=%j wd=%w week=%U %%I=%I" UTC)
message("RESULT=${RESULT}")

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
RESULT=2

View File

@ -0,0 +1,3 @@
set(ENV{SOURCE_DATE_EPOCH} "")
string(TIMESTAMP RESULT "%Y-%m-%d %H:%M:%S" UTC)
message("RESULT=${RESULT}")

View File

@ -0,0 +1 @@
27

View File

@ -0,0 +1 @@
CMake Error: Cannot parse SOURCE_DATE_EPOCH as integer

View File

@ -0,0 +1,3 @@
set(ENV{SOURCE_DATE_EPOCH} "invalid-integer")
string(TIMESTAMP RESULT "%Y-%m-%d %H:%M:%S" UTC)
message("RESULT=${RESULT}")

View File

@ -0,0 +1 @@
27

View File

@ -0,0 +1 @@
CMake Error: Cannot parse SOURCE_DATE_EPOCH as integer

View File

@ -0,0 +1,3 @@
set(ENV{SOURCE_DATE_EPOCH} "123trailing-garbage")
string(TIMESTAMP RESULT "%Y-%m-%d %H:%M:%S" UTC)
message("RESULT=${RESULT}")