diff options
| author | Chong Lu <Chong.Lu@windriver.com> | 2014-07-14 16:31:50 +0800 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-07-16 10:20:49 +0100 |
| commit | bb0b7656fb36b79e14b4ebfe374c8abf8151e2a8 (patch) | |
| tree | 8baf6b37b9cd1671aff690f0c3013f0988d7227b | |
| parent | 5b0762021f587d8fc01b5709c4789ae16667f3d4 (diff) | |
| download | poky-bb0b7656fb36b79e14b4ebfe374c8abf8151e2a8.tar.gz | |
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:
<message> [QA check name]
You can see which QA check you need to disable if you want to disable it.
[YOCTO #6160]
(From OE-Core rev: a5ea622a8e012d3263bc36b6239ee43a4d1fb0ee)
Signed-off-by: Chong Lu <Chong.Lu@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | meta/classes/insane.bbclass | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass index 106ace7651..c71e8e283e 100644 --- a/meta/classes/insane.bbclass +++ b/meta/classes/insane.bbclass | |||
| @@ -151,24 +151,24 @@ def package_qa_clean_path(path,d): | |||
| 151 | """ Remove the common prefix from the path. In this case it is the TMPDIR""" | 151 | """ Remove the common prefix from the path. In this case it is the TMPDIR""" |
| 152 | return path.replace(d.getVar('TMPDIR',True),"") | 152 | return path.replace(d.getVar('TMPDIR',True),"") |
| 153 | 153 | ||
| 154 | def package_qa_write_error(error, d): | 154 | def package_qa_write_error(type, error, d): |
| 155 | logfile = d.getVar('QA_LOGFILE', True) | 155 | logfile = d.getVar('QA_LOGFILE', True) |
| 156 | if logfile: | 156 | if logfile: |
| 157 | p = d.getVar('P', True) | 157 | p = d.getVar('P', True) |
| 158 | f = file( logfile, "a+") | 158 | f = file( logfile, "a+") |
| 159 | print >> f, "%s: %s" % (p, error) | 159 | print >> f, "%s: %s [%s]" % (p, error, type) |
| 160 | f.close() | 160 | f.close() |
| 161 | 161 | ||
| 162 | def package_qa_handle_error(error_class, error_msg, d): | 162 | def package_qa_handle_error(error_class, error_msg, d): |
| 163 | package_qa_write_error(error_msg, d) | 163 | package_qa_write_error(error_class, error_msg, d) |
| 164 | if error_class in (d.getVar("ERROR_QA", True) or "").split(): | 164 | if error_class in (d.getVar("ERROR_QA", True) or "").split(): |
| 165 | bb.error("QA Issue: %s" % error_msg) | 165 | bb.error("QA Issue: %s [%s]" % (error_msg, error_class)) |
| 166 | d.setVar("QA_SANE", False) | 166 | d.setVar("QA_SANE", False) |
| 167 | return False | 167 | return False |
| 168 | elif error_class in (d.getVar("WARN_QA", True) or "").split(): | 168 | elif error_class in (d.getVar("WARN_QA", True) or "").split(): |
| 169 | bb.warn("QA Issue: %s" % error_msg) | 169 | bb.warn("QA Issue: %s [%s]" % (error_msg, error_class)) |
| 170 | else: | 170 | else: |
| 171 | bb.note("QA Issue: %s" % error_msg) | 171 | bb.note("QA Issue: %s [%s]" % (error_msg, error_class)) |
| 172 | return True | 172 | return True |
| 173 | 173 | ||
| 174 | QAPATHTEST[libexec] = "package_qa_check_libexec" | 174 | QAPATHTEST[libexec] = "package_qa_check_libexec" |
| @@ -180,7 +180,7 @@ def package_qa_check_libexec(path,name, d, elf, messages): | |||
| 180 | return True | 180 | return True |
| 181 | 181 | ||
| 182 | if 'libexec' in path.split(os.path.sep): | 182 | if 'libexec' in path.split(os.path.sep): |
| 183 | messages.append("%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec)) | 183 | messages["libexec"] = "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec) |
| 184 | return False | 184 | return False |
| 185 | 185 | ||
| 186 | return True | 186 | return True |
| @@ -208,7 +208,7 @@ def package_qa_check_rpath(file,name, d, elf, messages): | |||
| 208 | rpath = m.group(1) | 208 | rpath = m.group(1) |
| 209 | for dir in bad_dirs: | 209 | for dir in bad_dirs: |
| 210 | if dir in rpath: | 210 | if dir in rpath: |
| 211 | messages.append("package %s contains bad RPATH %s in file %s" % (name, rpath, file)) | 211 | messages["rpaths"] = "package %s contains bad RPATH %s in file %s" % (name, rpath, file) |
| 212 | 212 | ||
| 213 | QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" | 213 | QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" |
| 214 | def package_qa_check_useless_rpaths(file, name, d, elf, messages): | 214 | def package_qa_check_useless_rpaths(file, name, d, elf, messages): |
| @@ -238,7 +238,7 @@ def package_qa_check_useless_rpaths(file, name, d, elf, messages): | |||
| 238 | if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir): | 238 | if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir): |
| 239 | # The dynamic linker searches both these places anyway. There is no point in | 239 | # The dynamic linker searches both these places anyway. There is no point in |
| 240 | # looking there again. | 240 | # looking there again. |
| 241 | messages.append("%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath)) | 241 | messages["useless-rpaths"] = "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath) |
| 242 | 242 | ||
| 243 | QAPATHTEST[dev-so] = "package_qa_check_dev" | 243 | QAPATHTEST[dev-so] = "package_qa_check_dev" |
| 244 | def package_qa_check_dev(path, name, d, elf, messages): | 244 | def package_qa_check_dev(path, name, d, elf, messages): |
| @@ -247,8 +247,8 @@ def package_qa_check_dev(path, name, d, elf, messages): | |||
| 247 | """ | 247 | """ |
| 248 | 248 | ||
| 249 | 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): | 249 | 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): |
| 250 | messages.append("non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \ | 250 | messages["dev-so"] = "non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \ |
| 251 | (name, package_qa_clean_path(path,d))) | 251 | (name, package_qa_clean_path(path,d)) |
| 252 | 252 | ||
| 253 | QAPATHTEST[staticdev] = "package_qa_check_staticdev" | 253 | QAPATHTEST[staticdev] = "package_qa_check_staticdev" |
| 254 | def package_qa_check_staticdev(path, name, d, elf, messages): | 254 | def package_qa_check_staticdev(path, name, d, elf, messages): |
| @@ -260,8 +260,8 @@ def package_qa_check_staticdev(path, name, d, elf, messages): | |||
| 260 | """ | 260 | """ |
| 261 | 261 | ||
| 262 | 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"): | 262 | 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"): |
| 263 | messages.append("non -staticdev package contains static .a library: %s path '%s'" % \ | 263 | messages["staticdev"] = "non -staticdev package contains static .a library: %s path '%s'" % \ |
| 264 | (name, package_qa_clean_path(path,d))) | 264 | (name, package_qa_clean_path(path,d)) |
| 265 | 265 | ||
| 266 | def package_qa_check_libdir(d): | 266 | def package_qa_check_libdir(d): |
| 267 | """ | 267 | """ |
| @@ -315,8 +315,8 @@ def package_qa_check_dbg(path, name, d, elf, messages): | |||
| 315 | 315 | ||
| 316 | if not "-dbg" in name and not "-ptest" in name: | 316 | if not "-dbg" in name and not "-ptest" in name: |
| 317 | if '.debug' in path.split(os.path.sep): | 317 | if '.debug' in path.split(os.path.sep): |
| 318 | messages.append("non debug package contains .debug directory: %s path %s" % \ | 318 | messages["debug-files"] = "non debug package contains .debug directory: %s path %s" % \ |
| 319 | (name, package_qa_clean_path(path,d))) | 319 | (name, package_qa_clean_path(path,d)) |
| 320 | 320 | ||
| 321 | QAPATHTEST[perms] = "package_qa_check_perm" | 321 | QAPATHTEST[perms] = "package_qa_check_perm" |
| 322 | def package_qa_check_perm(path,name,d, elf, messages): | 322 | def package_qa_check_perm(path,name,d, elf, messages): |
| @@ -462,15 +462,15 @@ def package_qa_check_arch(path,name,d, elf, messages): | |||
| 462 | # Check the architecture and endiannes of the binary | 462 | # Check the architecture and endiannes of the binary |
| 463 | if not ((machine == elf.machine()) or \ | 463 | if not ((machine == elf.machine()) or \ |
| 464 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): | 464 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): |
| 465 | messages.append("Architecture did not match (%d to %d) on %s" % \ | 465 | messages["arch"] = "Architecture did not match (%d to %d) on %s" % \ |
| 466 | (machine, elf.machine(), package_qa_clean_path(path,d))) | 466 | (machine, elf.machine(), package_qa_clean_path(path,d)) |
| 467 | elif not ((bits == elf.abiSize()) or \ | 467 | elif not ((bits == elf.abiSize()) or \ |
| 468 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): | 468 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32"))): |
| 469 | messages.append("Bit size did not match (%d to %d) %s on %s" % \ | 469 | messages["arch"] = "Bit size did not match (%d to %d) %s on %s" % \ |
| 470 | (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d))) | 470 | (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d)) |
| 471 | elif not littleendian == elf.isLittleEndian(): | 471 | elif not littleendian == elf.isLittleEndian(): |
| 472 | messages.append("Endiannes did not match (%d to %d) on %s" % \ | 472 | messages["arch"] = "Endiannes did not match (%d to %d) on %s" % \ |
| 473 | (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d))) | 473 | (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d)) |
| 474 | 474 | ||
| 475 | QAPATHTEST[desktop] = "package_qa_check_desktop" | 475 | QAPATHTEST[desktop] = "package_qa_check_desktop" |
| 476 | def package_qa_check_desktop(path, name, d, elf, messages): | 476 | def package_qa_check_desktop(path, name, d, elf, messages): |
| @@ -482,7 +482,7 @@ def package_qa_check_desktop(path, name, d, elf, messages): | |||
| 482 | output = os.popen("%s %s" % (desktop_file_validate, path)) | 482 | output = os.popen("%s %s" % (desktop_file_validate, path)) |
| 483 | # This only produces output on errors | 483 | # This only produces output on errors |
| 484 | for l in output: | 484 | for l in output: |
| 485 | messages.append("Desktop file issue: " + l.strip()) | 485 | messages["desktop"] = "Desktop file issue: " + l.strip() |
| 486 | 486 | ||
| 487 | QAPATHTEST[textrel] = "package_qa_textrel" | 487 | QAPATHTEST[textrel] = "package_qa_textrel" |
| 488 | def package_qa_textrel(path, name, d, elf, messages): | 488 | def package_qa_textrel(path, name, d, elf, messages): |
| @@ -506,7 +506,7 @@ def package_qa_textrel(path, name, d, elf, messages): | |||
| 506 | sane = False | 506 | sane = False |
| 507 | 507 | ||
| 508 | if not sane: | 508 | if not sane: |
| 509 | messages.append("ELF binary '%s' has relocations in .text" % path) | 509 | messages["textrel"] = "ELF binary '%s' has relocations in .text" % path |
| 510 | 510 | ||
| 511 | QAPATHTEST[ldflags] = "package_qa_hash_style" | 511 | QAPATHTEST[ldflags] = "package_qa_hash_style" |
| 512 | def package_qa_hash_style(path, name, d, elf, messages): | 512 | def package_qa_hash_style(path, name, d, elf, messages): |
| @@ -541,7 +541,7 @@ def package_qa_hash_style(path, name, d, elf, messages): | |||
| 541 | sane = True | 541 | sane = True |
| 542 | 542 | ||
| 543 | if has_syms and not sane: | 543 | if has_syms and not sane: |
| 544 | messages.append("No GNU_HASH in the elf binary: '%s'" % path) | 544 | messages["ldflags"] = "No GNU_HASH in the elf binary: '%s'" % path |
| 545 | 545 | ||
| 546 | 546 | ||
| 547 | QAPATHTEST[buildpaths] = "package_qa_check_buildpaths" | 547 | QAPATHTEST[buildpaths] = "package_qa_check_buildpaths" |
| @@ -561,7 +561,7 @@ def package_qa_check_buildpaths(path, name, d, elf, messages): | |||
| 561 | with open(path) as f: | 561 | with open(path) as f: |
| 562 | file_content = f.read() | 562 | file_content = f.read() |
| 563 | if tmpdir in file_content: | 563 | if tmpdir in file_content: |
| 564 | messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d)) | 564 | messages["buildpaths"] = "File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d) |
| 565 | 565 | ||
| 566 | 566 | ||
| 567 | QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi" | 567 | QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi" |
| @@ -580,7 +580,7 @@ def package_qa_check_xorg_driver_abi(path, name, d, elf, messages): | |||
| 580 | for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS_' + name, True) or ""): | 580 | for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS_' + name, True) or ""): |
| 581 | if rdep.startswith("%sxorg-abi-" % mlprefix): | 581 | if rdep.startswith("%sxorg-abi-" % mlprefix): |
| 582 | return | 582 | return |
| 583 | messages.append("Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path))) | 583 | messages["xorg-driver-abi"] = "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)) |
| 584 | 584 | ||
| 585 | QAPATHTEST[infodir] = "package_qa_check_infodir" | 585 | QAPATHTEST[infodir] = "package_qa_check_infodir" |
| 586 | def package_qa_check_infodir(path, name, d, elf, messages): | 586 | def package_qa_check_infodir(path, name, d, elf, messages): |
| @@ -590,7 +590,7 @@ def package_qa_check_infodir(path, name, d, elf, messages): | |||
| 590 | infodir = d.expand("${infodir}/dir") | 590 | infodir = d.expand("${infodir}/dir") |
| 591 | 591 | ||
| 592 | if infodir in path: | 592 | if infodir in path: |
| 593 | messages.append("The /usr/share/info/dir file is not meant to be shipped in a particular package.") | 593 | messages["infodir"] = "The /usr/share/info/dir file is not meant to be shipped in a particular package." |
| 594 | 594 | ||
| 595 | QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot" | 595 | QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot" |
| 596 | def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): | 596 | def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): |
| @@ -603,7 +603,7 @@ def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): | |||
| 603 | tmpdir = d.getVar('TMPDIR', True) | 603 | tmpdir = d.getVar('TMPDIR', True) |
| 604 | if target.startswith(tmpdir): | 604 | if target.startswith(tmpdir): |
| 605 | trimmed = path.replace(os.path.join (d.getVar("PKGDEST", True), name), "") | 605 | trimmed = path.replace(os.path.join (d.getVar("PKGDEST", True), name), "") |
| 606 | messages.append("Symlink %s in %s points to TMPDIR" % (trimmed, name)) | 606 | messages["symlink-to-sysroot"] = "Symlink %s in %s points to TMPDIR" % (trimmed, name) |
| 607 | 607 | ||
| 608 | def package_qa_check_license(workdir, d): | 608 | def package_qa_check_license(workdir, d): |
| 609 | """ | 609 | """ |
| @@ -735,8 +735,8 @@ def package_qa_walk(path, warnfuncs, errorfuncs, skip, package, d): | |||
| 735 | target_os = d.getVar('TARGET_OS', True) | 735 | target_os = d.getVar('TARGET_OS', True) |
| 736 | target_arch = d.getVar('TARGET_ARCH', True) | 736 | target_arch = d.getVar('TARGET_ARCH', True) |
| 737 | 737 | ||
| 738 | warnings = [] | 738 | warnings = {} |
| 739 | errors = [] | 739 | errors = {} |
| 740 | for path in pkgfiles[package]: | 740 | for path in pkgfiles[package]: |
| 741 | elf = oe.qa.ELFFile(path) | 741 | elf = oe.qa.ELFFile(path) |
| 742 | try: | 742 | try: |
| @@ -749,11 +749,9 @@ def package_qa_walk(path, warnfuncs, errorfuncs, skip, package, d): | |||
| 749 | func(path, package, d, elf, errors) | 749 | func(path, package, d, elf, errors) |
| 750 | 750 | ||
| 751 | for w in warnings: | 751 | for w in warnings: |
| 752 | bb.warn("QA Issue: %s" % w) | 752 | package_qa_handle_error(w, warnings[w], d) |
| 753 | package_qa_write_error(w, d) | ||
| 754 | for e in errors: | 753 | for e in errors: |
| 755 | bb.error("QA Issue: %s" % e) | 754 | package_qa_handle_error(e, errors[e], d) |
| 756 | package_qa_write_error(e, d) | ||
| 757 | 755 | ||
| 758 | return len(errors) == 0 | 756 | return len(errors) == 0 |
| 759 | 757 | ||
