summaryrefslogtreecommitdiff
path: root/meta/classes/sstate.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'meta/classes/sstate.bbclass')
-rw-r--r--meta/classes/sstate.bbclass168
1 files changed, 100 insertions, 68 deletions
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index 0ba130c886..e4564e4b07 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -1,11 +1,11 @@
-SSTATE_VERSION = "1"
+SSTATE_VERSION = "2"
SSTATE_MANIFESTS = "${TMPDIR}/sstate-control"
-SSTATE_MANFILEBASE = "${SSTATE_MANIFESTS}/manifest-${SSTATE_PKGARCH}-"
+SSTATE_MANFILEBASE = "${SSTATE_MANIFESTS}/manifest-${SSTATE_MANMACH}-"
SSTATE_MANFILEPREFIX = "${SSTATE_MANFILEBASE}${PN}"
-SSTATE_PKGARCH = "${BASE_PACKAGE_ARCH}"
+SSTATE_PKGARCH = "${MULTIMACH_ARCH}"
SSTATE_PKGSPEC = "sstate-${PN}-${MULTIMACH_ARCH}${TARGET_VENDOR}-${TARGET_OS}-${PV}-${PR}-${SSTATE_PKGARCH}-${SSTATE_VERSION}-"
SSTATE_PKGNAME = "${SSTATE_PKGSPEC}${BB_TASKHASH}"
SSTATE_PKG = "${SSTATE_DIR}/${SSTATE_PKGNAME}"
@@ -14,15 +14,22 @@ SSTATE_SCAN_CMD ?= "find ${SSTATE_BUILDDIR} \( -name "*.la" -o -name "*-config"
BB_HASHFILENAME = "${SSTATE_PKGNAME}"
+SSTATE_MANMACH ?= "${SSTATE_PKGARCH}"
+
python () {
if bb.data.inherits_class('native', d):
bb.data.setVar('SSTATE_PKGARCH', bb.data.getVar('BUILD_ARCH', d), d)
- elif bb.data.inherits_class('cross', d) or bb.data.inherits_class('crosssdk', d):
+ elif bb.data.inherits_class('cross', d):
+ bb.data.setVar('SSTATE_PKGARCH', bb.data.expand("${BUILD_ARCH}_${BASE_PACKAGE_ARCH}", d), d)
+ bb.data.setVar('SSTATE_MANMACH', bb.data.expand("${BUILD_ARCH}_${MACHINE}", d), d)
+ elif bb.data.inherits_class('crosssdk', d):
bb.data.setVar('SSTATE_PKGARCH', bb.data.expand("${BUILD_ARCH}_${BASE_PACKAGE_ARCH}", d), d)
elif bb.data.inherits_class('nativesdk', d):
bb.data.setVar('SSTATE_PKGARCH', bb.data.expand("${SDK_ARCH}", d), d)
elif bb.data.inherits_class('cross-canadian', d):
bb.data.setVar('SSTATE_PKGARCH', bb.data.expand("${SDK_ARCH}_${BASE_PACKAGE_ARCH}", d), d)
+ else:
+ bb.data.setVar('SSTATE_MANMACH', bb.data.expand("${MACHINE}", d), d)
# These classes encode staging paths into their scripts data so can only be
# reused if we manipulate the paths
@@ -30,17 +37,21 @@ python () {
scan_cmd = "grep -Irl ${STAGING_DIR} ${SSTATE_BUILDDIR}"
bb.data.setVar('SSTATE_SCAN_CMD', scan_cmd, d)
+ namemap = []
for task in (bb.data.getVar('SSTATETASKS', d, True) or "").split():
+ namemap.append(bb.data.getVarFlag(task, 'sstate-name', d))
funcs = bb.data.getVarFlag(task, 'prefuncs', d) or ""
funcs = "sstate_task_prefunc " + funcs
bb.data.setVarFlag(task, 'prefuncs', funcs, d)
funcs = bb.data.getVarFlag(task, 'postfuncs', d) or ""
funcs = funcs + " sstate_task_postfunc"
bb.data.setVarFlag(task, 'postfuncs', funcs, d)
+ d.setVar('SSTATETASKNAMES', " ".join(namemap))
}
-def sstate_init(name, d):
+def sstate_init(name, task, d):
ss = {}
+ ss['task'] = task
ss['name'] = name
ss['dirs'] = []
ss['plaindirs'] = []
@@ -63,7 +74,7 @@ def sstate_state_fromvars(d, task = None):
if not name or len(inputs) != len(outputs):
bb.fatal("sstate variables not setup correctly?!")
- ss = sstate_init(name, d)
+ ss = sstate_init(name, task, d)
for i in range(len(inputs)):
sstate_add(ss, inputs[i], outputs[i], d)
ss['lockfiles'] = lockfiles
@@ -87,30 +98,6 @@ def sstate_install(ss, d):
if os.access(manifest, os.R_OK):
bb.fatal("Package already staged (%s)?!" % manifest)
- def checkmanifest(pn, task):
- return os.access(bb.data.expand("${SSTATE_MANFILEBASE}%s.%s" % (pn, task), d), os.R_OK)
-
- skipinst = False
- pn = d.getVar("PN", True)
- if pn == "gcc-cross-initial":
- if checkmanifest("gcc-cross", "populate-sysroot"):
- skipinst = True
- if checkmanifest("gcc-cross-intermediate", "populate-sysroot"):
- skipinst = True
- elif pn == "gcc-cross-intermediate":
- if checkmanifest("gcc-cross", "populate-sysroot"):
- skipinst = True
- elif pn == "glibc-initial":
- if checkmanifest("glibc", "populate-sysroot"):
- skipinst = True
- elif pn == "eglibc-initial":
- if checkmanifest("eglibc", "populate-sysroot"):
- skipinst = True
-
- if skipinst:
- bb.note("Not staging %s.%s as sysroot already contains better functionality" % (pn, ss['name']))
- return
-
locks = []
for lock in ss['lockfiles']:
locks.append(bb.utils.lockfile(lock))
@@ -168,10 +155,14 @@ def sstate_installpkg(ss, d):
fixmefn = sstateinst + "fixmepath"
if os.path.isfile(fixmefn):
staging = bb.data.getVar('STAGING_DIR', d, True)
+ staging_target = bb.data.getVar('STAGING_DIR_TARGET', d, True)
+ staging_host = bb.data.getVar('STAGING_DIR_HOST', d, True)
fixmefd = open(fixmefn, "r")
fixmefiles = fixmefd.readlines()
fixmefd.close()
for file in fixmefiles:
+ os.system("sed -i -e s:FIXMESTAGINGDIRTARGET:%s:g %s" % (staging_target, sstateinst + file))
+ os.system("sed -i -e s:FIXMESTAGINGDIRHOST:%s:g %s" % (staging_host, sstateinst + file))
os.system("sed -i -e s:FIXMESTAGINGDIR:%s:g %s" % (staging, sstateinst + file))
for state in ss['dirs']:
@@ -206,9 +197,6 @@ def sstate_clean_cachefiles(d):
def sstate_clean_manifest(manifest, d):
import oe.path
- if not os.path.exists(manifest):
- return
-
mfile = open(manifest)
entries = mfile.readlines()
mfile.close()
@@ -232,9 +220,13 @@ def sstate_clean_manifest(manifest, d):
oe.path.remove(manifest)
def sstate_clean(ss, d):
+ import oe.path
manifest = bb.data.expand("${SSTATE_MANFILEPREFIX}.%s" % ss['name'], d)
+ if not os.path.exists(manifest):
+ return
+
locks = []
for lock in ss['lockfiles']:
locks.append(bb.utils.lockfile(lock))
@@ -244,7 +236,8 @@ def sstate_clean(ss, d):
for lock in locks:
bb.utils.unlockfile(lock)
-SCENEFUNCS += "sstate_cleanall"
+ oe.path.remove(d.getVar("STAMP", True) + ".do_" + ss['task'] + "*")
+
CLEANFUNCS += "sstate_cleanall"
python sstate_cleanall() {
@@ -261,9 +254,45 @@ python sstate_cleanall() {
for manifest in (os.listdir(manifest_dir)):
if fnmatch.fnmatch(manifest, manifest_pattern):
- sstate_clean_manifest(manifest_dir + "/" + manifest, d)
+ name = manifest.replace(manifest_pattern[:-1], "")
+ namemap = d.getVar('SSTATETASKNAMES', True).split()
+ tasks = d.getVar('SSTATETASKS', True).split()
+ taskname = tasks[namemap.index(name)]
+ shared_state = sstate_state_fromvars(d, taskname[3:])
+ sstate_clean(shared_state, d)
}
+def sstate_hardcode_path(d):
+ # Need to remove hardcoded paths and fix these when we install the
+ # staging packages.
+ sstate_scan_cmd = bb.data.getVar('SSTATE_SCAN_CMD', d, True)
+ p = os.popen("%s" % sstate_scan_cmd)
+ file_list = p.read()
+
+ if file_list == "":
+ p.close()
+ return
+
+ staging = bb.data.getVar('STAGING_DIR', d, True)
+ staging_target = bb.data.getVar('STAGING_DIR_TARGET', d, True)
+ staging_host = bb.data.getVar('STAGING_DIR_HOST', d, True)
+ sstate_builddir = bb.data.getVar('SSTATE_BUILDDIR', d, True)
+
+ for i in file_list.split('\n'):
+ if not i:
+ continue
+ if bb.data.inherits_class('native', d) or bb.data.inherits_class('nativesdk', d) or bb.data.inherits_class('crosssdk', d) or bb.data.inherits_class('cross-canadian', d):
+ cmd = "sed -i -e s:%s:FIXMESTAGINGDIR:g %s" % (staging, i)
+ elif bb.data.inherits_class('cross', d):
+ cmd = "sed -i -e s:%s:FIXMESTAGINGDIRTARGET:g %s \
+ sed -i -e s:%s:FIXMESTAGINGDIR:g %s" % (staging_target, i, staging, i)
+ else:
+ cmd = "sed -i -e s:%s:FIXMESTAGINGDIRHOST:g %s" % (staging_host, i)
+
+ os.system(cmd)
+ os.system("echo %s | sed -e 's:%s::' >> %sfixmepath" % (i, sstate_builddir, sstate_builddir))
+ p.close()
+
def sstate_package(ss, d):
import oe.path
@@ -289,6 +318,7 @@ def sstate_package(ss, d):
bb.data.setVar('SSTATE_BUILDDIR', sstatebuild, d)
bb.data.setVar('SSTATE_PKG', sstatepkg, d)
+ sstate_hardcode_path(d)
bb.build.exec_func('sstate_create_package', d)
bb.siggen.dump_this_task(sstatepkg + ".siginfo", d)
@@ -296,37 +326,40 @@ def sstate_package(ss, d):
return
def pstaging_fetch(sstatepkg, d):
- import bb.fetch
-
- # only try and fetch if the user has configured a mirror
+ # Only try and fetch if the user has configured a mirror
mirrors = bb.data.getVar('SSTATE_MIRRORS', d, True)
- if mirrors:
- # Copy the data object and override DL_DIR and SRC_URI
- localdata = bb.data.createCopy(d)
- bb.data.update_data(localdata)
+ if not mirrors:
+ return
- dldir = bb.data.expand("${SSTATE_DIR}", localdata)
- srcuri = "file://" + os.path.basename(sstatepkg)
+ import bb.fetch2
+ # Copy the data object and override DL_DIR and SRC_URI
+ localdata = bb.data.createCopy(d)
+ bb.data.update_data(localdata)
- bb.mkdirhier(dldir)
+ dldir = bb.data.expand("${SSTATE_DIR}", localdata)
+ srcuri = "file://" + os.path.basename(sstatepkg)
- bb.data.setVar('DL_DIR', dldir, localdata)
- bb.data.setVar('PREMIRRORS', mirrors, localdata)
- bb.data.setVar('SRC_URI', srcuri, localdata)
+ bb.mkdirhier(dldir)
- # Try a fetch from the sstate mirror, if it fails just return and
- # we will build the package
- try:
- bb.fetch.init([srcuri], localdata)
- bb.fetch.go(localdata, [srcuri])
- # Need to optimise this, if using file:// urls, the fetcher just changes the local path
- # For now work around by symlinking
- localpath = bb.data.expand(bb.fetch.localpath(srcuri, localdata), localdata)
- if localpath != sstatepkg and os.path.exists(localpath):
- os.symlink(localpath, sstatepkg)
- except:
- pass
+ bb.data.setVar('DL_DIR', dldir, localdata)
+ bb.data.setVar('PREMIRRORS', mirrors, localdata)
+ bb.data.setVar('SRC_URI', srcuri, localdata)
+
+ # Try a fetch from the sstate mirror, if it fails just return and
+ # we will build the package
+ try:
+ fetcher = bb.fetch2.Fetch([srcuri], localdata)
+ fetcher.download()
+
+ # Need to optimise this, if using file:// urls, the fetcher just changes the local path
+ # For now work around by symlinking
+ localpath = bb.data.expand(fetcher.localpath(srcuri), localdata)
+ if localpath != sstatepkg and os.path.exists(localpath) and not os.path.exists(sstatepkg):
+ os.symlink(localpath, sstatepkg)
+
+ except bb.fetch2.BBFetchException:
+ pass
def sstate_setscene(d):
shared_state = sstate_state_fromvars(d)
@@ -353,15 +386,13 @@ python sstate_task_postfunc () {
# set as SSTATE_BUILDDIR
#
sstate_create_package () {
- # Need to remove hardcoded paths and fix these when we install the
- # staging packages.
- for i in `${SSTATE_SCAN_CMD}` ; do \
- sed -i -e s:${STAGING_DIR}:FIXMESTAGINGDIR:g $i
- echo $i | sed -e 's:${SSTATE_BUILDDIR}::' >> ${SSTATE_BUILDDIR}fixmepath
- done
-
cd ${SSTATE_BUILDDIR}
- tar -cvzf ${SSTATE_PKG} *
+ # Need to handle empty directories
+ if [ "$(ls -A)" ]; then
+ tar -czf ${SSTATE_PKG} *
+ else
+ tar -cz --file=${SSTATE_PKG} --files-from=/dev/null
+ fi
cd ${WORKDIR}
rm -rf ${SSTATE_BUILDDIR}
@@ -384,6 +415,7 @@ def sstate_checkhashes(sq_fn, sq_task, sq_hash, sq_hashfn, d):
# This needs to go away, FIXME
mapping = {
"do_populate_sysroot" : "populate-sysroot",
+ "do_populate_lic" : "populate-lic",
"do_package_write_ipk" : "deploy-ipk",
"do_package_write_deb" : "deploy-deb",
"do_package_write_rpm" : "deploy-rpm",