From 9437012b9ee4dc550e42665b71902cf885169100 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Fri, 26 Jul 2019 23:45:47 +0200 Subject: tools/mklibs: update to 0.1.44 and convert to Python 3 Since the switch to Python 3 build fails if CONFIG_USE_MKLIBS is set ("Strip unnecessary functions from libraries" in menuconfig) as mklibs hasn't been converted to run on Python 3. * update to most recent upstream version which brings some reproducibility fixes * converted to Python 3 using 2to3 * fixed mixed tab/spaces indentation * fixed use of string.* functions * some more minor fixes to make Python 3 happy Fixes commit 19938c8de7 ("build: switch to Python 3") Signed-off-by: Daniel Golle --- tools/mklibs/patches/100-apply-2to3.patch | 327 ++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 tools/mklibs/patches/100-apply-2to3.patch (limited to 'tools/mklibs/patches/100-apply-2to3.patch') diff --git a/tools/mklibs/patches/100-apply-2to3.patch b/tools/mklibs/patches/100-apply-2to3.patch new file mode 100644 index 0000000000..9f2ae6c438 --- /dev/null +++ b/tools/mklibs/patches/100-apply-2to3.patch @@ -0,0 +1,327 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -57,18 +57,18 @@ debuglevel = DEBUG_NORMAL + + def debug(level, *msg): + if debuglevel >= level: +- print string.join(msg) ++ print(' '.join(msg)) + + # return a list of lines of output of the command + def command(command, *args): +- debug(DEBUG_SPAM, "calling", command, string.join(args)) ++ debug(DEBUG_SPAM, "calling", command, ' '.join(args)) + pipe = os.popen(command + ' ' + ' '.join(args), 'r') + output = pipe.read().strip() + status = pipe.close() + if status is not None and os.WEXITSTATUS(status) != 0: +- print "Command failed with status", os.WEXITSTATUS(status), ":", \ +- command, string.join(args) +- print "With output:", output ++ print("Command failed with status", os.WEXITSTATUS(status), ":", \ ++ command, ' '.join(args)) ++ print("With output:", output) + sys.exit(1) + return [i for i in output.split('\n') if i] + +@@ -204,7 +204,7 @@ class ProvidedSymbol(Symbol): + # Return a set of symbols provided by a library + def provided_symbols(obj): + if not os.access(obj, os.F_OK): +- raise Exception("Cannot find lib" + obj) ++ raise Exception("Cannot find lib " + obj) + library = extract_soname(obj) + + output = command("mklibs-readelf", "--print-symbols-provided", obj) +@@ -297,27 +297,27 @@ def usage(was_err): + outfd = sys.stderr + else: + outfd = sys.stdout +- print >> outfd, "Usage: mklibs [OPTION]... -d DEST FILE ..." +- print >> outfd, "Make a set of minimal libraries for FILE(s) in DEST." +- print >> outfd, "" +- print >> outfd, " -d, --dest-dir DIRECTORY create libraries in DIRECTORY" +- print >> outfd, " -D, --no-default-lib omit default libpath (", ':'.join(default_lib_path), ")" +- print >> outfd, " -L DIRECTORY[:DIRECTORY]... add DIRECTORY(s) to the library search path" +- print >> outfd, " -l LIBRARY add LIBRARY always" +- print >> outfd, " --ldlib LDLIB use LDLIB for the dynamic linker" +- print >> outfd, " --libc-extras-dir DIRECTORY look for libc extra files in DIRECTORY" +- print >> outfd, " --target TARGET prepend TARGET- to the gcc and binutils calls" +- print >> outfd, " --root ROOT search in ROOT for library rpaths" +- print >> outfd, " --sysroot ROOT prepend ROOT to all paths for libraries" +- print >> outfd, " --gcc-options OPTIONS pass OPTIONS to gcc" +- print >> outfd, " --libdir DIR use DIR (e.g. lib64) in place of lib in default paths" +- print >> outfd, " -v, --verbose explain what is being done" +- print >> outfd, " -h, --help display this help and exit" ++ print("Usage: mklibs [OPTION]... -d DEST FILE ...", file=outfd) ++ print("Make a set of minimal libraries for FILE(s) in DEST.", file=outfd) ++ print("", file=outfd) ++ print(" -d, --dest-dir DIRECTORY create libraries in DIRECTORY", file=outfd) ++ print(" -D, --no-default-lib omit default libpath (", ':'.join(default_lib_path), ")", file=outfd) ++ print(" -L DIRECTORY[:DIRECTORY]... add DIRECTORY(s) to the library search path", file=outfd) ++ print(" -l LIBRARY add LIBRARY always", file=outfd) ++ print(" --ldlib LDLIB use LDLIB for the dynamic linker", file=outfd) ++ print(" --libc-extras-dir DIRECTORY look for libc extra files in DIRECTORY", file=outfd) ++ print(" --target TARGET prepend TARGET- to the gcc and binutils calls", file=outfd) ++ print(" --root ROOT search in ROOT for library rpaths", file=outfd) ++ print(" --sysroot ROOT prepend ROOT to all paths for libraries", file=outfd) ++ print(" --gcc-options OPTIONS pass OPTIONS to gcc", file=outfd) ++ print(" --libdir DIR use DIR (e.g. lib64) in place of lib in default paths", file=outfd) ++ print(" -v, --verbose explain what is being done", file=outfd) ++ print(" -h, --help display this help and exit", file=outfd) + sys.exit(was_err) + + def version(vers): +- print "mklibs: version ",vers +- print "" ++ print("mklibs: version ",vers) ++ print("") + + #################### main #################### + ## Usage: ./mklibs.py [OPTION]... -d DEST FILE ... +@@ -368,8 +368,8 @@ script_pattern = re.compile("^#!\s*/") + + try: + optlist, proglist = getopt.getopt(sys.argv[1:], opts, longopts) +-except getopt.GetoptError, msg: +- print >> sys.stderr, msg ++except getopt.GetoptError as msg: ++ print(msg, file=sys.stderr) + usage(1) + + for opt, arg in optlist: +@@ -377,7 +377,7 @@ for opt, arg in optlist: + if debuglevel < DEBUG_SPAM: + debuglevel = debuglevel + 1 + elif opt == "-L": +- lib_path.extend(string.split(arg, ":")) ++ lib_path.extend(arg.split(":")) + elif opt in ("-d", "--dest-dir"): + dest_path = arg + elif opt in ("-D", "--no-default-lib"): +@@ -396,17 +396,17 @@ for opt, arg in optlist: + elif opt in ("-l",): + force_libs.append(arg) + elif opt == "--gcc-options": +- gcc_options.extend(string.split(arg, " ")) ++ gcc_options.extend(arg.split(" ")) + elif opt == "--libdir": + libdir = arg + elif opt in ("--help", "-h"): +- usage(0) ++ usage(0) + sys.exit(0) + elif opt in ("--version", "-V"): + version(vers) + sys.exit(0) + else: +- print "WARNING: unknown option: " + opt + "\targ: " + arg ++ print("WARNING: unknown option: " + opt + "\targ: " + arg) + + if include_default_lib_path == "yes": + lib_path.extend([a.replace("/lib/", "/" + libdir + "/") for a in default_lib_path]) +@@ -424,22 +424,22 @@ if ldlib == "LDLIB": + objects = {} # map from inode to filename + for prog in proglist: + inode = os.stat(prog)[ST_INO] +- if objects.has_key(inode): ++ if inode in objects: + debug(DEBUG_SPAM, prog, "is a hardlink to", objects[inode]) + elif so_pattern.match(prog): + debug(DEBUG_SPAM, prog, "is a library") +- elif script_pattern.match(open(prog).read(256)): ++ elif script_pattern.match(open(prog, 'r', encoding='iso-8859-1').read(256)): + debug(DEBUG_SPAM, prog, "is a script") + else: + objects[inode] = prog + + if not ldlib: +- for obj in objects.values(): ++ for obj in list(objects.values()): + output = command("mklibs-readelf", "--print-interp", obj) + if output: + ldlib = output.pop() +- if ldlib: +- break ++ if ldlib: ++ break + + if not ldlib: + sys.exit("E: Dynamic linker not found, aborting.") +@@ -454,10 +454,10 @@ for obj in sorted(objects.values()): + for rpath_elem in rpath_val: + if not rpath_elem in lib_rpath: + if debuglevel >= DEBUG_VERBOSE: +- print "Adding rpath " + rpath_elem + " for " + obj ++ print("Adding rpath " + rpath_elem + " for " + obj) + lib_rpath.append(rpath_elem) + else: +- print "warning: " + obj + " may need rpath, but --root not specified" ++ print("warning: " + obj + " may need rpath, but --root not specified") + + lib_path.extend(lib_rpath) + +@@ -465,12 +465,12 @@ passnr = 1 + available_libs = [] + previous_pass_unresolved = set() + while 1: +- debug(DEBUG_NORMAL, "I: library reduction pass", `passnr`) ++ debug(DEBUG_NORMAL, "I: library reduction pass", repr(passnr)) + if debuglevel >= DEBUG_VERBOSE: +- print "Objects:", +- for obj in sorted([x[string.rfind(x, '/') + 1:] for x in objects.values()]): +- print obj, +- print ++ print("Objects:", end=' ') ++ for obj in sorted([x[x.rfind('/') + 1:] for x in list(objects.values())]): ++ print(obj, end=' ') ++ print() + + passnr = passnr + 1 + # Gather all already reduced libraries and treat them as objects as well +@@ -479,7 +479,7 @@ while 1: + obj = dest_path + "/" + lib + small_libs.append(obj) + inode = os.stat(obj)[ST_INO] +- if objects.has_key(inode): ++ if inode in objects: + debug(DEBUG_SPAM, obj, "is hardlink to", objects[inode]) + else: + objects[inode] = obj +@@ -509,7 +509,7 @@ while 1: + present_symbols = {} + checked_libs = small_libs + checked_libs.extend(available_libs) +- checked_libs.append(ldlib) ++ checked_libs.append(sysroot + "/" + ldlib) + for lib in checked_libs: + for symbol in provided_symbols(lib): + debug(DEBUG_SPAM, "present_symbols adding %s" % symbol) +@@ -529,8 +529,8 @@ while 1: + unresolved.add(name) + num_unresolved = num_unresolved + 1 + +- debug (DEBUG_NORMAL, `len(needed_symbols)`, "symbols,", +- `num_unresolved`, "unresolved") ++ debug (DEBUG_NORMAL, repr(len(needed_symbols)), "symbols,", ++ repr(num_unresolved), "unresolved") + + if num_unresolved == 0: + break +@@ -539,7 +539,7 @@ while 1: + # No progress in last pass. Verify all remaining symbols are weak. + for name in unresolved: + if not needed_symbols[name].weak: +- print "WARNING: Unresolvable symbol %s" % name ++ print("WARNING: Unresolvable symbol %s" % name) + break + + previous_pass_unresolved = unresolved +@@ -641,9 +641,9 @@ while 1: + command(target + "gcc", *cmd) + + ## DEBUG +- debug(DEBUG_VERBOSE, so_file, "\t", `os.stat(so_file)[ST_SIZE]`) ++ debug(DEBUG_VERBOSE, so_file, "\t", repr(os.stat(so_file)[ST_SIZE])) + debug(DEBUG_VERBOSE, dest_path + "/" + so_file_name + "-so", "\t", +- `os.stat(dest_path + "/" + so_file_name + "-so")[ST_SIZE]`) ++ repr(os.stat(dest_path + "/" + so_file_name + "-so")[ST_SIZE])) + + # Finalising libs and cleaning up + for lib in regexpfilter(os.listdir(dest_path), "(.*)-so$"): +@@ -680,4 +680,4 @@ if not os.access(dest_path + "/" + ld_fu + command(target + "objcopy", "--strip-unneeded -R .note -R .comment", + ld_file, dest_path + "/" + ld_full_path) + +-os.chmod(dest_path + "/" + ld_full_path, 0755) ++os.chmod(dest_path + "/" + ld_full_path, 0o755) +--- a/src/mklibs-copy ++++ b/src/mklibs-copy +@@ -51,9 +51,9 @@ def command(command, *args): + output = pipe.read().strip() + status = pipe.close() + if status is not None and os.WEXITSTATUS(status) != 0: +- print "Command failed with status", os.WEXITSTATUS(status), ":", \ +- command, ' '.join(args) +- print "With output:", output ++ print("Command failed with status", os.WEXITSTATUS(status), ":", \ ++ command, ' '.join(args)) ++ print("With output:", output) + sys.exit(1) + return output.split('\n') + +@@ -134,8 +134,8 @@ def multiarch(paths): + return paths + + def version(vers): +- print "mklibs: version ",vers +- print "" ++ print("mklibs: version ",vers) ++ print("") + + # Clean the environment + vers="0.12" +@@ -159,7 +159,7 @@ if include_default_lib_path: + objects = {} # map from inode to filename + for prog in proglist: + inode = os.stat(prog)[ST_INO] +- if objects.has_key(inode): ++ if inode in objects: + logger.debug("%s is a hardlink to %s", prog, objects[inode]) + elif so_pattern.match(prog): + logger.debug("%s is a library", prog) +@@ -169,12 +169,12 @@ for prog in proglist: + logger.debug("%s is no ELF", prog) + + if not ldlib: +- for obj in objects.values(): ++ for obj in list(objects.values()): + output = command("mklibs-readelf", "-i", obj) +- for x in output: ++ for x in output: + ldlib = x +- if ldlib: +- break ++ if ldlib: ++ break + + if not ldlib: + sys.exit("E: Dynamic linker not found, aborting.") +@@ -182,7 +182,7 @@ if not ldlib: + logger.info('Using %s as dynamic linker', ldlib) + + # Check for rpaths +-for obj in objects.values(): ++for obj in list(objects.values()): + rpath_val = rpath(obj) + if rpath_val: + if root: +@@ -208,18 +208,18 @@ while 1: + obj = dest_path + "/" + lib + small_libs.append(obj) + inode = os.stat(obj)[ST_INO] +- if objects.has_key(inode): ++ if inode in objects: + logger.debug("%s is hardlink to %s", obj, objects[inode]) + else: + objects[inode] = obj + +- for obj in objects.values(): ++ for obj in list(objects.values()): + small_libs.append(obj) + +- logger.verbose('Objects: %r', ' '.join([i[i.rfind('/') + 1:] for i in objects.itervalues()])) ++ logger.verbose('Objects: %r', ' '.join([i[i.rfind('/') + 1:] for i in objects.values()])) + + libraries = set() +- for obj in objects.values(): ++ for obj in list(objects.values()): + libraries.update(library_depends(obj)) + + if libraries == previous_pass_libraries: +@@ -272,4 +272,4 @@ if not os.access(dest_path + "/" + ld_fu + command(target + "objcopy", "--strip-unneeded -R .note -R .comment", + ld_file, dest_path + "/" + ld_full_path) + +-os.chmod(dest_path + "/" + ld_full_path, 0755) ++os.chmod(dest_path + "/" + ld_full_path, 0o755) -- cgit v1.2.3