> -----Original Message-----
> From: [email protected]
> <[email protected]> On Behalf Of Richard Purdie
> Sent: den 22 maj 2024 11:28
> To: [email protected]
> 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 <[email protected]>
> ---
> 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: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-