Package: gdc-15
Version: 15.2.0-12
User: [email protected]
Usertags: toolchain timezone
Severity: normal
Dear Maintainer,
GDC handles SOURCE_DATE_EPOCH differently from GCC with respect
to timezones:
$ cat test.c
#include <stdio.h>
void main() { printf(__DATE__ " " __TIME__ "\n"); }
$ cat test.d
import std.stdio;
void main() { writeln(__DATE__ ~ " " ~ __TIME__); }
$ SOURCE_DATE_EPOCH=1 gcc test.c -o test-c
$ SOURCE_DATE_EPOCH=1 gdc test.d -o test-d
$ ./test-c
Jan 1 1970 00:00:01
$ ./test-d
Dec 31 1969 16:00:01
That final line should also be "Jan 1 1970 00:00:01", as gdc
should in effect ignore my machine's timezone (-0800) as
SOURCE_DATE_EPOCH is specified at compile time.
This affects the reproducibility of D packages that use
__TIME__ or __DATE__, such as dub:
https://tests.reproducible-builds.org/debian/rb-pkg/unstable/amd64/dub.html
§
The cause of this is in gcc/d/dmd/globals.d:
time_t ct;
// https://issues.dlang.org/show_bug.cgi?id=20444
if (auto p = getenv("SOURCE_DATE_EPOCH"))
{
if (!ct.parseDigits(p[0 .. strlen(p)]))
errorSink.error(Loc.initial, "value of environment variable
`SOURCE_DATE_EPOCH` should be a valid UNIX timestamp, not: `%s`", p);
}
else
core.stdc.time.time(&ct);
const p = ctime(&ct);
assert(p);
This call to ctime should be basically asctime(gmtime(&ct)), but only in
the case that SOURCE_DATE_EPOCH is set... so something like:
time_t ct;
char* p;
// https://issues.dlang.org/show_bug.cgi?id=20444
if (auto p2 = getenv("SOURCE_DATE_EPOCH"))
{
if (!ct.parseDigits(p2[0 .. strlen(p2)]))
errorSink.error(Loc.initial, "value of environment variable
`SOURCE_DATE_EPOCH` should be a valid UNIX timestamp, not: `%s`", p2);
p = asctime(gmtime(&ct));
}
else {
core.stdc.time.time(&ct);
p = ctime(&ct);
}
assert(p);
… although I am not a D programmer so this is not very idiomatic.
Regards,
--
,''`.
: :' : Chris Lamb
`. `'` [email protected] / chris-lamb.co.uk
`-