classes/insane: Show QA check name
cover classes/insane: Show QA check name
The following changes since commit a5531a2b8983318b99c119a87b78a92cf84160b8:
bitbake: fetch2/svn: Add transportuser parameter (2014-07-04 09:28:36 +0100)
are available in the git repository at:
git://git.pokylinux.org/poky-contrib chonglu/qacheck
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=chonglu/qacheck
Chong Lu (1):
classes/insane: Show QA check name
meta/classes/insane.bbclass | 66 ++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 34 deletions(-)
Signature · 1 line
1.9.1
PATCH 1/1 classes/insane: Show QA check name
QA errors/warnings would show the name of the QA failure in the error/warning message. The format is listed:
[The name of QA] QA Issue: messages
You can see which QA check you need to disable if you want to disable it.
[YOCTO #6160]
--- meta/classes/insane.bbclass | 66 ++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 34 deletions(-)
meta/classes/insane.bbclass +32 -34
@@ -154,24 +154,24 @@ def package_qa_clean_path(path,d): """ Remove the common prefix from the path. In this case it is the TMPDIR""" return path.replace(d.getVar('TMPDIR',True),"") -def package_qa_write_error(error, d): +def package_qa_write_error(type, error, d): logfile = d.getVar('QA_LOGFILE', True) if logfile: p = d.getVar('P', True) f = file( logfile, "a+") - print >> f, "%s: %s" % (p, error) + print >> f, "%s: [%s] %s" % (p, type, error) f.close() def package_qa_handle_error(error_class, error_msg, d): - package_qa_write_error(error_msg, d) + package_qa_write_error(error_class, error_msg, d) if error_class in (d.getVar("ERROR_QA", True) or "").split(): - bb.error("QA Issue: %s" % error_msg) + bb.error("[%s] QA Issue: %s" % (error_class, error_msg)) d.setVar("QA_SANE", False) return False elif error_class in (d.getVar("WARN_QA", True) or "").split(): - bb.warn("QA Issue: %s" % error_msg) + bb.warn("[%s] QA Issue: %s" % (error_class, error_msg)) else: - bb.note("QA Issue: %s" % error_msg) + bb.note("[%s] QA Issue: %s" % (error_class, error_msg)) return True QAPATHTEST[libexec] = "package_qa_check_libexec"
@@ -183,7 +183,7 @@ def package_qa_check_libexec(path,name, d, elf, messages): return True if 'libexec' in path.split(os.path.sep): - messages.append("%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec)) + messages["libexec"] = "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec) return False return True
@@ -211,7 +211,7 @@ def package_qa_check_rpath(file,name, d, elf, messages): rpath = m.group(1) for dir in bad_dirs: if dir in rpath: - messages.append("package %s contains bad RPATH %s in file %s" % (name, rpath, file)) + messages["rpaths"] = "package %s contains bad RPATH %s in file %s" % (name, rpath, file) QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" def package_qa_check_useless_rpaths(file, name, d, elf, messages):
@@ -241,7 +241,7 @@ def package_qa_check_useless_rpaths(file, name, d, elf, messages): if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir): # The dynamic linker searches both these places anyway. There is no point in # looking there again. - messages.append("%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath)) + messages["useless-rpaths"] = "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath) QAPATHTEST[dev-so] = "package_qa_check_dev" def package_qa_check_dev(path, name, d, elf, messages):
@@ -250,8 +250,8 @@ def package_qa_check_dev(path, name, d, elf, messages): """ 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): - messages.append("non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \ - (name, package_qa_clean_path(path,d))) + messages["dev-so"] = "non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \ + (name, package_qa_clean_path(path,d)) QAPATHTEST[staticdev] = "package_qa_check_staticdev" def package_qa_check_staticdev(path, name, d, elf, messages):
@@ -263,8 +263,8 @@ 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"): - messages.append("non -staticdev package contains static .a library: %s path '%s'" % \ - (name, package_qa_clean_path(path,d))) + messages["staticdev"] = "non -staticdev package contains static .a library: %s path '%s'" % \ + (name, package_qa_clean_path(path,d)) def package_qa_check_libdir(d): """
@@ -318,8 +318,8 @@ def package_qa_check_dbg(path, name, d, elf, messages): if not "-dbg" in name and not "-ptest" in name: if '.debug' in path.split(os.path.sep): - messages.append("non debug package contains .debug directory: %s path %s" % \ - (name, package_qa_clean_path(path,d))) + messages["debug-files"] = "non debug package contains .debug directory: %s path %s" % \ + (name, package_qa_clean_path(path,d)) QAPATHTEST[perms] = "package_qa_check_perm" def package_qa_check_perm(path,name,d, elf, messages):
@@ -465,15 +465,15 @@ def package_qa_check_arch(path,name,d, elf, messages): # Check the architecture and endiannes of the binary if not ((machine == elf.machine()) or \ ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): - messages.append("Architecture did not match (%d to %d) on %s" % \ - (machine, elf.machine(), package_qa_clean_path(path,d))) + messages["arch"] = "Architecture did not match (%d to %d) on %s" % \ + (machine, elf.machine(), package_qa_clean_path(path,d)) elif not ((bits == elf.abiSize()) or \ ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): - messages.append("Bit size did not match (%d to %d) %s on %s" % \ - (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d))) + messages["arch"] = "Bit size did not match (%d to %d) %s on %s" % \ + (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d)) elif not littleendian == elf.isLittleEndian(): - messages.append("Endiannes did not match (%d to %d) on %s" % \ - (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d))) + messages["arch"] = "Endiannes did not match (%d to %d) on %s" % \ + (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d)) QAPATHTEST[desktop] = "package_qa_check_desktop" def package_qa_check_desktop(path, name, d, elf, messages):
@@ -485,7 +485,7 @@ def package_qa_check_desktop(path, name, d, elf, messages): output = os.popen("%s %s" % (desktop_file_validate, path)) # This only produces output on errors for l in output: - messages.append("Desktop file issue: " + l.strip()) + messages["desktop"] = "Desktop file issue: " + l.strip() QAPATHTEST[textrel] = "package_qa_textrel" def package_qa_textrel(path, name, d, elf, messages):
@@ -509,7 +509,7 @@ def package_qa_textrel(path, name, d, elf, messages): sane = False if not sane: - messages.append("ELF binary '%s' has relocations in .text" % path) + messages["textrel"] = "ELF binary '%s' has relocations in .text" % path QAPATHTEST[ldflags] = "package_qa_hash_style" def package_qa_hash_style(path, name, d, elf, messages):
@@ -544,7 +544,7 @@ def package_qa_hash_style(path, name, d, elf, messages): sane = True if has_syms and not sane: - messages.append("No GNU_HASH in the elf binary: '%s'" % path) + messages["ldflags"] = "No GNU_HASH in the elf binary: '%s'" % path QAPATHTEST[buildpaths] = "package_qa_check_buildpaths"
@@ -564,7 +564,7 @@ def package_qa_check_buildpaths(path, name, d, elf, messages): with open(path) as f: file_content = f.read() if tmpdir in file_content: - messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d)) + messages["buildpaths"] = "File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d) QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"
@@ -583,7 +583,7 @@ def package_qa_check_xorg_driver_abi(path, name, d, elf, messages): for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS_' + name, True) or ""): if rdep.startswith("%sxorg-abi-" % mlprefix): return - messages.append("Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path))) + messages["xorg-driver-abi"] = "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)) QAPATHTEST[infodir] = "package_qa_check_infodir" def package_qa_check_infodir(path, name, d, elf, messages):
@@ -593,7 +593,7 @@ def package_qa_check_infodir(path, name, d, elf, messages): infodir = d.expand("${infodir}/dir") if infodir in path: - messages.append("The /usr/share/info/dir file is not meant to be shipped in a particular package.") + messages["infodir"] = "The /usr/share/info/dir file is not meant to be shipped in a particular package." QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot" def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages):
@@ -606,7 +606,7 @@ def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): tmpdir = d.getVar('TMPDIR', True) if target.startswith(tmpdir): trimmed = path.replace(os.path.join (d.getVar("PKGDEST", True), name), "") - messages.append("Symlink %s in %s points to TMPDIR" % (trimmed, name)) + messages["symlink-to-sysroot"] = "Symlink %s in %s points to TMPDIR" % (trimmed, name) def package_qa_check_license(workdir, d): """
@@ -738,8 +738,8 @@ def package_qa_walk(path, warnfuncs, errorfuncs, skip, package, d): target_os = d.getVar('TARGET_OS', True) target_arch = d.getVar('TARGET_ARCH', True) - warnings = [] - errors = [] + warnings = {} + errors = {} for path in pkgfiles[package]: elf = oe.qa.ELFFile(path) try:
@@ -752,11 +752,9 @@ def package_qa_walk(path, warnfuncs, errorfuncs, skip, package, d): func(path, package, d, elf, errors) for w in warnings: - bb.warn("QA Issue: %s" % w) - package_qa_write_error(w, d) + package_qa_handle_error(w, warnings[w], d) for e in errors: - bb.error("QA Issue: %s" % e) - package_qa_write_error(e, d) + package_qa_handle_error(e, errors[e], d) return len(errors) == 0
Signature · 1 line
1.9.1
ping
Quoted 219 lines · Chong Lu
QA errors/warnings would show the name of the QA failure in the error/warning message. The format is listed:
[The name of QA] QA Issue: messages
You can see which QA check you need to disable if you want to disable it.
[YOCTO #6160]
Signed-off-by Chong Lu <[email protected]>--- meta/classes/insane.bbclass | 66 ++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 34 deletions(-)meta/classes/insane.bbclass +32
-34@@ -154,24 +154,24 @@ def package_qa_clean_path(path,d): """ Remove the common prefix from the path. In this case it is the TMPDIR""" return path.replace(d.getVar('TMPDIR',True),"") -def package_qa_write_error(error, d): +def package_qa_write_error(type, error, d): logfile = d.getVar('QA_LOGFILE', True) if logfile: p = d.getVar('P', True) f = file( logfile, "a+") - print >> f, "%s: %s" % (p, error) + print >> f, "%s: [%s] %s" % (p, type, error) f.close() def package_qa_handle_error(error_class, error_msg, d): - package_qa_write_error(error_msg, d) + package_qa_write_error(error_class, error_msg, d) if error_class in (d.getVar("ERROR_QA", True) or "").split(): - bb.error("QA Issue: %s" % error_msg) + bb.error("[%s] QA Issue: %s" % (error_class, error_msg)) d.setVar("QA_SANE", False) return False elif error_class in (d.getVar("WARN_QA", True) or "").split(): - bb.warn("QA Issue: %s" % error_msg) + bb.warn("[%s] QA Issue: %s" % (error_class, error_msg)) else: - bb.note("QA Issue: %s" % error_msg) + bb.note("[%s] QA Issue: %s" % (error_class, error_msg)) return True QAPATHTEST[libexec] = "package_qa_check_libexec"@@ -183,7 +183,7 @@ def package_qa_check_libexec(path,name, d, elf, messages): return True if 'libexec' in path.split(os.path.sep): - messages.append("%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec)) + messages["libexec"] = "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec) return False return True@@ -211,7 +211,7 @@ def package_qa_check_rpath(file,name, d, elf, messages): rpath = m.group(1) for dir in bad_dirs: if dir in rpath: - messages.append("package %s contains bad RPATH %s in file %s" % (name, rpath, file)) + messages["rpaths"] = "package %s contains bad RPATH %s in file %s" % (name, rpath, file) QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" def package_qa_check_useless_rpaths(file, name, d, elf, messages):@@ -241,7 +241,7 @@ def package_qa_check_useless_rpaths(file, name, d, elf, messages): if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir): # The dynamic linker searches both these places anyway. There is no point in # looking there again. - messages.append("%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath)) + messages["useless-rpaths"] = "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath) QAPATHTEST[dev-so] = "package_qa_check_dev" def package_qa_check_dev(path, name, d, elf, messages):@@ -250,8 +250,8 @@ def package_qa_check_dev(path, name, d, elf, messages): """ 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): - messages.append("non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \ - (name, package_qa_clean_path(path,d))) + messages["dev-so"] = "non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \ + (name, package_qa_clean_path(path,d)) QAPATHTEST[staticdev] = "package_qa_check_staticdev" def package_qa_check_staticdev(path, name, d, elf, messages):@@ -263,8 +263,8 @@ 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"): - messages.append("non -staticdev package contains static .a library: %s path '%s'" % \ - (name, package_qa_clean_path(path,d))) + messages["staticdev"] = "non -staticdev package contains static .a library: %s path '%s'" % \ + (name, package_qa_clean_path(path,d)) def package_qa_check_libdir(d): """@@ -318,8 +318,8 @@ def package_qa_check_dbg(path, name, d, elf, messages): if not "-dbg" in name and not "-ptest" in name: if '.debug' in path.split(os.path.sep): - messages.append("non debug package contains .debug directory: %s path %s" % \ - (name, package_qa_clean_path(path,d))) + messages["debug-files"] = "non debug package contains .debug directory: %s path %s" % \ + (name, package_qa_clean_path(path,d)) QAPATHTEST[perms] = "package_qa_check_perm" def package_qa_check_perm(path,name,d, elf, messages):@@ -465,15 +465,15 @@ def package_qa_check_arch(path,name,d, elf, messages): # Check the architecture and endiannes of the binary if not ((machine == elf.machine()) or \ ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): - messages.append("Architecture did not match (%d to %d) on %s" % \ - (machine, elf.machine(), package_qa_clean_path(path,d))) + messages["arch"] = "Architecture did not match (%d to %d) on %s" % \ + (machine, elf.machine(), package_qa_clean_path(path,d)) elif not ((bits == elf.abiSize()) or \ ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): - messages.append("Bit size did not match (%d to %d) %s on %s" % \ - (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d))) + messages["arch"] = "Bit size did not match (%d to %d) %s on %s" % \ + (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d)) elif not littleendian == elf.isLittleEndian(): - messages.append("Endiannes did not match (%d to %d) on %s" % \ - (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d))) + messages["arch"] = "Endiannes did not match (%d to %d) on %s" % \ + (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d)) QAPATHTEST[desktop] = "package_qa_check_desktop" def package_qa_check_desktop(path, name, d, elf, messages):@@ -485,7 +485,7 @@ def package_qa_check_desktop(path, name, d, elf, messages): output = os.popen("%s %s" % (desktop_file_validate, path)) # This only produces output on errors for l in output: - messages.append("Desktop file issue: " + l.strip()) + messages["desktop"] = "Desktop file issue: " + l.strip() QAPATHTEST[textrel] = "package_qa_textrel" def package_qa_textrel(path, name, d, elf, messages):@@ -509,7 +509,7 @@ def package_qa_textrel(path, name, d, elf, messages): sane = False if not sane: - messages.append("ELF binary '%s' has relocations in .text" % path) + messages["textrel"] = "ELF binary '%s' has relocations in .text" % path QAPATHTEST[ldflags] = "package_qa_hash_style" def package_qa_hash_style(path, name, d, elf, messages):@@ -544,7 +544,7 @@ def package_qa_hash_style(path, name, d, elf, messages): sane = True if has_syms and not sane: - messages.append("No GNU_HASH in the elf binary: '%s'" % path) + messages["ldflags"] = "No GNU_HASH in the elf binary: '%s'" % path QAPATHTEST[buildpaths] = "package_qa_check_buildpaths"@@ -564,7 +564,7 @@ def package_qa_check_buildpaths(path, name, d, elf, messages): with open(path) as f: file_content = f.read() if tmpdir in file_content: - messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d)) + messages["buildpaths"] = "File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d) QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"@@ -583,7 +583,7 @@ def package_qa_check_xorg_driver_abi(path, name, d, elf, messages): for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS_' + name, True) or ""): if rdep.startswith("%sxorg-abi-" % mlprefix): return - messages.append("Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path))) + messages["xorg-driver-abi"] = "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)) QAPATHTEST[infodir] = "package_qa_check_infodir" def package_qa_check_infodir(path, name, d, elf, messages):@@ -593,7 +593,7 @@ def package_qa_check_infodir(path, name, d, elf, messages): infodir = d.expand("${infodir}/dir") if infodir in path: - messages.append("The /usr/share/info/dir file is not meant to be shipped in a particular package.") + messages["infodir"] = "The /usr/share/info/dir file is not meant to be shipped in a particular package." QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot" def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages):@@ -606,7 +606,7 @@ def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): tmpdir = d.getVar('TMPDIR', True) if target.startswith(tmpdir): trimmed = path.replace(os.path.join (d.getVar("PKGDEST", True), name), "") - messages.append("Symlink %s in %s points to TMPDIR" % (trimmed, name)) + messages["symlink-to-sysroot"] = "Symlink %s in %s points to TMPDIR" % (trimmed, name) def package_qa_check_license(workdir, d): """@@ -738,8 +738,8 @@ def package_qa_walk(path, warnfuncs, errorfuncs, skip, package, d): target_os = d.getVar('TARGET_OS', True) target_arch = d.getVar('TARGET_ARCH', True) - warnings = [] - errors = [] + warnings = {} + errors = {} for path in pkgfiles[package]: elf = oe.qa.ELFFile(path) try:@@ -752,11 +752,9 @@ def package_qa_walk(path, warnfuncs, errorfuncs, skip, package, d): func(path, package, d, elf, errors) for w in warnings: - bb.warn("QA Issue: %s" % w) - package_qa_write_error(w, d) + package_qa_handle_error(w, warnings[w], d) for e in errors: - bb.error("QA Issue: %s" % e) - package_qa_write_error(e, d) + package_qa_handle_error(e, errors[e], d) return len(errors) == 0
Hi Chong,
Quoted 7 lines · On Friday 11 July 2014 09:25:07 Chong Lu wrote:
Quoted 6 lines · Chong Lu
QA errors/warnings would show the name of the QA failure in the error/warning message.>
The format is listed:
[The name of QA] QA Issue: messagesYou can see which QA check you need to disable if you want to disable it.
The way I had envisaged this being shown was <message> [QA check name]; since the message is the important part (in general we really want to encourage people to fix the QA issues rather than disabling them). This also matches up with gcc's warning message behaviour.
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
Quoted 9 lines · Paul Eggleton
Hi Chong,
Quoted 6 lines · On Friday 11 July 2014 09:25:07 Chong Lu wrote:
Quoted 5 lines · Chong Lu
QA errors/warnings would show the name of the QA failure in the error/warning message.>
The format is listed:
[The name of QA] QA Issue: messages
Quoted 9 lines
Quoted 1 line
Quoted 1 line
You can see which QA check you need to disable if you want to disable it.
The way I had envisaged this being shown was <message> [QA check name]; since the message is the important part (in general we really want to encourage people to fix the QA issues rather than disabling them). This also matches up with gcc's warning message behaviour.
Cheers,
Paul
Hi Paul,
Thanks your reply. I will change format of message and resend a V2.
Best Regards
Chong