[PATCH] use SOURCE_DATE_EPOCH for timestamp if available

Denys Vlasenko vda.linux at googlemail.com
Sat Jun 5 16:15:29 UTC 2021


Applied, thank you

On Fri, May 14, 2021 at 12:15 AM Paul Spooren <mail at aparcar.org> wrote:
>
> 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 at 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
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list