Am Freitag, dem 20.12.2024 um 09:59 -0500 schrieb Bruce Ashfield:
> On Tue, Dec 17, 2024 at 2:46 AM Enrico Jörns <[email protected]> wrote:
> > The git commit hashes for the kernel checkout are not reproducible under
> > certain conditions:
> > 
> > - If the git repository is initialized on an archive (rather than a
> >   git), the initial git commit not only has the current user name set,
> >   it also uses the current system time as committer and author date.
> >   This will affect the initial git hash and thus all subsequent ones.
> > 
> > - The patches applied by the kern-tools have a valid author and date.
> >   However, their committer again depends on the user building the BSP.
> > 
> > This is an issue, for example, if one compiles a kernel with
> > CONFIG_LOCALVERSION_AUTO enabled where the commit hash lands into the
> > kernel and thus the package version. This not only makes the package
> > version non-reproducible, but also leads to version mismatches between
> > kernel modules built against a fresh kernel checkout and the kernel
> > retrieved from the sstate cache.
> > 
> > The class uses 'check_git_config', but this only sets the git user and
> > only if none existed before. Thus it doesn't really help here.
> > 
> > Since in Git the committer information can be set only from the
> > environment variables GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, and
> > GIT_COMMITTER_DATE, we introduce the helper function
> > 'reproducible_git_committer' here to set those.
> > As values simply use PATCH_GIT_USER_NAME, PATCH_GIT_USER_EMAIL (from
> > patch.bbclass) and SOURCE_DATE_EPOCH.
> > 
> > Using this helper makes the committer date/name/email for the initial
> > reproducible, as well as the committer name/email for the patches
> > applied with kern-tools.
> > 
> > What's still missing is the initial commit's date/name/email which we
> > just set explicitly via command line arguments.
> > 
> > Suggested-by: Felix Klöckner <[email protected]>
> > Signed-off-by: Enrico Jörns <[email protected]>
> > ---
> >  meta/classes-recipe/kernel-yocto.bbclass | 10 +++++++++-
> >  1 file changed, 9 insertions(+), 1 deletion(-)
> > 
> > diff --git a/meta/classes-recipe/kernel-yocto.bbclass 
> > b/meta/classes-recipe/kernel-yocto.bbclass
> > index a5d89dc2c8..1ba2f91e62 100644
> > --- a/meta/classes-recipe/kernel-yocto.bbclass
> > +++ b/meta/classes-recipe/kernel-yocto.bbclass
> > @@ -9,6 +9,12 @@ SRCTREECOVEREDTASKS += "do_validate_branches 
> > do_kernel_configcheck
> > do_kernel_che
> >  PATCH_GIT_USER_EMAIL ?= "kernel-yocto@oe"
> >  PATCH_GIT_USER_NAME ?= "OpenEmbedded"
> > 
> > +reproducible_git_committer() {
> > +       export GIT_COMMITTER_NAME="${PATCH_GIT_USER_NAME}"
> > +       export GIT_COMMITTER_EMAIL="${PATCH_GIT_USER_EMAIL}"
> > +       export GIT_COMMITTER_DATE="$(date -d @${SOURCE_DATE_EPOCH})"
> > +}
> 
> These would be better set in the same class and I'd argue
> that they should just be set in same function  as our other
> settings check_git_config()
> 
> While the check_git_config name might not convey it, the
> original intent of that routine was to make sure that if what we
> needed wasn't set, that we'd configure/set it for the upcoming
> git commands.

Yeah. Maybe it's useful for others, too.
Will move it to utils.bbclass.

> Is there any reason this wouldn't work when exported from
> classes-global/utils.bbclass ?

None that I would know of.

> We also have already have get_kernel_source_date_epoch(),
> that should be used instead of going directly at
> SOURCE_DATE_EPOCH (unless the routine is causing a
> problem, and then I'd be interested in hearing what it is).

Cannot find a method named 'get_kernel_source_date_epoch()' in any class.
Just find other parts of the kernel classes using SOURCE_DATE_EPOCH directly.
Could you give me a hint what I have to look at?

> There are some builds that for debugging purposes
> we want to inhibit all reproducibility and forced setting of
> timestamps, so setting these options should be
> conditional on KERNEL_DEBUG_TIMESTAMPS not being
> set. I realize that this is a slightly different use of setting
> the timestamp as when we build the kernel, but it would 
> still be useful to disable the forced timestamp in some
> scenarios.

I have no opinion on this and will do as suggested.
If timestamps change I'd assume that I can safely ignore all reproducibility 
features, right?
Would make it easier then by just guarding the call to 
'reproducible_git_commiter'.

> > +
> >  # The distro or local.conf should set this, but if nobody cares...
> >  LINUX_KERNEL_TYPE ??= "standard"
> > 
> > @@ -349,6 +355,7 @@ do_patch() {
> >         cd ${S}
> > 
> >         check_git_config
> > +       reproducible_git_committer
> >         meta_dir=$(kgit --meta)
> >         (cd ${meta_dir}; ln -sf patch.queue series)
> >         if [ -f "${meta_dir}/series" ]; then
> > @@ -431,8 +438,9 @@ do_kernel_checkout() {
> >                 rm -f .gitignore
> >                 git init
> >                 check_git_config
> > +               reproducible_git_committer
> >                 git add .
> > -               git commit -q -n -m "baseline commit: creating repo for 
> > ${PN}-${PV}"
> > +               git commit --author="${PATCH_GIT_USER_NAME} 
> > <${PATCH_GIT_USER_EMAIL}>" --
> > date=${SOURCE_DATE_EPOCH} -q -n -m "baseline commit: creating repo for 
> > ${PN}-${PV}"
> > 
> 
> 
> The author, author date and author email can also come from the environment
> in my experiments.

Yes, this works, too.
Wasn't sure which way to go since e.g. patch.py also uses --author directly.

> Can we just set them the same way as the other variables for consistency ?

Maybe that's better anyway, yes.


Regards, Enrico

> Bruce
>  
> >                 git clean -d -f
> >         fi
> > 

-- 
Pengutronix e.K.                           | Enrico Jörns                |
Embedded Linux Consulting & Support        | https://www.pengutronix.de/ |
Steuerwalder Str. 21                       | Phone: +49-5121-206917-180  |
31137 Hildesheim, Germany                  | Fax:   +49-5121-206917-9    |
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#209951): 
https://lists.openembedded.org/g/openembedded-core/message/209951
Mute This Topic: https://lists.openembedded.org/mt/110159643/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to