diff options
| author | Douglas Royds <douglas.royds@taitradio.com> | 2018-09-14 14:58:13 +1200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-09-21 18:45:46 -0700 |
| commit | d872b0e51e767d6473d1e6051d9a16ad6aeccaa8 (patch) | |
| tree | 344b589fc0d32ce81a4618c86a9144590253ed51 /meta/classes/reproducible_build.bbclass | |
| parent | 1bf7337bf82e128308a03476a6c765cd455ec62a (diff) | |
| download | poky-d872b0e51e767d6473d1e6051d9a16ad6aeccaa8.tar.gz | |
reproducible: Refactor: get_source_date_epoch_from_youngest_file()
(From OE-Core rev: 2c8baf6c50e5a266a1e9ac939415bd481668e17e)
Signed-off-by: Douglas Royds <douglas.royds@taitradio.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/reproducible_build.bbclass')
| -rw-r--r-- | meta/classes/reproducible_build.bbclass | 73 |
1 files changed, 40 insertions, 33 deletions
diff --git a/meta/classes/reproducible_build.bbclass b/meta/classes/reproducible_build.bbclass index 4e8850fb83..e118cfde01 100644 --- a/meta/classes/reproducible_build.bbclass +++ b/meta/classes/reproducible_build.bbclass | |||
| @@ -49,15 +49,15 @@ do_deploy_source_date_epoch[sstate-plaindirs] = "${SDE_DIR}" | |||
| 49 | addtask do_deploy_source_date_epoch_setscene | 49 | addtask do_deploy_source_date_epoch_setscene |
| 50 | addtask do_deploy_source_date_epoch before do_configure after do_patch | 50 | addtask do_deploy_source_date_epoch before do_configure after do_patch |
| 51 | 51 | ||
| 52 | def get_source_date_epoch_known_files(d, path): | 52 | def get_source_date_epoch_from_known_files(d, path): |
| 53 | source_date_epoch = 0 | 53 | source_date_epoch = None |
| 54 | known_files = set(["NEWS", "ChangeLog", "Changelog", "CHANGES"]) | 54 | known_files = set(["NEWS", "ChangeLog", "Changelog", "CHANGES"]) |
| 55 | for file in known_files: | 55 | for file in known_files: |
| 56 | filepath = os.path.join(path,file) | 56 | filepath = os.path.join(path,file) |
| 57 | if os.path.isfile(filepath): | 57 | if os.path.isfile(filepath): |
| 58 | mtime = int(os.lstat(filepath).st_mtime) | 58 | mtime = int(os.lstat(filepath).st_mtime) |
| 59 | # There may be more than one "known_file" present, if so, use the youngest one | 59 | # There may be more than one "known_file" present, if so, use the youngest one |
| 60 | if mtime > source_date_epoch: | 60 | if not source_date_epoch or mtime > source_date_epoch: |
| 61 | source_date_epoch = mtime | 61 | source_date_epoch = mtime |
| 62 | return source_date_epoch | 62 | return source_date_epoch |
| 63 | 63 | ||
| @@ -68,8 +68,8 @@ def find_git_folder(path): | |||
| 68 | if '.git' in dirs: | 68 | if '.git' in dirs: |
| 69 | return root | 69 | return root |
| 70 | 70 | ||
| 71 | def get_source_date_epoch_git(d, path): | 71 | def get_source_date_epoch_from_git(d, path): |
| 72 | source_date_epoch = 0 | 72 | source_date_epoch = None |
| 73 | if "git://" in d.getVar('SRC_URI'): | 73 | if "git://" in d.getVar('SRC_URI'): |
| 74 | gitpath = find_git_folder(d.getVar('WORKDIR')) | 74 | gitpath = find_git_folder(d.getVar('WORKDIR')) |
| 75 | if gitpath != None: | 75 | if gitpath != None: |
| @@ -84,6 +84,31 @@ def get_source_date_epoch_git(d, path): | |||
| 84 | bb.warn("Failed to find a git repository for path:%s" % (path)) | 84 | bb.warn("Failed to find a git repository for path:%s" % (path)) |
| 85 | return source_date_epoch | 85 | return source_date_epoch |
| 86 | 86 | ||
| 87 | def get_source_date_epoch_from_youngest_file(d, path): | ||
| 88 | # Do it the hard way: check all files and find the youngest one... | ||
| 89 | source_date_epoch = None | ||
| 90 | newest_file = None | ||
| 91 | # Just in case S = WORKDIR | ||
| 92 | exclude = set(["build", "image", "license-destdir", "patches", "pseudo", | ||
| 93 | "recipe-sysroot", "recipe-sysroot-native", "sysroot-destdir", "temp"]) | ||
| 94 | for root, dirs, files in os.walk(path, topdown=True): | ||
| 95 | files = [f for f in files if not f[0] == '.'] | ||
| 96 | dirs[:] = [d for d in dirs if d not in exclude] | ||
| 97 | |||
| 98 | for fname in files: | ||
| 99 | filename = os.path.join(root, fname) | ||
| 100 | try: | ||
| 101 | mtime = int(os.lstat(filename).st_mtime) | ||
| 102 | except ValueError: | ||
| 103 | mtime = 0 | ||
| 104 | if not source_date_epoch or mtime > source_date_epoch: | ||
| 105 | source_date_epoch = mtime | ||
| 106 | newest_file = filename | ||
| 107 | |||
| 108 | if newest_file != None: | ||
| 109 | bb.debug(1," SOURCE_DATE_EPOCH %d derived from: %s" % (source_date_epoch, newest_file)) | ||
| 110 | return source_date_epoch | ||
| 111 | |||
| 87 | python do_create_source_date_epoch_stamp() { | 112 | python do_create_source_date_epoch_stamp() { |
| 88 | path = d.getVar('S') | 113 | path = d.getVar('S') |
| 89 | if not os.path.isdir(path): | 114 | if not os.path.isdir(path): |
| @@ -95,35 +120,17 @@ python do_create_source_date_epoch_stamp() { | |||
| 95 | bb.debug(1, " path: %s reusing __source_date_epoch.txt" % epochfile) | 120 | bb.debug(1, " path: %s reusing __source_date_epoch.txt" % epochfile) |
| 96 | return | 121 | return |
| 97 | 122 | ||
| 98 | source_date_epoch = get_source_date_epoch_git(d, path) | 123 | source_date_epoch = ( |
| 124 | get_source_date_epoch_from_git(d, path) or | ||
| 125 | get_source_date_epoch_from_known_files(d, path) or | ||
| 126 | get_source_date_epoch_from_youngest_file(d, path) or | ||
| 127 | 0 # Last resort | ||
| 128 | ) | ||
| 99 | if source_date_epoch == 0: | 129 | if source_date_epoch == 0: |
| 100 | source_date_epoch = get_source_date_epoch_known_files(d, path) | 130 | # empty folder, not a single file ... |
| 101 | if source_date_epoch == 0: | 131 | # kernel source do_unpack is special cased |
| 102 | # Do it the hard way: check all files and find the youngest one... | 132 | if not bb.data.inherits_class('kernel', d): |
| 103 | filename_dbg = None | 133 | bb.debug(1, "Unable to determine source_date_epoch! path:%s" % path) |
| 104 | exclude = set(["temp", "license-destdir", "patches", "recipe-sysroot-native", "recipe-sysroot", "pseudo", "build", "image", "sysroot-destdir"]) | ||
| 105 | for root, dirs, files in os.walk(path, topdown=True): | ||
| 106 | files = [f for f in files if not f[0] == '.'] | ||
| 107 | dirs[:] = [d for d in dirs if d not in exclude] | ||
| 108 | |||
| 109 | for fname in files: | ||
| 110 | filename = os.path.join(root, fname) | ||
| 111 | try: | ||
| 112 | mtime = int(os.lstat(filename).st_mtime) | ||
| 113 | except ValueError: | ||
| 114 | mtime = 0 | ||
| 115 | if mtime > source_date_epoch: | ||
| 116 | source_date_epoch = mtime | ||
| 117 | filename_dbg = filename | ||
| 118 | |||
| 119 | if filename_dbg != None: | ||
| 120 | bb.debug(1," SOURCE_DATE_EPOCH %d derived from: %s" % (source_date_epoch, filename_dbg)) | ||
| 121 | |||
| 122 | if source_date_epoch == 0: | ||
| 123 | # empty folder, not a single file ... | ||
| 124 | # kernel source do_unpack is special cased | ||
| 125 | if not bb.data.inherits_class('kernel', d): | ||
| 126 | bb.debug(1, "Unable to determine source_date_epoch! path:%s" % path) | ||
| 127 | 134 | ||
| 128 | bb.utils.mkdirhier(d.getVar('SDE_DIR')) | 135 | bb.utils.mkdirhier(d.getVar('SDE_DIR')) |
| 129 | with open(epochfile, 'w') as f: | 136 | with open(epochfile, 'w') as f: |
