summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@xilinx.com>2021-09-09 21:22:12 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-09-11 22:39:19 +0100
commit88e643a8b75f7cc7e30c5212f8e08cc483249aa7 (patch)
tree7915e54d01b1ed695e517a8c1af6fc37753f3f00
parentd5723cb241b7951aef7c140249541934e16fd115 (diff)
downloadpoky-88e643a8b75f7cc7e30c5212f8e08cc483249aa7.tar.gz
reproducible_build: Remove BUILD_REPRODUCIBLE_BINARIES checking
Previously if BUILD_REPRODUCIBLE_BINARIES was set to 0, the system would fall back and select the default epoch (April 2011), but still perform the reproducible build actions. This resulted in binaries that had an unusually old date. Simplify the functions and remove the anonymous python as no longer necessary. Also improve the documentation to better explain what the class is doing and how a recipe can override the behavior if necessary. (From OE-Core rev: 1976013b026cfba94de32a13e994d92d7e9e39e5) Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/reproducible_build.bbclass53
1 files changed, 34 insertions, 19 deletions
diff --git a/meta/classes/reproducible_build.bbclass b/meta/classes/reproducible_build.bbclass
index 378121903d..96bb012243 100644
--- a/meta/classes/reproducible_build.bbclass
+++ b/meta/classes/reproducible_build.bbclass
@@ -1,17 +1,38 @@
1# reproducible_build.bbclass 1# reproducible_build.bbclass
2# 2#
3# Sets SOURCE_DATE_EPOCH in each component's build environment. 3# Sets the default SOURCE_DATE_EPOCH in each component's build environment.
4# The format is number of seconds since the system epoch.
5#
4# Upstream components (generally) respect this environment variable, 6# Upstream components (generally) respect this environment variable,
5# using it in place of the "current" date and time. 7# using it in place of the "current" date and time.
6# See https://reproducible-builds.org/specs/source-date-epoch/ 8# See https://reproducible-builds.org/specs/source-date-epoch/
7# 9#
8# After sources are unpacked but before they are patched, we set a reproducible value for SOURCE_DATE_EPOCH. 10# The default value of SOURCE_DATE_EPOCH comes from the function
9# This value should be reproducible for anyone who builds the same revision from the same sources. 11# get_source_date_epoch_value which reads from the SDE_FILE, or if the file
12# is not available (or set to 0) will use the fallback of
13# SOURCE_DATE_EPOCH_FALLBACK.
14#
15# The SDE_FILE is normally constructed from the function
16# create_source_date_epoch_stamp which is typically added as a postfuncs to
17# the do_unpack task. If a recipe does NOT have do_unpack, it should be added
18# to a task that runs after the source is available and before the
19# do_deploy_source_date_epoch task is executed.
20#
21# If a recipe wishes to override the default behavior it should set it's own
22# SOURCE_DATE_EPOCH or override the do_deploy_source_date_epoch_stamp task
23# with recipe-specific functionality to write the appropriate
24# SOURCE_DATE_EPOCH into the SDE_FILE.
25#
26# SOURCE_DATE_EPOCH is intended to be a reproducible value. This value should
27# be reproducible for anyone who builds the same revision from the same
28# sources.
10# 29#
11# There are 4 ways we determine SOURCE_DATE_EPOCH: 30# There are 4 ways the create_source_date_epoch_stamp function determines what
31# becomes SOURCE_DATE_EPOCH:
12# 32#
13# 1. Use the value from __source_date_epoch.txt file if this file exists. 33# 1. Use the value from __source_date_epoch.txt file if this file exists.
14# This file was most likely created in the previous build by one of the following methods 2,3,4. 34# This file was most likely created in the previous build by one of the
35# following methods 2,3,4.
15# Alternatively, it can be provided by a recipe via SRC_URI. 36# Alternatively, it can be provided by a recipe via SRC_URI.
16# 37#
17# If the file does not exist: 38# If the file does not exist:
@@ -22,20 +43,16 @@
22# 3. Use the mtime of "known" files such as NEWS, CHANGLELOG, ... 43# 3. Use the mtime of "known" files such as NEWS, CHANGLELOG, ...
23# This works for well-kept repositories distributed via tarball. 44# This works for well-kept repositories distributed via tarball.
24# 45#
25# 4. Use the modification time of the youngest file in the source tree, if there is one. 46# 4. Use the modification time of the youngest file in the source tree, if
47# there is one.
26# This will be the newest file from the distribution tarball, if any. 48# This will be the newest file from the distribution tarball, if any.
27# 49#
28# 5. Fall back to a fixed timestamp. 50# 5. Fall back to a fixed timestamp (SOURCE_DATE_EPOCH_FALLBACK).
29# 51#
30# Once the value of SOURCE_DATE_EPOCH is determined, it is stored in the recipe's SDE_FILE. 52# Once the value is determined, it is stored in the recipe's SDE_FILE.
31# If none of these mechanisms are suitable, replace the do_deploy_source_date_epoch task
32# with recipe-specific functionality to write the appropriate SOURCE_DATE_EPOCH into the SDE_FILE.
33#
34# If this file is found by other tasks, the value is exported in the SOURCE_DATE_EPOCH variable.
35# SOURCE_DATE_EPOCH is set for all tasks that might use it (do_configure, do_compile, do_package, ...)
36 53
37BUILD_REPRODUCIBLE_BINARIES ??= '1' 54BUILD_REPRODUCIBLE_BINARIES ??= '1'
38inherit ${@oe.utils.ifelse(d.getVar('BUILD_REPRODUCIBLE_BINARIES') == '1', 'reproducible_build_simple', '')} 55inherit reproducible_build_simple
39 56
40SDE_DIR = "${WORKDIR}/source-date-epoch" 57SDE_DIR = "${WORKDIR}/source-date-epoch"
41SDE_FILE = "${SDE_DIR}/__source_date_epoch.txt" 58SDE_FILE = "${SDE_DIR}/__source_date_epoch.txt"
@@ -92,6 +109,9 @@ python create_source_date_epoch_stamp() {
92 os.rename(tmp_file, epochfile) 109 os.rename(tmp_file, epochfile)
93} 110}
94 111
112# Generate the stamp after do_unpack runs
113do_unpack[postfuncs] += "create_source_date_epoch_stamp"
114
95def get_source_date_epoch_value(d): 115def get_source_date_epoch_value(d):
96 cached = d.getVar('__CACHED_SOURCE_DATE_EPOCH') 116 cached = d.getVar('__CACHED_SOURCE_DATE_EPOCH')
97 if cached: 117 if cached:
@@ -120,8 +140,3 @@ def get_source_date_epoch_value(d):
120 140
121export SOURCE_DATE_EPOCH ?= "${@get_source_date_epoch_value(d)}" 141export SOURCE_DATE_EPOCH ?= "${@get_source_date_epoch_value(d)}"
122BB_HASHBASE_WHITELIST += "SOURCE_DATE_EPOCH" 142BB_HASHBASE_WHITELIST += "SOURCE_DATE_EPOCH"
123
124python () {
125 if d.getVar('BUILD_REPRODUCIBLE_BINARIES') == '1':
126 d.appendVarFlag("do_unpack", "postfuncs", " create_source_date_epoch_stamp")
127}