insane/package: refactor packaging sanity tests

Refactor packaging sanity tests from package.bbclass to insane.bbclass
so that the message can respect WARN_QA (print the warning message and
go on the task) and ERROR_QA (print the error message and fail the
task).

- For the bb.warn(), give it a message name and add it to WARN_QA, then
  use package_qa_handle_error() to handle it.

- For the bb.error(), give it a message name and add it to ERROR_QA,
  then use package_qa_handle_error() to handle it.

- All the bb.warn() and bb.error() have been replaced in
  package.bbclass.

- A few bb.warn() and bb.error() in insane.bbclass have been kept since
  they can not be replaced or doesn't have to, for example the
  bb.error() in package_qa_check_license(), it will print the error
  message and then invoke bb.fatal() to fail the task, I think that we
  don't have to replace it with package_qa_handle_error().

- Put all the WARN_QA and ERROR_QA in one line, so that they can be
  redefined by the user easily.

[YOCTO #3190]
[YOCTO #4396]

(From OE-Core rev: 2f117ee615b703db07d3274ac592e2bd653743dd)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Robert Yang 2013-05-12 06:46:10 +08:00 committed by Richard Purdie
parent b4371dd0e4
commit 829d6bf005
2 changed files with 45 additions and 24 deletions

View File

@ -27,6 +27,20 @@ QADEPENDS_class-native = ""
QADEPENDS_class-nativesdk = "" QADEPENDS_class-nativesdk = ""
QA_SANE = "True" QA_SANE = "True"
# Elect whether a given type of error is a warning or error, they may
# have been set by other files.
WARN_QA ?= "ldflags useless-rpaths rpaths staticdev libdir xorg-driver-abi \
textrel already-stripped incompatible-license files-invalid \
installed-vs-shipped compile-host-path install-host-path \
pn-overrides \
"
ERROR_QA ?= "dev-so debug-deps dev-deps debug-files arch la2 pkgconfig la \
perms dep-cmp pkgvarcheck perm-config perm-line perm-link \
split-strip packages-list pkgv-undefined var-undefined \
"
ALL_QA = "${WARN_QA} ${ERROR_QA}"
# #
# dictionary for elf headers # dictionary for elf headers
# #
@ -111,12 +125,6 @@ def package_qa_get_machine_dict():
} }
# Currently not being used by default "desktop"
WARN_QA ?= "ldflags useless-rpaths rpaths staticdev libdir xorg-driver-abi textrel"
ERROR_QA ?= "dev-so debug-deps dev-deps debug-files arch la2 pkgconfig la perms dep-cmp pkgvarcheck"
ALL_QA = "${WARN_QA} ${ERROR_QA}"
def package_qa_clean_path(path,d): def package_qa_clean_path(path,d):
""" Remove the common prefix from the path. In this case it is the TMPDIR""" """ Remove the common prefix from the path. In this case it is the TMPDIR"""
return path.replace(d.getVar('TMPDIR',True),"") return path.replace(d.getVar('TMPDIR',True),"")
@ -757,8 +765,9 @@ python do_package_qa () {
if os.path.exists(compilelog): if os.path.exists(compilelog):
statement = "grep -e 'CROSS COMPILE Badness:' -e 'is unsafe for cross-compilation' %s > /dev/null" % compilelog statement = "grep -e 'CROSS COMPILE Badness:' -e 'is unsafe for cross-compilation' %s > /dev/null" % compilelog
if subprocess.call(statement, shell=True) == 0: if subprocess.call(statement, shell=True) == 0:
bb.warn("%s: The compile log indicates that host include and/or library paths were used.\n \ msg = "%s: The compile log indicates that host include and/or library paths were used.\n \
Please check the log '%s' for more information." % (pkg, compilelog)) Please check the log '%s' for more information." % (pkg, compilelog)
package_qa_handle_error("compile-host-path", msg, d)
# Check the install log for host contamination # Check the install log for host contamination
installlog = os.path.join(logdir,"log.do_install") installlog = os.path.join(logdir,"log.do_install")
@ -766,8 +775,9 @@ python do_package_qa () {
if os.path.exists(installlog): if os.path.exists(installlog):
statement = "grep -e 'CROSS COMPILE Badness:' -e 'is unsafe for cross-compilation' %s > /dev/null" % installlog statement = "grep -e 'CROSS COMPILE Badness:' -e 'is unsafe for cross-compilation' %s > /dev/null" % installlog
if subprocess.call(statement, shell=True) == 0: if subprocess.call(statement, shell=True) == 0:
bb.warn("%s: The install log indicates that host include and/or library paths were used.\n \ msg = "%s: The install log indicates that host include and/or library paths were used.\n \
Please check the log '%s' for more information." % (pkg, installlog)) Please check the log '%s' for more information." % (pkg, installlog)
package_qa_handle_error("install-host-path", msg, d)
# Scan the packages... # Scan the packages...
pkgdest = d.getVar('PKGDEST', True) pkgdest = d.getVar('PKGDEST', True)
@ -911,7 +921,8 @@ python () {
overrides = d.getVar('OVERRIDES', True).split(':') overrides = d.getVar('OVERRIDES', True).split(':')
pn = d.getVar('PN', True) pn = d.getVar('PN', True)
if pn in overrides: if pn in overrides:
bb.warn('Recipe %s has PN of "%s" which is in OVERRIDES, this can result in unexpected behaviour.' % (d.getVar("FILE", True), pn)) msg = 'Recipe %s has PN of "%s" which is in OVERRIDES, this can result in unexpected behaviour.' % (d.getVar("FILE", True), pn)
package_qa_handle_error("pn-overrides", msg, d)
issues = [] issues = []
if (d.getVar('PACKAGES', True) or "").split(): if (d.getVar('PACKAGES', True) or "").split():

View File

@ -500,7 +500,8 @@ python fixup_perms () {
elif len(lsplit) == 8: elif len(lsplit) == 8:
self._setdir(lsplit[0], lsplit[1], lsplit[2], lsplit[3], lsplit[4], lsplit[5], lsplit[6], lsplit[7]) self._setdir(lsplit[0], lsplit[1], lsplit[2], lsplit[3], lsplit[4], lsplit[5], lsplit[6], lsplit[7])
else: else:
bb.error("Fixup Perms: invalid config line %s" % line) msg = "Fixup Perms: invalid config line %s" % line
package_qa_handle_error("perm-config", msg, d)
self.path = None self.path = None
self.link = None self.link = None
@ -635,7 +636,8 @@ python fixup_perms () {
if len(lsplit) == 0: if len(lsplit) == 0:
continue continue
if len(lsplit) != 8 and not (len(lsplit) == 3 and lsplit[1].lower() == "link"): if len(lsplit) != 8 and not (len(lsplit) == 3 and lsplit[1].lower() == "link"):
bb.error("Fixup perms: %s invalid line: %s" % (conf, line)) msg = "Fixup perms: %s invalid line: %s" % (conf, line)
package_qa_handle_error("perm-line", msg, d)
continue continue
entry = fs_perms_entry(d.expand(line)) entry = fs_perms_entry(d.expand(line))
if entry and entry.path: if entry and entry.path:
@ -664,7 +666,8 @@ python fixup_perms () {
target = os.path.join(os.path.dirname(origin), link) target = os.path.join(os.path.dirname(origin), link)
ptarget = os.path.join(os.path.dirname(dir), link) ptarget = os.path.join(os.path.dirname(dir), link)
if os.path.exists(target): if os.path.exists(target):
bb.error("Fixup Perms: Unable to correct directory link, target already exists: %s -> %s" % (dir, ptarget)) msg = "Fixup Perms: Unable to correct directory link, target already exists: %s -> %s" % (dir, ptarget)
package_qa_handle_error("perm-link", msg, d)
continue continue
# Create path to move directory to, move it, and then setup the symlink # Create path to move directory to, move it, and then setup the symlink
@ -737,7 +740,8 @@ python split_and_strip_files () {
ret, result = oe.utils.getstatusoutput("file '%s'" % path) ret, result = oe.utils.getstatusoutput("file '%s'" % path)
if ret: if ret:
bb.error("split_and_strip_files: 'file %s' failed" % path) msg = "split_and_strip_files: 'file %s' failed" % path
package_qa_handle_error("split-strip", msg, d)
return type return type
# Not stripped # Not stripped
@ -802,7 +806,8 @@ python split_and_strip_files () {
elf_file = isELF(file) elf_file = isELF(file)
if elf_file & 1: if elf_file & 1:
if elf_file & 2: if elf_file & 2:
bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (file[len(dvar):], pn)) msg = "File '%s' from %s was already stripped, this will prevent future debugging!" % (file[len(dvar):], pn)
package_qa_handle_error("already-stripped", msg, d)
continue continue
# Check if it's a hard link to something else # Check if it's a hard link to something else
if s.st_nlink > 1: if s.st_nlink > 1:
@ -928,9 +933,11 @@ python populate_packages () {
for pkg in packages.split(): for pkg in packages.split():
if d.getVar('LICENSE_EXCLUSION-' + pkg, True): if d.getVar('LICENSE_EXCLUSION-' + pkg, True):
bb.warn("%s has an incompatible license. Excluding from packaging." % pkg) msg = "%s has an incompatible license. Excluding from packaging." % pkg
package_qa_handle_error("incompatible-license", msg, d)
if pkg in package_list: if pkg in package_list:
bb.error("%s is listed in PACKAGES multiple times, this leads to packaging errors." % pkg) msg = "%s is listed in PACKAGES multiple times, this leads to packaging errors." % pkg
package_qa_handle_error("packages-list", msg, d)
else: else:
package_list.append(pkg) package_list.append(pkg)
d.setVar('PACKAGES', ' '.join(package_list)) d.setVar('PACKAGES', ' '.join(package_list))
@ -944,7 +951,8 @@ python populate_packages () {
filesvar = d.getVar('FILES_%s' % pkg, True) or "" filesvar = d.getVar('FILES_%s' % pkg, True) or ""
if "//" in filesvar: if "//" in filesvar:
bb.warn("FILES variable for package %s contains '//' which is invalid. Attempting to fix this but you should correct the metadata.\n" % pkg) msg = "FILES variable for package %s contains '//' which is invalid. Attempting to fix this but you should correct the metadata.\n" % pkg
package_qa_handle_error("files-invalid", msg, d)
filesvar.replace("//", "/") filesvar.replace("//", "/")
files = filesvar.split() files = filesvar.split()
for file in files: for file in files:
@ -1023,12 +1031,12 @@ python populate_packages () {
if unshipped != []: if unshipped != []:
msg = pn + ": Files/directories were installed but not shipped" msg = pn + ": Files/directories were installed but not shipped"
if "installed_vs_shipped" in (d.getVar('INSANE_SKIP_' + pn, True) or "").split(): if "installed-vs-shipped" in (d.getVar('INSANE_SKIP_' + pn, True) or "").split():
bb.note("Package %s skipping QA tests: installed_vs_shipped" % pn) bb.note("Package %s skipping QA tests: installed-vs-shipped" % pn)
else: else:
for f in unshipped: for f in unshipped:
msg = msg + "\n " + f msg = msg + "\n " + f
package_qa_handle_error("installed_vs_shipped", msg, d) package_qa_handle_error("installed-vs-shipped", msg, d)
} }
populate_packages[dirs] = "${D}" populate_packages[dirs] = "${D}"
@ -1318,7 +1326,8 @@ python package_do_shlibs() {
ver = d.getVar('PKGV', True) ver = d.getVar('PKGV', True)
if not ver: if not ver:
bb.error("PKGV not defined") msg = "PKGV not defined"
package_qa_handle_error("pkgv-undefined", msg, d)
return return
pkgdest = d.getVar('PKGDEST', True) pkgdest = d.getVar('PKGDEST', True)
@ -1853,7 +1862,8 @@ python do_package () {
pn = d.getVar('PN', True) pn = d.getVar('PN', True)
if not workdir or not outdir or not dest or not dvar or not pn: if not workdir or not outdir or not dest or not dvar or not pn:
bb.error("WORKDIR, DEPLOY_DIR, D, PN and PKGD all must be defined, unable to package") msg = "WORKDIR, DEPLOY_DIR, D, PN and PKGD all must be defined, unable to package"
package_qa_handle_error("var-undefined", msg, d)
return return
bb.build.exec_func("package_get_auto_pr", d) bb.build.exec_func("package_get_auto_pr", d)