aboutsummaryrefslogtreecommitdiffstats
path: root/meta-mentor-common/classes/isolated-sstate-dir.bbclass
blob: e24d7786840668faca0008ee564cf7af0c3f141a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# ---------------------------------------------------------------------------------------------------------------------
# SPDX-License-Identifier: MIT
# ---------------------------------------------------------------------------------------------------------------------

# Populate an isolated SSTATE_DIR while still populating the default shared
# sstate directory. This is useful if SSTATE_DIR is shared, so we have access
# to the set of cached binaries which were used in this build.

ISOLATED_SSTATE_DIR ?= "${TMPDIR}/sstate-cache"
ISOLATED_SSTATE_PATHSPEC = "${@SSTATE_PATHSPEC.replace(SSTATE_DIR + '/', ISOLATED_SSTATE_DIR + '/')}"

sstate_write_isolated () {
    if [ -n "${ISOLATED_SSTATE_DIR}" ] && \
       [ "${ISOLATED_SSTATE_DIR}" != "${SSTATE_DIR}" ]; then
        isolated_dest=$(echo ${SSTATE_PKG} | sed 's,^${SSTATE_DIR}/,${ISOLATED_SSTATE_DIR}/,')
        mkdir -p $(dirname $isolated_dest)
        rm -f $isolated_dest $isolated_dest.siginfo
        ln -s ${SSTATE_PKG} $isolated_dest
        ln -s ${SSTATE_PKG}.siginfo $isolated_dest.siginfo
    fi
}

sstate_create_package:append () {
    sstate_write_isolated
}
# Work around missing vardep bug in bitbake
sstate_create_package[vardeps] += "sstate_write_isolated"

# Copy existing/fetched archives from SSTATE_DIR to ISOLATED_SSTATE_DIR
sstate_write_isolated_preinst () {
    sstate_write_isolated
}

SSTATEPREINSTFUNCS:append = " sstate_write_isolated_preinst"

def cleansstate_isolated(d):
    if d.getVar('ISOLATED_SSTATE_DIR', True) != d.getVar('SSTATE_DIR', True):
        l = d.createCopy()
        l.setVar('SSTATE_PATHSPEC', d.getVar('ISOLATED_SSTATE_PATHSPEC', True))
        sstate_clean_cachefiles(l)

python do_cleansstate:append() {
        cleansstate_isolated(d)
}

# Sadly, there's no way to guarantee event handler execution order, so we need
# to duplicate the bits to dump the siginfo to SSTATE_DIR.
addhandler isolated_sstate_eventhandler
isolated_sstate_eventhandler[eventmask] = "bb.build.TaskSucceeded"
python isolated_sstate_eventhandler() {
    sstate_dir = d.getVar('SSTATE_DIR', True)
    isolated_sstate_dir = d.getVar('ISOLATED_SSTATE_DIR', True)
    if sstate_dir == isolated_sstate_dir:
        return

    # When we write an sstate package we rewrite the SSTATE_PKG
    spkg = d.getVar('SSTATE_PKG', True)
    if not spkg.endswith(".tgz"):
        taskname = d.getVar("BB_RUNTASK", True)[3:]
        spec = d.getVar('SSTATE_PKGSPEC', True)
        swspec = d.getVar('SSTATE_SWSPEC', True)
        if taskname in ["fetch", "unpack", "patch", "populate_lic"] and swspec:
            d.setVar("SSTATE_PKGSPEC", "${SSTATE_SWSPEC}")
            d.setVar("SSTATE_EXTRAPATH", "")
        sstatepkg = d.getVar('SSTATE_PKG', True)
        fn = sstatepkg + '_' + taskname + '.tgz.siginfo'
        if not os.path.exists(fn):
            bb.utils.mkdirhier(os.path.dirname(fn))
            bb.siggen.dump_this_task(fn, d)

        isolated_fn = fn.replace(sstate_dir + '/', isolated_sstate_dir + '/')
        if not os.path.exists(isolated_fn):
            bb.utils.mkdirhier(os.path.dirname(isolated_fn))
            os.symlink(fn, isolated_fn)
}