Reproducible U-Boot build support, using SOURCE_DATE_EPOCH

In order to achieve reproducible builds in U-Boot, timestamps that are defined
at build-time have to be somewhat eliminated. The SOURCE_DATE_EPOCH environment
variable allows setting a fixed value for those timestamps.

Simply by setting SOURCE_DATE_EPOCH to a fixed value, a number of targets can be
built reproducibly. This is the case for e.g. sunxi devices.

However, some other devices might need some more tweaks, especially regarding
the image generation tools.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
This commit is contained in:
Paul Kocialkowski 2015-07-26 18:48:15 +02:00 committed by Tom Rini
parent 9c57487752
commit f3f431a712
3 changed files with 36 additions and 4 deletions

View file

@ -88,6 +88,9 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
struct image_tool_params *params)
{
uint32_t checksum;
char *source_date_epoch;
struct tm *time_universal;
time_t time;
image_header_t * hdr = (image_header_t *)ptr;
@ -96,9 +99,25 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
sizeof(image_header_t)),
sbuf->st_size - sizeof(image_header_t));
source_date_epoch = getenv("SOURCE_DATE_EPOCH");
if (source_date_epoch != NULL) {
time = (time_t) strtol(source_date_epoch, NULL, 10);
time_universal = gmtime(&time);
if (time_universal == NULL) {
fprintf(stderr, "%s: SOURCE_DATE_EPOCH is not valid\n",
__func__);
time = 0;
} else {
time = mktime(time_universal);
}
} else {
time = sbuf->st_mtime;
}
/* Build new header */
image_set_magic(hdr, IH_MAGIC);
image_set_time(hdr, sbuf->st_mtime);
image_set_time(hdr, time);
image_set_size(hdr, sbuf->st_size - sizeof(image_header_t));
image_set_load(hdr, params->addr);
image_set_ep(hdr, params->ep);