From f4eec68635bc516ce99c804bdc876f74dd4523fc Mon Sep 17 00:00:00 2001 From: Christopher Clark Date: Tue, 25 Feb 2020 16:15:59 -0800 Subject: xen, xen-tools: update recipes for python3 Adds patches for packaged scripts to enable deployment with python3 where they have been ported to python 3 upstream. setuptools3 inherits distutils3 which modifies ${B}, so cd ${S} is needed in the do_configure, do_compile and do_install steps. Remove python 2 dependency from the Xen recipes by adding a new separate recipe, xen-python2, for packaging the remaining optional scripts which are yet to be ported to python 3. Package naming in the separate recipe is chosen to support transition back into the xen-tools recipe if the scripts are ported later. Use RSUGGESTS to support inclusion of the xen-python2 scripts in images that include python 2. Drop the remus package python dependency since the script was removed in 2014: commit 5b66f84e37a45038f9e5dae7a5768a5525d1e6ba Add python3 RDEPENDS needed to run xenmon. Signed-off-by: Christopher Clark Signed-off-by: Bruce Ashfield --- ...001-python-pygrub-pass-DISTUTILS-xen.4.12.patch | 7 +- .../xen/files/xen-tools-libxl-gentypes-py3.patch | 140 ++++++ .../xen-tools-pygrub-change-tabs-into-spaces.patch | 40 ++ ...-make-python-scripts-work-with-2.6-and-up.patch | 529 +++++++++++++++++++++ .../xen/files/xen-tools-pygrub-py3.patch | 233 +++++++++ ...n-tools-python-fix-Wsign-compare-warnings.patch | 136 ++++++ .../xen-tools-update-python-scripts-to-py3.patch | 140 ++++++ recipes-extended/xen/xen-hypervisor.inc | 4 +- recipes-extended/xen/xen-python2.bb | 68 +++ recipes-extended/xen/xen-tools.inc | 57 ++- recipes-extended/xen/xen-tools_git.bb | 6 + recipes-extended/xen/xen.inc | 11 +- 12 files changed, 1344 insertions(+), 27 deletions(-) create mode 100644 recipes-extended/xen/files/xen-tools-libxl-gentypes-py3.patch create mode 100644 recipes-extended/xen/files/xen-tools-pygrub-change-tabs-into-spaces.patch create mode 100644 recipes-extended/xen/files/xen-tools-pygrub-make-python-scripts-work-with-2.6-and-up.patch create mode 100644 recipes-extended/xen/files/xen-tools-pygrub-py3.patch create mode 100644 recipes-extended/xen/files/xen-tools-python-fix-Wsign-compare-warnings.patch create mode 100644 recipes-extended/xen/files/xen-tools-update-python-scripts-to-py3.patch create mode 100644 recipes-extended/xen/xen-python2.bb diff --git a/recipes-extended/xen/files/0001-python-pygrub-pass-DISTUTILS-xen.4.12.patch b/recipes-extended/xen/files/0001-python-pygrub-pass-DISTUTILS-xen.4.12.patch index 6504d86e..96e907d5 100644 --- a/recipes-extended/xen/files/0001-python-pygrub-pass-DISTUTILS-xen.4.12.patch +++ b/recipes-extended/xen/files/0001-python-pygrub-pass-DISTUTILS-xen.4.12.patch @@ -13,11 +13,14 @@ Signed-off-by: Maciej Pijanowski Forward-ported to Xen 4.12.0 Signed-off-by: Christopher Clark +Modified to support pygrub installation with python 3 +Signed-off-by: Christopher Clark + diff --git a/tools/pygrub/Makefile b/tools/pygrub/Makefile index 3063c49..513314b 100644 --- a/tools/pygrub/Makefile +++ b/tools/pygrub/Makefile -@@ -10,14 +10,15 @@ INSTALL_LOG = build/installed_files.txt +@@ -10,14 +10,17 @@ INSTALL_LOG = build/installed_files.txt all: build .PHONY: build build: @@ -32,6 +35,8 @@ index 3063c49..513314b 100644 - --root="$(DESTDIR)" --install-scripts=$(LIBEXEC_BIN) --force + --root="$(DESTDIR)" --install-scripts=$(LIBEXEC_BIN) --force \ + $(DISTUTILS_INSTALL_ARGS) ++ rm -f $(DESTDIR)/$(LIBEXEC_BIN)/pygrub ++ $(INSTALL_PYTHON_PROG) src/pygrub $(DESTDIR)/$(LIBEXEC_BIN)/pygrub set -e; if [ $(bindir) != $(LIBEXEC_BIN) -a \ "`readlink -f $(DESTDIR)/$(bindir)`" != \ "`readlink -f $(LIBEXEC_BIN)`" ]; then \ diff --git a/recipes-extended/xen/files/xen-tools-libxl-gentypes-py3.patch b/recipes-extended/xen/files/xen-tools-libxl-gentypes-py3.patch new file mode 100644 index 00000000..23997865 --- /dev/null +++ b/recipes-extended/xen/files/xen-tools-libxl-gentypes-py3.patch @@ -0,0 +1,140 @@ +From 660d2dd863802ef464c90b32f187cb65861f8185 Mon Sep 17 00:00:00 2001 +From: Wei Liu +Date: Thu, 7 Mar 2019 12:33:38 +0000 +Subject: [PATCH] libxl: make python scripts work with python 2.6 and up + +Go through transformations suggested by 2to3 and pick the necessary +ones. + +Signed-off-by: Wei Liu +Reviewed-by: Andrew Cooper +--- + tools/libxl/gentest.py | 4 +++- + tools/libxl/gentypes.py | 12 +++++++----- + tools/libxl/idl.py | 15 ++++++++------- + 3 files changed, 18 insertions(+), 13 deletions(-) + +diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py +index 989959fc68..1cc7eebc82 100644 +--- a/tools/libxl/gentest.py ++++ b/tools/libxl/gentest.py +@@ -1,5 +1,7 @@ + #!/usr/bin/python + ++from __future__ import print_function ++ + import os + import sys + import re +@@ -86,7 +88,7 @@ def gen_rand_init(ty, v, indent = " ", parent = None): + + if __name__ == '__main__': + if len(sys.argv) < 3: +- print >>sys.stderr, "Usage: gentest.py " ++ print("Usage: gentest.py ", file=sys.stderr) + sys.exit(1) + + random.seed(os.getenv('LIBXL_TESTIDL_SEED')) +diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py +index 88e5c5f30e..6417c9dd8c 100644 +--- a/tools/libxl/gentypes.py ++++ b/tools/libxl/gentypes.py +@@ -1,5 +1,7 @@ + #!/usr/bin/python + ++from __future__ import print_function ++ + import sys + import re + +@@ -576,14 +578,14 @@ def libxl_C_enum_from_string(ty, str, e, indent = " "): + + if __name__ == '__main__': + if len(sys.argv) != 6: +- print >>sys.stderr, "Usage: gentypes.py
" ++ print("Usage: gentypes.py
", file=sys.stderr) + sys.exit(1) + + (_, idlname, header, header_private, header_json, impl) = sys.argv + + (builtins,types) = idl.parse(idlname) + +- print "outputting libxl type definitions to %s" % header ++ print("outputting libxl type definitions to %s" % header) + + f = open(header, "w") + +@@ -633,7 +635,7 @@ if __name__ == '__main__': + f.write("""#endif /* %s */\n""" % (header_define)) + f.close() + +- print "outputting libxl JSON definitions to %s" % header_json ++ print("outputting libxl JSON definitions to %s" % header_json) + + f = open(header_json, "w") + +@@ -657,7 +659,7 @@ if __name__ == '__main__': + f.write("""#endif /* %s */\n""" % header_json_define) + f.close() + +- print "outputting libxl type internal definitions to %s" % header_private ++ print("outputting libxl type internal definitions to %s" % header_private) + + f = open(header_private, "w") + +@@ -683,7 +685,7 @@ if __name__ == '__main__': + f.write("""#endif /* %s */\n""" % header_json_define) + f.close() + +- print "outputting libxl type implementations to %s" % impl ++ print("outputting libxl type implementations to %s" % impl) + + f = open(impl, "w") + f.write(""" +diff --git a/tools/libxl/idl.py b/tools/libxl/idl.py +index 2a7f3c44fe..d7367503b4 100644 +--- a/tools/libxl/idl.py ++++ b/tools/libxl/idl.py +@@ -1,3 +1,5 @@ ++from __future__ import print_function ++ + import sys + + PASS_BY_VALUE = 1 +@@ -11,7 +13,7 @@ DIR_BOTH = 3 + _default_namespace = "" + def namespace(s): + if type(s) != str: +- raise TypeError, "Require a string for the default namespace." ++ raise TypeError("Require a string for the default namespace.") + global _default_namespace + _default_namespace = s + +@@ -346,7 +348,7 @@ class OrderedDict(dict): + return [(x,self[x]) for x in self.__ordered] + + def parse(f): +- print >>sys.stderr, "Parsing %s" % f ++ print("Parsing %s" % f, file=sys.stderr) + + globs = {} + locs = OrderedDict() +@@ -362,11 +364,10 @@ def parse(f): + globs[n] = t + + try: +- execfile(f, globs, locs) +- except SyntaxError,e: +- raise SyntaxError, \ +- "Errors were found at line %d while processing %s:\n\t%s"\ +- %(e.lineno,f,e.text) ++ exec(compile(open(f).read(), f, 'exec'), globs, locs) ++ except SyntaxError as e: ++ raise SyntaxError("Errors were found at line %d while processing %s:\n\t%s" ++ % (e.lineno, f, e.text)) + + types = [t for t in locs.ordered_values() if isinstance(t,Type)] + +-- +2.17.1 + diff --git a/recipes-extended/xen/files/xen-tools-pygrub-change-tabs-into-spaces.patch b/recipes-extended/xen/files/xen-tools-pygrub-change-tabs-into-spaces.patch new file mode 100644 index 00000000..d913be20 --- /dev/null +++ b/recipes-extended/xen/files/xen-tools-pygrub-change-tabs-into-spaces.patch @@ -0,0 +1,40 @@ +From b9e1368af14ded6aee3bdf64e8329628b16291ff Mon Sep 17 00:00:00 2001 +From: Wei Liu +Date: Mon, 11 Mar 2019 12:55:29 +0000 +Subject: [PATCH] pygrub: change tabs into spaces + +Not sure why Python 2 never complained, but Python 3 does. + +Change tabs to spaces. + +Signed-off-by: Wei Liu +Reviewed-by: Andrew Cooper +--- + tools/pygrub/src/pygrub | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub +index 52a8965ad9..1189b1ca48 100755 +--- a/tools/pygrub/src/pygrub ++++ b/tools/pygrub/src/pygrub +@@ -858,7 +858,7 @@ if __name__ == "__main__": + output_directory = a + + if debug: +- logging.basicConfig(level=logging.DEBUG) ++ logging.basicConfig(level=logging.DEBUG) + + + try: +@@ -917,7 +917,7 @@ if __name__ == "__main__": + # IOErrors raised by fsimage.open + # RuntimeErrors raised by run_grub if no menu.lst present + if debug: +- traceback.print_exc() ++ traceback.print_exc() + fs = None + continue + +-- +2.17.1 + diff --git a/recipes-extended/xen/files/xen-tools-pygrub-make-python-scripts-work-with-2.6-and-up.patch b/recipes-extended/xen/files/xen-tools-pygrub-make-python-scripts-work-with-2.6-and-up.patch new file mode 100644 index 00000000..f4cbb670 --- /dev/null +++ b/recipes-extended/xen/files/xen-tools-pygrub-make-python-scripts-work-with-2.6-and-up.patch @@ -0,0 +1,529 @@ +From 0aabd89dcfee9ee2a6caaa2ec7a475daf5cada53 Mon Sep 17 00:00:00 2001 +From: Wei Liu +Date: Thu, 7 Mar 2019 12:45:47 +0000 +Subject: [PATCH] pygrub: make python scripts work with 2.6 and up + +Run 2to3 and pick the sensible suggestions. + +Import print_function and absolute_import so 2.6 can work. + +There has never been a curses.wrapper module according to 2.x and 3.x +doc, only a function, so "import curses.wrapper" is not correct. It +happened to work because 2.x implemented a (undocumented) module. + +We only need to import curses to make curses.wrapper available to +pygrub. + +Signed-off-by: Wei Liu +Reviewed-by: Andrew Cooper +--- + tools/pygrub/src/ExtLinuxConf.py | 19 +++++---- + tools/pygrub/src/GrubConf.py | 39 ++++++++++-------- + tools/pygrub/src/LiloConf.py | 19 +++++---- + tools/pygrub/src/pygrub | 71 ++++++++++++++++---------------- + 4 files changed, 78 insertions(+), 70 deletions(-) + +diff --git a/tools/pygrub/src/ExtLinuxConf.py b/tools/pygrub/src/ExtLinuxConf.py +index d1789bf020..9fd635b9cf 100644 +--- a/tools/pygrub/src/ExtLinuxConf.py ++++ b/tools/pygrub/src/ExtLinuxConf.py +@@ -10,9 +10,11 @@ + # along with this program; If not, see . + # + ++from __future__ import print_function, absolute_import ++ + import sys, re, os + import logging +-import GrubConf ++from . import GrubConf + + class ExtLinuxImage(object): + def __init__(self, lines, path): +@@ -32,7 +34,8 @@ class ExtLinuxImage(object): + self.lines = [] + self.path = path + self.root = "" +- map(self.set_from_line, lines) ++ for line in lines: ++ self.set_from_line(line) + + def set_from_line(self, line, replace = None): + (com, arg) = GrubConf.grub_exact_split(line, 2) +@@ -67,7 +70,7 @@ class ExtLinuxImage(object): + setattr(self, "initrd", a.replace("initrd=", "")) + arg = arg.replace(a, "") + +- if com is not None and self.commands.has_key(com): ++ if com is not None and com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], re.sub('^"(.+)"$', r"\1", arg.strip())) + else: +@@ -136,7 +139,7 @@ class ExtLinuxConfigFile(object): + def parse(self, buf = None): + if buf is None: + if self.filename is None: +- raise ValueError, "No config file defined to parse!" ++ raise ValueError("No config file defined to parse!") + + f = open(self.filename, 'r') + lines = f.readlines() +@@ -167,7 +170,7 @@ class ExtLinuxConfigFile(object): + + (com, arg) = GrubConf.grub_exact_split(l, 2) + com = com.lower() +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: +@@ -207,8 +210,8 @@ class ExtLinuxConfigFile(object): + + if __name__ == "__main__": + if len(sys.argv) < 2: +- raise RuntimeError, "Need a configuration file to read" ++ raise RuntimeError("Need a configuration file to read") + g = ExtLinuxConfigFile(sys.argv[1]) + for i in g.images: +- print i +- print g.default ++ print(i) ++ print(g.default) +diff --git a/tools/pygrub/src/GrubConf.py b/tools/pygrub/src/GrubConf.py +index dc810d55cb..f8d3799dc0 100644 +--- a/tools/pygrub/src/GrubConf.py ++++ b/tools/pygrub/src/GrubConf.py +@@ -12,6 +12,8 @@ + # along with this program; If not, see . + # + ++from __future__ import print_function, absolute_import ++ + import os, sys + import logging + import re +@@ -44,7 +46,7 @@ def get_path(s): + return (None, s) + idx = s.find(')') + if idx == -1: +- raise ValueError, "Unable to find matching ')'" ++ raise ValueError("Unable to find matching ')'") + d = s[:idx] + return (GrubDiskPart(d), s[idx + 1:]) + +@@ -100,7 +102,8 @@ class _GrubImage(object): + " initrd: %s\n" %(self.title, self.root, self.kernel, + self.args, self.initrd)) + def _parse(self, lines): +- map(self.set_from_line, lines) ++ for line in lines: ++ self.set_from_line(line) + + def reset(self, lines): + self._root = self._initrd = self._kernel = self._args = None +@@ -141,7 +144,7 @@ class GrubImage(_GrubImage): + def set_from_line(self, line, replace = None): + (com, arg) = grub_exact_split(line, 2) + +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: +@@ -177,7 +180,7 @@ class _GrubConfigFile(object): + self.parse() + + def parse(self, buf = None): +- raise RuntimeError, "unimplemented parse function" ++ raise RuntimeError("unimplemented parse function") + + def hasPasswordAccess(self): + return self.passwordAccess +@@ -201,7 +204,7 @@ class _GrubConfigFile(object): + import crypt + if crypt.crypt(password, pwd[1]) == pwd[1]: + return True +- except Exception, e: ++ except Exception as e: + self.passExc = "Can't verify password: %s" % str(e) + return False + +@@ -213,7 +216,7 @@ class _GrubConfigFile(object): + + def set(self, line): + (com, arg) = grub_exact_split(line, 2) +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: +@@ -233,7 +236,7 @@ class _GrubConfigFile(object): + self._default = val + + if self._default < 0: +- raise ValueError, "default must be positive number" ++ raise ValueError("default must be positive number") + default = property(_get_default, _set_default) + + def set_splash(self, val): +@@ -265,7 +268,7 @@ class GrubConfigFile(_GrubConfigFile): + def parse(self, buf = None): + if buf is None: + if self.filename is None: +- raise ValueError, "No config file defined to parse!" ++ raise ValueError("No config file defined to parse!") + + f = open(self.filename, 'r') + lines = f.readlines() +@@ -296,7 +299,7 @@ class GrubConfigFile(_GrubConfigFile): + continue + + (com, arg) = grub_exact_split(l, 2) +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: +@@ -328,7 +331,7 @@ class Grub2Image(_GrubImage): + if com == "set": + (com,arg) = grub2_handle_set(arg) + +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: +@@ -364,7 +367,7 @@ class Grub2ConfigFile(_GrubConfigFile): + def parse(self, buf = None): + if buf is None: + if self.filename is None: +- raise ValueError, "No config file defined to parse!" ++ raise ValueError("No config file defined to parse!") + + f = open(self.filename, 'r') + lines = f.readlines() +@@ -398,7 +401,7 @@ class Grub2ConfigFile(_GrubConfigFile): + title_match = re.match('^menuentry ["\'](.*?)["\'] (.*){', l) + if title_match: + if img is not None: +- raise RuntimeError, "syntax error: cannot nest menuentry (%d %s)" % (len(img),img) ++ raise RuntimeError("syntax error: cannot nest menuentry (%d %s)" % (len(img),img)) + img = [] + title = title_match.group(1) + continue +@@ -413,7 +416,7 @@ class Grub2ConfigFile(_GrubConfigFile): + menu_level -= 1 + continue + else: +- raise RuntimeError, "syntax error: closing brace without menuentry" ++ raise RuntimeError("syntax error: closing brace without menuentry") + + self.add_image(Grub2Image(title, img)) + img = None +@@ -428,7 +431,7 @@ class Grub2ConfigFile(_GrubConfigFile): + if com == "set": + (com,arg) = grub2_handle_set(arg) + +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + arg_strip = arg.strip() + if arg_strip == "${saved_entry}" or arg_strip == "${next_entry}": +@@ -443,7 +446,7 @@ class Grub2ConfigFile(_GrubConfigFile): + logging.warning("Unknown directive %s" %(com,)) + + if img is not None: +- raise RuntimeError, "syntax error: end of file with open menuentry(%d %s)" % (len(img),img) ++ raise RuntimeError("syntax error: end of file with open menuentry(%d %s)" % (len(img),img)) + + if self.hasPassword(): + self.setPasswordAccess(False) +@@ -462,12 +465,12 @@ class Grub2ConfigFile(_GrubConfigFile): + + if __name__ == "__main__": + if len(sys.argv) < 3: +- raise RuntimeError, "Need a grub version (\"grub\" or \"grub2\") and a grub.conf or grub.cfg to read" ++ raise RuntimeError('Need a grub version ("grub" or "grub2") and a grub.conf or grub.cfg to read') + if sys.argv[1] == "grub": + g = GrubConfigFile(sys.argv[2]) + elif sys.argv[1] == "grub2": + g = Grub2ConfigFile(sys.argv[2]) + else: +- raise RuntimeError, "Unknown config type %s" % sys.argv[1] ++ raise RuntimeError("Unknown config type %s" % sys.argv[1]) + for i in g.images: +- print i #, i.title, i.root, i.kernel, i.args, i.initrd ++ print(i) #, i.title, i.root, i.kernel, i.args, i.initrd +diff --git a/tools/pygrub/src/LiloConf.py b/tools/pygrub/src/LiloConf.py +index 2cb649f115..e3bfcb5244 100644 +--- a/tools/pygrub/src/LiloConf.py ++++ b/tools/pygrub/src/LiloConf.py +@@ -2,9 +2,11 @@ + #LiloConf.py + # + ++from __future__ import print_function, absolute_import ++ + import sys, re, os + import logging +-import GrubConf ++from . import GrubConf + + class LiloImage(object): + def __init__(self, lines, path): +@@ -24,12 +26,13 @@ class LiloImage(object): + self.lines = [] + self.path = path + self.root = "" +- map(self.set_from_line, lines) ++ for line in lines: ++ self.set_from_line(line) + + def set_from_line(self, line, replace = None): + (com, arg) = GrubConf.grub_exact_split(line, 2) + +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], re.sub('^"(.+)"$', r"\1", arg.strip())) + else: +@@ -97,7 +100,7 @@ class LiloConfigFile(object): + def parse(self, buf = None): + if buf is None: + if self.filename is None: +- raise ValueError, "No config file defined to parse!" ++ raise ValueError("No config file defined to parse!") + + f = open(self.filename, 'r') + lines = f.readlines() +@@ -127,7 +130,7 @@ class LiloConfigFile(object): + continue + + (com, arg) = GrubConf.grub_exact_split(l, 2) +- if self.commands.has_key(com): ++ if com in self.commands: + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: +@@ -170,8 +173,8 @@ class LiloConfigFile(object): + + if __name__ == "__main__": + if len(sys.argv) < 2: +- raise RuntimeError, "Need a lilo.conf to read" ++ raise RuntimeError("Need a lilo.conf to read") + g = LiloConfigFile(sys.argv[1]) + for i in g.images: +- print i #, i.title, i.root, i.kernel, i.args, i.initrd +- print g.default ++ print(i) #, i.title, i.root, i.kernel, i.args, i.initrd ++ print(g.default) +diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub +index 1189b1ca48..dbdce315c6 100755 +--- a/tools/pygrub/src/pygrub ++++ b/tools/pygrub/src/pygrub +@@ -12,13 +12,15 @@ + # along with this program; If not, see . + # + ++from __future__ import print_function ++ + import os, sys, string, struct, tempfile, re, traceback, stat, errno + import copy + import logging + import platform + import xen.lowlevel.xc + +-import curses, _curses, curses.wrapper, curses.textpad, curses.ascii ++import curses, _curses, curses.textpad, curses.ascii + import getopt + + import xenfsimage +@@ -77,7 +79,7 @@ def get_solaris_slice(file, offset): + buf = os.read(fd, 512) + os.close(fd) + if struct.unpack(">sys.stderr, "Using %s to parse %s" % (parser,f) ++ print("Using %s to parse %s" % (parser,f), file=sys.stderr) + self.cf = parser() + self.cf.filename = f + break + if self.__dict__.get('cf', None) is None: +- raise RuntimeError, "couldn't find bootloader config file in the image provided." ++ raise RuntimeError("couldn't find bootloader config file in the image provided.") + f = fs.open_file(self.cf.filename) + # limit read size to avoid pathological cases + buf = f.read(FS_READ_MAX) +@@ -628,11 +627,11 @@ def run_grub(file, entry, fs, cfg_args): + if list_entries: + for i in range(len(g.cf.images)): + img = g.cf.images[i] +- print "title: %s" % img.title +- print " root: %s" % img.root +- print " kernel: %s" % img.kernel[1] +- print " args: %s" % img.args +- print " initrd: %s" % img.initrd[1] ++ print("title: %s" % img.title) ++ print(" root: %s" % img.root) ++ print(" kernel: %s" % img.kernel[1]) ++ print(" args: %s" % img.args) ++ print(" initrd: %s" % img.initrd[1]) + + if interactive and not list_entries: + curses.wrapper(run_main) +@@ -646,7 +645,7 @@ def run_grub(file, entry, fs, cfg_args): + sel = idx + + if sel == -1: +- print "No kernel image selected!" ++ print("No kernel image selected!") + sys.exit(1) + + try: +@@ -731,7 +730,7 @@ def format_sxp(kernel, ramdisk, args): + def format_simple(kernel, ramdisk, args, sep): + for check in (kernel, ramdisk, args): + if check is not None and sep in check: +- raise RuntimeError, "simple format cannot represent delimiter-containing value" ++ raise RuntimeError("simple format cannot represent delimiter-containing value") + s = ("kernel %s" % kernel) + sep + if ramdisk: + s += ("ramdisk %s" % ramdisk) + sep +@@ -744,7 +743,7 @@ if __name__ == "__main__": + sel = None + + def usage(): +- print >> sys.stderr, "Usage: %s [-q|--quiet] [-i|--interactive] [-l|--list-entries] [-n|--not-really] [--output=] [--kernel=] [--ramdisk=] [--args=] [--entry=] [--output-directory=] [--output-format=sxp|simple|simple0] [--offset=] " %(sys.argv[0],) ++ print("Usage: %s [-q|--quiet] [-i|--interactive] [-l|--list-entries] [-n|--not-really] [--output=] [--kernel=] [--ramdisk=] [--args=] [--entry=] [--output-directory=] [--output-format=sxp|simple|simple0] [--offset=] " %(sys.argv[0],), file=sys.stderr) + + def copy_from_image(fs, file_to_read, file_type, output_directory, + not_really): +@@ -755,8 +754,8 @@ if __name__ == "__main__": + sys.exit("The requested %s file does not exist" % file_type) + try: + datafile = fs.open_file(file_to_read) +- except Exception, e: +- print >>sys.stderr, e ++ except Exception as e: ++ print(e, file=sys.stderr) + sys.exit("Error opening %s in guest" % file_to_read) + (tfd, ret) = tempfile.mkstemp(prefix="boot_"+file_type+".", + dir=output_directory) +@@ -769,8 +768,8 @@ if __name__ == "__main__": + return ret + try: + os.write(tfd, data) +- except Exception, e: +- print >>sys.stderr, e ++ except Exception as e: ++ print(e, file=sys.stderr) + os.close(tfd) + os.unlink(ret) + del datafile +@@ -834,7 +833,7 @@ if __name__ == "__main__": + try: + part_offs = [ int(a) ] + except ValueError: +- print "offset value must be an integer" ++ print("offset value must be an integer") + usage() + sys.exit(1) + elif o in ("--entry",): +@@ -847,13 +846,13 @@ if __name__ == "__main__": + debug = True + elif o in ("--output-format",): + if a not in ["sxp", "simple", "simple0"]: +- print "unknown output format %s" % a ++ print("unknown output format %s" % a) + usage() + sys.exit(1) + output_format = a + elif o in ("--output-directory",): + if not os.path.isdir(a): +- print "%s is not an existing directory" % a ++ print("%s is not an existing directory" % a) + sys.exit(1) + output_directory = a + +@@ -862,8 +861,8 @@ if __name__ == "__main__": + + + try: +- os.makedirs(output_directory, 0700) +- except OSError,e: ++ os.makedirs(output_directory, 0o700) ++ except OSError as e: + if (e.errno == errno.EEXIST) and os.path.isdir(output_directory): + pass + else: +@@ -877,10 +876,10 @@ if __name__ == "__main__": + # debug + if isconfig: + chosencfg = run_grub(file, entry, fs, incfg["args"]) +- print " kernel: %s" % chosencfg["kernel"] ++ print(" kernel: %s" % chosencfg["kernel"]) + if chosencfg["ramdisk"]: +- print " initrd: %s" % chosencfg["ramdisk"] +- print " args: %s" % chosencfg["args"] ++ print(" initrd: %s" % chosencfg["ramdisk"]) ++ print(" args: %s" % chosencfg["args"]) + sys.exit(0) + + # if boot filesystem is set then pass to fsimage.open +@@ -926,7 +925,7 @@ if __name__ == "__main__": + + # Did looping through partitions find us a kernel? + if fs is None: +- raise RuntimeError, "Unable to find partition containing kernel" ++ raise RuntimeError("Unable to find partition containing kernel") + + bootcfg["kernel"] = copy_from_image(fs, chosencfg["kernel"], "kernel", + output_directory, not_really) +-- +2.17.1 + diff --git a/recipes-extended/xen/files/xen-tools-pygrub-py3.patch b/recipes-extended/xen/files/xen-tools-pygrub-py3.patch new file mode 100644 index 00000000..e486646f --- /dev/null +++ b/recipes-extended/xen/files/xen-tools-pygrub-py3.patch @@ -0,0 +1,233 @@ +From 83a204e6951c6358f995da3b60dd61224e9d41ac Mon Sep 17 00:00:00 2001 +From: Wei Liu +Date: Tue, 5 Mar 2019 14:13:17 +0000 +Subject: [PATCH] pygrub/fsimage: make it work with python 3 + +With the help of two porting guides and cpython source code: + +1. Use PyBytes to replace PyString counterparts. +2. Use PyVarObject_HEAD_INIT. +3. Remove usage of Py_FindMethod. +4. Use new module initialisation routine. + +For #3, Py_FindMethod was removed, yet an alternative wasn't +documented. The code is the result of reverse-engineering cpython +commit 6116d4a1d1 + +https://docs.python.org/3/howto/cporting.html +http://python3porting.com/cextensions.html + +Signed-off-by: Wei Liu +Reviewed-by: Andrew Cooper +--- + tools/pygrub/src/fsimage/fsimage.c | 123 ++++++++++++++++------------- + 1 file changed, 69 insertions(+), 54 deletions(-) + +diff --git a/tools/pygrub/src/fsimage/fsimage.c b/tools/pygrub/src/fsimage/fsimage.c +index 780207791c..2ebbbe35df 100644 +--- a/tools/pygrub/src/fsimage/fsimage.c ++++ b/tools/pygrub/src/fsimage/fsimage.c +@@ -26,12 +26,6 @@ + #include + #include + +-#if (PYTHON_API_VERSION >= 1011) +-#define PY_PAD 0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L +-#else +-#define PY_PAD 0L,0L,0L,0L +-#endif +- + typedef struct fsimage_fs { + PyObject_HEAD + fsi_t *fs; +@@ -59,12 +53,24 @@ fsimage_file_read(fsimage_file_t *file, PyObject *args, PyObject *kwargs) + + bufsize = size ? size : 4096; + +- if ((buffer = PyString_FromStringAndSize(NULL, bufsize)) == NULL) ++ buffer = ++#if PY_MAJOR_VERSION < 3 ++ PyString_FromStringAndSize(NULL, bufsize); ++#else ++ PyBytes_FromStringAndSize(NULL, bufsize); ++#endif ++ ++ if (buffer == NULL) + return (NULL); + + while (1) { + int err; +- void *buf = PyString_AS_STRING(buffer) + bytesread; ++ void *buf = ++#if PY_MAJOR_VERSION < 3 ++ PyString_AS_STRING(buffer) + bytesread; ++#else ++ PyBytes_AS_STRING(buffer) + bytesread; ++#endif + + err = fsi_pread_file(file->file, buf, bufsize, + bytesread + offset); +@@ -84,12 +90,20 @@ fsimage_file_read(fsimage_file_t *file, PyObject *args, PyObject *kwargs) + if (bufsize == 0) + break; + } else { ++#if PY_MAJOR_VERSION < 3 + if (_PyString_Resize(&buffer, bytesread + bufsize) < 0) ++#else ++ if (_PyBytes_Resize(&buffer, bytesread + bufsize) < 0) ++#endif + return (NULL); + } + } + ++#if PY_MAJOR_VERSION < 3 + _PyString_Resize(&buffer, bytesread); ++#else ++ _PyBytes_Resize(&buffer, bytesread); ++#endif + return (buffer); + } + +@@ -106,11 +120,13 @@ static struct PyMethodDef fsimage_file_methods[] = { + { NULL, NULL, 0, NULL } + }; + ++#if PY_MAJOR_VERSION < 3 + static PyObject * + fsimage_file_getattr(fsimage_file_t *file, char *name) + { + return (Py_FindMethod(fsimage_file_methods, (PyObject *)file, name)); + } ++#endif + + static void + fsimage_file_dealloc(fsimage_file_t *file) +@@ -123,29 +139,18 @@ fsimage_file_dealloc(fsimage_file_t *file) + + static char fsimage_file_type__doc__[] = "Filesystem image file"; + PyTypeObject fsimage_file_type = { +- PyObject_HEAD_INIT(&PyType_Type) +- 0, /* ob_size */ +- "xenfsimage.file", /* tp_name */ +- sizeof(fsimage_file_t), /* tp_size */ +- 0, /* tp_itemsize */ +- (destructor) fsimage_file_dealloc, /* tp_dealloc */ +- 0, /* tp_print */ +- (getattrfunc) fsimage_file_getattr, /* tp_getattr */ +- 0, /* tp_setattr */ +- 0, /* tp_compare */ +- 0, /* tp_repr */ +- 0, /* tp_as_number */ +- 0, /* tp_as_sequence */ +- 0, /* tp_as_mapping */ +- 0, /* tp_hash */ +- 0, /* tp_call */ +- 0, /* tp_str */ +- 0, /* tp_getattro */ +- 0, /* tp_setattro */ +- 0, /* tp_as_buffer */ +- Py_TPFLAGS_DEFAULT, /* tp_flags */ +- fsimage_file_type__doc__, +- PY_PAD ++ PyVarObject_HEAD_INIT(&PyType_Type, 0) ++ .tp_name = "xenfsimage.file", ++ .tp_basicsize = sizeof(fsimage_file_t), ++ .tp_dealloc = (destructor) fsimage_file_dealloc, ++#if PY_MAJOR_VERSION < 3 ++ .tp_getattr = (getattrfunc) fsimage_file_getattr, ++#endif ++ .tp_flags = Py_TPFLAGS_DEFAULT, ++ .tp_doc = fsimage_file_type__doc__, ++#if PY_MAJOR_VERSION >= 3 ++ .tp_methods = fsimage_file_methods, ++#endif + }; + + static PyObject * +@@ -208,11 +213,13 @@ static struct PyMethodDef fsimage_fs_methods[] = { + { NULL, NULL, 0, NULL } + }; + ++#if PY_MAJOR_VERSION < 3 + static PyObject * + fsimage_fs_getattr(fsimage_fs_t *fs, char *name) + { + return (Py_FindMethod(fsimage_fs_methods, (PyObject *)fs, name)); + } ++#endif + + static void + fsimage_fs_dealloc (fsimage_fs_t *fs) +@@ -225,29 +232,18 @@ fsimage_fs_dealloc (fsimage_fs_t *fs) + PyDoc_STRVAR(fsimage_fs_type__doc__, "Filesystem image"); + + PyTypeObject fsimage_fs_type = { +- PyObject_HEAD_INIT(&PyType_Type) +- 0, /* ob_size */ +- "xenfsimage.fs", /* tp_name */ +- sizeof(fsimage_fs_t), /* tp_size */ +- 0, /* tp_itemsize */ +- (destructor) fsimage_fs_dealloc, /* tp_dealloc */ +- 0, /* tp_print */ +- (getattrfunc) fsimage_fs_getattr, /* tp_getattr */ +- 0, /* tp_setattr */ +- 0, /* tp_compare */ +- 0, /* tp_repr */ +- 0, /* tp_as_number */ +- 0, /* tp_as_sequence */ +- 0, /* tp_as_mapping */ +- 0, /* tp_hash */ +- 0, /* tp_call */ +- 0, /* tp_str */ +- 0, /* tp_getattro */ +- 0, /* tp_setattro */ +- 0, /* tp_as_buffer */ +- Py_TPFLAGS_DEFAULT, /* tp_flags */ +- fsimage_fs_type__doc__, +- PY_PAD ++ PyVarObject_HEAD_INIT(&PyType_Type, 0) ++ .tp_name = "xenfsimage.fs", ++ .tp_basicsize = sizeof(fsimage_fs_t), ++ .tp_dealloc = (destructor) fsimage_fs_dealloc, ++#if PY_MAJOR_VERSION < 3 ++ .tp_getattr = (getattrfunc) fsimage_fs_getattr, ++#endif ++ .tp_flags = Py_TPFLAGS_DEFAULT, ++ .tp_doc = fsimage_fs_type__doc__, ++#if PY_MAJOR_VERSION >= 3 ++ .tp_methods = fsimage_fs_methods, ++#endif + }; + + static PyObject * +@@ -309,8 +305,27 @@ static struct PyMethodDef fsimage_module_methods[] = { + { NULL, NULL, 0, NULL } + }; + ++#if PY_MAJOR_VERSION >= 3 ++static struct PyModuleDef fsimage_module_def = { ++ PyModuleDef_HEAD_INIT, ++ .m_name = "xenfsimage", ++ .m_size = -1, ++ .m_methods = fsimage_module_methods, ++}; ++#endif ++ + PyMODINIT_FUNC ++#if PY_MAJOR_VERSION >= 3 ++PyInit_xenfsimage(void) ++#else + initxenfsimage(void) ++#endif + { ++#if PY_MAJOR_VERSION < 3 + Py_InitModule("xenfsimage", fsimage_module_methods); ++#else ++ if (PyType_Ready(&fsimage_fs_type) < 0 || PyType_Ready(&fsimage_file_type) < 0) ++ return NULL; ++ return PyModule_Create(&fsimage_module_def); ++#endif + } +-- +2.17.1 + diff --git a/recipes-extended/xen/files/xen-tools-python-fix-Wsign-compare-warnings.patch b/recipes-extended/xen/files/xen-tools-python-fix-Wsign-compare-warnings.patch new file mode 100644 index 00000000..b32c5d06 --- /dev/null +++ b/recipes-extended/xen/files/xen-tools-python-fix-Wsign-compare-warnings.patch @@ -0,0 +1,136 @@ +From 88d703a361d34d75f81fc6d30b31d0abc8aa17eb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= + +Date: Fri, 9 Aug 2019 03:01:36 +0100 +Subject: [PATCH] python: fix -Wsign-compare warnings +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Specifically: +xen/lowlevel/xc/xc.c: In function ‘pyxc_domain_create’: +xen/lowlevel/xc/xc.c:147:24: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare] + 147 | for ( i = 0; i < sizeof(xen_domain_handle_t); i++ ) + | ^ +xen/lowlevel/xc/xc.c: In function ‘pyxc_domain_sethandle’: +xen/lowlevel/xc/xc.c:312:20: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare] + 312 | for ( i = 0; i < sizeof(xen_domain_handle_t); i++ ) + | ^ +xen/lowlevel/xc/xc.c: In function ‘pyxc_domain_getinfo’: +xen/lowlevel/xc/xc.c:391:24: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare] + 391 | for ( j = 0; j < sizeof(xen_domain_handle_t); j++ ) + | ^ +xen/lowlevel/xc/xc.c: In function ‘pyxc_get_device_group’: +xen/lowlevel/xc/xc.c:677:20: error: comparison of integer expressions of different signedness: ‘int’ and ‘uint32_t’ {aka ‘unsigned int’} [-Werror=sign-compare] + 677 | for ( i = 0; i < num_sdevs; i++ ) + | ^ +xen/lowlevel/xc/xc.c: In function ‘pyxc_physinfo’: +xen/lowlevel/xc/xc.c:988:20: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare] + 988 | for ( i = 0; i < sizeof(pinfo.hw_cap)/4; i++ ) + | ^ +xen/lowlevel/xc/xc.c:994:20: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare] + 994 | for ( i = 0; i < ARRAY_SIZE(virtcaps_bits); i++ ) + | ^ +xen/lowlevel/xc/xc.c:998:24: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare] + 998 | for ( i = 0; i < ARRAY_SIZE(virtcaps_bits); i++ ) + | ^ +xen/lowlevel/xs/xs.c: In function ‘xspy_ls’: +xen/lowlevel/xs/xs.c:191:23: error: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Werror=sign-compare] + 191 | for (i = 0; i < xsval_n; i++) + | ^ +xen/lowlevel/xs/xs.c: In function ‘xspy_get_permissions’: +xen/lowlevel/xs/xs.c:297:23: error: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Werror=sign-compare] + 297 | for (i = 0; i < perms_n; i++) { + | ^ +cc1: all warnings being treated as errors + +Use size_t for loop iterators where it's compared with sizeof() or +similar construct. + +Signed-off-by: Marek Marczykowski-Górecki +Acked-by: Ian Jackson + +Modified to apply to Xen 4.12.2 by Christopher Clark +Signed-off-by: Christopher Clark +--- + tools/python/xen/lowlevel/xc/xc.c | 13 ++++++++----- + tools/python/xen/lowlevel/xs/xs.c | 4 ++-- + 2 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c +index 522cbe3b9c..188bfa34da 100644 +--- a/tools/python/xen/lowlevel/xc/xc.c ++++ b/tools/python/xen/lowlevel/xc/xc.c +@@ -117,7 +117,8 @@ static PyObject *pyxc_domain_create(XcObject *self, + PyObject *kwds) + { + uint32_t dom = 0, target = 0; +- int ret, i; ++ int ret; ++ size_t i; + PyObject *pyhandle = NULL; + struct xen_domctl_createdomain config = { + .handle = { +@@ -295,7 +296,7 @@ static PyObject *pyxc_vcpu_setaffinity(XcObject *self, + + static PyObject *pyxc_domain_sethandle(XcObject *self, PyObject *args) + { +- int i; ++ size_t i; + uint32_t dom; + PyObject *pyhandle; + xen_domain_handle_t handle; +@@ -336,7 +337,8 @@ static PyObject *pyxc_domain_getinfo(XcObject *self, + PyObject *list, *info_dict, *pyhandle; + + uint32_t first_dom = 0; +- int max_doms = 1024, nr_doms, i, j; ++ int max_doms = 1024, nr_doms, i; ++ size_t j; + xc_dominfo_t *info; + + static char *kwd_list[] = { "first_dom", "max_doms", NULL }; +@@ -631,7 +633,8 @@ static PyObject *pyxc_get_device_group(XcObject *self, + { + uint32_t sbdf; + uint32_t max_sdevs, num_sdevs; +- int domid, seg, bus, dev, func, rc, i; ++ int domid, seg, bus, dev, func, rc; ++ size_t i; + PyObject *Pystr; + char *group_str; + char dev_str[9]; +@@ -971,7 +974,7 @@ static PyObject *pyxc_physinfo(XcObject *self) + { + xc_physinfo_t pinfo; + char cpu_cap[128], virt_caps[128], *p; +- int i; ++ size_t i; + const char *virtcap_names[] = { "hvm", "hvm_directio" }; + + if ( xc_physinfo(self->xc_handle, &pinfo) != 0 ) +diff --git a/tools/python/xen/lowlevel/xs/xs.c b/tools/python/xen/lowlevel/xs/xs.c +index 9a0acfc25c..ea50f86bc3 100644 +--- a/tools/python/xen/lowlevel/xs/xs.c ++++ b/tools/python/xen/lowlevel/xs/xs.c +@@ -186,7 +186,7 @@ static PyObject *xspy_ls(XsHandle *self, PyObject *args) + Py_END_ALLOW_THREADS + + if (xsval) { +- int i; ++ size_t i; + PyObject *val = PyList_New(xsval_n); + for (i = 0; i < xsval_n; i++) + #if PY_MAJOR_VERSION >= 3 +@@ -276,7 +276,7 @@ static PyObject *xspy_get_permissions(XsHandle *self, PyObject *args) + struct xs_handle *xh = xshandle(self); + struct xs_permissions *perms; + unsigned int perms_n = 0; +- int i; ++ size_t i; + + xs_transaction_t th; + char *thstr; +-- +2.17.1 + diff --git a/recipes-extended/xen/files/xen-tools-update-python-scripts-to-py3.patch b/recipes-extended/xen/files/xen-tools-update-python-scripts-to-py3.patch new file mode 100644 index 00000000..455072ba --- /dev/null +++ b/recipes-extended/xen/files/xen-tools-update-python-scripts-to-py3.patch @@ -0,0 +1,140 @@ +From a9047a722ba5de38e7c1d762ffcfb74c36725fe2 Mon Sep 17 00:00:00 2001 +From: Andrew Cooper +Date: Mon, 11 Mar 2019 19:18:40 +0000 +Subject: [PATCH] tools/xen-foreign: Update python scripts to be Py3 compatible + +The issues are: + * dict.has_key() was completely removed in Py3 + * dict.keys() is an iterable rather than list in Py3, so .sort() doesn't work. + * list.sort(cmp=) was deprecated in Py2.4 and removed in Py3. + +The has_key() issue is trivially fixed by switching to using the in keyword. +The sorting issue could be trivially fixed, but take the opportunity to +improve the code. + +The reason for the sorting is to ensure that "unsigned long" gets replaced +before "long", and the only reason sorting is necessary is because +inttypes[arch] is needlessly a dictionary. Update inttypes[arch] to be a list +of tuples rather than a dictionary, and process them in list order. + +Reported-by: George Dunlap +Signed-off-by: Andrew Cooper +Acked-by: Wei Liu +--- + tools/include/xen-foreign/mkchecker.py | 2 +- + tools/include/xen-foreign/mkheader.py | 58 +++++++++++++------------- + 2 files changed, 29 insertions(+), 31 deletions(-) + +diff --git a/tools/include/xen-foreign/mkchecker.py b/tools/include/xen-foreign/mkchecker.py +index fdad869a91..199b0eebbc 100644 +--- a/tools/include/xen-foreign/mkchecker.py ++++ b/tools/include/xen-foreign/mkchecker.py +@@ -37,7 +37,7 @@ for struct in structs: + f.write('\tprintf("%%-25s |", "%s");\n' % struct); + for a in archs: + s = struct + "_" + a; +- if compat_arches.has_key(a): ++ if a in compat_arches: + compat = compat_arches[a] + c = struct + "_" + compat; + else: +diff --git a/tools/include/xen-foreign/mkheader.py b/tools/include/xen-foreign/mkheader.py +index 97e0c7a984..fb268f0dce 100644 +--- a/tools/include/xen-foreign/mkheader.py ++++ b/tools/include/xen-foreign/mkheader.py +@@ -17,13 +17,13 @@ header = {}; + footer = {}; + + #arm +-inttypes["arm32"] = { +- "unsigned long" : "__danger_unsigned_long_on_arm32", +- "long" : "__danger_long_on_arm32", +- "xen_pfn_t" : "uint64_t", +- "xen_ulong_t" : "uint64_t", +- "uint64_t" : "__align8__ uint64_t", +-}; ++inttypes["arm32"] = [ ++ ("unsigned long", "__danger_unsigned_long_on_arm32"), ++ ("long", "__danger_long_on_arm32"), ++ ("xen_pfn_t", "uint64_t"), ++ ("xen_ulong_t", "uint64_t"), ++ ("uint64_t", "__align8__ uint64_t"), ++] + header["arm32"] = """ + #define __arm___ARM32 1 + #if defined(__GNUC__) && !defined(__STRICT_ANSI__) +@@ -38,13 +38,13 @@ footer["arm32"] = """ + #undef __DECL_REG + """ + +-inttypes["arm64"] = { +- "unsigned long" : "__danger_unsigned_long_on_arm64", +- "long" : "__danger_long_on_arm64", +- "xen_pfn_t" : "uint64_t", +- "xen_ulong_t" : "uint64_t", +- "uint64_t" : "__align8__ uint64_t", +-}; ++inttypes["arm64"] = [ ++ ("unsigned long", "__danger_unsigned_long_on_arm64"), ++ ("long", "__danger_long_on_arm64"), ++ ("xen_pfn_t", "uint64_t"), ++ ("xen_ulong_t", "uint64_t"), ++ ("uint64_t", "__align8__ uint64_t"), ++] + header["arm64"] = """ + #define __aarch64___ARM64 1 + #if defined(__GNUC__) && !defined(__STRICT_ANSI__) +@@ -60,12 +60,12 @@ footer["arm64"] = """ + """ + + # x86_32 +-inttypes["x86_32"] = { +- "unsigned long" : "uint32_t", +- "long" : "uint32_t", +- "xen_pfn_t" : "uint32_t", +- "xen_ulong_t" : "uint32_t", +-}; ++inttypes["x86_32"] = [ ++ ("unsigned long", "uint32_t"), ++ ("long", "uint32_t"), ++ ("xen_pfn_t", "uint32_t"), ++ ("xen_ulong_t", "uint32_t"), ++] + header["x86_32"] = """ + #define __DECL_REG_LO8(which) uint32_t e ## which ## x + #define __DECL_REG_LO16(name) uint32_t e ## name +@@ -79,12 +79,12 @@ footer["x86_32"] = """ + """; + + # x86_64 +-inttypes["x86_64"] = { +- "unsigned long" : "__align8__ uint64_t", +- "long" : "__align8__ uint64_t", +- "xen_pfn_t" : "__align8__ uint64_t", +- "xen_ulong_t" : "__align8__ uint64_t", +-}; ++inttypes["x86_64"] = [ ++ ("unsigned long", "__align8__ uint64_t"), ++ ("long", "__align8__ uint64_t"), ++ ("xen_pfn_t", "__align8__ uint64_t"), ++ ("xen_ulong_t", "__align8__ uint64_t"), ++] + header["x86_64"] = """ + #if defined(__GNUC__) && !defined(__STRICT_ANSI__) + # define __DECL_REG(name) union { uint64_t r ## name, e ## name; } +@@ -205,10 +205,8 @@ for struct in structs: + output = re.sub("\\b(%s)_t\\b" % struct, "\\1_%s_t" % arch, output); + + # replace: integer types +-integers = inttypes[arch].keys(); +-integers.sort(lambda a, b: cmp(len(b),len(a))); +-for type in integers: +- output = re.sub("\\b%s\\b" % type, inttypes[arch][type], output); ++for old, new in inttypes[arch]: ++ output = re.sub("\\b%s\\b" % old, new, output) + + # print results + f = open(outfile, "w"); +-- +2.17.1 + diff --git a/recipes-extended/xen/xen-hypervisor.inc b/recipes-extended/xen/xen-hypervisor.inc index c0df1580..79fafd27 100644 --- a/recipes-extended/xen/xen-hypervisor.inc +++ b/recipes-extended/xen/xen-hypervisor.inc @@ -6,7 +6,7 @@ DESCRIPTION = "The Xen hypervisor" # this allows for varying the target architecture or toolchain used # to build the different components. eg. 32-bit tools and a 64-bit hypervisor. -inherit deploy +inherit deploy python3native PACKAGES = " \ ${PN} \ @@ -34,7 +34,7 @@ do_configure() { } do_compile() { - oe_runmake xen + oe_runmake xen PYTHON="${PYTHON}" } do_install() { diff --git a/recipes-extended/xen/xen-python2.bb b/recipes-extended/xen/xen-python2.bb new file mode 100644 index 00000000..08d8e92a --- /dev/null +++ b/recipes-extended/xen/xen-python2.bb @@ -0,0 +1,68 @@ +SUMMARY = "Xen hypervisor tools written in python 2" +DESCRIPTION = "Unported utility scripts for the Xen hypervisor" +HOMEPAGE = "http://xen.org" +LICENSE = "GPLv2" +SECTION = "console/tools" + +SRCREV ?= "a5fcafbfbee55261853fba07149c1c795f2baf58" + +XEN_REL ?= "4.12" +XEN_BRANCH ?= "stable-4.12" + +SRC_URI = "git://xenbits.xen.org/xen.git;branch=${XEN_BRANCH}" + +LIC_FILES_CHKSUM ?= "file://COPYING;md5=bbb4b1bdc2c3b6743da3c39d03249095" + +PV = "${XEN_REL}+git${SRCPV}" + +S = "${WORKDIR}/git" + +# Packages in this recipe do not use ${PN} to allow for simpler +# movement of the package back into the xen-tools recipe if/when +# the scripts are ported to python 3. + +RDEPENDS_xen-tools-xencov-split ="python" +RDEPENDS_xen-tools-xencons = "python" +RDEPENDS_xen-tools-xenpvnetboot = "python" +RDEPENDS_xen-tools-xentrace-format = "python" + +RRECOMMENDS_xen-tools-xencov-trace = "xen-tools-xencov" +RRECOMMENDS_xen-tools-xentrace-format = "xen-tools-xentrace" + +PACKAGES = " \ + xen-tools-xencons \ + xen-tools-xencov-split \ + xen-tools-xenpvnetboot \ + xen-tools-xentrace-format \ + " + +FILES_xen-tools-xencons = " \ + ${bindir}/xencons \ + " + +FILES_xen-tools-xencov-split = " \ + ${bindir}/xencov_split \ + " + +FILES_xen-tools-xenpvnetboot = " \ + ${libdir}/xen/bin/xenpvnetboot \ + " + +FILES_xen-tools-xentrace-format = " \ + ${bindir}/xentrace_format \ + " + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +do_install() { + install -d ${D}${bindir} + install -m 0755 ${S}/tools/xentrace/xentrace_format \ + ${D}${bindir}/xentrace_format + install -m 0755 ${S}/tools/misc/xencons ${D}${bindir}/xencons + install -m 0755 ${S}/tools/misc/xencov_split ${D}${bindir}/xencov_split + + install -d ${D}${libdir}/xen/bin + install -m 0755 ${S}/tools/misc/xenpvnetboot \ + ${D}${libdir}/xen/bin/xenpvnetboot +} diff --git a/recipes-extended/xen/xen-tools.inc b/recipes-extended/xen/xen-tools.inc index e166c74b..a6f12090 100644 --- a/recipes-extended/xen/xen-tools.inc +++ b/recipes-extended/xen/xen-tools.inc @@ -1,7 +1,7 @@ SUMMARY = "Xen hypervisor tools" DESCRIPTION = "Tools and utility software for the Xen hypervisor" -inherit setuptools update-rc.d systemd deploy +inherit setuptools3 update-rc.d systemd deploy require xen-blktap.inc RDEPENDS_${PN} = "\ @@ -47,21 +47,25 @@ RDEPENDS_${PN}-fsimage = " \ RDEPENDS_${PN}-misc = " \ perl \ - python \ + python3 \ + ${PN}-xencov \ + " + +RSUGGESTS_${PN}-misc = " \ + ${PN}-xencons \ + ${PN}-xenpvnetboot \ " RDEPENDS_${PN}-python = " \ - python \ + python3 \ " RDEPENDS_${PN}-pygrub = " \ + python3 \ ${PN}-python \ " -RDEPENDS_${PN}-remus = " \ - bash \ - python \ - " +RDEPENDS_${PN}-remus = "bash" RDEPENDS_${PN}-scripts-block = "\ bash \ @@ -78,6 +82,8 @@ RDEPENDS_${PN}-scripts-network = "\ ${PN}-volatiles \ " +RSUGGESTS_${PN}-xencov = "${PN}-xencov-split" + RDEPENDS_${PN}-xencommons = "\ bash \ ${PN}-console \ @@ -97,7 +103,11 @@ RDEPENDS_${PN}-xendomains = "\ RDEPENDS_${PN}-xl = "libgcc" -RDEPENDS_${PN}-xentrace = "python" +RDEPENDS_${PN}-xenmon = " \ + python3 \ + " + +RSUGGESTS_${PN}-xentrace = "${PN}-xentrace-format" RDEPENDS_${PN}-xen-watchdog = "bash" @@ -160,6 +170,7 @@ PACKAGES = " \ ${PN}-volatiles \ ${PN}-xcutils \ ${PN}-xencommons \ + ${PN}-xencov \ ${PN}-xend \ ${PN}-xend-examples \ ${PN}-xendomains \ @@ -188,8 +199,8 @@ RPROVIDES_${PN}-xenstored = "virtual/xenstored" FILES_${PN}-dbg += "\ ${libdir}/xen/bin/.debug \ - ${libdir}/python2.7/site-packages/.debug \ - ${libdir}/python2.7/site-packages/xen/lowlevel/.debug \ + ${libdir}/${PYTHON_DIR}/site-packages/.debug \ + ${libdir}/${PYTHON_DIR}/site-packages/xen/lowlevel/.debug \ ${libdir}/fs/xfs/.debug \ ${libdir}/fs/ufs/.debug \ ${libdir}/fs/ext2fs-lib/.debug \ @@ -202,8 +213,8 @@ FILES_${PN}-dbg += "\ ${libdir}exec/.debug \ ${libdir}/xen/libexec/.debug \ ${bindir}/.debug \ - ${libdir}/python2.7/dist-packages/.debug \ - ${libdir}/python2.7/dist-packages/xen/lowlevel/.debug \ + ${libdir}/${PYTHON_DIR}/dist-packages/.debug \ + ${libdir}/${PYTHON_DIR}/dist-packages/xen/lowlevel/.debug \ " FILES_${PN}-dev = "\ @@ -404,15 +415,11 @@ FILES_${PN}-livepatch += " \ " FILES_${PN}-misc = "\ - ${bindir}/xencons \ - ${bindir}/xencov_split \ ${bindir}/xen-detect \ - ${libdir}/xen/bin/xenpvnetboot \ ${libdir}/xen/bin/depriv-fd-checker \ ${sbindir}/gtracestat \ ${sbindir}/gtraceview \ ${sbindir}/xen-bugtool \ - ${sbindir}/xencov \ ${sbindir}/xenperf \ ${sbindir}/xenpm \ ${sbindir}/xsview \ @@ -436,11 +443,10 @@ FILES_${PN}-pygrub = "\ " FILES_${PN}-python = "\ - ${libdir}/python2.7 \ + ${libdir}/${PYTHON_DIR} \ " FILES_${PN}-remus = "\ - ${bindir}/remus \ ${sysconfdir}/xen/scripts/remus-netbuf-setup \ " @@ -500,6 +506,10 @@ FILES_${PN}-xcutils = "\ ${libdir}/xen/bin/xc_save \ " +FILES_${PN}-xencov = "\ + ${sbindir}/xencov \ + " + FILES_${PN}-xend-examples = "\ ${sysconfdir}/xen/xend-config.sxp \ ${sysconfdir}/xen/xend-pci-permissive.sxp \ @@ -539,7 +549,6 @@ FILES_${PN}-xenstored = "\ FILES_${PN}-xentrace = "\ ${bindir}/xentrace \ - ${bindir}/xentrace_format \ ${bindir}/xentrace_setsize \ ${libdir}/xen/bin/xenctx \ ${bindir}/xenalyze \ @@ -665,12 +674,20 @@ do_stubs() { addtask stubs after do_configure before do_compile do_compile() { - oe_runmake tools + cd ${S} + oe_runmake tools PYTHON="${PYTHON}" } do_install() { + cd ${S} oe_runmake DESTDIR="${D}" install-tools + # Remove unported python 2 scripts -- see the separate xen-python2 recipe + rm -f ${D}${bindir}/xentrace_format \ + ${D}${bindir}/xencons \ + ${D}${bindir}/xencov_split \ + ${D}${libdir}/xen/bin/xenpvnetboot + # remove installed volatiles rm -rf ${D}${base_prefix}/run \ ${D}${localstatedir}/run \ diff --git a/recipes-extended/xen/xen-tools_git.bb b/recipes-extended/xen/xen-tools_git.bb index 7042c535..00060df7 100644 --- a/recipes-extended/xen/xen-tools_git.bb +++ b/recipes-extended/xen/xen-tools_git.bb @@ -6,6 +6,12 @@ XEN_BRANCH ?= "stable-${XEN_REL}" SRC_URI = " \ git://xenbits.xen.org/xen.git;branch=${XEN_BRANCH} \ file://0001-python-pygrub-pass-DISTUTILS-xen.4.12.patch \ + file://xen-tools-update-python-scripts-to-py3.patch \ + file://xen-tools-libxl-gentypes-py3.patch \ + file://xen-tools-python-fix-Wsign-compare-warnings.patch \ + file://xen-tools-pygrub-change-tabs-into-spaces.patch \ + file://xen-tools-pygrub-make-python-scripts-work-with-2.6-and-up.patch \ + file://xen-tools-pygrub-py3.patch \ " LIC_FILES_CHKSUM ?= "file://COPYING;md5=bbb4b1bdc2c3b6743da3c39d03249095" diff --git a/recipes-extended/xen/xen.inc b/recipes-extended/xen/xen.inc index b2af8aa7..0bfe72da 100644 --- a/recipes-extended/xen/xen.inc +++ b/recipes-extended/xen/xen.inc @@ -43,7 +43,7 @@ DEPENDS = " \ pciutils \ pixman \ procps \ - python \ + python3 \ libaio \ lzo \ util-linux \ @@ -77,8 +77,8 @@ libexecdir = "${libdir}" export XEN_OS = "Linux" # this is used for the header (#!${bindir}/python) of the install python scripts -export PYTHONPATH="${bindir}/python" -export ac_cv_path_PYTHONPATH="${bindir}/python" +export PYTHONPATH="${bindir}/env python3" +export ac_cv_path_PYTHONPATH="${bindir}/env python3" export DISTUTILS_BUILD_ARGS export DISTUTILS_INSTALL_ARGS @@ -207,6 +207,7 @@ EXTRA_OEMAKE += "XEN_CONFIG_EXPERT=y" EXTRA_OEMAKE += "debug=n" do_configure_common() { + cd ${S} #./configure --enable-xsmpolicy does not set XSM_ENABLE must be done manually if [ "${XSM_ENABLED}" = "1" ]; then @@ -222,7 +223,9 @@ do_configure_common() { # do configure oe_runconf EXTRA_CFLAGS_XEN_CORE="${EXTRA_CFLAGS_XEN_CORE}" \ - EXTRA_CFLAGS_XEN_TOOLS="${EXTRA_CFLAGS_XEN_TOOLS}" + EXTRA_CFLAGS_XEN_TOOLS="${EXTRA_CFLAGS_XEN_TOOLS}" \ + PYTHON="${PYTHON}" + if [ ! -e ${STAGING_INCDIR}/bits/long-double-32.h ]; then cp ${STAGING_INCDIR}/bits/long-double-64.h ${STAGING_INCDIR}/bits/long-double-32.h fi -- cgit v1.2.3-54-g00ecf