diff options
author | Robert Yang <liezhi.yang@windriver.com> | 2016-01-20 00:34:23 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-01-24 09:40:22 +0000 |
commit | e1850048a270673003d218d39fda5bbf3f0060ae (patch) | |
tree | a5c790a6402c83b7d5444802d073f44ca843a359 /meta | |
parent | 95fa36e9c3a701c947979b10c03e92bf1a0d78a8 (diff) | |
download | poky-e1850048a270673003d218d39fda5bbf3f0060ae.tar.gz |
insane.bbclass: print all the QA messages
Fixed:
If more than one files have the same QA issue, it only prints the last
one, others are overrided, for example:
messages["host-user-contaminated"] = "foo1"
messages["host-user-contaminated"] = "foo2"
Only foo2 will be printed.
Add package_qa_add_message() to hanlde messages, so that all of them
will be printed. The package_qa_add_message() is from RP.
(From OE-Core rev: 1dcb38ca9d632887dd99ea9fa32dd955561dc18d)
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes/insane.bbclass | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass index 47988bd1e9..9a315edabb 100644 --- a/meta/classes/insane.bbclass +++ b/meta/classes/insane.bbclass | |||
@@ -190,6 +190,12 @@ def package_qa_handle_error(error_class, error_msg, d): | |||
190 | bb.note("QA Issue: %s [%s]" % (error_msg, error_class)) | 190 | bb.note("QA Issue: %s [%s]" % (error_msg, error_class)) |
191 | return True | 191 | return True |
192 | 192 | ||
193 | def package_qa_add_message(messages, section, new_msg): | ||
194 | if section not in messages: | ||
195 | messages[section] = new_msg | ||
196 | else: | ||
197 | messages[section] = messages[section] + "\n" + new_msg | ||
198 | |||
193 | QAPATHTEST[libexec] = "package_qa_check_libexec" | 199 | QAPATHTEST[libexec] = "package_qa_check_libexec" |
194 | def package_qa_check_libexec(path,name, d, elf, messages): | 200 | def package_qa_check_libexec(path,name, d, elf, messages): |
195 | 201 | ||
@@ -199,7 +205,7 @@ def package_qa_check_libexec(path,name, d, elf, messages): | |||
199 | return True | 205 | return True |
200 | 206 | ||
201 | if 'libexec' in path.split(os.path.sep): | 207 | if 'libexec' in path.split(os.path.sep): |
202 | messages["libexec"] = "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec) | 208 | package_qa_add_message(messages, "libexec", "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec)) |
203 | return False | 209 | return False |
204 | 210 | ||
205 | return True | 211 | return True |
@@ -227,7 +233,7 @@ def package_qa_check_rpath(file,name, d, elf, messages): | |||
227 | rpath = m.group(1) | 233 | rpath = m.group(1) |
228 | for dir in bad_dirs: | 234 | for dir in bad_dirs: |
229 | if dir in rpath: | 235 | if dir in rpath: |
230 | messages["rpaths"] = "package %s contains bad RPATH %s in file %s" % (name, rpath, file) | 236 | package_qa_add_message(messages, "rpaths", "package %s contains bad RPATH %s in file %s" % (name, rpath, file)) |
231 | 237 | ||
232 | QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" | 238 | QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" |
233 | def package_qa_check_useless_rpaths(file, name, d, elf, messages): | 239 | def package_qa_check_useless_rpaths(file, name, d, elf, messages): |
@@ -257,7 +263,7 @@ def package_qa_check_useless_rpaths(file, name, d, elf, messages): | |||
257 | if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir): | 263 | if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir): |
258 | # The dynamic linker searches both these places anyway. There is no point in | 264 | # The dynamic linker searches both these places anyway. There is no point in |
259 | # looking there again. | 265 | # looking there again. |
260 | messages["useless-rpaths"] = "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath) | 266 | package_qa_add_message(messages, "useless-rpaths", "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d), rpath)) |
261 | 267 | ||
262 | QAPATHTEST[dev-so] = "package_qa_check_dev" | 268 | QAPATHTEST[dev-so] = "package_qa_check_dev" |
263 | def package_qa_check_dev(path, name, d, elf, messages): | 269 | def package_qa_check_dev(path, name, d, elf, messages): |
@@ -266,8 +272,8 @@ def package_qa_check_dev(path, name, d, elf, messages): | |||
266 | """ | 272 | """ |
267 | 273 | ||
268 | 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): | 274 | 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): |
269 | messages["dev-so"] = "non -dev/-dbg/nativesdk- package contains symlink .so: %s path '%s'" % \ | 275 | package_qa_add_message(messages, "dev-so", "non -dev/-dbg/nativesdk- package contains symlink .so: %s path '%s'" % \ |
270 | (name, package_qa_clean_path(path,d)) | 276 | (name, package_qa_clean_path(path,d))) |
271 | 277 | ||
272 | QAPATHTEST[staticdev] = "package_qa_check_staticdev" | 278 | QAPATHTEST[staticdev] = "package_qa_check_staticdev" |
273 | def package_qa_check_staticdev(path, name, d, elf, messages): | 279 | def package_qa_check_staticdev(path, name, d, elf, messages): |
@@ -279,8 +285,8 @@ def package_qa_check_staticdev(path, name, d, elf, messages): | |||
279 | """ | 285 | """ |
280 | 286 | ||
281 | 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"): | 287 | 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"): |
282 | messages["staticdev"] = "non -staticdev package contains static .a library: %s path '%s'" % \ | 288 | package_qa_add_message(messages, "staticdev", "non -staticdev package contains static .a library: %s path '%s'" % \ |
283 | (name, package_qa_clean_path(path,d)) | 289 | (name, package_qa_clean_path(path,d))) |
284 | 290 | ||
285 | def package_qa_check_libdir(d): | 291 | def package_qa_check_libdir(d): |
286 | """ | 292 | """ |
@@ -338,8 +344,8 @@ def package_qa_check_dbg(path, name, d, elf, messages): | |||
338 | 344 | ||
339 | if not "-dbg" in name and not "-ptest" in name: | 345 | if not "-dbg" in name and not "-ptest" in name: |
340 | if '.debug' in path.split(os.path.sep): | 346 | if '.debug' in path.split(os.path.sep): |
341 | messages["debug-files"] = "non debug package contains .debug directory: %s path %s" % \ | 347 | messages("debug-files", "non debug package contains .debug directory: %s path %s" % \ |
342 | (name, package_qa_clean_path(path,d)) | 348 | (name, package_qa_clean_path(path,d))) |
343 | 349 | ||
344 | QAPATHTEST[perms] = "package_qa_check_perm" | 350 | QAPATHTEST[perms] = "package_qa_check_perm" |
345 | def package_qa_check_perm(path,name,d, elf, messages): | 351 | def package_qa_check_perm(path,name,d, elf, messages): |
@@ -470,7 +476,7 @@ def package_qa_check_arch(path,name,d, elf, messages): | |||
470 | 476 | ||
471 | if target_arch == "allarch": | 477 | if target_arch == "allarch": |
472 | pn = d.getVar('PN', True) | 478 | pn = d.getVar('PN', True) |
473 | messages["arch"] = pn + ": Recipe inherits the allarch class, but has packaged architecture-specific binaries" | 479 | package_qa_add_message(messages, "arch", pn + ": Recipe inherits the allarch class, but has packaged architecture-specific binaries") |
474 | return | 480 | return |
475 | 481 | ||
476 | # FIXME: Cross package confuse this check, so just skip them | 482 | # FIXME: Cross package confuse this check, so just skip them |
@@ -490,15 +496,15 @@ def package_qa_check_arch(path,name,d, elf, messages): | |||
490 | # Check the architecture and endiannes of the binary | 496 | # Check the architecture and endiannes of the binary |
491 | if not ((machine == elf.machine()) or \ | 497 | if not ((machine == elf.machine()) or \ |
492 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32" or target_os == "linux-gnun32"))): | 498 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32" or target_os == "linux-gnun32"))): |
493 | messages["arch"] = "Architecture did not match (%d to %d) on %s" % \ | 499 | package_qa_add_message(messages, "arch", "Architecture did not match (%d to %d) on %s" % \ |
494 | (machine, elf.machine(), package_qa_clean_path(path,d)) | 500 | (machine, elf.machine(), package_qa_clean_path(path,d))) |
495 | elif not ((bits == elf.abiSize()) or \ | 501 | elif not ((bits == elf.abiSize()) or \ |
496 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32" or target_os == "linux-gnun32"))): | 502 | ((("virtual/kernel" in provides) or bb.data.inherits_class("module", d) ) and (target_os == "linux-gnux32" or target_os == "linux-gnun32"))): |
497 | messages["arch"] = "Bit size did not match (%d to %d) %s on %s" % \ | 503 | package_qa_add_message(messages, "arch", "Bit size did not match (%d to %d) %s on %s" % \ |
498 | (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d)) | 504 | (bits, elf.abiSize(), bpn, package_qa_clean_path(path,d))) |
499 | elif not littleendian == elf.isLittleEndian(): | 505 | elif not littleendian == elf.isLittleEndian(): |
500 | messages["arch"] = "Endiannes did not match (%d to %d) on %s" % \ | 506 | package_qa_add_message(messages, "arch", "Endiannes did not match (%d to %d) on %s" % \ |
501 | (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d)) | 507 | (littleendian, elf.isLittleEndian(), package_qa_clean_path(path,d))) |
502 | 508 | ||
503 | QAPATHTEST[desktop] = "package_qa_check_desktop" | 509 | QAPATHTEST[desktop] = "package_qa_check_desktop" |
504 | def package_qa_check_desktop(path, name, d, elf, messages): | 510 | def package_qa_check_desktop(path, name, d, elf, messages): |
@@ -510,7 +516,7 @@ def package_qa_check_desktop(path, name, d, elf, messages): | |||
510 | output = os.popen("%s %s" % (desktop_file_validate, path)) | 516 | output = os.popen("%s %s" % (desktop_file_validate, path)) |
511 | # This only produces output on errors | 517 | # This only produces output on errors |
512 | for l in output: | 518 | for l in output: |
513 | messages["desktop"] = "Desktop file issue: " + l.strip() | 519 | package_qa_add_message(messages, "desktop", "Desktop file issue: " + l.strip()) |
514 | 520 | ||
515 | QAPATHTEST[textrel] = "package_qa_textrel" | 521 | QAPATHTEST[textrel] = "package_qa_textrel" |
516 | def package_qa_textrel(path, name, d, elf, messages): | 522 | def package_qa_textrel(path, name, d, elf, messages): |
@@ -534,7 +540,7 @@ def package_qa_textrel(path, name, d, elf, messages): | |||
534 | sane = False | 540 | sane = False |
535 | 541 | ||
536 | if not sane: | 542 | if not sane: |
537 | messages["textrel"] = "ELF binary '%s' has relocations in .text" % path | 543 | package_qa_add_message(messages, "textrel", "ELF binary '%s' has relocations in .text" % path) |
538 | 544 | ||
539 | QAPATHTEST[ldflags] = "package_qa_hash_style" | 545 | QAPATHTEST[ldflags] = "package_qa_hash_style" |
540 | def package_qa_hash_style(path, name, d, elf, messages): | 546 | def package_qa_hash_style(path, name, d, elf, messages): |
@@ -569,7 +575,7 @@ def package_qa_hash_style(path, name, d, elf, messages): | |||
569 | sane = True | 575 | sane = True |
570 | 576 | ||
571 | if has_syms and not sane: | 577 | if has_syms and not sane: |
572 | messages["ldflags"] = "No GNU_HASH in the elf binary: '%s'" % path | 578 | package_qa_add_message(messages, "ldflags", "No GNU_HASH in the elf binary: '%s'" % path) |
573 | 579 | ||
574 | 580 | ||
575 | QAPATHTEST[buildpaths] = "package_qa_check_buildpaths" | 581 | QAPATHTEST[buildpaths] = "package_qa_check_buildpaths" |
@@ -593,7 +599,7 @@ def package_qa_check_buildpaths(path, name, d, elf, messages): | |||
593 | with open(path) as f: | 599 | with open(path) as f: |
594 | file_content = f.read() | 600 | file_content = f.read() |
595 | if tmpdir in file_content: | 601 | if tmpdir in file_content: |
596 | messages["buildpaths"] = "File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d) | 602 | package_qa_add_message(messages, "buildpaths", "File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d)) |
597 | 603 | ||
598 | 604 | ||
599 | QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi" | 605 | QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi" |
@@ -612,7 +618,7 @@ def package_qa_check_xorg_driver_abi(path, name, d, elf, messages): | |||
612 | for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS_' + name, True) or ""): | 618 | for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS_' + name, True) or ""): |
613 | if rdep.startswith("%sxorg-abi-" % mlprefix): | 619 | if rdep.startswith("%sxorg-abi-" % mlprefix): |
614 | return | 620 | return |
615 | messages["xorg-driver-abi"] = "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)) | 621 | package_qa_add_message(messages, "xorg-driver-abi", "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path))) |
616 | 622 | ||
617 | QAPATHTEST[infodir] = "package_qa_check_infodir" | 623 | QAPATHTEST[infodir] = "package_qa_check_infodir" |
618 | def package_qa_check_infodir(path, name, d, elf, messages): | 624 | def package_qa_check_infodir(path, name, d, elf, messages): |
@@ -622,7 +628,7 @@ def package_qa_check_infodir(path, name, d, elf, messages): | |||
622 | infodir = d.expand("${infodir}/dir") | 628 | infodir = d.expand("${infodir}/dir") |
623 | 629 | ||
624 | if infodir in path: | 630 | if infodir in path: |
625 | messages["infodir"] = "The /usr/share/info/dir file is not meant to be shipped in a particular package." | 631 | package_qa_add_message(messages, "infodir", "The /usr/share/info/dir file is not meant to be shipped in a particular package.") |
626 | 632 | ||
627 | QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot" | 633 | QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot" |
628 | def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): | 634 | def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): |
@@ -635,7 +641,7 @@ def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages): | |||
635 | tmpdir = d.getVar('TMPDIR', True) | 641 | tmpdir = d.getVar('TMPDIR', True) |
636 | if target.startswith(tmpdir): | 642 | if target.startswith(tmpdir): |
637 | trimmed = path.replace(os.path.join (d.getVar("PKGDEST", True), name), "") | 643 | trimmed = path.replace(os.path.join (d.getVar("PKGDEST", True), name), "") |
638 | messages["symlink-to-sysroot"] = "Symlink %s in %s points to TMPDIR" % (trimmed, name) | 644 | package_qa_add_message(messages, "symlink-to-sysroot", "Symlink %s in %s points to TMPDIR" % (trimmed, name)) |
639 | 645 | ||
640 | def package_qa_check_license(workdir, d): | 646 | def package_qa_check_license(workdir, d): |
641 | """ | 647 | """ |
@@ -939,10 +945,10 @@ def package_qa_check_expanded_d(path,name,d,elf,messages): | |||
939 | # Bitbake expands ${D} within bbvar during the previous step, so we check for its expanded value | 945 | # Bitbake expands ${D} within bbvar during the previous step, so we check for its expanded value |
940 | if expanded_d in bbvar: | 946 | if expanded_d in bbvar: |
941 | if var == 'FILES': | 947 | if var == 'FILES': |
942 | 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" % pak | 948 | package_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" % pak) |
943 | sane = False | 949 | sane = False |
944 | else: | 950 | else: |
945 | messages["expanded-d"] = "%s in %s recipe contains ${D}, it should be replaced by $D instead" % (var, pak) | 951 | package_qa_add_message(messages, "expanded-d", "%s in %s recipe contains ${D}, it should be replaced by $D instead" % (var, pak)) |
946 | sane = False | 952 | sane = False |
947 | return sane | 953 | return sane |
948 | 954 | ||
@@ -990,12 +996,12 @@ def package_qa_check_host_user(path, name, d, elf, messages): | |||
990 | rootfs_path = path[len(dest):] | 996 | rootfs_path = path[len(dest):] |
991 | check_uid = int(d.getVar('HOST_USER_UID', True)) | 997 | check_uid = int(d.getVar('HOST_USER_UID', True)) |
992 | if stat.st_uid == check_uid: | 998 | if stat.st_uid == check_uid: |
993 | 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, rootfs_path, check_uid) | 999 | package_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, rootfs_path, check_uid)) |
994 | return False | 1000 | return False |
995 | 1001 | ||
996 | check_gid = int(d.getVar('HOST_USER_GID', True)) | 1002 | check_gid = int(d.getVar('HOST_USER_GID', True)) |
997 | if stat.st_gid == check_gid: | 1003 | if stat.st_gid == check_gid: |
998 | 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, rootfs_path, check_gid) | 1004 | package_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, rootfs_path, check_gid)) |
999 | return False | 1005 | return False |
1000 | return True | 1006 | return True |
1001 | 1007 | ||