diff options
| author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-07-16 14:53:23 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-07-30 00:11:51 +0100 |
| commit | 82c1581e4824a778915c1e1fed23851b84fd7cd3 (patch) | |
| tree | 39d88d4867e070e8c70710e300c64458f43dbedc /scripts | |
| parent | 2f2875f73ceec4839f1fdbbd65a216a0cc840b76 (diff) | |
| download | poky-82c1581e4824a778915c1e1fed23851b84fd7cd3.tar.gz | |
scripts/contrib: Add override conversion script
This adds a script I've developed to migrate metadata to use the new override
syntax. It is a bit rough but since its for a single use with validation, it
doesn't need to be perfect. It is run simply as:
scripts/contrib/convert-overrides.py <directory>
It is setup and has been tested to work with OE-Core, Bitbake, yocto-docs,
meta-yocto, meta-gplv2 and meta-mingw. For OE-Core, it converts around 10,100
lines with about 34 manual fixes needed.
For other layers it would need updating for override names and exclusions for
functions/variable names with "append", "prepend" or "remove" in them.
(From OE-Core rev: e8fc67f6f6baf54ccdf548b947c35dea926842c3)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/contrib/convert-overrides.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/scripts/contrib/convert-overrides.py b/scripts/contrib/convert-overrides.py new file mode 100755 index 0000000000..499852bd26 --- /dev/null +++ b/scripts/contrib/convert-overrides.py | |||
| @@ -0,0 +1,141 @@ | |||
| 1 | #!/usr/bin/env python3 | ||
| 2 | # | ||
| 3 | # Conversion script to add new override syntax to existing bitbake metadata | ||
| 4 | # | ||
| 5 | # Copyright (C) 2021 Richard Purdie | ||
| 6 | # | ||
| 7 | # SPDX-License-Identifier: GPL-2.0-only | ||
| 8 | # | ||
| 9 | |||
| 10 | # | ||
| 11 | # To use this script on a new layer you need to list the overrides the | ||
| 12 | # layer is known to use in the list below. | ||
| 13 | # | ||
| 14 | # Known constraint: Matching is 'loose' and in particular will find variable | ||
| 15 | # and function names with "_append" and "_remove" in them. Those need to be | ||
| 16 | # filtered out manually or in the skip list below. | ||
| 17 | # | ||
| 18 | |||
| 19 | import re | ||
| 20 | import os | ||
| 21 | import sys | ||
| 22 | import tempfile | ||
| 23 | import shutil | ||
| 24 | import mimetypes | ||
| 25 | |||
| 26 | if len(sys.argv) != 2: | ||
| 27 | print("Please specify a directory to run the conversion script against.") | ||
| 28 | sys.exit(1) | ||
| 29 | |||
| 30 | targetdir = sys.argv[1] | ||
| 31 | |||
| 32 | # List of strings to treat as overrides | ||
| 33 | vars = ["append", "prepend", "remove"] | ||
| 34 | vars = vars + ["qemuarm", "qemux86", "qemumips", "qemuppc", "qemuriscv", "qemuall"] | ||
| 35 | vars = vars + ["genericx86", "edgerouter", "beaglebone-yocto"] | ||
| 36 | vars = vars + ["armeb", "arm", "armv5", "armv6", "armv4", "powerpc64", "aarch64", "riscv32", "riscv64", "x86", "mips64", "powerpc"] | ||
| 37 | vars = vars + ["mipsarch", "x86-x32", "mips16e", "microblaze", "e5500-64b", "mipsisa32", "mipsisa64"] | ||
| 38 | vars = vars + ["class-native", "class-target", "class-cross-canadian", "class-cross", "class-devupstream"] | ||
| 39 | vars = vars + ["tune-", "pn-", "forcevariable"] | ||
| 40 | vars = vars + ["libc-musl", "libc-glibc", "libc-newlib","libc-baremetal"] | ||
| 41 | vars = vars + ["task-compile", "task-install", "task-clean", "task-image-qa", "task-rm_work", "task-image-complete", "task-populate-sdk"] | ||
| 42 | vars = vars + ["toolchain-clang", "mydistro", "nios2", "sdkmingw32", "overrideone", "overridetwo"] | ||
| 43 | vars = vars + ["linux-gnux32", "linux-muslx32", "linux-gnun32", "mingw32", "poky", "darwin", "linuxstdbase"] | ||
| 44 | vars = vars + ["virtclass-multilib", "virtclass-mcextend"] | ||
| 45 | |||
| 46 | # List of strings to treat as overrides but only with whitespace following or another override (more restricted matching). | ||
| 47 | # Handles issues with arc matching arch. | ||
| 48 | shortvars = ["arc", "mips", "mipsel", "sh4"] | ||
| 49 | |||
| 50 | # Variables which take packagenames as an override | ||
| 51 | packagevars = ["FILES", "RDEPENDS", "RRECOMMENDS", "SUMMARY", "DESCRIPTION", "RSUGGESTS", "RPROVIDES", "RCONFLICTS", "PKG", "ALLOW_EMPTY", | ||
| 52 | "pkg_postrm", "pkg_postinst_ontarget", "pkg_postinst", "INITSCRIPT_NAME", "INITSCRIPT_PARAMS", "DEBIAN_NOAUTONAME", "ALTERNATIVE", | ||
| 53 | "PKGE", "PKGV", "PKGR", "USERADD_PARAM", "GROUPADD_PARAM", "CONFFILES", "SYSTEMD_SERVICE", "LICENSE", "SECTION", "pkg_preinst", | ||
| 54 | "pkg_prerm", "RREPLACES", "GROUPMEMS_PARAM", "SYSTEMD_AUTO_ENABLE", "SKIP_FILEDEPS", "PRIVATE_LIBS", "PACKAGE_ADD_METADATA", | ||
| 55 | "INSANE_SKIP", "DEBIANNAME", "SYSTEMD_SERVICE_ESCAPED"] | ||
| 56 | |||
| 57 | # Expressions to skip if encountered, these are not overrides | ||
| 58 | skips = ["parser_append", "recipe_to_append", "extra_append", "to_remove", "show_appends", "applied_appends", "file_appends", "handle_remove"] | ||
| 59 | skips = skips + ["expanded_removes", "color_remove", "test_remove", "empty_remove", "toaster_prepend", "num_removed", "licfiles_append", "_write_append"] | ||
| 60 | skips = skips + ["no_report_remove", "test_prepend", "test_append", "multiple_append", "test_remove", "shallow_remove", "do_remove_layer", "first_append"] | ||
| 61 | skips = skips + ["parser_remove", "to_append", "no_remove", "bblayers_add_remove", "bblayers_remove", "apply_append", "is_x86", "base_dep_prepend"] | ||
| 62 | skips = skips + ["autotools_dep_prepend", "go_map_arm", "alt_remove_links", "systemd_append_file", "file_append", "process_file_darwin"] | ||
| 63 | skips = skips + ["run_loaddata_poky", "determine_if_poky_env", "do_populate_poky_src", "libc_cv_include_x86_isa_level", "test_rpm_remove", "do_install_armmultilib"] | ||
| 64 | skips = skips + ["get_appends_for_files", "test_doubleref_remove", "test_bitbakelayers_add_remove", "elf32_x86_64", "colour_remove", "revmap_remove"] | ||
| 65 | skips = skips + ["test_rpm_remove", "test_bitbakelayers_add_remove", "recipe_append_file", "log_data_removed", "recipe_append", "systemd_machine_unit_append"] | ||
| 66 | skips = skips + ["recipetool_append", "changetype_remove", "try_appendfile_wc", "test_qemux86_directdisk", "test_layer_appends", "tgz_removed"] | ||
| 67 | |||
| 68 | imagevars = ["IMAGE_CMD", "EXTRA_IMAGECMD"] | ||
| 69 | packagevars = packagevars + imagevars | ||
| 70 | |||
| 71 | vars_re = {} | ||
| 72 | for exp in vars: | ||
| 73 | vars_re[exp] = (re.compile('((^|[\'"\s])[A-Za-z0-9_\-:${}]+)_' + exp), r"\1:" + exp) | ||
| 74 | |||
| 75 | shortvars_re = {} | ||
| 76 | for exp in shortvars: | ||
| 77 | shortvars_re[exp] = (re.compile('((^|[\'"\s])[A-Za-z0-9_\-:${}]+)_' + exp + '([\'"\s:])'), r"\1:" + exp + r"\3") | ||
| 78 | |||
| 79 | package_re = {} | ||
| 80 | for exp in packagevars: | ||
| 81 | package_re[exp] = (re.compile('(^|[\'"\s]+)' + exp + '_' + '([$a-z"\'\s%\[<{\\\*].)'), r"\1" + exp + r":\2") | ||
| 82 | |||
| 83 | # Other substitutions to make | ||
| 84 | subs = { | ||
| 85 | 'r = re.compile("([^:]+):\s*(.*)")' : 'r = re.compile("(^.+?):\s+(.*)")', | ||
| 86 | "val = d.getVar('%s_%s' % (var, pkg))" : "val = d.getVar('%s:%s' % (var, pkg))", | ||
| 87 | "f.write('%s_%s: %s\\n' % (var, pkg, encode(val)))" : "f.write('%s:%s: %s\\n' % (var, pkg, encode(val)))", | ||
| 88 | "d.getVar('%s_%s' % (scriptlet_name, pkg))" : "d.getVar('%s:%s' % (scriptlet_name, pkg))", | ||
| 89 | 'ret.append(v + "_" + p)' : 'ret.append(v + ":" + p)', | ||
| 90 | } | ||
| 91 | |||
| 92 | def processfile(fn): | ||
| 93 | try: | ||
| 94 | fh, abs_path = tempfile.mkstemp() | ||
| 95 | with os.fdopen(fh, 'w') as new_file: | ||
| 96 | with open(fn, "r") as old_file: | ||
| 97 | for line in old_file: | ||
| 98 | skip = False | ||
| 99 | for s in skips: | ||
| 100 | if s in line: | ||
| 101 | skip = True | ||
| 102 | if "ptest_append" in line or "ptest_remove" in line or "ptest_prepend" in line: | ||
| 103 | skip = False | ||
| 104 | if "base_dep_prepend" in line and line.startswith("BASEDEPENDS_class"): | ||
| 105 | line = line.replace("BASEDEPENDS_class", "BASEDEPENDS:class") | ||
| 106 | skip = True | ||
| 107 | if "autotools_dep_prepend" in line and line.startswith("DEPENDS_prepend"): | ||
| 108 | line = line.replace("DEPENDS_prepend", "DEPENDS:prepend") | ||
| 109 | skip = True | ||
| 110 | for sub in subs: | ||
| 111 | if sub in line: | ||
| 112 | line = line.replace(sub, subs[sub]) | ||
| 113 | skip = True | ||
| 114 | if not skip: | ||
| 115 | for pvar in packagevars: | ||
| 116 | line = package_re[pvar][0].sub(package_re[pvar][1], line) | ||
| 117 | for var in vars: | ||
| 118 | line = vars_re[var][0].sub(vars_re[var][1], line) | ||
| 119 | for shortvar in shortvars: | ||
| 120 | line = shortvars_re[shortvar][0].sub(shortvars_re[shortvar][1], line) | ||
| 121 | if "pkg_postinst:ontarget" in line: | ||
| 122 | line = line.replace("pkg_postinst:ontarget", "pkg_postinst_ontarget") | ||
| 123 | new_file.write(line) | ||
| 124 | shutil.copymode(fn, abs_path) | ||
| 125 | os.remove(fn) | ||
| 126 | shutil.move(abs_path, fn) | ||
| 127 | except UnicodeDecodeError: | ||
| 128 | pass | ||
| 129 | |||
| 130 | ourname = os.path.basename(sys.argv[0]) | ||
| 131 | |||
| 132 | for root, dirs, files in os.walk(targetdir): | ||
| 133 | for name in files: | ||
| 134 | if name == ourname: | ||
| 135 | continue | ||
| 136 | fn = os.path.join(root, name) | ||
| 137 | if os.path.islink(fn): | ||
| 138 | continue | ||
| 139 | if "/.git/" in fn or fn.endswith(".html") or fn.endswith(".patch") or fn.endswith(".m4") or fn.endswith(".diff"): | ||
| 140 | continue | ||
| 141 | processfile(fn) | ||
