Merge pull request #91 from henrygab/improve_repeatable_builds

Allow overriding the compilation date/time
This commit is contained in:
Ha Thach 2021-03-15 15:35:25 +07:00 committed by GitHub
commit e65fcc2b18
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 44 deletions

View file

@ -26,54 +26,66 @@
#ifndef COMPILE_DATE_H
#define COMPILE_DATE_H
#define __YEAR_INT__ ((( \
(__DATE__ [ 7u] - '0') * 10u + \
(__DATE__ [ 8u] - '0')) * 10u + \
(__DATE__ [ 9u] - '0')) * 10u + \
(__DATE__ [10u] - '0'))
// Help enable build to be deterministic.
// Allows Ghostfat to generate 100% reproducible images across compilations.
// Reproducible builds are also important for other reasons.
// See generally, https://reproducible-builds.org/
#ifndef COMPILE_DATE
#define COMPILE_DATE __DATE__
#endif
#ifndef COMPILE_TIME
#define COMPILE_TIME __TIME__
#endif
#define __MONTH_INT__ ( \
(__DATE__ [2u] == 'n' && __DATE__ [1u] == 'a') ? 1u /*Jan*/ \
: (__DATE__ [2u] == 'b' ) ? 2u /*Feb*/ \
: (__DATE__ [2u] == 'r' && __DATE__ [1u] == 'a') ? 3u /*Mar*/ \
: (__DATE__ [2u] == 'r' ) ? 4u /*Apr*/ \
: (__DATE__ [2u] == 'y' ) ? 5u /*May*/ \
: (__DATE__ [2u] == 'n' ) ? 6u /*Jun*/ \
: (__DATE__ [2u] == 'l' ) ? 7u /*Jul*/ \
: (__DATE__ [2u] == 'g' ) ? 8u /*Aug*/ \
: (__DATE__ [2u] == 'p' ) ? 9u /*Sep*/ \
: (__DATE__ [2u] == 't' ) ? 10u /*Oct*/ \
: (__DATE__ [2u] == 'v' ) ? 11u /*Nov*/ \
#define COMPILE_YEAR_INT ((( \
(COMPILE_DATE [ 7u] - '0') * 10u + \
(COMPILE_DATE [ 8u] - '0')) * 10u + \
(COMPILE_DATE [ 9u] - '0')) * 10u + \
(COMPILE_DATE [10u] - '0'))
#define COMPILE_MONTH_INT ( \
(COMPILE_DATE [2u] == 'n' && COMPILE_DATE [1u] == 'a') ? 1u /*Jan*/ \
: (COMPILE_DATE [2u] == 'b' ) ? 2u /*Feb*/ \
: (COMPILE_DATE [2u] == 'r' && COMPILE_DATE [1u] == 'a') ? 3u /*Mar*/ \
: (COMPILE_DATE [2u] == 'r' ) ? 4u /*Apr*/ \
: (COMPILE_DATE [2u] == 'y' ) ? 5u /*May*/ \
: (COMPILE_DATE [2u] == 'n' ) ? 6u /*Jun*/ \
: (COMPILE_DATE [2u] == 'l' ) ? 7u /*Jul*/ \
: (COMPILE_DATE [2u] == 'g' ) ? 8u /*Aug*/ \
: (COMPILE_DATE [2u] == 'p' ) ? 9u /*Sep*/ \
: (COMPILE_DATE [2u] == 't' ) ? 10u /*Oct*/ \
: (COMPILE_DATE [2u] == 'v' ) ? 11u /*Nov*/ \
: 12u /*Dec*/ )
#define __DAY_INT__ ( \
(__DATE__ [4u] == ' ' ? 0 : __DATE__ [4u] - '0') * 10u \
+ (__DATE__ [5u] - '0') )
#define COMPILE_DAY_INT ( \
(COMPILE_DATE [4u] == ' ' ? 0 : COMPILE_DATE [4u] - '0') * 10u + \
(COMPILE_DATE [5u] - '0') \
)
// __TIME__ expands to an eight-character string constant
// "23:59:01", or (if cannot determine time) "??:??:??"
#define __HOUR_INT__ ( \
(__TIME__ [0u] == '?' ? 0 : __TIME__ [0u] - '0') * 10u \
+ (__TIME__ [1u] == '?' ? 0 : __TIME__ [1u] - '0') )
#define COMPILE_HOUR_INT ( \
(COMPILE_TIME [0u] == '?' ? 0 : COMPILE_TIME [0u] - '0') * 10u \
+ (COMPILE_TIME [1u] == '?' ? 0 : COMPILE_TIME [1u] - '0') )
#define __MINUTE_INT__ ( \
(__TIME__ [3u] == '?' ? 0 : __TIME__ [3u] - '0') * 10u \
+ (__TIME__ [4u] == '?' ? 0 : __TIME__ [4u] - '0') )
#define COMPILE_MINUTE_INT ( \
(COMPILE_TIME [3u] == '?' ? 0 : COMPILE_TIME [3u] - '0') * 10u \
+ (COMPILE_TIME [4u] == '?' ? 0 : COMPILE_TIME [4u] - '0') )
#define __SECONDS_INT__ ( \
(__TIME__ [6u] == '?' ? 0 : __TIME__ [6u] - '0') * 10u \
+ (__TIME__ [7u] == '?' ? 0 : __TIME__ [7u] - '0') )
#define COMPILE_SECONDS_INT ( \
(COMPILE_TIME [6u] == '?' ? 0 : COMPILE_TIME [6u] - '0') * 10u \
+ (COMPILE_TIME [7u] == '?' ? 0 : COMPILE_TIME [7u] - '0') )
#define __DOSDATE__ ( \
((__YEAR_INT__ - 1980u) << 9u) | \
( __MONTH_INT__ << 5u) | \
( __DAY_INT__ << 0u) )
#define COMPILE_DOS_DATE ( \
((COMPILE_YEAR_INT - 1980u) << 9u) | \
( COMPILE_MONTH_INT << 5u) | \
( COMPILE_DAY_INT << 0u) )
#define __DOSTIME__ ( \
( __HOUR_INT__ << 11u) | \
( __MINUTE_INT__ << 5u) | \
( __SECONDS_INT__ << 0u) )
#define COMPILE_DOS_TIME ( \
( COMPILE_HOUR_INT << 11u) | \
( COMPILE_MINUTE_INT << 5u) | \
( COMPILE_SECONDS_INT << 0u) )
#endif // COMPILE_DATE_H

View file

@ -329,13 +329,13 @@ void uf2_read_block (uint32_t block_no, uint8_t *data)
struct TextFile const *inf = &info[fileIndex];
padded_memcpy(d->name, inf->name, 11);
d->createTimeFine = __SECONDS_INT__ % 2 * 100;
d->createTime = __DOSTIME__;
d->createDate = __DOSDATE__;
d->lastAccessDate = __DOSDATE__;
d->createTimeFine = COMPILE_SECONDS_INT % 2 * 100;
d->createTime = COMPILE_DOS_TIME;
d->createDate = COMPILE_DOS_DATE;
d->lastAccessDate = COMPILE_DOS_DATE;
d->highStartCluster = startCluster >> 16;
d->updateTime = __DOSTIME__;
d->updateDate = __DOSDATE__;
d->updateTime = COMPILE_DOS_TIME;
d->updateDate = COMPILE_DOS_DATE;
d->startCluster = startCluster & 0xFFFF;
d->size = (inf->content ? strlen(inf->content) : UF2_BYTE_COUNT);
}