devtool/upgrade: correctly handle recipes where S is a subdir of upstream tree

'devtool modify' writes additional settings to workspace .bbappend so that this
can be handled correctly, but 'devtool upgrade' does not. This adds the missing
settings.

In particular, local files should not anymore mysteriously disappear from
SRC_URIs on upgrades.

(From OE-Core rev: 0817aa5537a8d7cc9591c53dfaa1d225f4c327f7)

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexander Kanavin 2022-12-13 12:10:56 +01:00 committed by Richard Purdie
parent 70c8d7c07b
commit 04d2a394ea
2 changed files with 19 additions and 18 deletions

View File

@ -765,6 +765,16 @@ def get_staging_kbranch(srcdir):
staging_kbranch = "".join(branch.split('\n')[0]) staging_kbranch = "".join(branch.split('\n')[0])
return staging_kbranch return staging_kbranch
def get_real_srctree(srctree, s, workdir):
# Check that recipe isn't using a shared workdir
s = os.path.abspath(s)
workdir = os.path.abspath(workdir)
if s.startswith(workdir) and s != workdir and os.path.dirname(s) != workdir:
# Handle if S is set to a subdirectory of the source
srcsubdir = os.path.relpath(s, workdir).split(os.sep, 1)[1]
srctree = os.path.join(srctree, srcsubdir)
return srctree
def modify(args, config, basepath, workspace): def modify(args, config, basepath, workspace):
"""Entry point for the devtool 'modify' subcommand""" """Entry point for the devtool 'modify' subcommand"""
import bb import bb
@ -923,14 +933,7 @@ def modify(args, config, basepath, workspace):
# Need to grab this here in case the source is within a subdirectory # Need to grab this here in case the source is within a subdirectory
srctreebase = srctree srctreebase = srctree
srctree = get_real_srctree(srctree, rd.getVar('S'), rd.getVar('WORKDIR'))
# Check that recipe isn't using a shared workdir
s = os.path.abspath(rd.getVar('S'))
workdir = os.path.abspath(rd.getVar('WORKDIR'))
if s.startswith(workdir) and s != workdir and os.path.dirname(s) != workdir:
# Handle if S is set to a subdirectory of the source
srcsubdir = os.path.relpath(s, workdir).split(os.sep, 1)[1]
srctree = os.path.join(srctree, srcsubdir)
bb.utils.mkdirhier(os.path.dirname(appendfile)) bb.utils.mkdirhier(os.path.dirname(appendfile))
with open(appendfile, 'w') as f: with open(appendfile, 'w') as f:

View File

@ -88,7 +88,7 @@ def _rename_recipe_files(oldrecipe, bpn, oldpv, newpv, path):
_rename_recipe_dirs(oldpv, newpv, path) _rename_recipe_dirs(oldpv, newpv, path)
return _rename_recipe_file(oldrecipe, bpn, oldpv, newpv, path) return _rename_recipe_file(oldrecipe, bpn, oldpv, newpv, path)
def _write_append(rc, srctree, same_dir, no_same_dir, rev, copied, workspace, d): def _write_append(rc, srctreebase, srctree, same_dir, no_same_dir, rev, copied, workspace, d):
"""Writes an append file""" """Writes an append file"""
if not os.path.exists(rc): if not os.path.exists(rc):
raise DevtoolError("bbappend not created because %s does not exist" % rc) raise DevtoolError("bbappend not created because %s does not exist" % rc)
@ -104,6 +104,11 @@ def _write_append(rc, srctree, same_dir, no_same_dir, rev, copied, workspace, d)
af = os.path.join(appendpath, '%s.bbappend' % brf) af = os.path.join(appendpath, '%s.bbappend' % brf)
with open(af, 'w') as f: with open(af, 'w') as f:
f.write('FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"\n\n') f.write('FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"\n\n')
# Local files can be modified/tracked in separate subdir under srctree
# Mostly useful for packages with S != WORKDIR
f.write('FILESPATH:prepend := "%s:"\n' %
os.path.join(srctreebase, 'oe-local-files'))
f.write('# srctreebase: %s\n' % srctreebase)
f.write('inherit externalsrc\n') f.write('inherit externalsrc\n')
f.write(('# NOTE: We use pn- overrides here to avoid affecting' f.write(('# NOTE: We use pn- overrides here to avoid affecting'
'multiple variants in the case where the recipe uses BBCLASSEXTEND\n')) 'multiple variants in the case where the recipe uses BBCLASSEXTEND\n'))
@ -524,14 +529,7 @@ def upgrade(args, config, basepath, workspace):
else: else:
srctree = standard.get_default_srctree(config, pn) srctree = standard.get_default_srctree(config, pn)
# Check that recipe isn't using a shared workdir srctree_s = standard.get_real_srctree(srctree, rd.getVar('S'), rd.getVar('WORKDIR'))
s = os.path.abspath(rd.getVar('S'))
workdir = os.path.abspath(rd.getVar('WORKDIR'))
srctree_s = srctree
if s.startswith(workdir) and s != workdir and os.path.dirname(s) != workdir:
# Handle if S is set to a subdirectory of the source
srcsubdir = os.path.relpath(s, workdir).split(os.sep, 1)[1]
srctree_s = os.path.join(srctree, srcsubdir)
# try to automatically discover latest version and revision if not provided on command line # try to automatically discover latest version and revision if not provided on command line
if not args.version and not args.srcrev: if not args.version and not args.srcrev:
@ -575,7 +573,7 @@ def upgrade(args, config, basepath, workspace):
_upgrade_error(e, recipedir, srctree, args.keep_failure) _upgrade_error(e, recipedir, srctree, args.keep_failure)
standard._add_md5(config, pn, os.path.dirname(rf)) standard._add_md5(config, pn, os.path.dirname(rf))
af = _write_append(rf, srctree_s, args.same_dir, args.no_same_dir, rev2, af = _write_append(rf, srctree, srctree_s, args.same_dir, args.no_same_dir, rev2,
copied, config.workspace_path, rd) copied, config.workspace_path, rd)
standard._add_md5(config, pn, af) standard._add_md5(config, pn, af)