aboutsummaryrefslogtreecommitdiffstats
path: root/package/utils/busybox/patches/530-use-SOURCE_DATE_EPOCH-for-timestamp-if-available.patch
blob: af473622ed216d4432da30ee42bdf6dc72942d58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
From 59f773ee81a8945321f4aa20abc5e9577e6483e4 Mon Sep 17 00:00:00 2001
From: Paul Spooren <mail@aparcar.org>
Date: Thu, 13 May 2021 11:25:34 +0200
Subject: [PATCH] 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>
---
 scripts/kconfig/confdata.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index b05b96e45..73c25e3a8 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");
 		}
-- 
2.30.2