diff options
Diffstat (limited to 'meta/classes-global/patch.bbclass')
| -rw-r--r-- | meta/classes-global/patch.bbclass | 169 |
1 files changed, 0 insertions, 169 deletions
diff --git a/meta/classes-global/patch.bbclass b/meta/classes-global/patch.bbclass deleted file mode 100644 index e5786b1c9a..0000000000 --- a/meta/classes-global/patch.bbclass +++ /dev/null | |||
| @@ -1,169 +0,0 @@ | |||
| 1 | # Copyright (C) 2006 OpenedHand LTD | ||
| 2 | # | ||
| 3 | # SPDX-License-Identifier: MIT | ||
| 4 | |||
| 5 | # Point to an empty file so any user's custom settings don't break things | ||
| 6 | QUILTRCFILE ?= "${STAGING_ETCDIR_NATIVE}/quiltrc" | ||
| 7 | |||
| 8 | PATCHDEPENDENCY = "${PATCHTOOL}-native:do_populate_sysroot" | ||
| 9 | |||
| 10 | # There is a bug in patch 2.7.3 and earlier where index lines | ||
| 11 | # in patches can change file modes when they shouldn't: | ||
| 12 | # http://git.savannah.gnu.org/cgit/patch.git/patch/?id=82b800c9552a088a241457948219d25ce0a407a4 | ||
| 13 | # This leaks into debug sources in particular. Add the dependency | ||
| 14 | # to target recipes to avoid this problem until we can rely on 2.7.4 or later. | ||
| 15 | PATCHDEPENDENCY:append:class-target = " patch-replacement-native:do_populate_sysroot" | ||
| 16 | |||
| 17 | PATCH_GIT_USER_NAME ?= "OpenEmbedded" | ||
| 18 | PATCH_GIT_USER_EMAIL ?= "oe.patch@oe" | ||
| 19 | |||
| 20 | inherit terminal | ||
| 21 | |||
| 22 | python () { | ||
| 23 | if d.getVar('PATCHTOOL') == 'git' and d.getVar('PATCH_COMMIT_FUNCTIONS') == '1': | ||
| 24 | extratasks = bb.build.tasksbetween('do_unpack', 'do_patch', d) | ||
| 25 | try: | ||
| 26 | extratasks.remove('do_unpack') | ||
| 27 | except ValueError: | ||
| 28 | # For some recipes do_unpack doesn't exist, ignore it | ||
| 29 | pass | ||
| 30 | |||
| 31 | d.appendVarFlag('do_patch', 'prefuncs', ' patch_task_patch_prefunc') | ||
| 32 | for task in extratasks: | ||
| 33 | d.appendVarFlag(task, 'postfuncs', ' patch_task_postfunc') | ||
| 34 | } | ||
| 35 | |||
| 36 | python patch_task_patch_prefunc() { | ||
| 37 | # Prefunc for do_patch | ||
| 38 | srcsubdir = d.getVar('S') | ||
| 39 | |||
| 40 | workdir = os.path.abspath(d.getVar('WORKDIR')) | ||
| 41 | testsrcdir = os.path.abspath(srcsubdir) | ||
| 42 | if (testsrcdir + os.sep).startswith(workdir + os.sep): | ||
| 43 | # Double-check that either workdir or S or some directory in-between is a git repository | ||
| 44 | found = False | ||
| 45 | while testsrcdir != workdir: | ||
| 46 | if os.path.exists(os.path.join(testsrcdir, '.git')): | ||
| 47 | found = True | ||
| 48 | break | ||
| 49 | if testsrcdir == workdir: | ||
| 50 | break | ||
| 51 | testsrcdir = os.path.dirname(testsrcdir) | ||
| 52 | if not found: | ||
| 53 | bb.fatal('PATCHTOOL = "git" set for source tree that is not a git repository. Refusing to continue as that may result in commits being made in your metadata repository.') | ||
| 54 | |||
| 55 | patchdir = os.path.join(srcsubdir, 'patches') | ||
| 56 | if os.path.exists(patchdir): | ||
| 57 | if os.listdir(patchdir): | ||
| 58 | d.setVar('PATCH_HAS_PATCHES_DIR', '1') | ||
| 59 | else: | ||
| 60 | os.rmdir(patchdir) | ||
| 61 | } | ||
| 62 | |||
| 63 | python patch_task_postfunc() { | ||
| 64 | # Prefunc for task functions between do_unpack and do_patch | ||
| 65 | import oe.patch | ||
| 66 | import shutil | ||
| 67 | func = d.getVar('BB_RUNTASK') | ||
| 68 | srcsubdir = d.getVar('S') | ||
| 69 | |||
| 70 | if os.path.exists(srcsubdir): | ||
| 71 | if func == 'do_patch': | ||
| 72 | haspatches = (d.getVar('PATCH_HAS_PATCHES_DIR') == '1') | ||
| 73 | patchdir = os.path.join(srcsubdir, 'patches') | ||
| 74 | if os.path.exists(patchdir): | ||
| 75 | shutil.rmtree(patchdir) | ||
| 76 | if haspatches: | ||
| 77 | stdout, _ = bb.process.run('git status --porcelain patches', cwd=srcsubdir) | ||
| 78 | if stdout: | ||
| 79 | bb.process.run('git checkout patches', cwd=srcsubdir) | ||
| 80 | stdout, _ = bb.process.run('git status --porcelain .', cwd=srcsubdir) | ||
| 81 | if stdout: | ||
| 82 | oe.patch.GitApplyTree.commitIgnored("Add changes from %s" % func, dir=srcsubdir, files=['.'], d=d) | ||
| 83 | } | ||
| 84 | |||
| 85 | def src_patches(d, all=False, expand=True): | ||
| 86 | import oe.patch | ||
| 87 | return oe.patch.src_patches(d, all, expand) | ||
| 88 | |||
| 89 | def should_apply(parm, d): | ||
| 90 | """Determine if we should apply the given patch""" | ||
| 91 | import oe.patch | ||
| 92 | return oe.patch.should_apply(parm, d) | ||
| 93 | |||
| 94 | should_apply[vardepsexclude] = "DATE SRCDATE" | ||
| 95 | |||
| 96 | python patch_do_patch() { | ||
| 97 | import oe.patch | ||
| 98 | |||
| 99 | patchsetmap = { | ||
| 100 | "patch": oe.patch.PatchTree, | ||
| 101 | "quilt": oe.patch.QuiltTree, | ||
| 102 | "git": oe.patch.GitApplyTree, | ||
| 103 | } | ||
| 104 | |||
| 105 | cls = patchsetmap[d.getVar('PATCHTOOL') or 'quilt'] | ||
| 106 | |||
| 107 | resolvermap = { | ||
| 108 | "noop": oe.patch.NOOPResolver, | ||
| 109 | "user": oe.patch.UserResolver, | ||
| 110 | } | ||
| 111 | |||
| 112 | rcls = resolvermap[d.getVar('PATCHRESOLVE') or 'user'] | ||
| 113 | |||
| 114 | classes = {} | ||
| 115 | |||
| 116 | s = d.getVar('S') | ||
| 117 | |||
| 118 | os.putenv('PATH', d.getVar('PATH')) | ||
| 119 | |||
| 120 | # We must use one TMPDIR per process so that the "patch" processes | ||
| 121 | # don't generate the same temp file name. | ||
| 122 | |||
| 123 | import tempfile | ||
| 124 | process_tmpdir = tempfile.mkdtemp() | ||
| 125 | os.environ['TMPDIR'] = process_tmpdir | ||
| 126 | |||
| 127 | for patch in src_patches(d): | ||
| 128 | _, _, local, _, _, parm = bb.fetch.decodeurl(patch) | ||
| 129 | |||
| 130 | if "patchdir" in parm: | ||
| 131 | patchdir = parm["patchdir"] | ||
| 132 | if not os.path.isabs(patchdir): | ||
| 133 | patchdir = os.path.join(s, patchdir) | ||
| 134 | if not os.path.isdir(patchdir): | ||
| 135 | bb.fatal("Target directory '%s' not found, patchdir '%s' is incorrect in patch file '%s'" % | ||
| 136 | (patchdir, parm["patchdir"], parm['patchname'])) | ||
| 137 | else: | ||
| 138 | patchdir = s | ||
| 139 | |||
| 140 | if not patchdir in classes: | ||
| 141 | patchset = cls(patchdir, d) | ||
| 142 | resolver = rcls(patchset, oe_terminal) | ||
| 143 | classes[patchdir] = (patchset, resolver) | ||
| 144 | patchset.Clean() | ||
| 145 | else: | ||
| 146 | patchset, resolver = classes[patchdir] | ||
| 147 | |||
| 148 | bb.note("Applying patch '%s' (%s)" % (parm['patchname'], oe.path.format_display(local, d))) | ||
| 149 | try: | ||
| 150 | patchset.Import({"file":local, "strippath": parm['striplevel']}, True) | ||
| 151 | except Exception as exc: | ||
| 152 | bb.utils.remove(process_tmpdir, True) | ||
| 153 | bb.fatal("Importing patch '%s' with striplevel '%s'\n%s" % (parm['patchname'], parm['striplevel'], repr(exc).replace("\\n", "\n"))) | ||
| 154 | try: | ||
| 155 | resolver.Resolve() | ||
| 156 | except bb.BBHandledException as e: | ||
| 157 | bb.utils.remove(process_tmpdir, True) | ||
| 158 | bb.fatal("Applying patch '%s' on target directory '%s'\n%s" % (parm['patchname'], patchdir, repr(e).replace("\\n", "\n"))) | ||
| 159 | |||
| 160 | bb.utils.remove(process_tmpdir, True) | ||
| 161 | del os.environ['TMPDIR'] | ||
| 162 | } | ||
| 163 | patch_do_patch[vardepsexclude] = "PATCHRESOLVE" | ||
| 164 | |||
| 165 | addtask patch after do_unpack | ||
| 166 | do_patch[dirs] = "${WORKDIR}" | ||
| 167 | do_patch[depends] = "${PATCHDEPENDENCY}" | ||
| 168 | |||
| 169 | EXPORT_FUNCTIONS do_patch | ||
