diff options
author | Marcin Juszkiewicz <hrw@openembedded.org> | 2007-04-05 18:20:42 +0000 |
---|---|---|
committer | Marcin Juszkiewicz <hrw@openembedded.org> | 2007-04-05 18:20:42 +0000 |
commit | 328eff19a08bd399c6a833d213862039b4432b05 (patch) | |
tree | e20fa9422b90a51da620e168dba7f32764bba5c9 | |
download | openembedded-328eff19a08bd399c6a833d213862039b4432b05.tar.gz |
import of bitbake-qa bittest util which can be used as:
- source availability checker
- source mirror populate tool
- and few others
branch is named 'oetest' because this tool will be renamed to 'oetest' as it
is useful only with OE metadata
41 files changed, 3293 insertions, 0 deletions
diff --git a/.mtn2git_empty b/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/.mtn2git_empty diff --git a/bin/.mtn2git_empty b/bin/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bin/.mtn2git_empty diff --git a/bin/bittest b/bin/bittest new file mode 100755 index 0000000000..5db993edd1 --- /dev/null +++ b/bin/bittest @@ -0,0 +1,126 @@ +#!/usr/bin/env python +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005, 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import sys, os, optparse + +# append the lib subdir and modules subdir to the system python path +sys.path.append(os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib')) +sys.path.append(os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'modules')) + + +try: + import bb + import bb.data + import bb.parse + from bb import cooker +except: + print "Use PYTHONPATH to point to bitbake/lib" + sys.exit(-1) + + +from bittest import * + +class BBConfiguration( object ): + """ + Manages build options and configurations for one run + """ + def __init__( self, options ): + for key, val in options.__dict__.items(): + setattr( self, key, val ) + +def start_testing(): + """ + Start with testing: + We will parse the options to decide which tests should be executed. + Then we will parse the base configuration (bitbake.conf) and afterwards + our unit testing configuration. + We will go through every bbfile, parse it and for each setup we will call + the testing method + """ + + options, args = handle_options( sys.argv ) + + tests = [] + if len(args) == 0: + tests = __all_tests__ + else: + for mode in args: + if not mode in __all_tests__ and not mode == "example": + bb.note("Test %s does not exist" % mode) + else: + tests.append(mode) + + if len(tests) == 0: + bb.note("No tests to run exiting") + sys.exit(0) + + bb.note("Running the following tests: %s" % tests ) + + # Parse the default config + configuration = BBConfiguration(options) + configuration.pkgs_to_build = [] + configuration.data = bb.data.init() + configuration.verbose = False + configuration.debug = False + configuration.debug_domains = [] + configuration.file = [] + configuration.cmd = "fetch" + + bb.msg.set_debug_level(0) + cook = bb.cooker.BBCooker(configuration) + cook.configuration = configuration + cook.parseConfigurationFile( os.path.join( "conf", "bitbake.conf" ) ) + data = _load_config('bitbake.conf') + if data == None: + bb.error("Could not parse the bitbake.conf") + elif bb.data.getVar('BITBAKETEST_BITBAKE_CONF', data ) == None: + bb.error("You are not using the bitbake.conf from bittest please check your BBPATH") + + bb.data.inheritFromOS(data) + + # Parse the test configuration + test_config = _load_config('testrun.conf') + if test_config == None: + bb.error("Could not parse the bittest configuration file") + test_options = parse_test_options(test_config) + + # start running the test + results = run_tests(data, test_config, test_options, tests, options) + generate_results(results, options) + + + +if __name__ == "__main__": + start_testing() diff --git a/bin/bittest_single b/bin/bittest_single new file mode 100755 index 0000000000..d7182cc6ae --- /dev/null +++ b/bin/bittest_single @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005, 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import sys, os, optparse + +# append the lib subdir and modules subdir to the system python path +sys.path.append(os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib')) +sys.path.append(os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'modules')) + + +def which(path, item): + """Useful function for locating a file in a PATH""" + found = None + for p in (path or "").split(':'): + if os.path.exists(os.path.join(p, item)): + found = os.path.join(p, item) + break + return found + + +# Code to try hard to find the BitBake libraries +try: + import bb + import bb.data + import bb.parse +except: + print "Trying hard to find the BitBake libraries" + path = which(os.environ['PATH'], "bitbake") + if not path: + print "ERROR can't find bitbake in the $PATH. Either place bitbake/bin there or point PYTHONPATH to bitbake/lib." + sys.exit(-1) + + sys.path.append(os.path.join(os.path.dirname(os.path.dirname(path)), 'lib')) + import bb + import bb.data + import bb.parse + + +from bittest import * + + +# Start it up now +if __name__ == "__main__": + """ + In contrast to bittest we will try to update the BBPATH, load local conf to + get the TARGET_ARCH, TARGET_OS, DISTRO and MACHINE from the configuration file + """ + + options, args = handle_options( sys.argv ) + tests = [] + if len(args) == 0: + tests = __all_tests__ + else: + for mode in args: + if not mode in __all_tests__ and not mode == "example": + bb.note("Test %s does not exist" % mode) + else: + tests.append(mode) + + if len(tests) == 0: + bb.note("No tests to run exiting") + sys.exit(0) + + bb.note("Running the following tests: %s" % tests ) + + # Parse the test configuration - use local.conf here the one in the old BBPATH + test_config = _load_config('local.conf') + if test_config == None: + bb.error("Could not parse the local.conf configuration file") + + # extract information from the current setup + arch = bb.data.getVar('TARGET_ARCH', test_config, True) + tos = bb.data.getVar('TARGET_OS' , test_config, True) + distro = bb.data.getVar('DISTRO' , test_config, True) + machine= bb.data.getVar('MACHINE' , test_config, True) + test_options = [(arch,os,distro,[machine])] + + # Check for issues + if None in [arch,tos,distro,machine]: + bb.error("Error in your configuration. TARGET_ARCH=%(arch)s, TARGET_OS=%(tos)s, DISTRO=%(distro)s, MACHINE=%(machine)s" % locals() ) + sys.exit(-3) + else: + bb.note("Your configuration: TARGET_ARCH=%(arch)s, TARGET_OS=%(tos)s, DISTRO=%(distro)s, MACHINE=%(machine)s" % locals() ) + + + + # Update the BBPATH now + new_path = os.path.dirname(os.path.dirname(sys.argv[0]))+":"+os.environ['BBPATH'] + os.environ['BBPATH'] = new_path + + # Now start with the real deal + # Parse the default config + data = _load_config('bitbake.conf') + if data == None: + bb.error("Could not parse the bitbake.conf") + elif bb.data.getVar('BITBAKETEST_BITBAKE_CONF', data ) == None: + bb.error("You are not using the bitbake.conf from bittest please check your BBPATH") + + bb.data.inheritFromOS(data) + + + # start running the test + results = run_tests(data, test_config, test_options, tests, options) + generate_results(results, options) + + diff --git a/classes/.mtn2git_empty b/classes/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/classes/.mtn2git_empty diff --git a/classes/base.bbclass b/classes/base.bbclass new file mode 100755 index 0000000000..619c50b000 --- /dev/null +++ b/classes/base.bbclass @@ -0,0 +1,768 @@ +PATCHES_DIR="${S}" + +def base_dep_prepend(d): + import bb; + # + # Ideally this will check a flag so we will operate properly in + # the case where host == build == target, for now we don't work in + # that case though. + # + deps = "" + + # INHIBIT_DEFAULT_DEPS doesn't apply to the patch command. Whether or not + # we need that built is the responsibility of the patch function / class, not + # the application. + patchdeps = bb.data.getVar("PATCH_DEPENDS", d, 1) + if patchdeps and not patchdeps in bb.data.getVar("PROVIDES", d, 1): + deps = patchdeps + + if not bb.data.getVar('INHIBIT_DEFAULT_DEPS', d): + if (bb.data.getVar('HOST_SYS', d, 1) != + bb.data.getVar('BUILD_SYS', d, 1)): + deps += " virtual/${TARGET_PREFIX}gcc virtual/libc " + return deps + +def base_read_file(filename): + import bb + try: + f = file( filename, "r" ) + except IOError, reason: + return "" # WARNING: can't raise an error now because of the new RDEPENDS handling. This is a bit ugly. :M: + else: + return f.read().strip() + return None + +def base_conditional(variable, checkvalue, truevalue, falsevalue, d): + import bb + if bb.data.getVar(variable,d,1) == checkvalue: + return truevalue + else: + return falsevalue + +DEPENDS_prepend="${@base_dep_prepend(d)} " + +def base_set_filespath(path, d): + import os, bb + filespath = [] + for p in path: + overrides = bb.data.getVar("OVERRIDES", d, 1) or "" + overrides = overrides + ":" + for o in overrides.split(":"): + filespath.append(os.path.join(p, o)) + bb.data.setVar("FILESPATH", ":".join(filespath), d) + +FILESPATH = "${@base_set_filespath([ "${FILE_DIRNAME}/${PF}", "${FILE_DIRNAME}/${P}", "${FILE_DIRNAME}/${PN}", "${FILE_DIRNAME}/files", "${FILE_DIRNAME}" ], d)}" + +def oe_filter(f, str, d): + from re import match + return " ".join(filter(lambda x: match(f, x, 0), str.split())) + +def oe_filter_out(f, str, d): + from re import match + return " ".join(filter(lambda x: not match(f, x, 0), str.split())) + +die() { + oefatal "$*" +} + +oenote() { + echo "NOTE:" "$*" +} + +oewarn() { + echo "WARNING:" "$*" +} + +oefatal() { + echo "FATAL:" "$*" + exit 1 +} + +oedebug() { + test $# -ge 2 || { + echo "Usage: oedebug level \"message\"" + exit 1 + } + + test ${OEDEBUG:-0} -ge $1 && { + shift + echo "DEBUG:" $* + } +} + +oe_runmake() { + if [ x"$MAKE" = x ]; then MAKE=make; fi + oenote ${MAKE} ${EXTRA_OEMAKE} "$@" + ${MAKE} ${EXTRA_OEMAKE} "$@" || die "oe_runmake failed" +} + +oe_soinstall() { + # Purpose: Install shared library file and + # create the necessary links + # Example: + # + # oe_ + # + #oenote installing shared library $1 to $2 + # + libname=`basename $1` + install -m 755 $1 $2/$libname + sonamelink=`${HOST_PREFIX}readelf -d $1 |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` + solink=`echo $libname | sed -e 's/\.so\..*/.so/'` + ln -sf $libname $2/$sonamelink + ln -sf $libname $2/$solink +} + +oe_libinstall() { + # Purpose: Install a library, in all its forms + # Example + # + # oe_libinstall libltdl ${STAGING_LIBDIR}/ + # oe_libinstall -C src/libblah libblah ${D}/${libdir}/ + dir="" + libtool="" + silent="" + require_static="" + require_shared="" + staging_install="" + while [ "$#" -gt 0 ]; do + case "$1" in + -C) + shift + dir="$1" + ;; + -s) + silent=1 + ;; + -a) + require_static=1 + ;; + -so) + require_shared=1 + ;; + -*) + oefatal "oe_libinstall: unknown option: $1" + ;; + *) + break; + ;; + esac + shift + done + + libname="$1" + shift + destpath="$1" + if [ -z "$destpath" ]; then + oefatal "oe_libinstall: no destination path specified" + fi + if echo "$destpath/" | egrep '^${STAGING_LIBDIR}/' >/dev/null + then + staging_install=1 + fi + + __runcmd () { + if [ -z "$silent" ]; then + echo >&2 "oe_libinstall: $*" + fi + $* + } + + if [ -z "$dir" ]; then + dir=`pwd` + fi + dotlai=$libname.lai + dir=$dir`(cd $dir; find -name "$dotlai") | sed "s/^\.//;s/\/$dotlai\$//;q"` + olddir=`pwd` + __runcmd cd $dir + + lafile=$libname.la + if [ -f "$lafile" ]; then + # libtool archive + eval `cat $lafile|grep "^library_names="` + libtool=1 + else + library_names="$libname.so* $libname.dll.a" + fi + + __runcmd install -d $destpath/ + dota=$libname.a + if [ -f "$dota" -o -n "$require_static" ]; then + __runcmd install -m 0644 $dota $destpath/ + fi + if [ -f "$dotlai" -a -n "$libtool" ]; then + if test -n "$staging_install" + then + # stop libtool using the final directory name for libraries + # in staging: + __runcmd rm -f $destpath/$libname.la + __runcmd sed -e 's/^installed=yes$/installed=no/' -e '/^dependency_libs=/s,${WORKDIR}[[:alnum:]/\._+-]*/\([[:alnum:]\._+-]*\),${STAGING_LIBDIR}/\1,g' $dotlai >$destpath/$libname.la + else + __runcmd install -m 0644 $dotlai $destpath/$libname.la + fi + fi + + for name in $library_names; do + files=`eval echo $name` + for f in $files; do + if [ ! -e "$f" ]; then + if [ -n "$libtool" ]; then + oefatal "oe_libinstall: $dir/$f not found." + fi + elif [ -L "$f" ]; then + __runcmd cp -P "$f" $destpath/ + elif [ ! -L "$f" ]; then + libfile="$f" + __runcmd install -m 0755 $libfile $destpath/ + fi + done + done + + if [ -z "$libfile" ]; then + if [ -n "$require_shared" ]; then + oefatal "oe_libinstall: unable to locate shared library" + fi + elif [ -z "$libtool" ]; then + # special case hack for non-libtool .so.#.#.# links + baselibfile=`basename "$libfile"` + if (echo $baselibfile | grep -qE '^lib.*\.so\.[0-9.]*$'); then + sonamelink=`${HOST_PREFIX}readelf -d $libfile |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` + solink=`echo $baselibfile | sed -e 's/\.so\..*/.so/'` + if [ -n "$sonamelink" -a x"$baselibfile" != x"$sonamelink" ]; then + __runcmd ln -sf $baselibfile $destpath/$sonamelink + fi + __runcmd ln -sf $baselibfile $destpath/$solink + fi + fi + + __runcmd cd "$olddir" +} + +oe_machinstall() { + # Purpose: Install machine dependent files, if available + # If not available, check if there is a default + # If no default, just touch the destination + # Example: + # $1 $2 $3 $4 + # oe_machinstall -m 0644 fstab ${D}/etc/fstab + # + # TODO: Check argument number? + # + filename=`basename $3` + dirname=`dirname $3` + + for o in `echo ${OVERRIDES} | tr ':' ' '`; do + if [ -e $dirname/$o/$filename ]; then + oenote $dirname/$o/$filename present, installing to $4 + install $1 $2 $dirname/$o/$filename $4 + return + fi + done +# oenote overrides specific file NOT present, trying default=$3... + if [ -e $3 ]; then + oenote $3 present, installing to $4 + install $1 $2 $3 $4 + else + oenote $3 NOT present, touching empty $4 + touch $4 + fi +} + +addtask showdata +do_showdata[nostamp] = "1" +python do_showdata() { + import sys + # emit variables and shell functions + bb.data.emit_env(sys.__stdout__, d, True) + # emit the metadata which isnt valid shell + for e in d.keys(): + if bb.data.getVarFlag(e, 'python', d): + sys.__stdout__.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1))) +} + +addtask listtasks +do_listtasks[nostamp] = "1" +python do_listtasks() { + import sys + # emit variables and shell functions + #bb.data.emit_env(sys.__stdout__, d) + # emit the metadata which isnt valid shell + for e in d.keys(): + if bb.data.getVarFlag(e, 'task', d): + sys.__stdout__.write("%s\n" % e) +} + +addtask clean +do_clean[dirs] = "${TOPDIR}" +do_clean[nostamp] = "1" +do_clean[bbdepcmd] = "" +python base_do_clean() { + """clear the build and temp directories""" + dir = bb.data.expand("${WORKDIR}", d) + if dir == '//': raise bb.build.FuncFailed("wrong DATADIR") + bb.note("removing " + dir) + os.system('rm -rf ' + dir) + + dir = "%s.*" % bb.data.expand(bb.data.getVar('STAMP', d), d) + bb.note("removing " + dir) + os.system('rm -f '+ dir) +} + +addtask mrproper +do_mrproper[dirs] = "${TOPDIR}" +do_mrproper[nostamp] = "1" +do_mrproper[bbdepcmd] = "" +python base_do_mrproper() { + """clear downloaded sources, build and temp directories""" + dir = bb.data.expand("${DL_DIR}", d) + if dir == '/': bb.build.FuncFailed("wrong DATADIR") + bb.debug(2, "removing " + dir) + os.system('rm -rf ' + dir) + bb.build.exec_task('do_clean', d) +} + +addtask fetch +do_fetch[dirs] = "${DL_DIR}" +do_fetch[nostamp] = "1" +python base_do_fetch() { + import sys + + localdata = bb.data.createCopy(d) + bb.data.update_data(localdata) + + src_uri = bb.data.getVar('SRC_URI', localdata, 1) + if not src_uri: + return 1 + + try: + bb.fetch.init(src_uri.split(),d) + except bb.fetch.NoMethodError: + (type, value, traceback) = sys.exc_info() + raise bb.build.FuncFailed("No method: %s" % value) + + try: + bb.fetch.go(localdata) + except bb.fetch.MissingParameterError: + (type, value, traceback) = sys.exc_info() + raise bb.build.FuncFailed("Missing parameters: %s" % value) + except bb.fetch.FetchError: + (type, value, traceback) = sys.exc_info() + raise bb.build.FuncFailed("Fetch failed: %s" % value) +} + +def oe_unpack_file(file, data, url = None): + import bb, os + if not url: + url = "file://%s" % file + dots = file.split(".") + if dots[-1] in ['gz', 'bz2', 'Z']: + efile = os.path.join(bb.data.getVar('WORKDIR', data, 1),os.path.basename('.'.join(dots[0:-1]))) + else: + efile = file + cmd = None + if file.endswith('.tar'): + cmd = 'tar x --no-same-owner -f %s' % file + elif file.endswith('.tgz') or file.endswith('.tar.gz'): + cmd = 'tar xz --no-same-owner -f %s' % file + elif file.endswith('.tbz') or file.endswith('.tar.bz2'): + cmd = 'bzip2 -dc %s | tar x --no-same-owner -f -' % file + elif file.endswith('.gz') or file.endswith('.Z') or file.endswith('.z'): + cmd = 'gzip -dc %s > %s' % (file, efile) + elif file.endswith('.bz2'): + cmd = 'bzip2 -dc %s > %s' % (file, efile) + elif file.endswith('.zip'): + cmd = 'unzip -q' + (type, host, path, user, pswd, parm) = bb.decodeurl(url) + if 'dos' in parm: + cmd = '%s -a' % cmd + cmd = '%s %s' % (cmd, file) + elif os.path.isdir(file): + filesdir = os.path.realpath(bb.data.getVar("FILESDIR", data, 1)) + destdir = "." + if file[0:len(filesdir)] == filesdir: + destdir = file[len(filesdir):file.rfind('/')] + destdir = destdir.strip('/') + if len(destdir) < 1: + destdir = "." + elif not os.access("%s/%s" % (os.getcwd(), destdir), os.F_OK): + os.makedirs("%s/%s" % (os.getcwd(), destdir)) + cmd = 'cp -pPR %s %s/%s/' % (file, os.getcwd(), destdir) + else: + (type, host, path, user, pswd, parm) = bb.decodeurl(url) + if not 'patch' in parm: + # The "destdir" handling was specifically done for FILESPATH + # items. So, only do so for file:// entries. + if type == "file": + destdir = bb.decodeurl(url)[1] or "." + else: + destdir = "." + bb.mkdirhier("%s/%s" % (os.getcwd(), destdir)) + cmd = 'cp %s %s/%s/' % (file, os.getcwd(), destdir) + + if not cmd: + return True + + dest = os.path.join(os.getcwd(), os.path.basename(file)) + if os.path.exists(dest): + if os.path.samefile(file, dest): + return True + + cmd = "PATH=\"%s\" %s" % (bb.data.getVar('PATH', data, 1), cmd) + bb.note("Unpacking %s to %s/" % (file, os.getcwd())) + ret = os.system(cmd) + return ret == 0 + +addtask unpack after do_fetch +do_unpack[dirs] = "${WORKDIR}" +python base_do_unpack() { + import re, os + + localdata = bb.data.createCopy(d) + bb.data.update_data(localdata) + + src_uri = bb.data.getVar('SRC_URI', localdata) + if not src_uri: + return + src_uri = bb.data.expand(src_uri, localdata) + for url in src_uri.split(): + try: + local = bb.data.expand(bb.fetch.localpath(url, localdata), localdata) + except bb.MalformedUrl, e: + raise FuncFailed('Unable to generate local path for malformed uri: %s' % e) + # dont need any parameters for extraction, strip them off + local = re.sub(';.*$', '', local) + local = os.path.realpath(local) + ret = oe_unpack_file(local, localdata, url) + if not ret: + raise bb.build.FuncFailed() +} + +addtask patch after do_unpack +do_patch[dirs] = "${WORKDIR}" +python base_do_patch() { + import re + import bb.fetch + + src_uri = (bb.data.getVar('SRC_URI', d, 1) or '').split() + if not src_uri: + return + + patchcleancmd = bb.data.getVar('PATCHCLEANCMD', d, 1) + if patchcleancmd: + bb.data.setVar("do_patchcleancmd", patchcleancmd, d) + bb.data.setVarFlag("do_patchcleancmd", "func", 1, d) + bb.build.exec_func("do_patchcleancmd", d) + + workdir = bb.data.getVar('WORKDIR', d, 1) + for url in src_uri: + + (type, host, path, user, pswd, parm) = bb.decodeurl(url) + if not "patch" in parm: + continue + + bb.fetch.init([url],d) + url = bb.encodeurl((type, host, path, user, pswd, [])) + local = os.path.join('/', bb.fetch.localpath(url, d)) + + # did it need to be unpacked? + dots = os.path.basename(local).split(".") + if dots[-1] in ['gz', 'bz2', 'Z']: + unpacked = os.path.join(bb.data.getVar('WORKDIR', d),'.'.join(dots[0:-1])) + else: + unpacked = local + unpacked = bb.data.expand(unpacked, d) + + if "pnum" in parm: + pnum = parm["pnum"] + else: + pnum = "1" + + if "pname" in parm: + pname = parm["pname"] + else: + pname = os.path.basename(unpacked) + + if "mindate" in parm: + mindate = parm["mindate"] + else: + mindate = 0 + + if "maxdate" in parm: + maxdate = parm["maxdate"] + else: + maxdate = "20711226" + + pn = bb.data.getVar('PN', d, 1) + srcdate = bb.data.getVar('SRCDATE_%s' % pn, d, 1) + + if not srcdate: + srcdate = bb.data.getVar('SRCDATE', d, 1) + + if srcdate == "now": + srcdate = bb.data.getVar('DATE', d, 1) + + if (maxdate < srcdate) or (mindate > srcdate): + if (maxdate < srcdate): + bb.note("Patch '%s' is outdated" % pname) + + if (mindate > srcdate): + bb.note("Patch '%s' is predated" % pname) + + continue + + bb.note("Applying patch '%s'" % pname) + bb.data.setVar("do_patchcmd", bb.data.getVar("PATCHCMD", d, 1) % (pnum, pname, unpacked), d) + bb.data.setVarFlag("do_patchcmd", "func", 1, d) + bb.data.setVarFlag("do_patchcmd", "dirs", "${WORKDIR} ${S}", d) + bb.build.exec_func("do_patchcmd", d) +} + + +addhandler base_eventhandler +python base_eventhandler() { + from bb import note, error, data + from bb.event import Handled, NotHandled, getName + import os + + messages = {} + messages["Completed"] = "completed" + messages["Succeeded"] = "completed" + messages["Started"] = "started" + messages["Failed"] = "failed" + + name = getName(e) + msg = "" + if name.startswith("Pkg"): + msg += "package %s: " % data.getVar("P", e.data, 1) + msg += messages.get(name[3:]) or name[3:] + elif name.startswith("Task"): + msg += "package %s: task %s: " % (data.getVar("PF", e.data, 1), e.task) + msg += messages.get(name[4:]) or name[4:] + elif name.startswith("Build"): + msg += "build %s: " % e.name + msg += messages.get(name[5:]) or name[5:] + elif name == "UnsatisfiedDep": + msg += "package %s: dependency %s %s" % (e.pkg, e.dep, name[:-3].lower()) + note(msg) + + if name.startswith("BuildStarted"): + bb.data.setVar( 'BB_VERSION', bb.__version__, e.data ) + path_to_bbfiles = bb.data.getVar( 'BBFILES', e.data, 1 ) + path_to_packages = path_to_bbfiles[:path_to_bbfiles.rindex( "packages" )] + monotone_revision = "<unknown>" + try: + monotone_revision = file( "%s/_MTN/revision" % path_to_packages ).read().strip() + except IOError: + pass + bb.data.setVar( 'OE_REVISION', monotone_revision, e.data ) + statusvars = ['BB_VERSION', 'OE_REVISION', 'TARGET_ARCH', 'TARGET_OS', 'MACHINE', 'DISTRO', 'DISTRO_VERSION','TARGET_FPU'] + statuslines = ["%-14s = \"%s\"" % (i, bb.data.getVar(i, e.data, 1) or '') for i in statusvars] + statusmsg = "\nOE Build Configuration:\n%s\n" % '\n'.join(statuslines) + print statusmsg + + needed_vars = [ "TARGET_ARCH", "TARGET_OS" ] + pesteruser = [] + for v in needed_vars: + val = bb.data.getVar(v, e.data, 1) + if not val or val == 'INVALID': + pesteruser.append(v) + if pesteruser: + bb.fatal('The following variable(s) were not set: %s\nPlease set them directly, or choose a MACHINE or DISTRO that sets them.' % ', '.join(pesteruser)) + + if not data in e.__dict__: + return NotHandled + + log = data.getVar("EVENTLOG", e.data, 1) + if log: + logfile = file(log, "a") + logfile.write("%s\n" % msg) + logfile.close() + + return NotHandled +} + +addtask configure after do_unpack do_patch +do_configure[dirs] = "${S} ${B}" +do_configure[bbdepcmd] = "do_populate_staging" +base_do_configure() { + : +} + +addtask compile after do_configure +do_compile[dirs] = "${S} ${B}" +do_compile[bbdepcmd] = "do_populate_staging" +base_do_compile() { + if [ -e Makefile -o -e makefile ]; then + oe_runmake || die "make failed" + else + oenote "nothing to compile" + fi +} + + +addtask stage after do_compile +base_do_stage () { + : +} + +do_populate_staging[dirs] = "${STAGING_DIR}/${TARGET_SYS}/bin ${STAGING_DIR}/${TARGET_SYS}/lib \ + ${STAGING_DIR}/${TARGET_SYS}/include \ + ${STAGING_DIR}/${BUILD_SYS}/bin ${STAGING_DIR}/${BUILD_SYS}/lib \ + ${STAGING_DIR}/${BUILD_SYS}/include \ + ${STAGING_DATADIR} \ + ${S} ${B}" + +addtask populate_staging after do_compile + +python do_populate_staging () { + bb.build.exec_func('do_stage', d) +} + +addtask install after do_compile +do_install[dirs] = "${S} ${B}" + +base_do_install() { + : +} + +base_do_package() { + : +} + +addtask build after do_populate_staging +do_build = "" +do_build[func] = "1" + +# Functions that update metadata based on files outputted +# during the build process. + +SHLIBS = "" +RDEPENDS_prepend = " ${SHLIBS}" + +def explode_deps(s): + r = [] + l = s.split() + flag = False + for i in l: + if i[0] == '(': + flag = True + j = [] + if flag: + j.append(i) + if i.endswith(')'): + flag = False + r[-1] += ' ' + ' '.join(j) + else: + r.append(i) + return r + +python read_shlibdeps () { + packages = (bb.data.getVar('PACKAGES', d, 1) or "").split() + for pkg in packages: + rdepends = explode_deps(bb.data.getVar('RDEPENDS_' + pkg, d, 0) or bb.data.getVar('RDEPENDS', d, 0) or "") + shlibsfile = bb.data.expand("${WORKDIR}/install/" + pkg + ".shlibdeps", d) + if os.access(shlibsfile, os.R_OK): + fd = file(shlibsfile) + lines = fd.readlines() + fd.close() + for l in lines: + rdepends.append(l.rstrip()) + pcfile = bb.data.expand("${WORKDIR}/install/" + pkg + ".pcdeps", d) + if os.access(pcfile, os.R_OK): + fd = file(pcfile) + lines = fd.readlines() + fd.close() + for l in lines: + rdepends.append(l.rstrip()) + bb.data.setVar('RDEPENDS_' + pkg, " " + " ".join(rdepends), d) +} + +python read_subpackage_metadata () { + import re + + def decode(str): + import codecs + c = codecs.getdecoder("string_escape") + return c(str)[0] + + data_file = bb.data.expand("${WORKDIR}/install/${PN}.package", d) + if os.access(data_file, os.R_OK): + f = file(data_file, 'r') + lines = f.readlines() + f.close() + r = re.compile("([^:]+):\s*(.*)") + for l in lines: + m = r.match(l) + if m: + bb.data.setVar(m.group(1), decode(m.group(2)), d) +} + +python __anonymous () { + import exceptions + need_host = bb.data.getVar('COMPATIBLE_HOST', d, 1) + if need_host: + import re + this_host = bb.data.getVar('HOST_SYS', d, 1) + if not re.match(need_host, this_host): + raise bb.parse.SkipPackage("incompatible with host %s" % this_host) + + need_machine = bb.data.getVar('COMPATIBLE_MACHINE', d, 1) + if need_machine: + import re + this_machine = bb.data.getVar('MACHINE', d, 1) + if this_machine and not re.match(need_machine, this_machine): + raise bb.parse.SkipPackage("incompatible with machine %s" % this_machine) + + pn = bb.data.getVar('PN', d, 1) + + srcdate = bb.data.getVar('SRCDATE_%s' % pn, d, 1) + if srcdate != None: + bb.data.setVar('SRCDATE', srcdate, d) + + use_nls = bb.data.getVar('USE_NLS_%s' % pn, d, 1) + if use_nls != None: + bb.data.setVar('USE_NLS', use_nls, d) +} + +python () { + import bb, os + mach_arch = bb.data.getVar('MACHINE_ARCH', d, 1) + old_arch = bb.data.getVar('PACKAGE_ARCH', d, 1) + if (old_arch == mach_arch): + # Nothing to do + return + if (bb.data.getVar('SRC_URI_OVERRIDES_PACKAGE_ARCH', d, 1) == '0'): + return + paths = [] + for p in [ "${FILE_DIRNAME}/${PF}", "${FILE_DIRNAME}/${P}", "${FILE_DIRNAME}/${PN}", "${FILE_DIRNAME}/files", "${FILE_DIRNAME}" ]: + paths.append(bb.data.expand(os.path.join(p, mach_arch), d)) + for s in bb.data.getVar('SRC_URI', d, 1).split(): + local = bb.data.expand(bb.fetch.localpath(s, d), d) + for mp in paths: + if local.startswith(mp): +# bb.note("overriding PACKAGE_ARCH from %s to %s" % (old_arch, mach_arch)) + bb.data.setVar('PACKAGE_ARCH', mach_arch, d) + return +} + +EXPORT_FUNCTIONS do_clean do_mrproper do_fetch do_unpack do_configure do_compile do_install do_package do_patch do_populate_pkgs do_stage + +MIRRORS[func] = "0" +MIRRORS () { +${DEBIAN_MIRROR}/main http://snapshot.debian.net/archive/pool +${DEBIAN_MIRROR} ftp://ftp.de.debian.org/debian/pool +${GNU_MIRROR} ftp://mirrors.kernel.org/gnu +ftp://ftp.kernel.org/pub http://www.kernel.org/pub +ftp://ftp.kernel.org/pub ftp://ftp.us.kernel.org/pub +ftp://ftp.gnupg.org/gcrypt/ ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/ +ftp://ftp.gnupg.org/gcrypt/ ftp://ftp.surfnet.nl/pub/security/gnupg/ +ftp://dante.ctan.org/tex-archive ftp://ftp.fu-berlin.de/tex/CTAN +ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.gnutls.org/pub/gnutls/ +ftp://ftp.gnutls.org/pub/gnutls http://josefsson.org/gnutls/releases/ + + + +ftp://.*/.*/ http://www.oesources.org/source/current/ +http://.*/.*/ http://www.oesources.org/source/current/ +} + diff --git a/conf/.mtn2git_empty b/conf/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/conf/.mtn2git_empty diff --git a/conf/bitbake.conf b/conf/bitbake.conf new file mode 100644 index 0000000000..d4b56a8e4f --- /dev/null +++ b/conf/bitbake.conf @@ -0,0 +1,414 @@ +################################################################## +# Standard target filesystem paths. +################################################################## + +# Path prefixes +export base_prefix = "" +export prefix = "/usr" +export exec_prefix = "${prefix}" + +# Base paths +export base_bindir = "${base_prefix}/bin" +export base_sbindir = "${base_prefix}/sbin" +export base_libdir = "${base_prefix}/lib" + +# Architecture independent paths +export datadir = "${prefix}/share" +export sysconfdir = "/etc" +export sharedstatedir = "${prefix}/com" +export localstatedir = "/var" +export infodir = "${datadir}/info" +export mandir = "${datadir}/man" +export docdir = "${datadir}/doc" +export servicedir = "/srv" + +# Architecture dependent paths +export bindir = "${exec_prefix}/bin" +export sbindir = "${exec_prefix}/sbin" +export libexecdir = "${exec_prefix}/libexec" +export libdir = "${exec_prefix}/lib" +export includedir = "${exec_prefix}/include" +export oldincludedir = "${exec_prefix}/include" + +################################################################## +# Architecture-dependent build variables. +################################################################## + +BUILD_ARCH = "${@os.uname()[4]}" +BUILD_OS = "${@os.uname()[0].lower()}" +BUILD_VENDOR = "" +BUILD_SYS = "${BUILD_ARCH}${BUILD_VENDOR}-${BUILD_OS}" +BUILD_PREFIX = "" +BUILD_CC_ARCH = "" + +HOST_ARCH = "${TARGET_ARCH}" +HOST_OS = "${TARGET_OS}" +HOST_VENDOR = "${TARGET_VENDOR}" +HOST_SYS = "${HOST_ARCH}${HOST_VENDOR}-${HOST_OS}" +HOST_PREFIX = "${TARGET_PREFIX}" +HOST_CC_ARCH = "${TARGET_CC_ARCH}" + +TARGET_ARCH = "INVALID" +TARGET_OS = "INVALID" +TARGET_VENDOR = "${BUILD_VENDOR}" +TARGET_SYS = "${TARGET_ARCH}${TARGET_VENDOR}${@['-' + bb.data.getVar('TARGET_OS', d, 1), ''][bb.data.getVar('TARGET_OS', d, 1) == ('' or 'custom')]}" +TARGET_PREFIX = "${TARGET_SYS}-" +TARGET_CC_ARCH = "" + +PACKAGE_ARCH = "${HOST_ARCH}" +MACHINE_ARCH = "${@[bb.data.getVar('HOST_ARCH', d, 1), bb.data.getVar('MACHINE', d, 1)][bool(bb.data.getVar('MACHINE', d, 1))]}" +IPKG_ARCHS = "all any noarch ${TARGET_ARCH} ${IPKG_EXTRA_ARCHS} ${MACHINE}" + +################################################################## +# Date/time variables. +################################################################## + +DATE := "${@time.strftime('%Y%m%d',time.gmtime())}" +TIME := "${@time.strftime('%H%M%S',time.gmtime())}" +DATETIME = "${DATE}${TIME}" + +################################################################## +# Package default variables. +################################################################## + +PN = "${@bb.parse.BBHandler.vars_from_file(bb.data.getVar('FILE',d),d)[0] or 'defaultpkgname'}" +PV = "${@bb.parse.BBHandler.vars_from_file(bb.data.getVar('FILE',d),d)[1] or '1.0'}" +PR = "${@bb.parse.BBHandler.vars_from_file(bb.data.getVar('FILE',d),d)[2] or 'r0'}" +PF = "${PN}-${PV}-${PR}" +P = "${PN}-${PV}" + +# Package info. + +SECTION = "base" +PRIORITY = "optional" +DESCRIPTION = "Version ${PV}-${PR} of package ${PN}" +LICENSE = "unknown" +MAINTAINER = "OpenEmbedded Team <openembedded-devel@lists.openembedded.org>" +HOMEPAGE = "unknown" + +# Package dependencies and provides. + +DEPENDS = "" +RDEPENDS = "" +PROVIDES = "" +PROVIDES_prepend = "${P} ${PF} ${PN} " +RPROVIDES = "" + +PACKAGES = "${PN}-dbg ${PN} ${PN}-doc ${PN}-dev ${PN}-locale" +FILES = "" +FILES_${PN} = "${bindir}/* ${sbindir}/* ${libexecdir}/* ${libdir}/lib*.so.* \ + ${sysconfdir} ${sharedstatedir} ${localstatedir} \ + /bin/* /sbin/* /lib/*.so* ${datadir}/${PN} ${libdir}/${PN} \ + ${datadir}/pixmaps ${datadir}/applications \ + ${datadir}/idl ${datadir}/omf ${datadir}/sounds \ + ${libdir}/bonobo/servers" +SECTION_${PN}-doc = "doc" +FILES_${PN}-doc = "${docdir} ${mandir} ${infodir} ${datadir}/gtk-doc \ + ${datadir}/gnome/help" +SECTION_${PN}-dev = "devel" +FILES_${PN}-dev = "${includedir} ${libdir}/lib*.so ${libdir}/*.la \ + ${libdir}/*.a ${libdir}/*.o ${libdir}/pkgconfig \ + /lib/*.a /lib/*.o ${datadir}/aclocal" +FILES_${PN}-locale = "${datadir}/locale" +FILES_${PN}-dbg = "${bindir}/.debug ${sbindir}/.debug ${libexecdir}/.debug ${libdir}/.debug \ + /bin/.debug /sbin/.debug /lib/.debug ${libdir}/${PN}/.debug" + +# File manifest + +export MANIFEST = "${FILESDIR}/manifest" + +FILE_DIRNAME = "${@os.path.dirname(bb.data.getVar('FILE', d))}" +FILESPATH = "${FILE_DIRNAME}/${PF}:${FILE_DIRNAME}/${P}:${FILE_DIRNAME}/${PN}:${FILE_DIRNAME}/files:${FILE_DIRNAME}" +FILESDIR = "${@bb.which(bb.data.getVar('FILESPATH', d, 1), '.')}" + +################################################################## +# General work and output directories for the build system. +################################################################## + +TMPDIR = "${TOPDIR}/tmp" +CACHE = "${TMPDIR}/cache" +DL_DIR = "${TMPDIR}/downloads" +CVSDIR = "${DL_DIR}/cvs" +SVNDIR = "${DL_DIR}/svn" +GITDIR = "${DL_DIR}/git" + +STAMP = "${TMPDIR}/stamps/${PF}" +WORKDIR = "${TMPDIR}/work/${PF}" +T = "${WORKDIR}/temp" +D = "${WORKDIR}/image" +S = "${WORKDIR}/${P}" +B = "${S}" + +STAGING_DIR = "${TMPDIR}/staging" +STAGING_BINDIR = "${STAGING_DIR}/${BUILD_SYS}/bin" +STAGING_LIBDIR = "${STAGING_DIR}/${HOST_SYS}/lib" +STAGING_INCDIR = "${STAGING_DIR}/${HOST_SYS}/include" +STAGING_DATADIR = "${STAGING_DIR}/${HOST_SYS}/share" +STAGING_LOADER_DIR = "${STAGING_DIR}/${HOST_SYS}/loader" +STAGING_PYDIR = "${STAGING_DIR}/lib/python2.4" + +DEPLOY_DIR = "${TMPDIR}/deploy" +DEPLOY_DIR_TAR = "${DEPLOY_DIR}/tar" +DEPLOY_DIR_IPK = "${DEPLOY_DIR}/ipk" +DEPLOY_DIR_RPM = "${DEPLOY_DIR}/rpm" + +################################################################## +# Kernel info. +################################################################## + +OLDEST_KERNEL = "2.4.0" +STAGING_KERNEL_DIR = "${STAGING_DIR}/${HOST_SYS}/kernel" + +################################################################## +# Specific image creation and rootfs population info. +################################################################## + +DEPLOY_DIR_IMAGE = "${DEPLOY_DIR}/images" +IMAGE_ROOTFS = "${TMPDIR}/rootfs" +IMAGE_BASENAME = "rootfs" +IMAGE_NAME = "${IMAGE_BASENAME}-${MACHINE}-${DATETIME}" +IMAGE_CMD = "" +IMAGE_CMD_jffs2 = "mkfs.jffs2 --root=${IMAGE_ROOTFS} --faketime \ + --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \ + ${EXTRA_IMAGECMD}" +IMAGE_CMD_cramfs = "mkcramfs ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.cramfs ${EXTRA_IMAGECMD}" +IMAGE_CMD_ext2 = "genext2fs -b ${IMAGE_ROOTFS_SIZE} -d ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext2 ${EXTRA_IMAGECMD}" +IMAGE_CMD_ext2.gz = "mkdir ${DEPLOY_DIR_IMAGE}/tmp.gz; genext2fs -b ${IMAGE_ROOTFS_SIZE} -d ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/tmp.gz/${IMAGE_NAME}.rootfs.ext2 ${EXTRA_IMAGECMD}; gzip -f -9 ${DEPLOY_DIR_IMAGE}/tmp.gz/${IMAGE_NAME}.rootfs.ext2; mv ${DEPLOY_DIR_IMAGE}/tmp.gz/${IMAGE_NAME}.rootfs.ext2.gz ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext2.gz; rmdir ${DEPLOY_DIR_IMAGE}/tmp.gz" +IMAGE_CMD_squashfs = "mksquashfs ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.squashfs ${EXTRA_IMAGECMD} -noappend" +IMAGE_CMD_tar = "cd ${IMAGE_ROOTFS} && tar -jcvf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.tar.bz2 ." +IMAGE_CMD_tar.gz = "cd ${IMAGE_ROOTFS} && tar -zcvf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.tar.gz ." +IMAGE_CMD_tar.bz2 = "cd ${IMAGE_ROOTFS} && tar -jcvf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.tar.bz2 ." +EXTRA_IMAGECMD = "" +EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x40000" +EXTRA_IMAGECMD_squashfs = "-le -b 16384" +IMAGE_ROOTFS_SIZE_ext2 = "65536" +IMAGE_ROOTFS_SIZE_ext2.gz = "65536" + +IMAGE_DEPENDS = "" +IMAGE_DEPENDS_jffs2 = "mtd-utils-native" +IMAGE_DEPENDS_cramfs = "cramfs-native" +IMAGE_DEPENDS_ext2 = "genext2fs-native" +IMAGE_DEPENDS_ext2.gz = "genext2fs-native" +IMAGE_DEPENDS_squashfs = "squashfs-tools-native" +EXTRA_IMAGEDEPENDS = "" + +################################################################## +# Toolchain info. +################################################################## + +CROSS_DIR = "${TMPDIR}/cross" +CROSS_DATADIR = "${CROSS_DIR}/share" +export PATH_prepend = "${STAGING_BINDIR}/${HOST_SYS}:${STAGING_BINDIR}:${CROSS_DIR}/bin:" + +################################################################## +# Build utility info. +################################################################## + +CCACHE = "${@bb.which(bb.data.getVar('PATH', d), 'ccache') and 'ccache '}" + +export CC = "${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}" +export CXX = "${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}" +export F77 = "${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}" +export CPP = "${HOST_PREFIX}gcc -E" +export LD = "${HOST_PREFIX}ld" +export CCLD = "${CC}" +export AR = "${HOST_PREFIX}ar" +export AS = "${HOST_PREFIX}as" +export RANLIB = "${HOST_PREFIX}ranlib" +export STRIP = "${HOST_PREFIX}strip" +export OBJCOPY = "${HOST_PREFIX}objcopy" + +export BUILD_CC = "${CCACHE}${BUILD_PREFIX}gcc ${BUILD_CC_ARCH}" +export BUILD_CXX = "${CCACHE}${BUILD_PREFIX}g++ ${BUILD_CC_ARCH}" +export BUILD_F77 = "${CCACHE}${BUILD_PREFIX}g77 ${BUILD_CC_ARCH}" +export BUILD_CPP = "${BUILD_PREFIX}cpp" +export BUILD_LD = "${BUILD_PREFIX}ld" +export BUILD_CCLD = "${BUILD_PREFIX}gcc" +export BUILD_AR = "${BUILD_PREFIX}ar" +export BUILD_RANLIB = "${BUILD_PREFIX}ranlib" +export BUILD_STRIP = "${BUILD_PREFIX}strip" + +export MAKE = "make" +EXTRA_OEMAKE = "-e MAKEFLAGS=" + +################################################################## +# Patch handling. +################################################################## +PATCHTOOL = 'quilt' +PATCHRESOLVE = 'user' + +################################################################## +# Build flags and options. +################################################################## + +export BUILD_CPPFLAGS = "-isystem${STAGING_DIR}/${BUILD_SYS}/include" +export CPPFLAGS = "${TARGET_CPPFLAGS}" +export TARGET_CPPFLAGS = "-isystem${STAGING_DIR}/${TARGET_SYS}/include" + +export BUILD_CFLAGS = "${BUILD_CPPFLAGS} ${BUILD_OPTIMIZATION}" +export CFLAGS = "${TARGET_CFLAGS}" +export TARGET_CFLAGS = "${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}" + +export BUILD_CXXFLAGS = "${BUILD_CFLAGS} -fpermissive" +export CXXFLAGS = "${TARGET_CXXFLAGS}" +export TARGET_CXXFLAGS = "${TARGET_CFLAGS} -fpermissive" + +export BUILD_LDFLAGS = "-L${STAGING_DIR}/${BUILD_SYS}/lib \ + -Wl,-rpath-link,${STAGING_DIR}/${BUILD_SYS}/lib \ + -Wl,-rpath,${STAGING_DIR}/${BUILD_SYS}/lib -Wl,-O1" +export LDFLAGS = "${TARGET_LDFLAGS}" +export TARGET_LDFLAGS = "-L${STAGING_DIR}/${TARGET_SYS}/lib \ + -Wl,-rpath-link,${STAGING_DIR}/${TARGET_SYS}/lib \ + -Wl,-O1" + +# Which flags to leave by strip-flags() in bin/build/oebuild.sh ? +ALLOWED_FLAGS = "-O -mcpu -march -pipe" + +# Pass parallel make options to the compile task only +EXTRA_OEMAKE_prepend_task_do_compile = "${PARALLEL_MAKE} " + +################################################################## +# Optimization flags. +################################################################## + +FULL_OPTIMIZATION = "-fexpensive-optimizations -fomit-frame-pointer -frename-registers -O2" +DEBUG_OPTIMIZATION = "-O -g" +SELECTED_OPTIMIZATION = "${@bb.data.getVar(['FULL_OPTIMIZATION', 'DEBUG_OPTIMIZATION'][bb.data.getVar('DEBUG_BUILD', d, 1) == '1'], d, 1)}" +BUILD_OPTIMIZATION = "-O2" + +################################################################## +# Bootstrap stuff. +################################################################## + +BOOTSTRAP_EXTRA_RDEPENDS = "" +BOOTSTRAP_EXTRA_RRECOMMENDS = "" + +################################################################## +# Palmtop stuff. +################################################################## + +export QTDIR = "${STAGING_DIR}/${HOST_SYS}/qt2" +export QPEDIR = "${STAGING_DIR}/${HOST_SYS}" +export OPIEDIR = "${STAGING_DIR}/${HOST_SYS}" +export palmtopdir = "/opt/QtPalmtop" +export palmqtdir = "/opt/QtPalmtop" + +################################################################## +# Download locations and utilities. +################################################################## + +GNU_MIRROR = "ftp://ftp.gnu.org/gnu" +DEBIAN_MIRROR = "ftp://ftp.debian.org/debian/pool" +SOURCEFORGE_MIRROR = "http://heanet.dl.sourceforge.net/sourceforge" +GPE_MIRROR = "http://handhelds.org/pub/projects/gpe/source" +XLIBS_MIRROR = "http://xlibs.freedesktop.org/release" +XORG_MIRROR = "http://xorg.freedesktop.org/releases" +GNOME_MIRROR = "http://ftp.gnome.org/pub/GNOME/sources" +FREEBSD_MIRROR = "ftp://ftp.freebsd.org/pub/FreeBSD/" +HANDHELDS_CVS = "cvs://anoncvs:anoncvs@anoncvs.handhelds.org/cvs" +E_CVS = "cvs://anonymous@anoncvs.enlightenment.org/var/cvs/e" +E_URI = "http://enlightenment.freedesktop.org/files" +FREEDESKTOP_CVS = "cvs://anoncvs:anoncvs@anoncvs.freedesktop.org/cvs" +GENTOO_MIRROR = "http://distro.ibiblio.org/pub/linux/distributions/gentoo/distfiles" +APACHE_MIRROR = "http://www.apache.org/dist" + +# You can use the mirror of your country to get faster downloads by putting +# export DEBIAN_MIRROR = "ftp://ftp.de.debian.org/debian/pool" +# export SOURCEFORGE_MIRROR = "http://belnet.dl.sourceforge.net/sourceforge" +# into your local.conf + +FETCHCOMMAND = "ERROR, this must be a BitBake bug" +FETCHCOMMAND_wget = "/usr/bin/env wget --timeout=30 -t 3 --passive-ftp -P ${DL_DIR} ${URI}" +FETCHCOMMAND_cvs = "/usr/bin/env cvs -d${CVSROOT} co ${CVSCOOPTS} ${CVSMODULE}" +FETCHCOMMAND_svn = "/usr/bin/env svn co ${SVNCOOPTS} ${SVNROOT} ${SVNMODULE}" +RESUMECOMMAND = "ERROR, this must be a BitBake bug" +RESUMECOMMAND_wget = "/usr/bin/env wget -c --timeout=30 -t 3 --passive-ftp -P ${DL_DIR} ${URI}" +UPDATECOMMAND = "ERROR, this must be a BitBake bug" +UPDATECOMMAND_cvs = "/usr/bin/env cvs -d${CVSROOT} update -d -P ${CVSCOOPTS}" +UPDATECOMMAND_svn = "/usr/bin/env svn update ${SVNCOOPTS}" +SRCDATE = "${DATE}" + +SRC_URI = "file://${FILE}" + +################################################################## +# Miscellaneous utilities. +################################################################## + +MKTEMPDIRCMD = "mktemp -d -q ${TMPBASE}" +MKTEMPCMD = "mktemp -q ${TMPBASE}" + +# GNU patch tries to be intellgent about checking out read-only files from +# a RCS, which freaks out those special folks with active Perforce clients +# the following makes patch ignore RCS: + +export PATCH_GET=0 + +# Program to be used to build ipkg packages + +IPKGBUILDCMD = "ipkg-build -o 0 -g 0" + +################################################################## +# Not sure about the rest of this yet. +################################################################## + +# slot - currently unused by OE. portage remnants +SLOT = "0" + +# Other + +export PKG_CONFIG_PATH = "${STAGING_DATADIR}/pkgconfig" +export PKG_CONFIG_DISABLE_UNINSTALLED = "yes" + +export QMAKE_MKSPEC_PATH = "${STAGING_DIR}/${BUILD_SYS}/share/qmake" +export STAGING_SIPDIR = "${STAGING_DIR}/${BUILD_SYS}/share/sip" +export STAGING_IDLDIR = "${STAGING_DATADIR}/idl" + +# default test results for autoconf +# possible candidate for moving into autotools.oeclass -CL +export CONFIG_SITE = "${@bb.which(bb.data.getVar('BBPATH', d, 1), 'site/%s-%s' % (bb.data.getVar('HOST_ARCH', d, 1), bb.data.getVar('HOST_OS', d, 1)))}" + +# library package naming +AUTO_LIBNAME_PKGS = "${PACKAGES}" + +### +### Config file processing +### + +# This means that an envionment variable named '<foo>_arm' overrides an +# environment variable '<foo>' (when ${TARGET_ARCH} is arm). And the same: an +# environment variable '<foo>_ramses' overrides both '<foo>' and '<foo>_arm +# when ${MACHINE} is 'ramses'. And finally '<foo>_local' overrides anything. +# +# This works for functions as well, they are really just environment variables. +#OVERRIDES = "local:${MACHINE}:${DISTRO}:${TARGET_OS}:${TARGET_ARCH}:build-${BUILD_OS}" +# Alternative OVERRIDES to make compilation fail fast, we will enable it by default soon +OVERRIDES = "local:${MACHINE}:${DISTRO}:${TARGET_OS}:${TARGET_ARCH}:build-${BUILD_OS}:fail-fast:pn-${PN}" + +################################################################## +# Include the rest of the config files. +################################################################## + +include conf/site.conf +include conf/auto.conf +include conf/local.conf +include conf/build/${BUILD_SYS}.conf +include conf/target/${TARGET_SYS}.conf +include conf/machine/${MACHINE}.conf +include conf/distro/${DISTRO}.conf +include conf/documentation.conf + + +################################################################## +# Weak variables (usually to retain backwards compatibility) +################################################################## + +IMAGE_FSTYPES ?= "jffs2" +PCMCIA_MANAGER ?= "pcmcia-cs" +MACHINE_TASK_PROVIDER ?= "task-bootstrap" + + + +################################################################## +# Magic Cookie for SANITY CHECK +################################################################## +BITBAKETEST_BITBAKE_CONF = "1" diff --git a/conf/local.conf b/conf/local.conf new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/conf/local.conf diff --git a/conf/testrun.conf.sample b/conf/testrun.conf.sample new file mode 100644 index 0000000000..9f95fa3226 --- /dev/null +++ b/conf/testrun.conf.sample @@ -0,0 +1,9 @@ +# Point to the OpenEmbedded packages +BBFILES := "${HOME}/org.openembedded.dev/packages/*/*.bb" + +# Configurations to run tests for +# Each configurations consists out of a three tuple +# (TARGET_ARCH,TARGET_OS,DISTRO,[MACHINE1.MACHINE2]) +TEST_CONFIGS = "(arm,linux,angstrom-2007.1,[h3600.h3900]) (arm,linux,openzaurus-unstable,[collie.c7x0])" + + diff --git a/doc/.mtn2git_empty b/doc/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/doc/.mtn2git_empty diff --git a/doc/ADD_YOUR_CHECK b/doc/ADD_YOUR_CHECK new file mode 100644 index 0000000000..d2408dd21d --- /dev/null +++ b/doc/ADD_YOUR_CHECK @@ -0,0 +1,7 @@ +To create your own check + - Copy the example directory which is inside modules + - Give your module a name + - Add the name of your directory to __all_tests__ in + lib/bittest/__init__.py + +Now have fun to write a clever test! diff --git a/doc/README b/doc/README new file mode 100644 index 0000000000..642628ec9b --- /dev/null +++ b/doc/README @@ -0,0 +1,24 @@ +Bitbake QA will hold Quality Assurance Resources: + The primary user will be OpenEmbedded but it is useful +for any other user bitbake as well. + +layout of the bitbake_qa module: +conf/ + It contains example configurations used to run tests +with specified parameters (for overrides) + +doc/ + This directory + +modules/module_name/ + QA modules doing the actual tests + + +I hope to offer the following tests soon: + +source_checker - It will check if the sources can still be fetched + and generates reports +patch_checker - It will check if the patches still applies +doc_checker - It will check if all variables have a documentation +content_checker - It will check for common misusage in variables +depends_checker - Check if native packages RDEPEND on non-native packages diff --git a/lib/.mtn2git_empty b/lib/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/.mtn2git_empty diff --git a/lib/bittest/.mtn2git_empty b/lib/bittest/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/bittest/.mtn2git_empty diff --git a/lib/bittest/__init__.py b/lib/bittest/__init__.py new file mode 100644 index 0000000000..7980d7b417 --- /dev/null +++ b/lib/bittest/__init__.py @@ -0,0 +1,176 @@ +from testresult import TestItem, TestResult +from testreport_text import TestReportText +from testreport_html import TestReportHTML +from testreport_tinder import TestReportTinder +from config import parse_test_options + +import sys, os, optparse +import bb +import bb.data +import bb.parse + + +__all__ = [ + "TestResult", + "TestItem", + "TestReportText", + "TestReportHTML", + "TestReportTinder", + +# fileparser.py + "fileparser", +# config.py + "parse_test_options", + +# in this file + "__version__", + "__all_tests__", + "__all_reports__", + "handle_options", + "_load_config", + "_get_instances", + "generate_results", + "run_tests" + +] + + +__version__ = 0.2 + +# Add your test here +__all_tests__ = ["patch_checker", + "source_checker", + "doc_checker", + "content_checker", + "depends_checker" ] + +# known reporting classes +__all_reports__ = { + "TestReportText" : TestReportText, + "TestReportHTML" : TestReportHTML, + "TestReportTinder" : TestReportTinder +} + + + +def handle_options( args ): + """ + Handle the options and return the handled options and the rest (not parsed) + """ + parser = optparse.OptionParser( version = "BitTest Bitbake Testing Tool version %s" % __version__, + usage = """%prog [options] [test ...] +Executes the specified tests or if none are given all tests. The result is printed +on the cmd line +""" ) + + parser.add_option( "-o", "--output", help = "print the output to the file", + action = "store", dest = "output", default = sys.stdout ) + parser.add_option( "-r", "--report", help = "print the report in the specified format", + action = "store", dest = "report", default = "TestReportText" ) + + options, args = parser.parse_args( args ) + + if not options.report in __all_reports__: + print "The specified report format is not available. Falling back to TestReportText" + options.report = "TestReportText" + + if not type(options.output) == type(sys.stdout): + """ Create a file """ + options.output = file(options.output, "w") + + return options, args[1:] + + +def _load_config(file): + """ + load a config file into a bb.data instance + """ + try: + return bb.parse.handle(os.path.join('conf', file), bb.data.init() ) + except IOError, e: + return None + + +def _get_instances(tests): + test_inst = {} + + # create instances + for test in tests: + test_inst[test] = __import__(test).create_test() + + return test_inst + + +def generate_results(test_results, options): + for result in test_results: + res = test_results[result] + res.test_reporter().init(res) + res.test_reporter().print_result() + + +def run_tests(data,test_config,test_options, tests, options): + """ + Run tests using 'data' as base + """ + + bbfiles = fileparser.find_files(bb.data.getVar('BBFILES', test_config).split(' ')) + bb.note("Collected %d BitBake files" % len(bbfiles) ) + + tmp_dir = os.path.join(os.getcwd(),'tmp') + src_dir = os.path.join(os.getcwd(),'tmp_sources') + bb.mkdirhier(tmp_dir) + bb.mkdirhier(src_dir) + + # now run the tests for each test + test_results = {} + test_instances = _get_instances(tests) + + # Create the TestResult container and initialize the Report + for test in test_instances: + test_results[test] = TestResult(test_instances[test].test_name(), __all_reports__[options.report](test_config, test, options.output) ) + + for bbfile in bbfiles: + + # now we do it for each configuration... + for (arch,os1,distro,machines) in test_options: + test_data = bb.data.createCopy(data) + bb.data.setVar('TARGET_ARCH', arch, test_data) + bb.data.setVar('TARGET_OS', os1, test_data) + bb.data.setVar('DISTRO', distro, test_data) + + # include the distro + bb.parse.handle(os.path.join('conf/distro',distro+'.conf'),test_data,1) + + # now for each machine and we can finally run the tests + for machine in machines: + machine_data = bb.data.createCopy(test_data) + bb.data.setVar('MACHINE', machine, machine_data) + + try: + bb.parse.handle(os.path.join('conf/machine',machine+'.conf'),machine_data,1) + except: + bb.note("Machine %s is not known" % machine) + + try: + bb_data = bb.parse.handle(bbfile, bb.data.createCopy(machine_data)) + except bb.parse.SkipPackage: + bb.note("Skipping Package %s" % bbfile) + continue + except Exception, e: + bb.note("Error on parsing: %s:%s" % (bbfile, e)) + continue + + # run the testcases now + for test in test_instances: + test_run = bb.data.createCopy(bb_data) + + # be sure these variables are set + bb.data.setVar('TMPDIR', tmp_dir, test_run) + bb.data.setVar('DL_DIR', src_dir, test_run) + + + bb.data.update_data(test_run) +# print "Running test for %s with machine: %s and distro: %s" % (bb.data.getVar('PN', test_run, True), machine, distro) + test_results[test].insert_result(test_instances[test].test(bbfile, test_run)) + + return test_results diff --git a/lib/bittest/config.py b/lib/bittest/config.py new file mode 100644 index 0000000000..ea1dfc37d5 --- /dev/null +++ b/lib/bittest/config.py @@ -0,0 +1,79 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Config Utility to parse bitttest/doctest related configuration resources +""" + +__version__ = 0.2 + +import bb + +def __build_array(string): + """ + Build an array out of the string [abc.def] + """ + ar = [] + tmp = string.split('.') + + for item in tmp: + ar.append( item.strip().strip('[').strip(']').strip() ) + + return ar + +def parse_test_options(cfg): + """ + Parse the test options from the TEST_CONFIGS key normally found in the + testrun.conf + """ + + config = [] + data = bb.data.getVar('TEST_CONFIGS', cfg) + data = data.split(' ') + + for tuple in data: + # Lame ass splitting + g = tuple.split(',') + # Split the tuple by hand + a = g[0].strip().strip('(').strip() + b = g[1].strip() + c = g[2].strip() + + # [a.b] + d = __build_array(g[3].strip(')').strip()) + + # now append + config.append( (a,b,c,d) ) + + return config diff --git a/lib/bittest/fileparser.py b/lib/bittest/fileparser.py new file mode 100644 index 0000000000..576215e1e2 --- /dev/null +++ b/lib/bittest/fileparser.py @@ -0,0 +1,62 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os, glob + +__version__ = "0.0" + +def __find_files( path ): + """ + BitBake does not offer a find_files implementation + so we copy and paste it here :( + """ + findcmd = 'find ' + path + ' -name *.bb | grep -v SCCS/' + try: + finddata = os.popen(findcmd) + except OSError: + return [] + return finddata.readlines() + +def find_files(files): + lst = [] + + for file in files: + if os.path.isdir(file): + d_files = __find_files(f) + if d_files: + lst += d_files + else: + lst += glob.glob(file) or [ file ] + + return lst diff --git a/lib/bittest/testreport_html.py b/lib/bittest/testreport_html.py new file mode 100644 index 0000000000..f9241edc2d --- /dev/null +++ b/lib/bittest/testreport_html.py @@ -0,0 +1,120 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005, 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +__version__ = "0.0" + +import os, sys + +class HTMLPage: + """ + Small utility to create a HTML report page + """ + def __init__(self): + self.header = "" + self.config = "" + self.summary = [] + self.passed = [] + self.failed = [] + + def open(self, title): + """ + The header is taken from JHBuild + """ + self.header = """<html> + <head> + <title>%(title)s</title> + <style type="text/css"> + .section { + margin-after: 1.5em; + } + .success { + color: black; + background-color: #afa; + } + .failure { + color: black; + background-color: #faa; + } + </style> + </head> +""" + pass + + def add_head(self, config): + pass + + def add_summary(self, count, passed, failed): + pass + + def add_failed(self, failed): + pass + + def add_passed(self, failed): + pass + + def write(self, file): + pass + +class TestReportHTML: + """ + Output the Test Result as a single HTML Page + """ + + def __init__(self, config, test_name, file): + self.test_config = test_name + + def init(self, test_result): + self.test_result = test_result + self.failed = [] + self.passed = [] + + def parse_tests(self): + """ + Parse the tests into the categories Passed and Failed + """ + for test in self.test_result: + if test.test_result: + self.passed.append( test ) + else: + self.failed.append( test ) + + def print_result(self): + self.parse_tests() + page = HTMLPage() + page.open( "Bit Test Result" ) + page.add_head( self.test_config ) + page.add_summary( len(self.test_result), len(self.passed), len(self.failed) ) + page.add_failed( self.failed ) + page.add_passed( self.failed ) + page.write( "result.html" ) diff --git a/lib/bittest/testreport_text.py b/lib/bittest/testreport_text.py new file mode 100644 index 0000000000..351a5a7c87 --- /dev/null +++ b/lib/bittest/testreport_text.py @@ -0,0 +1,56 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005, 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +__version__ = "0.0" + +import os, sys + +class TestReportText: + """ + Output the Test Result as Text + """ + + def __init__(self,config,test_name, file): + self.test_file = file + self.test_config = test_name + + def init(self,test_result): + self.test_result = test_result + + def print_result(self): + print >> self.test_file, "Test results for %s:" % self.test_config + print >> self.test_file, "\tNumber of ran tests: %d" % len(self.test_result) + for test in self.test_result: + if not test.test_result(): + print >> self.test_file, "Tested file: %s" % (test.tested_file()) diff --git a/lib/bittest/testreport_tinder.py b/lib/bittest/testreport_tinder.py new file mode 100644 index 0000000000..74a4a89797 --- /dev/null +++ b/lib/bittest/testreport_tinder.py @@ -0,0 +1,328 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005, 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +__version__ = "0.0" + +import os, sys + + +# +# +# Methods from the tinderclient.bbclass +# +# + + +def tinder_http_post(server, selector, content_type, body): + import httplib + # now post it + for i in range(0,5): + try: + h = httplib.HTTP(server) + h.putrequest('POST', selector) + h.putheader('content-type', content_type) + h.putheader('content-length', str(len(body))) + h.endheaders() + h.send(body) + errcode, errmsg, headers = h.getreply() + #print errcode, errmsg, headers + return (errcode,errmsg, headers, h.file) + except: + print "Error sending the report!" + # try again + pass + + # return some garbage + return (-1, "unknown", "unknown", None) + +def tinder_form_data(bound, dict, log): + output = [] + # for each key in the dictionary + for name in dict: + output.append( "--" + bound ) + output.append( 'Content-Disposition: form-data; name="%s"' % name ) + output.append( "" ) + print "Adding %s %s" % (name, dict[name]) + output.append( dict[name] ) + + if log: + output.append( "--" + bound ) + output.append( 'Content-Disposition: form-data; name="log"; filename="log.txt"' ) + output.append( '' ) + output.append( log ) + output.append( '--' + bound + '--' ) + output.append( '' ) + + return "\r\n".join(output) + +def tinder_format_http_post(d,status,log, test_name): + """ + Format the Tinderbox HTTP post with the data needed + for the tinderbox to be happy. + """ + + from bb import data, build + import os,random + + # the variables we will need to send on this form post + variables = { + "tree" : data.getVar('TINDER_TREE', d, True), + "machine_name" : "%s-%s" % (data.getVar('TINDER_MACHINE', d, True), test_name), + "os" : os.uname()[0], + "os_version" : os.uname()[2], + "compiler" : "gcc", + "clobber" : data.getVar('TINDER_CLOBBER', d, True) + } + + # optionally add the status + if status: + variables["status"] = str(status) + + # try to load the machine id + # we only need on build_status.pl but sending it + # always does not hurt + try: + f = file(data.getVar('TMPDIR',d,True)+'/tinder-machine.id', 'r') + id = f.read() + variables['machine_id'] = id + except: + pass + + # the boundary we will need + boundary = "----------------------------------%d" % int(random.random()*1000000000000) + + # now format the body + body = tinder_form_data( boundary, variables, log ) + + return ("multipart/form-data; boundary=%s" % boundary),body + + +def tinder_build_start(d, test_name): + """ + Inform the tinderbox that a build is starting. We do this + by posting our name and tree to the build_start.pl script + on the server. + """ + from bb import data + + # get the body and type + content_type, body = tinder_format_http_post(d,None,None, test_name) + server = data.getVar('TINDER_HOST', d, True ) + url = data.getVar('TINDER_URL', d, True ) + + selector = url + "/xml/build_start.pl" + + #print "selector %s and url %s" % (selector, url) + + # now post it + errcode, errmsg, headers, h_file = tinder_http_post(server,selector,content_type, body) + #print errcode, errmsg, headers + report = h_file.read() + + # now let us find the machine id that was assigned to us + search = "<machine id='" + report = report[report.find(search)+len(search):] + report = report[0:report.find("'")] + + import bb + bb.note("Machine ID assigned by tinderbox: %s" % report ) + + # now we will need to save the machine number + # we will override any previous numbers + bb.mkdirhier(data.getVar('TMPDIR', d, True)) + f = file(data.getVar('TMPDIR', d, True)+"/tinder-machine.id", 'w') + f.write(report) + +def tinder_send_http(d, status, _log, test_name): + """ + Send this log as build status + """ + from bb import data + + + # get the body and type + server = data.getVar('TINDER_HOST', d, True ) + url = data.getVar('TINDER_URL', d, True ) + + selector = url + "/xml/build_status.pl" + + # now post it - in chunks of 10.000 charachters + new_log = _log + while len(new_log) > 0: + content_type, body = tinder_format_http_post(d,status,new_log[0:18000], test_name) + errcode, errmsg, headers, h_file = tinder_http_post(server,selector,content_type, body) + #print errcode, errmsg, headers + #print h.file.read() + new_log = new_log[18000:] + + +def tinder_print_info(d): + """ + Print the TinderBox Info + Including informations of the BaseSystem and the Tree + we use. + """ + + from bb import data + import os + # get the local vars + + time = "" + ops = os.uname()[0] + version = os.uname()[2] + url = data.getVar( 'TINDER_URL' , d, True ) + tree = data.getVar( 'TINDER_TREE', d, True ) + branch = data.getVar( 'TINDER_BRANCH', d, True ) + srcdate = data.getVar( 'SRCDATE', d, True ) + machine = data.getVar( 'MACHINE', d, True ) + distro = data.getVar( 'DISTRO', d, True ) + bbfiles = data.getVar( 'BBFILES', d, True ) + tarch = data.getVar( 'TARGET_ARCH', d, True ) + fpu = data.getVar( 'TARGET_FPU', d, True ) + oerev = data.getVar( 'OE_REVISION', d, True ) or "unknown" + + # there is a bug with tipple quoted strings + # i will work around but will fix the original + # bug as well + output = [] + output.append("== Tinderbox Info" ) + output.append("Time: %(time)s" ) + output.append("OS: %(ops)s" ) + output.append("%(version)s" ) + output.append("Compiler: BitTest" ) + output.append("Tinderbox Client: BitTest 0.1" ) + output.append("Tinderbox Client Last Modified: yesterday" ) + output.append("Tinderbox Protocol: 0.1" ) + output.append("URL: %(url)s" ) + output.append("Tree: %(tree)s" ) + output.append("Config:" ) + output.append("branch = '%(branch)s'" ) + output.append("TARGET_ARCH = '%(tarch)s'" ) + output.append("TARGET_FPU = '%(fpu)s'" ) + output.append("SRCDATE = '%(srcdate)s'" ) + output.append("MACHINE = '%(machine)s'" ) + output.append("DISTRO = '%(distro)s'" ) + output.append("BBFILES = '%(bbfiles)s'" ) + output.append("OEREV = '%(oerev)s'" ) + output.append("== End Tinderbox Client Info" ) + + # now create the real output + return "\n".join(output) % vars() + +def tinder_print_env(): + """ + Print the environment variables of this build + """ + from bb import data + import os + + time_start = "" + time_end = "" + + # build the environment + env = "" + for var in os.environ: + env += "%s=%s\n" % (var, os.environ[var]) + + output = [] + output.append( "---> TINDERBOX RUNNING env %(time_start)s" ) + output.append( env ) + output.append( "<--- TINDERBOX FINISHED (SUCCESS) %(time_end)s" ) + + return "\n".join(output) % vars() + +def tinder_tinder_start(d, test_name): + """ + PRINT the configuration of this build + """ + + config = tinder_print_info(d) + #env = tinder_print_env() + time_start = "" + time_end = "" + + output = [] + output.append( "---> TINDERBOX PRINTING CONFIGURATION %(time_start)s" ) + output.append( config ) + #output.append( env ) + output.append( "<--- TINDERBOX FINISHED PRINTING CONFIGURATION %(time_end)s" ) + output.append( "---> TINDERBOX TESTING '%(test_name)s'" ) + output.append( "<--- TINDERBOX STARTING TESTING NOW" ) + + output.append( "" ) + + return "\n".join(output) % vars() + + +class TestReportTinder: + """ + Output the Test Result to a TinderBox + """ + + def __init__(self,config, test_name, file): + self._config = config + self.test_config = test_name + self.test_file = file + + # inform our box + tinder_build_start(config, test_name) + log = tinder_tinder_start(config,test_name) + tinder_send_http(config, 1, log, test_name) + + def init(self, test_result): + self.test_result = test_result + + def print_result(self): + """ + Now format the test results + -Settle for 100 or 200 as status (sucess, failure) + -Create one big log message + """ + status = 100 + + log = "---> Printing the test results now\n" + print >> self.test_file, "Test results for %s:\n" % self.test_config + print >> self.test_file, "\tNumber of ran tests: %d\n" % len(self.test_result) + log += "<--- Done preparing\n" + + for test in self.test_result: + log += "---> Test for %s\n" % test.tested_file() + log += "Test comment: %s\n" % test.test_comment() + log += "<--- Test finished (%s)\n" % test.test_result() + + if not test.test_result(): + status = 200 + + # now send the log + tinder_send_http(self._config, status, log, self.test_config) diff --git a/lib/bittest/testresult.py b/lib/bittest/testresult.py new file mode 100644 index 0000000000..2a1355c93c --- /dev/null +++ b/lib/bittest/testresult.py @@ -0,0 +1,120 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005, 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import types + +__version__ = "0.0" + + +class TestItem: + """ + A TestItem contains of the following: + ( + tested_file [String], + test_result [True,False], + test_comment [String] + ) + """ + def __init__(self,tested_file,test_result,test_comment): + self._tested_file = tested_file + self._test_result = test_result + self._test_comment = test_comment + + def tested_file(self): + return self._tested_file + + def test_result(self): + return self._test_result + + def test_comment(self): + return self._test_comment + +class TestResult: + """ + This class holds the testresults + """ + + def __init__(self, name, report): + """ + name is the test name + """ + self._test_name = name + self._results = [] + self._report = report + + def test_name(self): + return self._test_name + + def test_reporter(self): + return self._report + + def insert_result(self, item): + """ + Insert item into the list of results. We will not + enter item if item is None. + If item is of type list we will add every element in the + list to the list of test results + """ + if item == None: + return + + if type(item) == types.ListType: + self._results.extend(item) + else: + self._results.append(item) + + def __iter__(self): + return self._results.__iter__() + + def __getitem__(self,index): + return self._results[index] + + def count(self): + return self._results.count() + + def __len__(self): + return self._results.__len__() + + +def _test(): + """ + Test the quite simple Test Data Types + """ + import doctest + + +if __name__ == "__main__": + _test() + + diff --git a/modules/.mtn2git_empty b/modules/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/.mtn2git_empty diff --git a/modules/content_checker/.mtn2git_empty b/modules/content_checker/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/content_checker/.mtn2git_empty diff --git a/modules/content_checker/__init__.py b/modules/content_checker/__init__.py new file mode 100644 index 0000000000..4304075ba7 --- /dev/null +++ b/modules/content_checker/__init__.py @@ -0,0 +1,40 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import content_checker + +__all__ = [ "create_test" ] + +def create_test(): + return content_checker.TestCase() diff --git a/modules/content_checker/content_checker.py b/modules/content_checker/content_checker.py new file mode 100644 index 0000000000..343e029919 --- /dev/null +++ b/modules/content_checker/content_checker.py @@ -0,0 +1,238 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from bittest import TestItem +from bb import data +import types + +# +# The tests are copied from the oelint.bbclass to this location +# + + +# quite simple without regexps +bad_signs = { + 'SRC_URI' : '?', # SRC_URI should not contain URLs like http://foo.foo?file=foo.tar.gz + 'RDEPENDS': 'kernel-module-' # According to reenoo this is always wrong +} + +# Test for the HOMEPAGE +def homepage1(): + return lambda fn,value : [None,TestItem(fn,False,"HOMEPAGE is not set %s" % value)] [value == 'unknown'] + +def homepage2(): + return lambda fn,value : [None,TestItem(fn,False,"HOMEPAGE doesn't start with http://")][not value.startswith("http://")] + +# Test for the MAINTAINER +def maintainer1(): + return lambda fn,value : [None,TestItem(fn,False, "explicit MAINTAINER is missing, using default"), None][value == "OpenEmbedded Team <oe@handhelds.org>"] + +def maintainer2(): + return lambda fn, value : [None,TestItem(fn,False,"You forgot to put an e-mail address into MAINTAINER"),None] [value.find("@") == -1] + + +# Check the licenses of the Files +valid_licenses = { + "GPL-2" : "GPLv2", + "GPL LGPL FDL" : True, + "GPL PSF" : True, + "GPL/QPL" : "GPL QPL", + "GPL QPL" : True, + "GPL" : True, + "GPLv2" : True, + "GPLV2" : "GPLv2", + "IBM" : True, + "LGPL GPL" : True, + "LGPL" : True, + "MIT" : True, + "OSL" : True, + "Perl" : True, + "Public Domain" : True, + "QPL" : True, + "Vendor" : True, + "BSD" : True, + "tickypip-levels" : True, + "unknown" : False, +} + +def license2(): + return lambda fn, value : [None,TestItem(fn,False,"LICENSE '%s' is not known" % value),None][not valid_licenses.has_key(value)] + +def license3(): + return lambda fn, value : [None,TestItem(fn,False,"LICENSE '%s' is not recommed, better use '%s'" % (value,valid_licenses[value])),None][valid_licenses[value] != True] +def license1(): + return lambda fn, value : [None,TestItem(fn,False,"LICENSE is not set %s" % value)][value == "unknown"] + +# Check the priorities here... +valid_priorities = { + "standard" : True, + "required" : True, + "optional" : True, + "extra" : True, +} + + +def priority1(): + return lambda fn, value : [None,TestItem(fn,False,"PRIORITY '%s' is not known" % value)][not valid_priorities.has_key(value)] + +def priority2(): + return lambda fn, value : [None,TestItem(fn,False,"PRIORITY '%s' is not recommed" % value)][valid_priorities[value]==False] + + +# Test the SECTION now +valid_sections = { + # Current Section Correct section + "apps" : True, + "audio" : True, + "base" : True, + "console/games" : True, + "console/net" : "console/network", + "console/network" : True, + "console/utils" : True, + "devel" : True, + "developing" : "devel", + "devel/python" : True, + "fonts" : True, + "games" : True, + "games/libs" : True, + "gnome/base" : True, + "gnome/libs" : True, + "gpe" : True, + "gpe/libs" : True, + "gui" : False, + "libc" : "libs", + "libs" : True, + "libs/net" : True, + "multimedia" : True, + "net" : "network", + "NET" : "network", + "network" : True, + "opie/applets" : True, + "opie/applications" : True, + "opie/base" : True, + "opie/codecs" : True, + "opie/decorations" : True, + "opie/fontfactories" : True, + "opie/fonts" : True, + "opie/games" : True, + "opie/help" : True, + "opie/inputmethods" : True, + "opie/libs" : True, + "opie/multimedia" : True, + "opie/pim" : True, + "opie/setting" : "opie/settings", + "opie/settings" : True, + "opie/Shell" : False, + "opie/styles" : True, + "opie/today" : True, + "scientific" : True, + "utils" : True, + "x11" : True, + "x11/libs" : True, + "x11/wm" : True, +} + +def section1(): + return lambda fn,value : [None,TestItem(fn,False,"SECTION '%s' is not known" % value)][not valid_sections.has_key(value)] +def section2(): + return lambda fn,value : [None,TestItem(fn,False,"SECTION '%s' is not reccomed use '%s' instead" % (value,valid_sections[value]))][valid_sections[value]!=True] + + + +# these are checks we execute on each variable +variable_checks = { + 'DESCRIPTION' : None, # we only want the presence check + 'HOMEPAGE' : [homepage1(),homepage2()], + 'LICENSE' : [license1(),license2(),license3()], + 'MAINTAINER' : [maintainer1(),maintainer2()], + 'SECTION' : [section1(),section2()], + 'PRIORITY' : [priority1(), priority2()], +} + +class TestCase: + """ + Check if keys contain weird expressions that are considered + error prone. + """ + + def __init__(self): + pass + + def test(self, file_name, file_data): + """ + Go through bad_signs and do reports + """ + results = [] + + # apply the heuristics + for sign in bad_signs.keys(): + try: + value = data.getVar(sign, file_data, True) + except: + try: + value = data.getVar(sign, file_data, False) + except: + pass + + if not value == None: + if bad_signs[sign] in value: + results.append( TestItem(file_name,False,"BAD sign found for %s." % sign)) + + # apply the variable content check + for variable in variable_checks.keys(): + value = data.getVar(variable, file_data, True) + + # is this require variable present + if value == None: + result.append( TestItem(file_name,False, "Required variable '%(variable)s' not found." % vars()) ) + else: + checks = variable_checks[variable] + # now check if we need to check a list of checks + if type(checks) == types.ListType: + for check in checks: + res = check(file_name, value) + # if one test failed we will stop here + if res: + results.append( res ) + print "Stopping the check for variable %s" % variable + break + elif checks: + res = checks(file_name, value) + if res: + results.append( res ) + + return results + + def test_name(self): + return "Content Checker Tool" diff --git a/modules/depends_checker/.mtn2git_empty b/modules/depends_checker/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/depends_checker/.mtn2git_empty diff --git a/modules/depends_checker/__init__.py b/modules/depends_checker/__init__.py new file mode 100644 index 0000000000..077e607f13 --- /dev/null +++ b/modules/depends_checker/__init__.py @@ -0,0 +1,41 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import depends + +__all__ = [ + "create_test" +] +def create_test(): + return depends.TestCase() diff --git a/modules/depends_checker/depends.py b/modules/depends_checker/depends.py new file mode 100644 index 0000000000..07ce2a736e --- /dev/null +++ b/modules/depends_checker/depends.py @@ -0,0 +1,94 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from bittest import TestItem +from bb import data +from bb import utils + +class TestCase: + """ + Check if native packages have non native RDEPENDS + """ + + def __init__(self): + pass + + def test(self,file_name, file_data): + """ + Check if the RDEPENDS or RRECOMMENDS of a native + package includes non native packages + """ + if data.inherits_class("native", file_data): + def check_rdepends(key, base_var): + """ + Check the RDEPENDS/RRECOMMENDS for the key + """ + + copy = data.createCopy(file_data) + cases = [] + if "_${PN}" in key: + pn = data.getVar('PN', copy, True) + ov = data.getVar('OVERRIDES', copy, True) + data.setVar('OVERRIDES', '%s:%s' % (pn,ov), copy ) + data.update_data(copy) + key = base_var + + deps = data.getVar(key, copy, True).strip() + deps = utils.explode_deps(deps) + + for dep in deps: + if len(dep.strip()) != 0 and not "-native" in dep: + cases.append( TestItem(file_name,False,"Native package is %s'ing on non native package '%s'" % (key,dep)) ) + return cases + + # check every key with RDEPENDS + # this finds more RDEPENDS :) + cases = [] + for key in data.keys(file_data): + res = None + if key.startswith('RDEPENDS'): + res = check_rdepends(key, 'RDEPENDS') + elif key.startswith('RRECOMMENDS'): + res = check_rdepends(key, 'RRECOMMENDS') + + # add the result + if res: + cases += res + return cases + + def test_name(self): + """ + Retutnr a name for the test + """ + return "RDEPEND and RRECOMMENDS checker for native packages" diff --git a/modules/doc_checker/.mtn2git_empty b/modules/doc_checker/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/doc_checker/.mtn2git_empty diff --git a/modules/doc_checker/__init__.py b/modules/doc_checker/__init__.py new file mode 100644 index 0000000000..24cbe845c3 --- /dev/null +++ b/modules/doc_checker/__init__.py @@ -0,0 +1,40 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import doc_checker + +__all__ = [ "create_test" ] + +def create_test(): + return doc_checker.TestCase() diff --git a/modules/doc_checker/doc_checker.py b/modules/doc_checker/doc_checker.py new file mode 100644 index 0000000000..18650cdc5c --- /dev/null +++ b/modules/doc_checker/doc_checker.py @@ -0,0 +1,74 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from bittest import TestItem + +import bb + + +# black list of KEYs that are not needed to have a documentation +_black_list = [] + +class TestCase: + """ + Check if variables carry a documentation. For each concrete bbfile + (which includes bbclasses) we will check if all keys are named. + """ + + def __init__(self): + """ + Construct the test case... + """ + pass + + def test(self, file_name, file_data): + """ + Now we will run the tests + """ + + results = [] + + # + # The big plot. We will go through every key of file_data + # and check if there is a doc Flag + # + for key in bb.data.keys(file_data): + flag = bb.data.getVarFlag(key,"doc", file_data) + if flag == None: + results.append( TestItem(file_name,False,"Attribute named '%s' lacks documentation." % key)) + + return results + + def test_name(self): + return "Documentation Checker Tool" diff --git a/modules/example/.mtn2git_empty b/modules/example/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/example/.mtn2git_empty diff --git a/modules/example/__init__.py b/modules/example/__init__.py new file mode 100644 index 0000000000..661b31fff4 --- /dev/null +++ b/modules/example/__init__.py @@ -0,0 +1,41 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import example + +__all__ = [ + "create_test" +] +def create_test(): + return example.TestCase() diff --git a/modules/example/example.py b/modules/example/example.py new file mode 100644 index 0000000000..d91cba5ca7 --- /dev/null +++ b/modules/example/example.py @@ -0,0 +1,59 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from bittest import TestItem + +class TestCase: + """ + A simple test case + """ + + def __init__(self): + """ + Construct and initialize the test case + """ + + def test(self,file_name, file_data): + """ + Now run the test for file_name and the corresponding data. + You can use whatever you want + """ + + return TestItem(file_name,False,"The Test Failed") + + def test_name(self): + """ + Retutnr a name for the test + """ + return "Example Test" diff --git a/modules/patch_checker/.mtn2git_empty b/modules/patch_checker/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/patch_checker/.mtn2git_empty diff --git a/modules/patch_checker/__init__.py b/modules/patch_checker/__init__.py new file mode 100644 index 0000000000..efa4665149 --- /dev/null +++ b/modules/patch_checker/__init__.py @@ -0,0 +1,42 @@ +#ifndef SOURCE_CHECKER/SOURCE_CHECKER.PY +#define SOURCE_CHECKER/SOURCE_CHECKER.PY +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import patch_checker + +__all__ = ["create_test"] + +def create_test(): + return patch_checker.TestCase() diff --git a/modules/patch_checker/patch_checker.py b/modules/patch_checker/patch_checker.py new file mode 100644 index 0000000000..e072f01408 --- /dev/null +++ b/modules/patch_checker/patch_checker.py @@ -0,0 +1,77 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from bittest import TestItem +import bb, sys + + +class TestCase: + def __init__(self): + pass + + def test_name(self): + return "Patch Checker" + + def test(self,file, data): + """ + Run the Test now... some duplication of the base.bbclass + """ + + error = None + + try: + bb.build.exec_func('do_unpack', data) + bb.build.exec_func('do_patch', data) + except bb.build.FuncFailed: + error = """Function failed +Distro: %s +Machine: %s +OS: %s +ARCH: %s +FPU: %s +""" % (bb.data.getVar('DISTRO',data),bb.data.getVar('MACHINE',data),bb.data.getVar('TARGET_OS',data, True),bb.data.getVar('TARGET_ARCH',data, True),bb.data.getVar('TARGET_FPU',data, True)) + except bb.build.EventException: + (type,value,traceback) = sys.exc_info() + e = value.event + error = """EventException %s +Distro: %s +Machine: %s +OS: %s +ARCH: %s +FPU: %s +""" % (bb.event.getName(e),bb.data.getVar('DISTRO',data),bb.data.getVar('MACHINE',data),bb.data.getVar('TARGET_OS',data, True),bb.data.getVar('TARGET_ARCH',data, True),bb.data.getVar('TARGET_FPU',data)) + + bb.build.exec_func('do_clean', data) + + return TestItem(file,error == None, error) diff --git a/modules/source_checker/.mtn2git_empty b/modules/source_checker/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/source_checker/.mtn2git_empty diff --git a/modules/source_checker/__init__.py b/modules/source_checker/__init__.py new file mode 100644 index 0000000000..ef8c8b5e0b --- /dev/null +++ b/modules/source_checker/__init__.py @@ -0,0 +1,40 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import source_checker + +__all__ = [ "create_test" ] + +def create_test(): + return source_checker.TestCase() diff --git a/modules/source_checker/source_checker.py b/modules/source_checker/source_checker.py new file mode 100644 index 0000000000..5dfc7ceaba --- /dev/null +++ b/modules/source_checker/source_checker.py @@ -0,0 +1,80 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2005 Holger Hans Peter Freyther +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name Holger Hans Peter Freyther nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from bittest import TestItem +import bb +import os, sys + +class TestCase: + def __init__(self): + pass + + def test_name(self): + return "Source Checker" + + def generate_error(file, error): + (type,value,traceback) = sys.exc_info() + return TestItem(file,False,error % (value,type,traceback)) + generate_error = staticmethod(generate_error) + + def test(self,file, data): + # we run the tests + + src_uri = bb.data.getVar('SRC_URI', data, 1) + + if not src_uri: + return TestItem(file,True,"NO SRC_URI") + + try: + bb.fetch.init(src_uri.split(), data) + except bb.fetch.NoMethodError: + return TestCase.generate_error(file,"""No Method Exception %s +Type: %s +Traceback: %s +""") + try: + bb.fetch.go(data) + except bb.fetch.MissingParameterError: + return TestCase.generate_error(file,"""Missing Parameter Error %s +Type: %s +Traceback: %s +""") + except bb.fetch.FetchError: + return TestCase.generate_error(file,"""Fetch Error %s +Type: %s +Traceback: %s +""") + + return TestItem(file,True,"") + |