diff options
-rw-r--r-- | bin/classes/base.oeclass | 72 | ||||
-rw-r--r-- | bin/oe/__init__.py | 2 | ||||
-rw-r--r-- | bin/oe/build.py | 91 | ||||
-rw-r--r-- | bin/oe/fetch.py | 17 | ||||
-rw-r--r-- | bin/oe/parse/ConfHandler.py | 124 | ||||
-rw-r--r-- | bin/oe/parse/OEHandler.py | 42 |
6 files changed, 307 insertions, 41 deletions
diff --git a/bin/classes/base.oeclass b/bin/classes/base.oeclass index 0900b449b..1a738357d 100644 --- a/bin/classes/base.oeclass +++ b/bin/classes/base.oeclass @@ -30,8 +30,40 @@ python base_do_patch () { } +python base_do_fetch() { + import sys + print sys.argv + + src_uri = data.getVar('SRC_URI', d) + if not src_uri: + note("No SRC_URI variable, nothing to be done") + return 1 + src_uri = data.expand(src_uri, d) + + try: + fetch.init(src_uri.split()) + except fetch.NoMethodError: + (type, value, traceback) = sys.exc_info() + error("No method: %s" % value) + raise FuncFailed() + + try: + fetch.go(d) + except fetch.MissingParameterError: + (type, value, traceback) = sys.exc_info() + error("Missing parameters: %s" % value) + raise FuncFailed() + except fetch.FetchError: + (type, value, traceback) = sys.exc_info() + error("Fetch failed: %s" % value) + raise FuncFailed() +} + base_do_unpack() { - if test -z "${A}"; then oenote "nothing to extract"; fi + if test -z "${A}"; then + oenote "nothing to extract" + return + fi unpack "${A}" || die "unpack failure" } @@ -67,26 +99,32 @@ base_do_build() { } python base_eventhandler() { - from oe import expand, note - from oe.event import Handled, NotHandled, getName - import os, string - - name = getName(e) - if name in ["PkgFailed", "PkgSucceeded", "PkgStarted"]: - note("package %s: build %s" % (e.pkg, string.lower(name[3:]))) - elif name in ["TaskFailed", "TaskSucceeded", "TaskStarted"]: - note("package %s: task %s %s" % (expand(e.data["PF"]), e.task, string.lower(name[4:]))) - elif name in ["UnsatisfiedDep"]: - note("package %s: dependency %s %s" % (e.pkg, e.dep, string.lower(name[:-3]))) - return NotHandled + from oe import note, error, data + from oe.event import Handled, NotHandled, getName + import os, string + + name = getName(e) + if name in ["PkgSucceeded", "PkgStarted"]: + note("package %s: build %s" % (e.pkg, string.lower(name[3:]))) + elif name in ["PkgFailed"]: + error("package %s: build %s" % (e.pkg, string.lower(name[3:]))) + elif name in ["TaskSucceeded", "TaskStarted"]: + note("package %s: task %s %s" % (data.expand(data.getVar("PF", e.data), e.data), e.task, string.lower(name[4:]))) + elif name in ["TaskFailed"]: + error("package %s: task %s %s" % (data.expand(data.getVar("PF", e.data), e.data), e.task, string.lower(name[4:]))) + elif name in ["UnsatisfiedDep"]: + note("package %s: dependency %s %s" % (e.pkg, e.dep, string.lower(name[:-3]))) + return NotHandled } addhandler base_eventhandler # setup the initial task stack -EXPORT_FUNCTIONS do_unpack do_compile do_stage do_install do_package do_patch do_build -addtask fetch before do_unpack -addtask unpack before do_compile +EXPORT_FUNCTIONS do_fetch do_unpack do_compile do_stage do_install do_package do_patch do_build + +addtask fetch +addtask unpack after do_fetch addtask patch after do_unpack addtask compile after do_unpack addtask stage after do_compile -addtask install after do_stage before do_build +addtask install after do_stage +addtask build after do_install diff --git a/bin/oe/__init__.py b/bin/oe/__init__.py index 75a323a3f..5bb8320a6 100644 --- a/bin/oe/__init__.py +++ b/bin/oe/__init__.py @@ -60,11 +60,11 @@ __all__ = [ "print_orphan_env", # modules - "fetch", "parse", "data", "event", "build", + "fetch", ] import sys,os,string,types,re diff --git a/bin/oe/build.py b/bin/oe/build.py index 427afd576..dd254d64e 100644 --- a/bin/oe/build.py +++ b/bin/oe/build.py @@ -1,5 +1,4 @@ -from oe import event, data -from oe import mkdirhier, fatal, debug, error +from oe import data, fetch, fatal, error, note, event, mkdirhier import oe import os @@ -77,12 +76,26 @@ def init(data): def exec_func(func, d): """Execute an OE 'function'""" - exec_func_shell(func, d) + if data.getVarFlag(func, "python", d): + exec_func_python(func, d) + else: + exec_func_shell(func, d) +def tmpFunction(d): + """Default function for python code blocks""" + return 1 def exec_func_python(func, d): """Execute a python OE 'function'""" - + body = data.getVar(func, d) + if not body: + return + print "executing function %s" % func + print "content: %s\n" % body + tmp = "def tmpFunction(d):\n%s" % body + comp = compile(tmp, "tmpFunction(d)", "exec") + exec(comp) + tmpFunction(d) def exec_func_shell(func, d): """Execute a shell OE 'function' Returns true if execution was successful. @@ -103,6 +116,7 @@ def exec_func_shell(func, d): dirs = data.getVarFlag(func, 'dirs', d) or [] for dir in dirs: + dir = data.expand(dir, d) mkdirhier(dir) if len(dirs) > 0: @@ -148,6 +162,8 @@ def exec_func_shell(func, d): raise FuncFailed() +_task_cache = [] + def exec_task(task, d): """Execute an OE 'task' @@ -160,29 +176,69 @@ def exec_task(task, d): raise EventException("", InvalidTask(task, d)) # check whether this task needs executing.. + if stamp_is_current(task, d): + return 1 # follow digraph path up, then execute our way back down def execute(graph, item): func = data.getVar(item, _task_data) if func: + if func in _task_cache: + return 1 + event.fire(TaskStarted(func, d)) try: - exec_func_shell(func, d) + if task == func: + # prevent recursion + exec_func(func, d) + else: + exec_task(func, d) except FuncFailed: failedevent = TaskFailed(func, d) event.fire(failedevent) raise EventException(None, failedevent) event.fire(TaskSucceeded(func, d)) + _task_cache.append(func) # execute _task_graph.walkdown(task, execute) # make stamp, or cause event and raise exception - mkstamp(task, d) + if not data.getVarFlag(task, 'nostamp', _task_data): + mkstamp(task, d) + + +def stamp_is_current(task, d, checkdeps = 1): + """Check status of a given task's stamp. returns False if it is not current and needs updating.""" + stamp = data.getVar('STAMP', d) + if not stamp: + return False + stampfile = "%s.%s" % (data.expand(stamp, d), task) + if not os.access(stampfile, os.F_OK): + return False + + if checkdeps == 0: + return True + import stat + tasktime = os.stat(stampfile)[stat.ST_MTIME] -def stamp_is_current(task): - """Check if a stamp file for a given task is current""" + _deps = [] + def checkStamp(graph, task): + # check for existance + if data.getVarFlag(task, 'nostamp', _task_data): + return 1 + + if not stamp_is_current(task, d, 0): + return 0 + + depfile = "%s.%s" % (data.expand(stamp, d), task) + deptime = os.stat(depfile)[stat.ST_MTIME] + if deptime > tasktime: + return 0 + return 1 + + return _task_graph.walkdown(task, checkStamp) def md5_is_current(task): @@ -221,3 +277,22 @@ def remove_task(task, kill = 1, taskdata = _task_data): if kill == 1: ref = 2 _task_graph.delnode(task, ref) + +data.setVarFlag("do_fetch", "nostamp", "1", _task_data) +data.setVarFlag("do_fetch", "check", "check_md5", _task_data) +data.setVarFlag("do_fetch", "md5data", [ "${SRC_URI}" ], _task_data) + +data.setVarFlag("do_unpack", "check", "check_md5", _task_data) +data.setVarFlag("do_unpack", "md5data", [ "A" ], _task_data) +data.setVarFlag("do_unpack", "undo", [ "do_clean" ], _task_data) + +data.setVarFlag("do_patch", "check", "check_md5", _task_data) +data.setVarFlag("do_patch", "md5data", [ "A" ], _task_data) + +data.setVarFlag("do_compile", "check", "check_md5", _task_data) + +data.setVarFlag("do_stage", "check", "check_md5", _task_data) + +data.setVarFlag("do_install", "check", "check_md5", _task_data) + +data.setVarFlag("do_package", "check", "check_md5", _task_data) diff --git a/bin/oe/fetch.py b/bin/oe/fetch.py index 76cce9e92..9daaa9749 100644 --- a/bin/oe/fetch.py +++ b/bin/oe/fetch.py @@ -13,7 +13,7 @@ Based on functions from the base oe module, Copyright 2003 Holger Schurig import os, re, string import oe -import oe.data +from oe import data class FetchError(Exception): """Exception raised when a download fails""" @@ -35,11 +35,11 @@ def init(urls = []): if m.supports(u): m.urls.append(u) -def go(): +def go(d = data.init()): """Fetch all urls""" for m in methods: if m.urls: - m.go() + m.go(d) def localpaths(): """Return a list of the local filenames, assuming successful fetch""" @@ -109,7 +109,7 @@ class Wget(Fetch): return os.path.join(oe.getenv("DL_DIR"), os.path.basename(url)) localpath = staticmethod(localpath) - def go(self, urls = []): + def go(self, d = data.init(), urls = []): """Fetch urls""" if not urls: urls = self.urls @@ -118,12 +118,13 @@ class Wget(Fetch): (type, host, path, user, pswd, parm) = oe.decodeurl(oe.expand(loc)) myfile = os.path.basename(path) dlfile = self.localpath(loc) + dlfile = data.expand(dlfile, d) if os.path.exists(dlfile): # if the file exists, check md5 # if no md5 or mismatch, attempt resume. # regardless of exit code, move on. - myfetch = oe.getenv("RESUMECOMMAND") + myfetch = data.expand(data.getVar("RESUMECOMMAND", d), d) oe.note("fetch " +loc) myfetch = myfetch.replace("${URI}",oe.encodeurl([type, host, path, user, pswd, {}])) myfetch = myfetch.replace("${FILE}",myfile) @@ -131,7 +132,7 @@ class Wget(Fetch): myret = os.system(myfetch) continue else: - myfetch = oe.getenv("FETCHCOMMAND") + myfetch = data.expand(data.getVar("FETCHCOMMAND", d), d) oe.note("fetch " +loc) myfetch = myfetch.replace("${URI}",oe.encodeurl([type, host, path, user, pswd, {}])) myfetch = myfetch.replace("${FILE}",myfile) @@ -167,7 +168,7 @@ class Cvs(Fetch): return os.path.join(oe.getenv("DL_DIR"), parm["module"]) localpath = staticmethod(localpath) - def go(self, urls = []): + def go(self, d = data.init(), urls = []): """Fetch urls""" if not urls: urls = self.urls @@ -200,7 +201,7 @@ class Cvs(Fetch): else: method = "pserver" - os.chdir(oe.expand(dldir)) + os.chdir(data.expand(dldir, d)) cvsroot = ":" + method + ":" + user if pswd: cvsroot += ":" + pswd diff --git a/bin/oe/parse/ConfHandler.py b/bin/oe/parse/ConfHandler.py index c989f94e1..659f52cc0 100644 --- a/bin/oe/parse/ConfHandler.py +++ b/bin/oe/parse/ConfHandler.py @@ -15,10 +15,132 @@ def init(data): oe.data.setVar('OEDIR', os.path.join(sys.prefix, "share/oe"), data) if not oe.data.getVar('OEPATH', data): oe.data.setVar('OEPATH', "${OEDIR}/bin:${OEDIR}:${TOPDIR}/bin:${TOPDIR}", data) + oe.data.setVarFlag("OEFILES", "inherit", "1", data) - oe.data.setVarFlag("OEDIR", "inherit", "1", data) oe.data.setVarFlag("OEPATH", "inherit", "1", data) + oe.data.setVarFlag("OEPATH", "warnlevel", "3", data) oe.data.setVarFlag("PATH", "inherit", "1", data) + oe.data.setVarFlag("STAMP", "warnlevel", "3", data) + + # directories + oe.data.setVarFlag("TOPDIR", "warnlevel", "3", data) + oe.data.setVarFlag("TMPDIR", "warnlevel", "3", data) + oe.data.setVarFlag("DL_DIR", "warnlevel", "3", data) + oe.data.setVarFlag("OEDIR", "inherit", "1", data) + oe.data.setVarFlag("OEDIR", "warnlevel", "3", data) + oe.data.setVarFlag("STAGING_DIR", "warnlevel", "3", data) + oe.data.setVarFlag("STAGING_BINDIR", "warnlevel", "3", data) + oe.data.setVarFlag("STAGING_LIBDIR", "warnlevel", "3", data) + + # Mirrors and download: + + oe.data.setVarFlag("DEBIAN_MIRROR", "warnlevel", "3", data) + oe.data.setVarFlag("SOURCEFORGE_MIRROR", "warnlevel", "3", data) + oe.data.setVarFlag("FETCHCOMMAND", "warnlevel", "3", data) + oe.data.setVarFlag("RESUMECOMMAND", "warnlevel", "3", data) + + # Architecture / Board related: + + oe.data.setVarFlag("DISTRO", "warnlevel", "0", data) + oe.data.setVarFlag("BUILD_ARCH", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_ARCH", "warn", "put something like BUILD_ARCH='i686' into conf/local.conf", data) + oe.data.setVarFlag("ARCH", "warnlevel", "3", data) + oe.data.setVarFlag("ARCH", "warn", "put something like ARCH='arm' into conf/local.conf", data) + oe.data.setVarFlag("BUILD_OS", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_OS", "warn", "put something like BUILD_OS='linux' into conf/local.conf", data) + oe.data.setVarFlag("OS", "warnlevel", "3", data) + oe.data.setVarFlag("OS", "warn", "put something like OS='linux' into conf/local.conf", data) + oe.data.setVarFlag("MACHINE", "warnlevel", "3", data) + oe.data.setVarFlag("MACHINE", "warn", "put something like MACHINE='ramses' into conf/local.conf", data) + oe.data.setVarFlag("USE", "warnlevel", "2", data) + oe.data.setVarFlag("USE", "warn", "put something like USE= with a list of features into conf/local.conf", data) + oe.data.setVarFlag("BUILD_SYS", "warnlevel", "3", data) + oe.data.setVarFlag("SYS", "warnlevel", "3", data) + oe.data.setVarFlag("CROSS", "warnlevel", "3", data) + oe.data.setVarFlag("OVERRIDES", "warnlevel", "2", data) + oe.data.setVarFlag("ALLOWED_FLAGS", "warnlevel", "2", data) + oe.data.setVarFlag("FULL_OPTIMIZATION", "warnlevel", "2", data) + oe.data.setVarFlag("OPTIMIZATION", "warnlevel", "2", data) + oe.data.setVarFlag("CPPFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("CFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("CXXFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("LDFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("CPP", "warnlevel", "3", data) + oe.data.setVarFlag("CC", "warnlevel", "3", data) + oe.data.setVarFlag("CXX", "warnlevel", "3", data) + oe.data.setVarFlag("LD", "warnlevel", "3", data) + oe.data.setVarFlag("STRIP", "warnlevel", "3", data) + oe.data.setVarFlag("AR", "warnlevel", "3", data) + oe.data.setVarFlag("RANLIB", "warnlevel", "3", data) + oe.data.setVarFlag("MAKE", "warnlevel", "3", data) + + oe.data.setVarFlag("BUILD_CPPFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_CFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_CXXFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_LDFLAGS", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_CPP", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_CC", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_CXX", "warnlevel", "3", data) + oe.data.setVarFlag("BUILD_LD", "warnlevel", "3", data) + + oe.data.setVarFlag("PKG_CONFIG_PATH", "warnlevel", "3", data) + + # Mandatory fields in build files + + oe.data.setVarFlag("DESCRIPTION", "warnlevel", "2", data) + oe.data.setVarFlag("DEPEND", "warnlevel", "1", data) + oe.data.setVarFlag("PROVIDES", "warnlevel", "0", data) + oe.data.setVarFlag("SRC_URI", "warnlevel", "1", data) + oe.data.setVarFlag("LICENSE", "warnlevel", "1", data) + oe.data.setVarFlag("HOMEPAGE", "warnlevel", "1", data) + + # Use when needed + + oe.data.setVarFlag("PROVIDE", "warnlevel", "0", data) + oe.data.setVarFlag("RECOMMEND", "warnlevel", "0", data) + oe.data.setVarFlag("FOR_TARGET", "warnlevel", "0", data) + oe.data.setVarFlag("SLOT", "warnlevel", "0", data) + oe.data.setVarFlag("GET_URI", "warnlevel", "0", data) + oe.data.setVarFlag("MAINTAINER", "warnlevel", "0", data) + oe.data.setVarFlag("EXTRA_OECONF", "warnlevel", "0", data) + oe.data.setVarFlag("EXTRA_OEMAKE", "warnlevel", "0", data) + + + oe.data.setVarFlag("P", "warnlevel", "3", data) + oe.data.setVarFlag("PN", "warnlevel", "3", data) + oe.data.setVarFlag("PV", "warnlevel", "3", data) + oe.data.setVarFlag("PR", "warnlevel", "3", data) + oe.data.setVarFlag("PF", "warnlevel", "3", data) + oe.data.setVarFlag("S", "warnlevel", "3", data) + oe.data.setVarFlag("T", "warnlevel", "3", data) + oe.data.setVarFlag("D", "warnlevel", "3", data) + oe.data.setVarFlag("A", "warnlevel", "3", data) + oe.data.setVarFlag("CATEGORY", "warnlevel", "2", data) + oe.data.setVarFlag("FILESDIR", "warnlevel", "3", data) + oe.data.setVarFlag("WORKDIR", "warnlevel", "3", data) + + # Package creation functions: + + oe.data.setVarFlag("do_fetch", "warnlevel", "1", data) + oe.data.setVarFlag("do_fetch", "dirs", [ '${DL_DIR}' ], data) + oe.data.setVarFlag("do_unpack", "warnlevel", "1", data) + oe.data.setVarFlag("do_unpack", "dirs", [ '${WORKDIR}' ], data) + oe.data.setVarFlag("do_compile", "warnlevel", "1", data) + oe.data.setVarFlag("do_compile", "dirs", [ '${S}' ], data) + oe.data.setVarFlag("do_stage", "warnlevel", "1", data) + oe.data.setVarFlag("do_stage", "dirs", [ '${STAGING_DIR}', '${STAGING_DIR}/build/include', '${STAGING_DIR}/target/include', '${STAGING_BINDIR}', '${STAGING_LIBDIR}', '${S}' ], data) + oe.data.setVarFlag("do_install", "warnlevel", "1", data) + oe.data.setVarFlag("do_install", "dirs", [ '${S}' ], data) + oe.data.setVarFlag("do_build", "warnlevel", "1", data) + oe.data.setVarFlag("do_build", "dirs", [ '${S}' ], data) + oe.data.setVarFlag("pkg_preinst", "warnlevel", "0", data) + oe.data.setVarFlag("pkg_postinst", "warnlevel", "0", data) + oe.data.setVarFlag("pkg_postrm", "warnlevel", "0", data) + oe.data.setVarFlag("pkg_prerm", "warnlevel", "0", data) + + # Automatically generated, but overrideable: + + oe.data.setVarFlag("OEDEBUG", "inherit", "1", data) def supports(fn): return fn[-5:] == ".conf" diff --git a/bin/oe/parse/OEHandler.py b/bin/oe/parse/OEHandler.py index 566aac1a4..668d7fe0b 100644 --- a/bin/oe/parse/OEHandler.py +++ b/bin/oe/parse/OEHandler.py @@ -99,6 +99,7 @@ def handle(fn, d = {}): classes.remove(__classname__) else: set_automatic_vars(fn, d) + set_additional_vars(fn, d) return d def feeder(lineno, s, fn, d): @@ -111,11 +112,6 @@ def feeder(lineno, s, fn, d): __infunc__ = "" __body__ = [] else: - try: - if data.getVarFlag(__infunc__, "python", d) == 1: - s = re.sub(r"^\t", '', s) - except KeyError: - pass __body__.append(s) return @@ -137,10 +133,15 @@ def feeder(lineno, s, fn, d): var = f if len(classes) > 1 and classes[-2] is not None: var = "%s_%s" % (classes[-2], var) - data.setVar(var, "\t%s_%s\n" % (classes[-1], f), d) data.setVarFlag(var, "func", 1, d) if data.getVarFlag("%s_%s" % (classes[-1], f), "python", d) == 1: data.setVarFlag(var, "python", 1, d) + data.setVar(var, """ + from oe import build + build.exec_func('%s_%s', d) +""" % (classes[-1], f), d) + else: + data.setVar(var, "\t%s_%s\n" % (classes[-1], f), d) return @@ -213,6 +214,35 @@ def set_automatic_vars(file, d): data.setVar('SLOT', '0', d) data.inheritFromOS(3, d) +def set_additional_vars(file, d): + """Deduce rest of variables, e.g. ${A} out of ${SRC_URI}""" + + debug(2,"set_additional_vars") + + data.inheritFromOS(4, d) + src_uri = data.getVar('SRC_URI', d) + if not src_uri: + return + src_uri = data.expand(src_uri, d) + + # Do we already have something in A? + a = data.getVar('A', d) + if a: + a = data.expand(a, d).split() + else: + a = [] + + import oe.fetch + try: + oe.fetch.init(src_uri.split()) + except oe.fetch.NoMethodError: + pass + + a += oe.fetch.localpaths() + del oe.fetch + data.setVar('A', string.join(a), d) + + # Add us to the handlers list from oe.parse import handlers handlers.append({'supports': supports, 'handle': handle, 'init': init}) |