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 <christopher.clark6@baesystems.com>
Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
This commit is contained in:
Christopher Clark 2020-02-25 16:15:59 -08:00 committed by Bruce Ashfield
parent 593df044c6
commit f4eec68635
12 changed files with 1344 additions and 27 deletions

View File

@ -13,11 +13,14 @@ Signed-off-by: Maciej Pijanowski <maciej.pijanowski@3mdeb.com>
Forward-ported to Xen 4.12.0
Signed-off-by: Christopher Clark <christopher.clark6@baesystems.com>
Modified to support pygrub installation with python 3
Signed-off-by: Christopher Clark <christopher.clark6@baesystems.com>
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 \

View File

@ -0,0 +1,140 @@
From 660d2dd863802ef464c90b32f187cb65861f8185 Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@citrix.com>
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 <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
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 <idl> <implementation>"
+ print("Usage: gentest.py <idl> <implementation>", 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 <idl> <header> <header-private> <header-json> <implementation>"
+ print("Usage: gentypes.py <idl> <header> <header-private> <header-json> <implementation>", 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

View File

@ -0,0 +1,40 @@
From b9e1368af14ded6aee3bdf64e8329628b16291ff Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@citrix.com>
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 <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
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

View File

@ -0,0 +1,529 @@
From 0aabd89dcfee9ee2a6caaa2ec7a475daf5cada53 Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@citrix.com>
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 <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
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 <http://www.gnu.org/licenses/>.
#
+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 <http://www.gnu.org/licenses/>.
#
+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 <http://www.gnu.org/licenses/>.
#
+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("<H", buf[508:510])[0] != DKL_MAGIC:
- raise RuntimeError, "Invalid disklabel magic"
+ raise RuntimeError("Invalid disklabel magic")
nslices = struct.unpack("<H", buf[30:32])[0]
@@ -88,7 +90,7 @@ def get_solaris_slice(file, offset):
if slicetag == V_ROOT:
return slicesect * SECTOR_SIZE
- raise RuntimeError, "No root slice found"
+ raise RuntimeError("No root slice found")
def get_fs_offset_gpt(file):
fd = os.open(file, os.O_RDONLY)
@@ -423,20 +425,17 @@ class Grub:
we're being given a raw config file rather than a disk image."""
if not os.access(fn, os.R_OK):
- raise RuntimeError, "Unable to access %s" %(fn,)
+ raise RuntimeError("Unable to access %s" %(fn,))
- cfg_list = map(lambda x: (x,grub.GrubConf.Grub2ConfigFile),
- ["/boot/grub/grub.cfg", "/grub/grub.cfg",
- "/boot/grub2/grub.cfg", "/grub2/grub.cfg"]) + \
- map(lambda x: (x,grub.ExtLinuxConf.ExtLinuxConfigFile),
- ["/boot/isolinux/isolinux.cfg",
+ cfg_list = [(x,grub.GrubConf.Grub2ConfigFile) for x in ["/boot/grub/grub.cfg", "/grub/grub.cfg",
+ "/boot/grub2/grub.cfg", "/grub2/grub.cfg"]] + \
+ [(x,grub.ExtLinuxConf.ExtLinuxConfigFile) for x in ["/boot/isolinux/isolinux.cfg",
"/boot/extlinux/extlinux.conf",
"/boot/extlinux.conf",
"/extlinux/extlinux.conf",
- "/extlinux.conf"]) + \
- map(lambda x: (x,grub.GrubConf.GrubConfigFile),
- ["/boot/grub/menu.lst", "/boot/grub/grub.conf",
- "/grub/menu.lst", "/grub/grub.conf"])
+ "/extlinux.conf"]] + \
+ [(x,grub.GrubConf.GrubConfigFile) for x in ["/boot/grub/menu.lst", "/boot/grub/grub.conf",
+ "/grub/menu.lst", "/grub/grub.conf"]]
if not fs:
# set the config file and parse it
@@ -448,12 +447,12 @@ class Grub:
for f,parser in cfg_list:
if fs.file_exists(f):
- print >>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=] <image>" %(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=] <image>" %(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

View File

@ -0,0 +1,233 @@
From 83a204e6951c6358f995da3b60dd61224e9d41ac Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@citrix.com>
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 <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
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 <xenfsimage.h>
#include <stdlib.h>
-#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

View File

@ -0,0 +1,136 @@
From 88d703a361d34d75f81fc6d30b31d0abc8aa17eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?=
<marmarek@invisiblethingslab.com>
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 <marmarek@invisiblethingslab.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Modified to apply to Xen 4.12.2 by Christopher Clark
Signed-off-by: Christopher Clark <christopher.clark6@baesystems.com>
---
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

View File

@ -0,0 +1,140 @@
From a9047a722ba5de38e7c1d762ffcfb74c36725fe2 Mon Sep 17 00:00:00 2001
From: Andrew Cooper <andrew.cooper3@citrix.com>
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 <george.dunlap@eu.citrix.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
---
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

View File

@ -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() {

View File

@ -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
}

View File

@ -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 \

View File

@ -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"

View File

@ -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