diff options
Diffstat (limited to 'meta/classes/sstate.bbclass')
-rw-r--r-- | meta/classes/sstate.bbclass | 168 |
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", |