#This class applies patches to an XML file during do_patch(). The #patches themselves are specified in XML in a separate file that must #be in SRC_URI and end in .patch.xml. The patch XML file must also #have a element that specifies the base name of the file #that needs to be patched. # #See patchxml.py for details on the XML patch format. # inherit pythonnative inherit obmc-phosphor-utils do_patch[depends] = "mrw-patch-native:do_populate_sysroot" def find_patch_files(d): all_patches = listvar_to_list(d, 'SRC_URI') xml_patches = filter(lambda x: x.endswith('.patch.xml') and x.startswith('file://'), all_patches) return [x.lstrip('file://') for x in xml_patches] def apply_xml_patch(base_patch_name, d): import xml.etree.ElementTree as et import subprocess patch_file = os.path.join(d.getVar("WORKDIR", True), base_patch_name) if not os.path.exists(patch_file): bb.fatal("Could not find patch file " + patch_file + " specified in SRC_URI") patch_tree = et.parse(patch_file) patch_root = patch_tree.getroot() target_file_element = patch_root.find("targetFile") if target_file_element is None: bb.fatal("Could not find element in patch file " + patch_file) else: xml = target_file_element.text xml = os.path.join(d.getVar("S", True), xml) if not os.path.exists(xml): bb.fatal("Could not find XML file to patch: " + xml) print("Applying XML fixes found in " + patch_file + " to " + xml) cmd = [] cmd.append(os.path.join(d.getVar("bindir", True), "obmc-mrw/patchxml.py")) cmd.append("-x") cmd.append(xml) cmd.append("-p") cmd.append(patch_file) cmd.append("-o") cmd.append(xml + ".patched") try: subprocess.check_call(cmd) except subprocess.CalledProcessError as e: bb.fatal("Failed patching XML:\n%s" % e.output) os.rename(xml, xml + ".orig") os.rename(xml + ".patched", xml) python xmlpatch_do_patch() { for patch in find_patch_files(d): apply_xml_patch(patch, d) } do_patch[postfuncs] += "xmlpatch_do_patch"