mirror of
https://git.yoctoproject.org/poky
synced 2026-05-30 12:29:55 +00:00
insane: Drop oe.qa.add_message usage
Drop the oe.qa.add_message() usage in favour of oe.qa.handle_error() which has code allowing it to be optimised with contains usage. The patch also drops unused return values which we stopped using a while ago and drops the now unneeded function parameters, generally leading to cleaner code. The code should be functionally equivalent. (From OE-Core rev: 9b2eea9fd4eab4f5e12e955738db22091b91f698) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
@@ -83,7 +83,7 @@ def package_qa_clean_path(path, d, pkg=None):
|
|||||||
return path.replace(d.getVar("TMPDIR"), "/").replace("//", "/")
|
return path.replace(d.getVar("TMPDIR"), "/").replace("//", "/")
|
||||||
|
|
||||||
QAPATHTEST[shebang-size] = "package_qa_check_shebang_size"
|
QAPATHTEST[shebang-size] = "package_qa_check_shebang_size"
|
||||||
def package_qa_check_shebang_size(path, name, d, elf, messages):
|
def package_qa_check_shebang_size(path, name, d, elf):
|
||||||
import stat
|
import stat
|
||||||
if os.path.islink(path) or stat.S_ISFIFO(os.stat(path).st_mode) or elf:
|
if os.path.islink(path) or stat.S_ISFIFO(os.stat(path).st_mode) or elf:
|
||||||
return
|
return
|
||||||
@@ -102,25 +102,23 @@ def package_qa_check_shebang_size(path, name, d, elf, messages):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if len(stanza) > 129:
|
if len(stanza) > 129:
|
||||||
oe.qa.add_message(messages, "shebang-size", "%s: %s maximum shebang size exceeded, the maximum size is 128." % (name, package_qa_clean_path(path, d, name)))
|
oe.qa.handle_error("shebang-size", "%s: %s maximum shebang size exceeded, the maximum size is 128." % (name, package_qa_clean_path(path, d, name)), d)
|
||||||
return
|
return
|
||||||
|
|
||||||
QAPATHTEST[libexec] = "package_qa_check_libexec"
|
QAPATHTEST[libexec] = "package_qa_check_libexec"
|
||||||
def package_qa_check_libexec(path,name, d, elf, messages):
|
def package_qa_check_libexec(path,name, d, elf):
|
||||||
|
|
||||||
# Skip the case where the default is explicitly /usr/libexec
|
# Skip the case where the default is explicitly /usr/libexec
|
||||||
libexec = d.getVar('libexecdir')
|
libexec = d.getVar('libexecdir')
|
||||||
if libexec == "/usr/libexec":
|
if libexec == "/usr/libexec":
|
||||||
return True
|
return
|
||||||
|
|
||||||
if 'libexec' in path.split(os.path.sep):
|
if 'libexec' in path.split(os.path.sep):
|
||||||
oe.qa.add_message(messages, "libexec", "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d, name), libexec))
|
oe.qa.handle_error("libexec", "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d, name), libexec), d)
|
||||||
return False
|
return
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
QAPATHTEST[rpaths] = "package_qa_check_rpath"
|
QAPATHTEST[rpaths] = "package_qa_check_rpath"
|
||||||
def package_qa_check_rpath(file,name, d, elf, messages):
|
def package_qa_check_rpath(file,name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check for dangerous RPATHs
|
Check for dangerous RPATHs
|
||||||
"""
|
"""
|
||||||
@@ -142,10 +140,10 @@ def package_qa_check_rpath(file,name, d, elf, messages):
|
|||||||
rpath = m.group(1)
|
rpath = m.group(1)
|
||||||
for dir in bad_dirs:
|
for dir in bad_dirs:
|
||||||
if dir in rpath:
|
if dir in rpath:
|
||||||
oe.qa.add_message(messages, "rpaths", "package %s contains bad RPATH %s in file %s" % (name, rpath, file))
|
oe.qa.handle_error("rpaths", "package %s contains bad RPATH %s in file %s" % (name, rpath, file), d)
|
||||||
|
|
||||||
QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths"
|
QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths"
|
||||||
def package_qa_check_useless_rpaths(file, name, d, elf, messages):
|
def package_qa_check_useless_rpaths(file, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check for RPATHs that are useless but not dangerous
|
Check for RPATHs that are useless but not dangerous
|
||||||
"""
|
"""
|
||||||
@@ -172,31 +170,31 @@ def package_qa_check_useless_rpaths(file, name, d, elf, messages):
|
|||||||
if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir):
|
if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir):
|
||||||
# The dynamic linker searches both these places anyway. There is no point in
|
# The dynamic linker searches both these places anyway. There is no point in
|
||||||
# looking there again.
|
# looking there again.
|
||||||
oe.qa.add_message(messages, "useless-rpaths", "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d, name), rpath))
|
oe.qa.handle_error("useless-rpaths", "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d, name), rpath), d)
|
||||||
|
|
||||||
QAPATHTEST[dev-so] = "package_qa_check_dev"
|
QAPATHTEST[dev-so] = "package_qa_check_dev"
|
||||||
def package_qa_check_dev(path, name, d, elf, messages):
|
def package_qa_check_dev(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check for ".so" library symlinks in non-dev packages
|
Check for ".so" library symlinks in non-dev packages
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not name.endswith("-dev") and not name.endswith("-dbg") and not name.endswith("-ptest") and not name.startswith("nativesdk-") and path.endswith(".so") and os.path.islink(path):
|
if not name.endswith("-dev") and not name.endswith("-dbg") and not name.endswith("-ptest") and not name.startswith("nativesdk-") and path.endswith(".so") and os.path.islink(path):
|
||||||
oe.qa.add_message(messages, "dev-so", "non -dev/-dbg/nativesdk- package %s contains symlink .so '%s'" % \
|
oe.qa.handle_error("dev-so", "non -dev/-dbg/nativesdk- package %s contains symlink .so '%s'" % \
|
||||||
(name, package_qa_clean_path(path, d, name)))
|
(name, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
QAPATHTEST[dev-elf] = "package_qa_check_dev_elf"
|
QAPATHTEST[dev-elf] = "package_qa_check_dev_elf"
|
||||||
def package_qa_check_dev_elf(path, name, d, elf, messages):
|
def package_qa_check_dev_elf(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check that -dev doesn't contain real shared libraries. The test has to
|
Check that -dev doesn't contain real shared libraries. The test has to
|
||||||
check that the file is not a link and is an ELF object as some recipes
|
check that the file is not a link and is an ELF object as some recipes
|
||||||
install link-time .so files that are linker scripts.
|
install link-time .so files that are linker scripts.
|
||||||
"""
|
"""
|
||||||
if name.endswith("-dev") and path.endswith(".so") and not os.path.islink(path) and elf:
|
if name.endswith("-dev") and path.endswith(".so") and not os.path.islink(path) and elf:
|
||||||
oe.qa.add_message(messages, "dev-elf", "-dev package %s contains non-symlink .so '%s'" % \
|
oe.qa.handle_error("dev-elf", "-dev package %s contains non-symlink .so '%s'" % \
|
||||||
(name, package_qa_clean_path(path, d, name)))
|
(name, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
QAPATHTEST[staticdev] = "package_qa_check_staticdev"
|
QAPATHTEST[staticdev] = "package_qa_check_staticdev"
|
||||||
def package_qa_check_staticdev(path, name, d, elf, messages):
|
def package_qa_check_staticdev(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check for ".a" library in non-staticdev packages
|
Check for ".a" library in non-staticdev packages
|
||||||
There are a number of exceptions to this rule, -pic packages can contain
|
There are a number of exceptions to this rule, -pic packages can contain
|
||||||
@@ -205,22 +203,22 @@ def package_qa_check_staticdev(path, name, d, elf, messages):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if not name.endswith("-pic") and not name.endswith("-staticdev") and not name.endswith("-ptest") and path.endswith(".a") and not path.endswith("_nonshared.a") and not '/usr/lib/debug-static/' in path and not '/.debug-static/' in path:
|
if not name.endswith("-pic") and not name.endswith("-staticdev") and not name.endswith("-ptest") and path.endswith(".a") and not path.endswith("_nonshared.a") and not '/usr/lib/debug-static/' in path and not '/.debug-static/' in path:
|
||||||
oe.qa.add_message(messages, "staticdev", "non -staticdev package contains static .a library: %s path '%s'" % \
|
oe.qa.handle_error("staticdev", "non -staticdev package contains static .a library: %s path '%s'" % \
|
||||||
(name, package_qa_clean_path(path, d, name)))
|
(name, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
QAPATHTEST[mime] = "package_qa_check_mime"
|
QAPATHTEST[mime] = "package_qa_check_mime"
|
||||||
def package_qa_check_mime(path, name, d, elf, messages):
|
def package_qa_check_mime(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check if package installs mime types to /usr/share/mime/packages
|
Check if package installs mime types to /usr/share/mime/packages
|
||||||
while no inheriting mime.bbclass
|
while no inheriting mime.bbclass
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if d.getVar("datadir") + "/mime/packages" in path and path.endswith('.xml') and not bb.data.inherits_class("mime", d):
|
if d.getVar("datadir") + "/mime/packages" in path and path.endswith('.xml') and not bb.data.inherits_class("mime", d):
|
||||||
oe.qa.add_message(messages, "mime", "package contains mime types but does not inherit mime: %s path '%s'" % \
|
oe.qa.handle_error("mime", "package contains mime types but does not inherit mime: %s path '%s'" % \
|
||||||
(name, package_qa_clean_path(path, d, name)))
|
(name, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
QAPATHTEST[mime-xdg] = "package_qa_check_mime_xdg"
|
QAPATHTEST[mime-xdg] = "package_qa_check_mime_xdg"
|
||||||
def package_qa_check_mime_xdg(path, name, d, elf, messages):
|
def package_qa_check_mime_xdg(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check if package installs desktop file containing MimeType and requires
|
Check if package installs desktop file containing MimeType and requires
|
||||||
mime-types.bbclass to create /usr/share/applications/mimeinfo.cache
|
mime-types.bbclass to create /usr/share/applications/mimeinfo.cache
|
||||||
@@ -243,10 +241,10 @@ def package_qa_check_mime_xdg(path, name, d, elf, messages):
|
|||||||
if name == d.getVar('PN'):
|
if name == d.getVar('PN'):
|
||||||
pkgname = '${PN}'
|
pkgname = '${PN}'
|
||||||
wstr += "If yes: add \'inhert mime-xdg\' and \'MIME_XDG_PACKAGES += \"%s\"\' / if no add \'INSANE_SKIP:%s += \"mime-xdg\"\' to recipe." % (pkgname, pkgname)
|
wstr += "If yes: add \'inhert mime-xdg\' and \'MIME_XDG_PACKAGES += \"%s\"\' / if no add \'INSANE_SKIP:%s += \"mime-xdg\"\' to recipe." % (pkgname, pkgname)
|
||||||
oe.qa.add_message(messages, "mime-xdg", wstr)
|
oe.qa.handle_error("mime-xdg", wstr, d)
|
||||||
if mime_type_found:
|
if mime_type_found:
|
||||||
oe.qa.add_message(messages, "mime-xdg", "%s: contains desktop file with key 'MimeType' but does not inhert mime-xdg: %s" % \
|
oe.qa.handle_error("mime-xdg", "%s: contains desktop file with key 'MimeType' but does not inhert mime-xdg: %s" % \
|
||||||
(name, package_qa_clean_path(path, d, name)))
|
(name, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
def package_qa_check_libdir(d):
|
def package_qa_check_libdir(d):
|
||||||
"""
|
"""
|
||||||
@@ -312,18 +310,18 @@ def package_qa_check_libdir(d):
|
|||||||
oe.qa.handle_error("libdir", "\n".join(messages), d)
|
oe.qa.handle_error("libdir", "\n".join(messages), d)
|
||||||
|
|
||||||
QAPATHTEST[debug-files] = "package_qa_check_dbg"
|
QAPATHTEST[debug-files] = "package_qa_check_dbg"
|
||||||
def package_qa_check_dbg(path, name, d, elf, messages):
|
def package_qa_check_dbg(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check for ".debug" files or directories outside of the dbg package
|
Check for ".debug" files or directories outside of the dbg package
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not "-dbg" in name and not "-ptest" in name:
|
if not "-dbg" in name and not "-ptest" in name:
|
||||||
if '.debug' in path.split(os.path.sep):
|
if '.debug' in path.split(os.path.sep):
|
||||||
oe.qa.add_message(messages, "debug-files", "%s: non debug package contains .debug directory %s" % \
|
oe.qa.handle_error("debug-files", "%s: non debug package contains .debug directory %s" % \
|
||||||
(name, package_qa_clean_path(path, d, name)))
|
(name, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
QAPATHTEST[arch] = "package_qa_check_arch"
|
QAPATHTEST[arch] = "package_qa_check_arch"
|
||||||
def package_qa_check_arch(path,name,d, elf, messages):
|
def package_qa_check_arch(path,name,d, elf):
|
||||||
"""
|
"""
|
||||||
Check if archs are compatible
|
Check if archs are compatible
|
||||||
"""
|
"""
|
||||||
@@ -339,7 +337,7 @@ def package_qa_check_arch(path,name,d, elf, messages):
|
|||||||
|
|
||||||
if host_arch == "allarch":
|
if host_arch == "allarch":
|
||||||
pn = d.getVar('PN')
|
pn = d.getVar('PN')
|
||||||
oe.qa.add_message(messages, "arch", pn + ": Recipe inherits the allarch class, but has packaged architecture-specific binaries")
|
oe.qa.handle_error("arch", pn + ": Recipe inherits the allarch class, but has packaged architecture-specific binaries", d)
|
||||||
return
|
return
|
||||||
|
|
||||||
# avoid following links to /usr/bin (e.g. on udev builds)
|
# avoid following links to /usr/bin (e.g. on udev builds)
|
||||||
@@ -357,17 +355,17 @@ def package_qa_check_arch(path,name,d, elf, messages):
|
|||||||
host_os == "linux-gnu_ilp32" or re.match(r'mips64.*32', d.getVar('DEFAULTTUNE')))
|
host_os == "linux-gnu_ilp32" or re.match(r'mips64.*32', d.getVar('DEFAULTTUNE')))
|
||||||
is_bpf = (oe.qa.elf_machine_to_string(elf.machine()) == "BPF")
|
is_bpf = (oe.qa.elf_machine_to_string(elf.machine()) == "BPF")
|
||||||
if not ((machine == elf.machine()) or is_32 or is_bpf):
|
if not ((machine == elf.machine()) or is_32 or is_bpf):
|
||||||
oe.qa.add_message(messages, "arch", "Architecture did not match (%s, expected %s) in %s" % \
|
oe.qa.handle_error("arch", "Architecture did not match (%s, expected %s) in %s" % \
|
||||||
(oe.qa.elf_machine_to_string(elf.machine()), oe.qa.elf_machine_to_string(machine), package_qa_clean_path(path, d, name)))
|
(oe.qa.elf_machine_to_string(elf.machine()), oe.qa.elf_machine_to_string(machine), package_qa_clean_path(path, d, name)), d)
|
||||||
elif not ((bits == elf.abiSize()) or is_32 or is_bpf):
|
elif not ((bits == elf.abiSize()) or is_32 or is_bpf):
|
||||||
oe.qa.add_message(messages, "arch", "Bit size did not match (%d, expected %d) in %s" % \
|
oe.qa.handle_error("arch", "Bit size did not match (%d, expected %d) in %s" % \
|
||||||
(elf.abiSize(), bits, package_qa_clean_path(path, d, name)))
|
(elf.abiSize(), bits, package_qa_clean_path(path, d, name)), d)
|
||||||
elif not ((littleendian == elf.isLittleEndian()) or is_bpf):
|
elif not ((littleendian == elf.isLittleEndian()) or is_bpf):
|
||||||
oe.qa.add_message(messages, "arch", "Endiannes did not match (%d, expected %d) in %s" % \
|
oe.qa.handle_error("arch", "Endiannes did not match (%d, expected %d) in %s" % \
|
||||||
(elf.isLittleEndian(), littleendian, package_qa_clean_path(path, d, name)))
|
(elf.isLittleEndian(), littleendian, package_qa_clean_path(path, d, name)), d)
|
||||||
|
|
||||||
QAPATHTEST[desktop] = "package_qa_check_desktop"
|
QAPATHTEST[desktop] = "package_qa_check_desktop"
|
||||||
def package_qa_check_desktop(path, name, d, elf, messages):
|
def package_qa_check_desktop(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Run all desktop files through desktop-file-validate.
|
Run all desktop files through desktop-file-validate.
|
||||||
"""
|
"""
|
||||||
@@ -376,10 +374,10 @@ def package_qa_check_desktop(path, name, d, elf, messages):
|
|||||||
output = os.popen("%s %s" % (desktop_file_validate, path))
|
output = os.popen("%s %s" % (desktop_file_validate, path))
|
||||||
# This only produces output on errors
|
# This only produces output on errors
|
||||||
for l in output:
|
for l in output:
|
||||||
oe.qa.add_message(messages, "desktop", "Desktop file issue: " + l.strip())
|
oe.qa.handle_error("desktop", "Desktop file issue: " + l.strip(), d)
|
||||||
|
|
||||||
QAPATHTEST[textrel] = "package_qa_textrel"
|
QAPATHTEST[textrel] = "package_qa_textrel"
|
||||||
def package_qa_textrel(path, name, d, elf, messages):
|
def package_qa_textrel(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check if the binary contains relocations in .text
|
Check if the binary contains relocations in .text
|
||||||
"""
|
"""
|
||||||
@@ -391,21 +389,17 @@ def package_qa_textrel(path, name, d, elf, messages):
|
|||||||
return
|
return
|
||||||
|
|
||||||
phdrs = elf.run_objdump("-p", d)
|
phdrs = elf.run_objdump("-p", d)
|
||||||
sane = True
|
|
||||||
|
|
||||||
import re
|
import re
|
||||||
textrel_re = re.compile(r"\s+TEXTREL\s+")
|
textrel_re = re.compile(r"\s+TEXTREL\s+")
|
||||||
for line in phdrs.split("\n"):
|
for line in phdrs.split("\n"):
|
||||||
if textrel_re.match(line):
|
if textrel_re.match(line):
|
||||||
sane = False
|
path = package_qa_clean_path(path, d, name)
|
||||||
break
|
oe.qa.handle_error("textrel", "%s: ELF binary %s has relocations in .text" % (name, path), d)
|
||||||
|
return
|
||||||
if not sane:
|
|
||||||
path = package_qa_clean_path(path, d, name)
|
|
||||||
oe.qa.add_message(messages, "textrel", "%s: ELF binary %s has relocations in .text" % (name, path))
|
|
||||||
|
|
||||||
QAPATHTEST[ldflags] = "package_qa_hash_style"
|
QAPATHTEST[ldflags] = "package_qa_hash_style"
|
||||||
def package_qa_hash_style(path, name, d, elf, messages):
|
def package_qa_hash_style(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check if the binary has the right hash style...
|
Check if the binary has the right hash style...
|
||||||
"""
|
"""
|
||||||
@@ -437,11 +431,11 @@ def package_qa_hash_style(path, name, d, elf, messages):
|
|||||||
sane = True
|
sane = True
|
||||||
if has_syms and not sane:
|
if has_syms and not sane:
|
||||||
path = package_qa_clean_path(path, d, name)
|
path = package_qa_clean_path(path, d, name)
|
||||||
oe.qa.add_message(messages, "ldflags", "File %s in package %s doesn't have GNU_HASH (didn't pass LDFLAGS?)" % (path, name))
|
oe.qa.handle_error("ldflags", "File %s in package %s doesn't have GNU_HASH (didn't pass LDFLAGS?)" % (path, name), d)
|
||||||
|
|
||||||
|
|
||||||
QAPATHTEST[buildpaths] = "package_qa_check_buildpaths"
|
QAPATHTEST[buildpaths] = "package_qa_check_buildpaths"
|
||||||
def package_qa_check_buildpaths(path, name, d, elf, messages):
|
def package_qa_check_buildpaths(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check for build paths inside target files and error if paths are not
|
Check for build paths inside target files and error if paths are not
|
||||||
explicitly ignored.
|
explicitly ignored.
|
||||||
@@ -458,11 +452,11 @@ def package_qa_check_buildpaths(path, name, d, elf, messages):
|
|||||||
file_content = f.read()
|
file_content = f.read()
|
||||||
if tmpdir in file_content:
|
if tmpdir in file_content:
|
||||||
path = package_qa_clean_path(path, d, name)
|
path = package_qa_clean_path(path, d, name)
|
||||||
oe.qa.add_message(messages, "buildpaths", "File %s in package %s contains reference to TMPDIR" % (path, name))
|
oe.qa.handle_error("buildpaths", "File %s in package %s contains reference to TMPDIR" % (path, name), d)
|
||||||
|
|
||||||
|
|
||||||
QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"
|
QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"
|
||||||
def package_qa_check_xorg_driver_abi(path, name, d, elf, messages):
|
def package_qa_check_xorg_driver_abi(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check that all packages containing Xorg drivers have ABI dependencies
|
Check that all packages containing Xorg drivers have ABI dependencies
|
||||||
"""
|
"""
|
||||||
@@ -477,20 +471,20 @@ def package_qa_check_xorg_driver_abi(path, name, d, elf, messages):
|
|||||||
for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS:' + name) or ""):
|
for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS:' + name) or ""):
|
||||||
if rdep.startswith("%sxorg-abi-" % mlprefix):
|
if rdep.startswith("%sxorg-abi-" % mlprefix):
|
||||||
return
|
return
|
||||||
oe.qa.add_message(messages, "xorg-driver-abi", "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)))
|
oe.qa.handle_error("xorg-driver-abi", "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)), d)
|
||||||
|
|
||||||
QAPATHTEST[infodir] = "package_qa_check_infodir"
|
QAPATHTEST[infodir] = "package_qa_check_infodir"
|
||||||
def package_qa_check_infodir(path, name, d, elf, messages):
|
def package_qa_check_infodir(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check that /usr/share/info/dir isn't shipped in a particular package
|
Check that /usr/share/info/dir isn't shipped in a particular package
|
||||||
"""
|
"""
|
||||||
infodir = d.expand("${infodir}/dir")
|
infodir = d.expand("${infodir}/dir")
|
||||||
|
|
||||||
if infodir in path:
|
if infodir in path:
|
||||||
oe.qa.add_message(messages, "infodir", "The %s file is not meant to be shipped in a particular package." % infodir)
|
oe.qa.handle_error("infodir", "The %s file is not meant to be shipped in a particular package." % infodir, d)
|
||||||
|
|
||||||
QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot"
|
QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot"
|
||||||
def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages):
|
def package_qa_check_symlink_to_sysroot(path, name, d, elf):
|
||||||
"""
|
"""
|
||||||
Check that the package doesn't contain any absolute symlinks to the sysroot.
|
Check that the package doesn't contain any absolute symlinks to the sysroot.
|
||||||
"""
|
"""
|
||||||
@@ -500,10 +494,10 @@ def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages):
|
|||||||
tmpdir = d.getVar('TMPDIR')
|
tmpdir = d.getVar('TMPDIR')
|
||||||
if target.startswith(tmpdir):
|
if target.startswith(tmpdir):
|
||||||
path = package_qa_clean_path(path, d, name)
|
path = package_qa_clean_path(path, d, name)
|
||||||
oe.qa.add_message(messages, "symlink-to-sysroot", "Symlink %s in %s points to TMPDIR" % (path, name))
|
oe.qa.handle_error("symlink-to-sysroot", "Symlink %s in %s points to TMPDIR" % (path, name), d)
|
||||||
|
|
||||||
QAPATHTEST[32bit-time] = "check_32bit_symbols"
|
QAPATHTEST[32bit-time] = "check_32bit_symbols"
|
||||||
def check_32bit_symbols(path, packagename, d, elf, messages):
|
def check_32bit_symbols(path, packagename, d, elf):
|
||||||
"""
|
"""
|
||||||
Check that ELF files do not use any 32 bit time APIs from glibc.
|
Check that ELF files do not use any 32 bit time APIs from glibc.
|
||||||
"""
|
"""
|
||||||
@@ -622,11 +616,8 @@ def check_32bit_symbols(path, packagename, d, elf, messages):
|
|||||||
if not allowed:
|
if not allowed:
|
||||||
msgformat = elfpath + " uses 32-bit api '%s'"
|
msgformat = elfpath + " uses 32-bit api '%s'"
|
||||||
for sym in usedapis:
|
for sym in usedapis:
|
||||||
oe.qa.add_message(messages, '32bit-time', msgformat % sym)
|
oe.qa.handle_error('32bit-time', msgformat % sym, d)
|
||||||
oe.qa.add_message(
|
oe.qa.handle_error('32bit-time', 'Suppress with INSANE_SKIP = "32bit-time"', d)
|
||||||
messages, '32bit-time',
|
|
||||||
'Suppress with INSANE_SKIP = "32bit-time"'
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check license variables
|
# Check license variables
|
||||||
do_populate_lic[postfuncs] += "populate_lic_qa_checksum"
|
do_populate_lic[postfuncs] += "populate_lic_qa_checksum"
|
||||||
@@ -787,44 +778,16 @@ def qa_check_staged(path,d):
|
|||||||
oe.qa.handle_error("pkgconfig", error_msg, d)
|
oe.qa.handle_error("pkgconfig", error_msg, d)
|
||||||
|
|
||||||
if not skip_shebang_size:
|
if not skip_shebang_size:
|
||||||
errors = {}
|
package_qa_check_shebang_size(path, "", d, None)
|
||||||
package_qa_check_shebang_size(path, "", d, None, errors)
|
|
||||||
if "shebang-size" in errors:
|
|
||||||
oe.qa.handle_error("shebang-size", errors["shebang-size"], d)
|
|
||||||
|
|
||||||
# Run all package-wide warnfuncs and errorfuncs
|
|
||||||
def package_qa_package(warnfuncs, errorfuncs, package, d):
|
|
||||||
warnings = {}
|
|
||||||
errors = {}
|
|
||||||
|
|
||||||
for func in warnfuncs:
|
|
||||||
func(package, d, warnings)
|
|
||||||
for func in errorfuncs:
|
|
||||||
func(package, d, errors)
|
|
||||||
|
|
||||||
for w in warnings:
|
|
||||||
oe.qa.handle_error(w, warnings[w], d)
|
|
||||||
for e in errors:
|
|
||||||
oe.qa.handle_error(e, errors[e], d)
|
|
||||||
|
|
||||||
return len(errors) == 0
|
|
||||||
|
|
||||||
# Run all recipe-wide warnfuncs and errorfuncs
|
# Run all recipe-wide warnfuncs and errorfuncs
|
||||||
def package_qa_recipe(warnfuncs, errorfuncs, pn, d):
|
def package_qa_recipe(warnfuncs, errorfuncs, pn, d):
|
||||||
warnings = {}
|
|
||||||
errors = {}
|
|
||||||
|
|
||||||
for func in warnfuncs:
|
for func in warnfuncs:
|
||||||
func(pn, d, warnings)
|
func(pn, d)
|
||||||
for func in errorfuncs:
|
for func in errorfuncs:
|
||||||
func(pn, d, errors)
|
func(pn, d)
|
||||||
|
|
||||||
for w in warnings:
|
|
||||||
oe.qa.handle_error(w, warnings[w], d)
|
|
||||||
for e in errors:
|
|
||||||
oe.qa.handle_error(e, errors[e], d)
|
|
||||||
|
|
||||||
return len(errors) == 0
|
|
||||||
|
|
||||||
def prepopulate_objdump_p(elf, d):
|
def prepopulate_objdump_p(elf, d):
|
||||||
output = elf.run_objdump("-p", d)
|
output = elf.run_objdump("-p", d)
|
||||||
@@ -832,8 +795,6 @@ def prepopulate_objdump_p(elf, d):
|
|||||||
|
|
||||||
# Walk over all files in a directory and call func
|
# Walk over all files in a directory and call func
|
||||||
def package_qa_walk(warnfuncs, errorfuncs, package, d):
|
def package_qa_walk(warnfuncs, errorfuncs, package, d):
|
||||||
warnings = {}
|
|
||||||
errors = {}
|
|
||||||
elves = {}
|
elves = {}
|
||||||
for path in pkgfiles[package]:
|
for path in pkgfiles[package]:
|
||||||
elf = None
|
elf = None
|
||||||
@@ -855,17 +816,12 @@ def package_qa_walk(warnfuncs, errorfuncs, package, d):
|
|||||||
if path in elves:
|
if path in elves:
|
||||||
elves[path].open()
|
elves[path].open()
|
||||||
for func in warnfuncs:
|
for func in warnfuncs:
|
||||||
func(path, package, d, elves.get(path), warnings)
|
func(path, package, d, elves.get(path))
|
||||||
for func in errorfuncs:
|
for func in errorfuncs:
|
||||||
func(path, package, d, elves.get(path), errors)
|
func(path, package, d, elves.get(path))
|
||||||
if path in elves:
|
if path in elves:
|
||||||
elves[path].close()
|
elves[path].close()
|
||||||
|
|
||||||
for w in warnings:
|
|
||||||
oe.qa.handle_error(w, warnings[w], d)
|
|
||||||
for e in errors:
|
|
||||||
oe.qa.handle_error(e, errors[e], d)
|
|
||||||
|
|
||||||
def package_qa_check_rdepends(pkg, pkgdest, skip, taskdeps, packages, d):
|
def package_qa_check_rdepends(pkg, pkgdest, skip, taskdeps, packages, d):
|
||||||
# Don't do this check for kernel/module recipes, there aren't too many debug/development
|
# Don't do this check for kernel/module recipes, there aren't too many debug/development
|
||||||
# packages and you can get false positives e.g. on kernel-module-lirc-dev
|
# packages and you can get false positives e.g. on kernel-module-lirc-dev
|
||||||
@@ -986,7 +942,7 @@ def package_qa_check_deps(pkg, pkgdest, d):
|
|||||||
check_valid_deps('RCONFLICTS')
|
check_valid_deps('RCONFLICTS')
|
||||||
|
|
||||||
QAPKGTEST[usrmerge] = "package_qa_check_usrmerge"
|
QAPKGTEST[usrmerge] = "package_qa_check_usrmerge"
|
||||||
def package_qa_check_usrmerge(pkg, d, messages):
|
def package_qa_check_usrmerge(pkg, d):
|
||||||
|
|
||||||
pkgdest = d.getVar('PKGDEST')
|
pkgdest = d.getVar('PKGDEST')
|
||||||
pkg_dir = pkgdest + os.sep + pkg + os.sep
|
pkg_dir = pkgdest + os.sep + pkg + os.sep
|
||||||
@@ -994,12 +950,12 @@ def package_qa_check_usrmerge(pkg, d, messages):
|
|||||||
for f in merged_dirs:
|
for f in merged_dirs:
|
||||||
if os.path.exists(pkg_dir + f) and not os.path.islink(pkg_dir + f):
|
if os.path.exists(pkg_dir + f) and not os.path.islink(pkg_dir + f):
|
||||||
msg = "%s package is not obeying usrmerge distro feature. /%s should be relocated to /usr." % (pkg, f)
|
msg = "%s package is not obeying usrmerge distro feature. /%s should be relocated to /usr." % (pkg, f)
|
||||||
oe.qa.add_message(messages, "usrmerge", msg)
|
oe.qa.handle_error("usrmerge", msg, d)
|
||||||
return False
|
return
|
||||||
return True
|
return
|
||||||
|
|
||||||
QAPKGTEST[perllocalpod] = "package_qa_check_perllocalpod"
|
QAPKGTEST[perllocalpod] = "package_qa_check_perllocalpod"
|
||||||
def package_qa_check_perllocalpod(pkg, d, messages):
|
def package_qa_check_perllocalpod(pkg, d):
|
||||||
"""
|
"""
|
||||||
Check that the recipe didn't ship a perlocal.pod file, which shouldn't be
|
Check that the recipe didn't ship a perlocal.pod file, which shouldn't be
|
||||||
installed in a distribution package. cpan.bbclass sets NO_PERLLOCAL=1 to
|
installed in a distribution package. cpan.bbclass sets NO_PERLLOCAL=1 to
|
||||||
@@ -1013,54 +969,47 @@ def package_qa_check_perllocalpod(pkg, d, messages):
|
|||||||
if matches:
|
if matches:
|
||||||
matches = [package_qa_clean_path(path, d, pkg) for path in matches]
|
matches = [package_qa_clean_path(path, d, pkg) for path in matches]
|
||||||
msg = "%s contains perllocal.pod (%s), should not be installed" % (pkg, " ".join(matches))
|
msg = "%s contains perllocal.pod (%s), should not be installed" % (pkg, " ".join(matches))
|
||||||
oe.qa.add_message(messages, "perllocalpod", msg)
|
oe.qa.handle_error("perllocalpod", msg, d)
|
||||||
|
|
||||||
QAPKGTEST[expanded-d] = "package_qa_check_expanded_d"
|
QAPKGTEST[expanded-d] = "package_qa_check_expanded_d"
|
||||||
def package_qa_check_expanded_d(package, d, messages):
|
def package_qa_check_expanded_d(package, d):
|
||||||
"""
|
"""
|
||||||
Check for the expanded D (${D}) value in pkg_* and FILES
|
Check for the expanded D (${D}) value in pkg_* and FILES
|
||||||
variables, warn the user to use it correctly.
|
variables, warn the user to use it correctly.
|
||||||
"""
|
"""
|
||||||
sane = True
|
|
||||||
expanded_d = d.getVar('D')
|
expanded_d = d.getVar('D')
|
||||||
|
|
||||||
for var in 'FILES','pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm':
|
for var in 'FILES','pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm':
|
||||||
bbvar = d.getVar(var + ":" + package) or ""
|
bbvar = d.getVar(var + ":" + package) or ""
|
||||||
if expanded_d in bbvar:
|
if expanded_d in bbvar:
|
||||||
if var == 'FILES':
|
if var == 'FILES':
|
||||||
oe.qa.add_message(messages, "expanded-d", "FILES in %s recipe should not contain the ${D} variable as it references the local build directory not the target filesystem, best solution is to remove the ${D} reference" % package)
|
oe.qa.handle_error("expanded-d", "FILES in %s recipe should not contain the ${D} variable as it references the local build directory not the target filesystem, best solution is to remove the ${D} reference" % package, d)
|
||||||
sane = False
|
|
||||||
else:
|
else:
|
||||||
oe.qa.add_message(messages, "expanded-d", "%s in %s recipe contains ${D}, it should be replaced by $D instead" % (var, package))
|
oe.qa.handle_error("expanded-d", "%s in %s recipe contains ${D}, it should be replaced by $D instead" % (var, package), d)
|
||||||
sane = False
|
|
||||||
return sane
|
|
||||||
|
|
||||||
QAPKGTEST[unlisted-pkg-lics] = "package_qa_check_unlisted_pkg_lics"
|
QAPKGTEST[unlisted-pkg-lics] = "package_qa_check_unlisted_pkg_lics"
|
||||||
def package_qa_check_unlisted_pkg_lics(package, d, messages):
|
def package_qa_check_unlisted_pkg_lics(package, d):
|
||||||
"""
|
"""
|
||||||
Check that all licenses for a package are among the licenses for the recipe.
|
Check that all licenses for a package are among the licenses for the recipe.
|
||||||
"""
|
"""
|
||||||
pkg_lics = d.getVar('LICENSE:' + package)
|
pkg_lics = d.getVar('LICENSE:' + package)
|
||||||
if not pkg_lics:
|
if not pkg_lics:
|
||||||
return True
|
return
|
||||||
|
|
||||||
recipe_lics_set = oe.license.list_licenses(d.getVar('LICENSE'))
|
recipe_lics_set = oe.license.list_licenses(d.getVar('LICENSE'))
|
||||||
package_lics = oe.license.list_licenses(pkg_lics)
|
package_lics = oe.license.list_licenses(pkg_lics)
|
||||||
unlisted = package_lics - recipe_lics_set
|
unlisted = package_lics - recipe_lics_set
|
||||||
if unlisted:
|
if unlisted:
|
||||||
oe.qa.add_message(messages, "unlisted-pkg-lics",
|
oe.qa.handle_error("unlisted-pkg-lics",
|
||||||
"LICENSE:%s includes licenses (%s) that are not "
|
"LICENSE:%s includes licenses (%s) that are not "
|
||||||
"listed in LICENSE" % (package, ' '.join(unlisted)))
|
"listed in LICENSE" % (package, ' '.join(unlisted)), d)
|
||||||
return False
|
|
||||||
obsolete = set(oe.license.obsolete_license_list()) & package_lics - recipe_lics_set
|
obsolete = set(oe.license.obsolete_license_list()) & package_lics - recipe_lics_set
|
||||||
if obsolete:
|
if obsolete:
|
||||||
oe.qa.add_message(messages, "obsolete-license",
|
oe.qa.handle_error(messages, "obsolete-license",
|
||||||
"LICENSE:%s includes obsolete licenses %s" % (package, ' '.join(obsolete)))
|
"LICENSE:%s includes obsolete licenses %s" % (package, ' '.join(obsolete)), d)
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
QAPKGTEST[empty-dirs] = "package_qa_check_empty_dirs"
|
QAPKGTEST[empty-dirs] = "package_qa_check_empty_dirs"
|
||||||
def package_qa_check_empty_dirs(pkg, d, messages):
|
def package_qa_check_empty_dirs(pkg, d):
|
||||||
"""
|
"""
|
||||||
Check for the existence of files in directories that are expected to be
|
Check for the existence of files in directories that are expected to be
|
||||||
empty.
|
empty.
|
||||||
@@ -1073,7 +1022,7 @@ def package_qa_check_empty_dirs(pkg, d, messages):
|
|||||||
recommendation = (d.getVar('QA_EMPTY_DIRS_RECOMMENDATION:' + dir) or
|
recommendation = (d.getVar('QA_EMPTY_DIRS_RECOMMENDATION:' + dir) or
|
||||||
"but it is expected to be empty")
|
"but it is expected to be empty")
|
||||||
msg = "%s installs files in %s, %s" % (pkg, dir, recommendation)
|
msg = "%s installs files in %s, %s" % (pkg, dir, recommendation)
|
||||||
oe.qa.add_message(messages, "empty-dirs", msg)
|
oe.qa.handle_error("empty-dirs", msg, d)
|
||||||
|
|
||||||
def package_qa_check_encoding(keys, encode, d):
|
def package_qa_check_encoding(keys, encode, d):
|
||||||
def check_encoding(key, enc):
|
def check_encoding(key, enc):
|
||||||
@@ -1097,7 +1046,7 @@ HOST_USER_UID := "${@os.getuid()}"
|
|||||||
HOST_USER_GID := "${@os.getgid()}"
|
HOST_USER_GID := "${@os.getgid()}"
|
||||||
|
|
||||||
QAPATHTEST[host-user-contaminated] = "package_qa_check_host_user"
|
QAPATHTEST[host-user-contaminated] = "package_qa_check_host_user"
|
||||||
def package_qa_check_host_user(path, name, d, elf, messages):
|
def package_qa_check_host_user(path, name, d, elf):
|
||||||
"""Check for paths outside of /home which are owned by the user running bitbake."""
|
"""Check for paths outside of /home which are owned by the user running bitbake."""
|
||||||
|
|
||||||
if not os.path.lexists(path):
|
if not os.path.lexists(path):
|
||||||
@@ -1118,17 +1067,14 @@ def package_qa_check_host_user(path, name, d, elf, messages):
|
|||||||
else:
|
else:
|
||||||
check_uid = int(d.getVar('HOST_USER_UID'))
|
check_uid = int(d.getVar('HOST_USER_UID'))
|
||||||
if stat.st_uid == check_uid:
|
if stat.st_uid == check_uid:
|
||||||
oe.qa.add_message(messages, "host-user-contaminated", "%s: %s is owned by uid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_uid))
|
oe.qa.handle_error("host-user-contaminated", "%s: %s is owned by uid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_uid), d)
|
||||||
return False
|
|
||||||
|
|
||||||
check_gid = int(d.getVar('HOST_USER_GID'))
|
check_gid = int(d.getVar('HOST_USER_GID'))
|
||||||
if stat.st_gid == check_gid:
|
if stat.st_gid == check_gid:
|
||||||
oe.qa.add_message(messages, "host-user-contaminated", "%s: %s is owned by gid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_gid))
|
oe.qa.handle_error("host-user-contaminated", "%s: %s is owned by gid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_gid), d)
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
QARECIPETEST[unhandled-features-check] = "package_qa_check_unhandled_features_check"
|
QARECIPETEST[unhandled-features-check] = "package_qa_check_unhandled_features_check"
|
||||||
def package_qa_check_unhandled_features_check(pn, d, messages):
|
def package_qa_check_unhandled_features_check(pn, d):
|
||||||
if not bb.data.inherits_class('features_check', d):
|
if not bb.data.inherits_class('features_check', d):
|
||||||
var_set = False
|
var_set = False
|
||||||
for kind in ['DISTRO', 'MACHINE', 'COMBINED']:
|
for kind in ['DISTRO', 'MACHINE', 'COMBINED']:
|
||||||
@@ -1139,7 +1085,7 @@ def package_qa_check_unhandled_features_check(pn, d, messages):
|
|||||||
oe.qa.handle_error("unhandled-features-check", "%s: recipe doesn't inherit features_check" % pn, d)
|
oe.qa.handle_error("unhandled-features-check", "%s: recipe doesn't inherit features_check" % pn, d)
|
||||||
|
|
||||||
QARECIPETEST[missing-update-alternatives] = "package_qa_check_missing_update_alternatives"
|
QARECIPETEST[missing-update-alternatives] = "package_qa_check_missing_update_alternatives"
|
||||||
def package_qa_check_missing_update_alternatives(pn, d, messages):
|
def package_qa_check_missing_update_alternatives(pn, d):
|
||||||
# Look at all packages and find out if any of those sets ALTERNATIVE variable
|
# Look at all packages and find out if any of those sets ALTERNATIVE variable
|
||||||
# without inheriting update-alternatives class
|
# without inheriting update-alternatives class
|
||||||
for pkg in (d.getVar('PACKAGES') or '').split():
|
for pkg in (d.getVar('PACKAGES') or '').split():
|
||||||
@@ -1235,7 +1181,10 @@ python do_package_qa () {
|
|||||||
package_qa_walk(warn_checks, error_checks, package, d)
|
package_qa_walk(warn_checks, error_checks, package, d)
|
||||||
|
|
||||||
warn_checks, error_checks = parse_test_matrix("QAPKGTEST")
|
warn_checks, error_checks = parse_test_matrix("QAPKGTEST")
|
||||||
package_qa_package(warn_checks, error_checks, package, d)
|
for func in warn_checks:
|
||||||
|
func(package, d)
|
||||||
|
for func in error_checks:
|
||||||
|
func(package, d)
|
||||||
|
|
||||||
package_qa_check_rdepends(package, pkgdest, skip, taskdeps, packages, d)
|
package_qa_check_rdepends(package, pkgdest, skip, taskdeps, packages, d)
|
||||||
package_qa_check_deps(package, pkgdest, d)
|
package_qa_check_deps(package, pkgdest, d)
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ python () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QARECIPETEST[missing-ptest] = "package_qa_check_missing_ptest"
|
QARECIPETEST[missing-ptest] = "package_qa_check_missing_ptest"
|
||||||
def package_qa_check_missing_ptest(pn, d, messages):
|
def package_qa_check_missing_ptest(pn, d):
|
||||||
# This checks that ptest package is actually included
|
# This checks that ptest package is actually included
|
||||||
# in standard oe-core ptest images - only for oe-core recipes
|
# in standard oe-core ptest images - only for oe-core recipes
|
||||||
if not 'meta/recipes' in d.getVar('FILE') or not(d.getVar('PTEST_ENABLED') == "1"):
|
if not 'meta/recipes' in d.getVar('FILE') or not(d.getVar('PTEST_ENABLED') == "1"):
|
||||||
|
|||||||
@@ -215,12 +215,6 @@ def handle_error(error_class, error_msg, d):
|
|||||||
return True
|
return True
|
||||||
handle_error.visitorcode = handle_error_visitorcode
|
handle_error.visitorcode = handle_error_visitorcode
|
||||||
|
|
||||||
def add_message(messages, section, new_msg):
|
|
||||||
if section not in messages:
|
|
||||||
messages[section] = new_msg
|
|
||||||
else:
|
|
||||||
messages[section] = messages[section] + "\n" + new_msg
|
|
||||||
|
|
||||||
def exit_with_message_if_errors(message, d):
|
def exit_with_message_if_errors(message, d):
|
||||||
qa_fatal_errors = bb.utils.to_boolean(d.getVar("QA_ERRORS_FOUND"), False)
|
qa_fatal_errors = bb.utils.to_boolean(d.getVar("QA_ERRORS_FOUND"), False)
|
||||||
if qa_fatal_errors:
|
if qa_fatal_errors:
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ do_install_ptest () {
|
|||||||
|
|
||||||
WARN_QA:append = " internal-solver-deprecation"
|
WARN_QA:append = " internal-solver-deprecation"
|
||||||
QARECIPETEST[internal-solver-deprecation] = "qa_check_solver_deprecation"
|
QARECIPETEST[internal-solver-deprecation] = "qa_check_solver_deprecation"
|
||||||
def qa_check_solver_deprecation (pn, d, messages):
|
def qa_check_solver_deprecation (pn, d):
|
||||||
pkgconfig = (d.getVar("PACKAGECONFIG") or "").split()
|
pkgconfig = (d.getVar("PACKAGECONFIG") or "").split()
|
||||||
|
|
||||||
if "libsolv" not in pkgconfig:
|
if "libsolv" not in pkgconfig:
|
||||||
|
|||||||
Reference in New Issue
Block a user