[OE-core] [PATCH] Allow script to work with Python 2.4 and 3.
Saul Wold
sgw at linux.intel.com
Mon Oct 14 18:03:09 UTC 2013
On 10/11/2013 08:30 AM, Konrad Scherer wrote:
> From: Konrad Scherer <Konrad.Scherer at windriver.com>
>
> Python 2.4 does not support the 'b' string literal or the
> keyword 'as' in exception handling. Python 3 does not accept
> the old method of exception handling and defaults to unicode.
> The b() function converts strings to bytes on Python 3 and
> using sys.exc_info() avoids the exception handling syntax.
>
I would like to get Laurentiu's opinion on this.
Also the patch synopsis should be in the format of
<file/recipe>: synopsis
In this case it should:
relocate_sdk.py: Allow script to work with Python 2.4 and 3
Thanks
Sau!
> Signed-off-by: Konrad Scherer <Konrad.Scherer at windriver.com>
> ---
> scripts/relocate_sdk.py | 43 ++++++++++++++++++++++++++-----------------
> 1 file changed, 26 insertions(+), 17 deletions(-)
>
> diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py
> index fe6e4e0..0971e63 100755
> --- a/scripts/relocate_sdk.py
> +++ b/scripts/relocate_sdk.py
> @@ -31,7 +31,15 @@ import os
> import re
> import errno
>
> -old_prefix = re.compile(b"##DEFAULT_INSTALL_DIR##")
> +if sys.version < '3':
> + def b(x):
> + return x
> +else:
> + import codecs
> + def b(x):
> + return codecs.latin_1_encode(x)[0]
> +
> +old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##"))
>
> def get_arch():
> f.seek(0)
> @@ -92,15 +100,15 @@ def change_interpreter(elf_file_name):
> # External SDKs with mixed pre-compiled binaries should not get
> # relocated so look for some variant of /lib
> fname = f.read(11)
> - if fname.startswith(b"/lib/") or fname.startswith(b"/lib64/") or \
> - fname.startswith(b"/lib32/") or fname.startswith(b"/usr/lib32/") or \
> - fname.startswith(b"/usr/lib32/") or fname.startswith(b"/usr/lib64/"):
> + if fname.startswith(b("/lib/")) or fname.startswith(b("/lib64/")) or \
> + fname.startswith(b("/lib32/")) or fname.startswith(b("/usr/lib32/")) or \
> + fname.startswith(b("/usr/lib32/")) or fname.startswith(b("/usr/lib64/")):
> break
> if (len(new_dl_path) >= p_filesz):
> print("ERROR: could not relocate %s, interp size = %i and %i is needed." \
> % (elf_file_name, p_memsz, len(new_dl_path) + 1))
> break
> - dl_path = new_dl_path + b"\0" * (p_filesz - len(new_dl_path))
> + dl_path = new_dl_path + b("\0") * (p_filesz - len(new_dl_path))
> f.seek(p_offset)
> f.write(dl_path)
> break
> @@ -132,40 +140,40 @@ def change_dl_sysdirs():
> sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\
> sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr)
>
> - name = sh_strtab[sh_name:sh_strtab.find(b"\0", sh_name)]
> + name = sh_strtab[sh_name:sh_strtab.find(b("\0"), sh_name)]
>
> """ look only into SHT_PROGBITS sections """
> if sh_type == 1:
> f.seek(sh_offset)
> """ default library paths cannot be changed on the fly because """
> """ the string lengths have to be changed too. """
> - if name == b".sysdirs":
> + if name == b(".sysdirs"):
> sysdirs = f.read(sh_size)
> sysdirs_off = sh_offset
> sysdirs_sect_size = sh_size
> - elif name == b".sysdirslen":
> + elif name == b(".sysdirslen"):
> sysdirslen = f.read(sh_size)
> sysdirslen_off = sh_offset
> - elif name == b".ldsocache":
> + elif name == b(".ldsocache"):
> ldsocache_path = f.read(sh_size)
> new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path)
> # pad with zeros
> - new_ldsocache_path += b"\0" * (sh_size - len(new_ldsocache_path))
> + new_ldsocache_path += b("\0") * (sh_size - len(new_ldsocache_path))
> # write it back
> f.seek(sh_offset)
> f.write(new_ldsocache_path)
>
> if sysdirs != "" and sysdirslen != "":
> - paths = sysdirs.split(b"\0")
> - sysdirs = b""
> - sysdirslen = b""
> + paths = sysdirs.split(b("\0"))
> + sysdirs = b("")
> + sysdirslen = b("")
> for path in paths:
> """ exit the loop when we encounter first empty string """
> - if path == b"":
> + if path == b(""):
> break
>
> new_path = old_prefix.sub(new_prefix, path)
> - sysdirs += new_path + b"\0"
> + sysdirs += new_path + b("\0")
>
> if arch == 32:
> sysdirslen += struct.pack("<L", len(new_path))
> @@ -173,7 +181,7 @@ def change_dl_sysdirs():
> sysdirslen += struct.pack("<Q", len(new_path))
>
> """ pad with zeros """
> - sysdirs += b"\0" * (sysdirs_sect_size - len(sysdirs))
> + sysdirs += b("\0") * (sysdirs_sect_size - len(sysdirs))
>
> """ write the sections back """
> f.seek(sysdirs_off)
> @@ -205,7 +213,8 @@ for e in executables_list:
>
> try:
> f = open(e, "r+b")
> - except IOError as ioex:
> + except IOError:
> + exctype, ioex = sys.exc_info()[:2]
> if ioex.errno == errno.ETXTBSY:
> print("Could not open %s. File used by another process.\nPlease "\
> "make sure you exit all processes that might use any SDK "\
>
More information about the Openembedded-core
mailing list