summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2021-07-16 14:53:23 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-07-30 00:11:51 +0100
commit82c1581e4824a778915c1e1fed23851b84fd7cd3 (patch)
tree39d88d4867e070e8c70710e300c64458f43dbedc /scripts
parent2f2875f73ceec4839f1fdbbd65a216a0cc840b76 (diff)
downloadpoky-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-xscripts/contrib/convert-overrides.py141
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
19import re
20import os
21import sys
22import tempfile
23import shutil
24import mimetypes
25
26if len(sys.argv) != 2:
27 print("Please specify a directory to run the conversion script against.")
28 sys.exit(1)
29
30targetdir = sys.argv[1]
31
32# List of strings to treat as overrides
33vars = ["append", "prepend", "remove"]
34vars = vars + ["qemuarm", "qemux86", "qemumips", "qemuppc", "qemuriscv", "qemuall"]
35vars = vars + ["genericx86", "edgerouter", "beaglebone-yocto"]
36vars = vars + ["armeb", "arm", "armv5", "armv6", "armv4", "powerpc64", "aarch64", "riscv32", "riscv64", "x86", "mips64", "powerpc"]
37vars = vars + ["mipsarch", "x86-x32", "mips16e", "microblaze", "e5500-64b", "mipsisa32", "mipsisa64"]
38vars = vars + ["class-native", "class-target", "class-cross-canadian", "class-cross", "class-devupstream"]
39vars = vars + ["tune-", "pn-", "forcevariable"]
40vars = vars + ["libc-musl", "libc-glibc", "libc-newlib","libc-baremetal"]
41vars = vars + ["task-compile", "task-install", "task-clean", "task-image-qa", "task-rm_work", "task-image-complete", "task-populate-sdk"]
42vars = vars + ["toolchain-clang", "mydistro", "nios2", "sdkmingw32", "overrideone", "overridetwo"]
43vars = vars + ["linux-gnux32", "linux-muslx32", "linux-gnun32", "mingw32", "poky", "darwin", "linuxstdbase"]
44vars = 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.
48shortvars = ["arc", "mips", "mipsel", "sh4"]
49
50# Variables which take packagenames as an override
51packagevars = ["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
58skips = ["parser_append", "recipe_to_append", "extra_append", "to_remove", "show_appends", "applied_appends", "file_appends", "handle_remove"]
59skips = skips + ["expanded_removes", "color_remove", "test_remove", "empty_remove", "toaster_prepend", "num_removed", "licfiles_append", "_write_append"]
60skips = skips + ["no_report_remove", "test_prepend", "test_append", "multiple_append", "test_remove", "shallow_remove", "do_remove_layer", "first_append"]
61skips = skips + ["parser_remove", "to_append", "no_remove", "bblayers_add_remove", "bblayers_remove", "apply_append", "is_x86", "base_dep_prepend"]
62skips = skips + ["autotools_dep_prepend", "go_map_arm", "alt_remove_links", "systemd_append_file", "file_append", "process_file_darwin"]
63skips = skips + ["run_loaddata_poky", "determine_if_poky_env", "do_populate_poky_src", "libc_cv_include_x86_isa_level", "test_rpm_remove", "do_install_armmultilib"]
64skips = skips + ["get_appends_for_files", "test_doubleref_remove", "test_bitbakelayers_add_remove", "elf32_x86_64", "colour_remove", "revmap_remove"]
65skips = skips + ["test_rpm_remove", "test_bitbakelayers_add_remove", "recipe_append_file", "log_data_removed", "recipe_append", "systemd_machine_unit_append"]
66skips = skips + ["recipetool_append", "changetype_remove", "try_appendfile_wc", "test_qemux86_directdisk", "test_layer_appends", "tgz_removed"]
67
68imagevars = ["IMAGE_CMD", "EXTRA_IMAGECMD"]
69packagevars = packagevars + imagevars
70
71vars_re = {}
72for exp in vars:
73 vars_re[exp] = (re.compile('((^|[\'"\s])[A-Za-z0-9_\-:${}]+)_' + exp), r"\1:" + exp)
74
75shortvars_re = {}
76for exp in shortvars:
77 shortvars_re[exp] = (re.compile('((^|[\'"\s])[A-Za-z0-9_\-:${}]+)_' + exp + '([\'"\s:])'), r"\1:" + exp + r"\3")
78
79package_re = {}
80for 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
84subs = {
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
92def 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
130ourname = os.path.basename(sys.argv[0])
131
132for 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)