poky/scripts/oe-check-sstate
Richard Purdie 189371f839 devtool/recipetool/meta: Adapt to bitbake API changes for multi-configuration builds
Unfortunately to implenent multiconfig support in bitbake some APIs
had to change. This updates code in OE to match the changes in bitbake.
Its mostly periperhal changes around devtool/recipetool

[Will need a bitbake version requirement bump which I'll make when merging]

(From OE-Core rev: 041212fa37bb83acac5ce4ceb9b7b77ad172c5c3)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2016-08-18 10:07:23 +01:00

122 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
# Query which tasks will be restored from sstate
#
# Copyright 2016 Intel Corporation
# Authored-by: Paul Eggleton <paul.eggleton@intel.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import sys
import os
import subprocess
import tempfile
import shutil
import re
scripts_path = os.path.dirname(os.path.realpath(__file__))
lib_path = scripts_path + '/lib'
sys.path = sys.path + [lib_path]
import scriptutils
import scriptpath
scriptpath.add_bitbake_lib_path()
import argparse_oe
def translate_virtualfns(tasks):
import bb.tinfoil
tinfoil = bb.tinfoil.Tinfoil()
try:
tinfoil.prepare(False)
recipecaches = tinfoil.cooker.recipecaches
outtasks = []
for task in tasks:
(mc, fn, taskname) = bb.runqueue.split_tid(task)
if taskname.endswith('_setscene'):
taskname = taskname[:-9]
outtasks.append('%s:%s' % (recipecaches[mc].pkg_fn[fn], taskname))
finally:
tinfoil.shutdown()
return outtasks
def check(args):
tmpdir = tempfile.mkdtemp(prefix='oe-check-sstate-')
try:
env = os.environ.copy()
if not args.same_tmpdir:
env['BB_ENV_EXTRAWHITE'] = env.get('BB_ENV_EXTRAWHITE', '') + ' TMPDIR_forcevariable'
env['TMPDIR_forcevariable'] = tmpdir
try:
output = subprocess.check_output(
'bitbake -n %s' % ' '.join(args.target),
stderr=subprocess.STDOUT,
env=env,
shell=True)
task_re = re.compile('NOTE: Running setscene task [0-9]+ of [0-9]+ \(([^)]+)\)')
tasks = []
for line in output.decode('utf-8').splitlines():
res = task_re.match(line)
if res:
tasks.append(res.group(1))
outtasks = translate_virtualfns(tasks)
except subprocess.CalledProcessError as e:
print('ERROR: bitbake failed:\n%s' % e.output.decode('utf-8'))
return e.returncode
finally:
shutil.rmtree(tmpdir)
if args.log:
with open(args.log, 'wb') as f:
f.write(output)
if args.outfile:
with open(args.outfile, 'w') as f:
for task in outtasks:
f.write('%s\n' % task)
else:
for task in outtasks:
print(task)
return 0
def main():
parser = argparse_oe.ArgumentParser(description='OpenEmbedded sstate check tool. Does a dry-run to check restoring the specified targets from shared state, and lists the tasks that would be restored. Set BB_SETSCENE_ENFORCE=1 in the environment if you wish to ensure real tasks are disallowed.')
parser.add_argument('target', nargs='+', help='Target to check')
parser.add_argument('-o', '--outfile', help='Write list to a file instead of stdout')
parser.add_argument('-l', '--log', help='Write full log to a file')
parser.add_argument('-s', '--same-tmpdir', action='store_true', help='Use same TMPDIR for check (list will then be dependent on what tasks have executed previously)')
parser.set_defaults(func=check)
args = parser.parse_args()
ret = args.func(args)
return ret
if __name__ == "__main__":
try:
ret = main()
except Exception:
ret = 1
import traceback
traceback.print_exc()
sys.exit(ret)