diff options
author | Paul Spooren <mail@aparcar.org> | 2021-05-13 23:39:05 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-05 18:13:00 +0200 |
commit | 947a22b33262c93e5c50286b723b9086a33a4c1f (patch) | |
tree | a386baf9c281da44d705a0f6ec5c2263051016bc | |
parent | 1b30c63dfdd4f31faa6deda69345bf07f23aa334 (diff) |
build system: use SOURCE_DATE_EPOCH for timestamp if available
The SOURCE_DATE_EPOCH is an effort of the Reproducible Builds
organization to make timestamps/build dates in compiled tools
deterministic over several repetitive builds.
Busybox shows by default the build date timestamp which changes whenever
compiled. To have a reasonable accurate build date while staying
reproducible, it's possible to use the *date of last source
modification* rather than the current time and date.
Further information on SOURCE_DATE_EPOCH are available online [1].
This patch modifies `confdata.c` so that the content of the
SOURCE_DATE_EPOCH env variable is used as timestamp.
To be independent of different timezones between builds, whenever
SOURCE_DATE_EPOCH is defined the GMT time is used.
[1]: https://reproducible-builds.org/docs/source-date-epoch/
Signed-off-by: Paul Spooren <mail@aparcar.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | scripts/kconfig/confdata.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 9976011a9..249a3195e 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -342,6 +342,8 @@ int conf_write(const char *name) time_t now; int use_timestamp = 1; char *env; + char *source_date_epoch; + struct tm *build_time; dirname[0] = 0; if (name && name[0]) { @@ -378,7 +380,16 @@ int conf_write(const char *name) } sym = sym_lookup("KERNELVERSION", 0); sym_calc_value(sym); - time(&now); + + source_date_epoch = getenv("SOURCE_DATE_EPOCH"); + if (source_date_epoch && *source_date_epoch) { + now = strtoull(source_date_epoch, NULL, 10); + build_time = gmtime(&now); + } else { + time(&now); + build_time = localtime(&now); + } + env = getenv("KCONFIG_NOTIMESTAMP"); if (env && *env) use_timestamp = 0; @@ -398,14 +409,14 @@ int conf_write(const char *name) if (use_timestamp) { size_t ret = \ strftime(buf, sizeof(buf), "#define AUTOCONF_TIMESTAMP " - "\"%Y-%m-%d %H:%M:%S %Z\"\n", localtime(&now)); + "\"%Y-%m-%d %H:%M:%S %Z\"\n", build_time); /* if user has Factory timezone or some other odd install, the * %Z above will overflow the string leaving us with undefined * results ... so let's try again without the timezone. */ if (ret == 0) strftime(buf, sizeof(buf), "#define AUTOCONF_TIMESTAMP " - "\"%Y-%m-%d %H:%M:%S\"\n", localtime(&now)); + "\"%Y-%m-%d %H:%M:%S\"\n", build_time); } else { /* bbox */ strcpy(buf, "#define AUTOCONF_TIMESTAMP \"\"\n"); } |