> -----Original Message----- > From: openembedded-core@lists.openembedded.org > <openembedded-core@lists.openembedded.org> On Behalf Of Richard Purdie > Sent: den 22 maj 2024 11:28 > To: openembedded-core@lists.openembedded.org > Subject: [OE-core] [PATCH 1/3] base: Switch UNPACKDIR to a subdir of WORKDIR > > Change do_unpack to unpack files to a subdirectory of WORKDIR instead of > WORKDIR > itself. There are several good reasons for this but it is mainly about being > able > to isolate the output of the unpack task and tell the files apart from other > things > which are created in workdir (logs, sysroots, temp dirs and more). > > This means that when the do_unpack task reruns, we can clean UNPACKDIR and > know > we have a standard point to start builds from. > > It also makes code in tools like devtool and recipetool easier. > > To reduce the impact to users, if a subdirectory under UNPACKDIR matches > the first subdirectory under WORKDIR of S, that directory is moved into > position > inside WORKDIR. This preserves the behaviour of S = "${WORKDIR}/git", > S = "${WORKDIR}/${BPN}" and other commonly used source directory setups. > > The directory is moved since sadly many autotools based projects can't cope > with > symlinks in their paths. > > The patch also updates reproducible and SOURCE_DATE_EPOCH handling to > match the new potential source locations. We can get rid of the horrible > list of hardcoded directories in WORKDIR to ignore from that code. > > Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org> > --- > meta/classes-global/base.bbclass | 28 +++++++++++++++++++++++----- > meta/conf/bitbake.conf | 2 +- > meta/lib/oe/reproducible.py | 19 ++++++++++--------- > 3 files changed, 34 insertions(+), 15 deletions(-) > > diff --git a/meta/classes-global/base.bbclass > b/meta/classes-global/base.bbclass > index 066f3848f7c..13e91b24a3b 100644 > --- a/meta/classes-global/base.bbclass > +++ b/meta/classes-global/base.bbclass > @@ -153,20 +153,38 @@ python base_do_fetch() { > } > > addtask unpack after do_fetch > -do_unpack[dirs] = "${UNPACKDIR}" > - > -do_unpack[cleandirs] = "${@d.getVar('S') if os.path.normpath(d.getVar('S')) > != os.path.normpath(d.getVar('WORKDIR')) else os.path.join('${S}', > 'patches')}" > +do_unpack[cleandirs] = "${UNPACKDIR}" > > python base_do_unpack() { > + import shutil > + > + sourcedir = d.getVar('S') > + # Intentionally keep SOURCE_BASEDIR internal to the task just for SDE > + d.setVar("SOURCE_BASEDIR", sourcedir) > + > src_uri = (d.getVar('SRC_URI') or "").split() > if not src_uri: > return > > + basedir = None > + unpackdir = d.getVar('UNPACKDIR') > + workdir = d.getVar('WORKDIR') > + if sourcedir.startswith(workdir) and not sourcedir.startswith(unpackdir): > + basedir = sourcedir.replace(workdir, '').strip("/").split('/')[0] > + if basedir: > + bb.utils.remove(workdir + '/' + basedir, True) > + d.setVar("SOURCE_BASEDIR", workdir + '/' + basedir) > + > try: > fetcher = bb.fetch2.Fetch(src_uri, d) > fetcher.unpack(d.getVar('UNPACKDIR')) > except bb.fetch2.BBFetchException as e: > bb.fatal("Bitbake Fetcher Error: " + repr(e)) > + > + if basedir and os.path.exists(unpackdir + '/' + basedir): > + # Compatibility magic to ensure ${WORKDIR}/git and ${WORKDIR}/${BP} > + # as often used in S work as expected. > + shutil.move(unpackdir + '/' + basedir, workdir + '/' + basedir) > } > > SSTATETASKS += "do_deploy_source_date_epoch" > @@ -199,8 +217,8 @@ addtask do_deploy_source_date_epoch_setscene > addtask do_deploy_source_date_epoch before do_configure after do_patch > > python create_source_date_epoch_stamp() { > - # Version: 1 > - source_date_epoch = oe.reproducible.get_source_date_epoch(d, > d.getVar('S')) > + # Version: 2 > + source_date_epoch = oe.reproducible.get_source_date_epoch(d, > d.getVar('SOURCE_BASEDIR') or d.getVar('S')) > oe.reproducible.epochfile_write(source_date_epoch, d.getVar('SDE_FILE'), > d) > } > do_unpack[postfuncs] += "create_source_date_epoch_stamp"
The following code is part of the anonymous python() function in base.bbclass: if os.path.normpath(d.getVar("WORKDIR")) != os.path.normpath(d.getVar("S")): d.appendVar("PSEUDO_IGNORE_PATHS", ",${S}") if os.path.normpath(d.getVar("WORKDIR")) != os.path.normpath(d.getVar("B")): d.appendVar("PSEUDO_IGNORE_PATHS", ",${B}") Since it is (or will be) an error to have S = "${WORKDIR}", it should now be possible to move the addition of ${S} to PSEUDO_IGNORE_PATHS to bitbake.conf. I also believe ${UNPACKDIR} should be added to PSEUDO_IGNORE_PATHS. And on a related note, would it make sense to make B = ${WORKDIR} an error too? In which case the addition of ${B} to PSEUDO_IGNORE_PATHS could also be moved to bitbake.conf. > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf > index b2c500d8739..75c850760f6 100644 > --- a/meta/conf/bitbake.conf > +++ b/meta/conf/bitbake.conf > @@ -405,7 +405,7 @@ STAMP = > "${STAMPS_DIR}/${MULTIMACH_TARGET_SYS}/${PN}/${PV}" > STAMPCLEAN = "${STAMPS_DIR}/${MULTIMACH_TARGET_SYS}/${PN}/*-*" > BASE_WORKDIR ?= "${TMPDIR}/work" > WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${PV}" > -UNPACKDIR ??= "${WORKDIR}" > +UNPACKDIR ??= "${WORKDIR}/sources-unpack" > T = "${WORKDIR}/temp" > D = "${WORKDIR}/image" > S = "${WORKDIR}/${BP}" > diff --git a/meta/lib/oe/reproducible.py b/meta/lib/oe/reproducible.py > index a9f717159e3..1957c974347 100644 > --- a/meta/lib/oe/reproducible.py > +++ b/meta/lib/oe/reproducible.py > @@ -75,10 +75,10 @@ def get_source_date_epoch_from_known_files(d, sourcedir): > return source_date_epoch > > def find_git_folder(d, sourcedir): > - # First guess: WORKDIR/git > + # First guess: UNPACKDIR/git > # This is the default git fetcher unpack path > - workdir = d.getVar('WORKDIR') > - gitpath = os.path.join(workdir, "git/.git") > + unpackdir = d.getVar('UNPACKDIR') > + gitpath = os.path.join(unpackdir, "git/.git") > if os.path.isdir(gitpath): > return gitpath > > @@ -88,15 +88,16 @@ def find_git_folder(d, sourcedir): > return gitpath > > # Perhaps there was a subpath or destsuffix specified. > - # Go looking in the WORKDIR > - exclude = set(["build", "image", "license-destdir", "patches", "pseudo", > - "recipe-sysroot", "recipe-sysroot-native", > "sysroot-destdir", "temp"]) > - for root, dirs, files in os.walk(workdir, topdown=True): > - dirs[:] = [d for d in dirs if d not in exclude] > + # Go looking in the UNPACKDIR > + for root, dirs, files in os.walk(unpackdir, topdown=True): > if '.git' in dirs: > return os.path.join(root, ".git") > > - bb.warn("Failed to find a git repository in WORKDIR: %s" % workdir) > + for root, dirs, files in os.walk(sourcedir, topdown=True): > + if '.git' in dirs: > + return os.path.join(root, ".git") > + > + bb.warn("Failed to find a git repository in UNPACKDIR: %s" % unpackdir) > return None > > def get_source_date_epoch_from_git(d, sourcedir): > -- > 2.40.1 //Peter
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#199749): https://lists.openembedded.org/g/openembedded-core/message/199749 Mute This Topic: https://lists.openembedded.org/mt/106239726/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-