[OE-core] [PATCH] kernel.bbclass: fix SOURCE_DATE_EPOCH for non-git kernel builds

Christopher Clark christopher.w.clark at gmail.com
Mon Mar 9 04:45:51 UTC 2020


On Sat, Mar 7, 2020 at 2:34 PM Alex Kiernan <alex.kiernan at gmail.com> wrote:
>
> On Sat, Mar 7, 2020 at 8:04 PM <christopher.w.clark at gmail.com> wrote:
> >
> > From: Christopher Clark <christopher.w.clark at gmail.com>
> >
> > Only use git to set SOURCE_DATE_EPOCH if ${S} is the top level of a git
> > repository.
> >
> > Fixes the following errors with the prior logic when building a kernel
> > that is not obtained from a git repository:
> >
> > 1. With TMPDIR set to a directory outside any git repository on a
> > mounted filesystem, reproducible builds fail in do_compile with this git
> > error:
> >
> >   fatal: not a git repository (or any parent up to mount point <abspath>)
> >   Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
> >
> > aborting before the error handling logic.
> >
> > 2. With TMPDIR located within a subdirectory of a git repository, the
> > SOURCE_DATE_EPOCH timestamp would be that of said repository rather than
> > that of the kernel.
> >
> > Signed-off-by: Christopher Clark <christopher.w.clark at gmail.com>
> > ---
> >  meta/classes/kernel.bbclass | 12 ++++++++----
> >  1 file changed, 8 insertions(+), 4 deletions(-)
> >
> > diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
> > index 0eadd3efb8..2603f24709 100644
> > --- a/meta/classes/kernel.bbclass
> > +++ b/meta/classes/kernel.bbclass
> > @@ -296,10 +296,14 @@ kernel_do_compile() {
> >                 if [ "${SOURCE_DATE_EPOCH}" = "" -o "${SOURCE_DATE_EPOCH}" = "0" ]; then
> >                         olddir=`pwd`
> >                         cd ${S}
> > -                       SOURCE_DATE_EPOCH=`git log  -1 --pretty=%ct`
> > -                       # git repo not guaranteed, so fall back to REPRODUCIBLE_TIMESTAMP_ROOTFS
> > -                       if [ $? -ne 0 ]; then
> > -                               SOURCE_DATE_EPOCH=${REPRODUCIBLE_TIMESTAMP_ROOTFS}
> > +                       # This kernel dir is not necessarily a git repo and we
> > +                       # must ensure that git does not incorrectly query a
> > +                       # repository in a parent directory.
> > +                       GIT_TOP=`git rev-parse --show-toplevel 2>/dev/null || echo ""`
> > +                       if [ "${S}" = "${GIT_TOP}" ]; then
>
> Will that work if ${S} isn't a canonical path?

Good question; it would be better to avoid the comparison.

>
> > +                               SOURCE_DATE_EPOCH=`git log  -1 --pretty=%ct`
> > +                       else
> > +                               SOURCE_DATE_EPOCH="${REPRODUCIBLE_TIMESTAMP_ROOTFS}"
> >                         fi
> >                         cd $olddir
> >                 fi
>
> Would something like this resolve the problem (untested):

Thanks for the suggestion to use the git-dir option. git is somewhat
picky about argument ordering and any error encountered at that point
aborts the build rather than falling into error handling logic below,
but I have a revised v2 patch now that I will post shortly.

Christopher

>
> diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
> index 0eadd3efb8d9..a17ca7adccca 100644
> --- a/meta/classes/kernel.bbclass
> +++ b/meta/classes/kernel.bbclass
> @@ -294,14 +294,11 @@ kernel_do_compile() {
>                 # kernel sources do not use do_unpack, so
> SOURCE_DATE_EPOCH may not
>                 # be set....
>                 if [ "${SOURCE_DATE_EPOCH}" = "" -o
> "${SOURCE_DATE_EPOCH}" = "0" ]; then
> -                       olddir=`pwd`
> -                       cd ${S}
> -                       SOURCE_DATE_EPOCH=`git log  -1 --pretty=%ct`
> +                       SOURCE_DATE_EPOCH=`git --git-dir="${S}/.git}"
> log  -1 --pretty=%ct`
>                         # git repo not guaranteed, so fall back to
> REPRODUCIBLE_TIMESTAMP_ROOTFS
>                         if [ $? -ne 0 ]; then
>
> SOURCE_DATE_EPOCH=${REPRODUCIBLE_TIMESTAMP_ROOTFS}
>                         fi
> -                       cd $olddir
>                 fi
>
>                 ts=`LC_ALL=C date -d @$SOURCE_DATE_EPOCH`
>
> --
> Alex Kiernan


More information about the Openembedded-core mailing list