aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/classes/base.oeclass72
-rw-r--r--bin/oe/__init__.py2
-rw-r--r--bin/oe/build.py91
-rw-r--r--bin/oe/fetch.py17
-rw-r--r--bin/oe/parse/ConfHandler.py124
-rw-r--r--bin/oe/parse/OEHandler.py42
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})