Matt Spinler | 1b8b904 | 2016-08-25 13:04:09 -0500 | [diff] [blame] | 1 | #This class applies patches to an XML file during do_patch(). The |
| 2 | #patches themselves are specified in XML in a separate file that must |
| 3 | #be in SRC_URI and end in .patch.xml. The patch XML file must also |
| 4 | #have a <targetFile> element that specifies the base name of the file |
| 5 | #that needs to be patched. |
| 6 | # |
| 7 | #See patchxml.py for details on the XML patch format. |
| 8 | # |
| 9 | |
Matt Spinler | e4fa191 | 2020-02-20 11:32:31 -0600 | [diff] [blame] | 10 | inherit python3native |
Matt Spinler | 1b8b904 | 2016-08-25 13:04:09 -0500 | [diff] [blame] | 11 | inherit obmc-phosphor-utils |
| 12 | do_patch[depends] = "mrw-patch-native:do_populate_sysroot" |
| 13 | |
| 14 | |
| 15 | def find_patch_files(d): |
| 16 | all_patches = listvar_to_list(d, 'SRC_URI') |
Matt Spinler | e4fa191 | 2020-02-20 11:32:31 -0600 | [diff] [blame] | 17 | xml_patches = [x for x in all_patches if x.endswith('.patch.xml') and |
| 18 | x.startswith('file://')] |
Matt Spinler | 1b8b904 | 2016-08-25 13:04:09 -0500 | [diff] [blame] | 19 | |
| 20 | return [x.lstrip('file://') for x in xml_patches] |
| 21 | |
| 22 | |
| 23 | def apply_xml_patch(base_patch_name, d): |
| 24 | import xml.etree.ElementTree as et |
| 25 | import subprocess |
| 26 | |
| 27 | patch_file = os.path.join(d.getVar("WORKDIR", True), base_patch_name) |
| 28 | |
| 29 | if not os.path.exists(patch_file): |
| 30 | bb.fatal("Could not find patch file " + patch_file + |
| 31 | " specified in SRC_URI") |
| 32 | |
| 33 | patch_tree = et.parse(patch_file) |
| 34 | patch_root = patch_tree.getroot() |
| 35 | target_file_element = patch_root.find("targetFile") |
| 36 | |
| 37 | if target_file_element is None: |
| 38 | bb.fatal("Could not find <targetFile> element in patch file " |
| 39 | + patch_file) |
| 40 | else: |
| 41 | xml = target_file_element.text |
| 42 | |
| 43 | xml = os.path.join(d.getVar("S", True), xml) |
| 44 | |
| 45 | if not os.path.exists(xml): |
| 46 | bb.fatal("Could not find XML file to patch: " + xml) |
| 47 | |
| 48 | print("Applying XML fixes found in " + patch_file + " to " + xml) |
| 49 | |
| 50 | cmd = [] |
| 51 | cmd.append(os.path.join(d.getVar("bindir", True), "obmc-mrw/patchxml.py")) |
| 52 | cmd.append("-x") |
| 53 | cmd.append(xml) |
| 54 | cmd.append("-p") |
| 55 | cmd.append(patch_file) |
| 56 | cmd.append("-o") |
| 57 | cmd.append(xml + ".patched") |
| 58 | |
| 59 | try: |
| 60 | subprocess.check_call(cmd) |
| 61 | except subprocess.CalledProcessError as e: |
| 62 | bb.fatal("Failed patching XML:\n%s" % e.output) |
| 63 | |
| 64 | os.rename(xml, xml + ".orig") |
| 65 | os.rename(xml + ".patched", xml) |
| 66 | |
| 67 | |
| 68 | python xmlpatch_do_patch() { |
| 69 | |
| 70 | for patch in find_patch_files(d): |
| 71 | apply_xml_patch(patch, d) |
| 72 | } |
| 73 | |
| 74 | do_patch[postfuncs] += "xmlpatch_do_patch" |