OpenAFS Master Repository branch, master, updated. openafs-devel-1_9_2-65-g5b01ee8

Gerrit Code Review gerrit@openafs.org
Wed, 8 Jan 2025 11:41:26 -0500


The following commit has been merged in the master branch:
commit 5b01ee836dae38235a84151dfec1a42166b7f13f
Author: Andrew Deason <adeason@sinenomine.net>
Date:   Tue Jan 7 13:24:29 2025 -0600

    LINUX: Symlink src/libafs/AFS_cvn.c
    
    Currently, make_kbuild_makefile.pl generates a Makefile for building our
    Linux kernel module by listing our various objects in 'openafs-objs',
    and symlinking the relevant source file from src/foo/bar.c into
    MODLOAD-*/bar.c. For example, src/libafs/MODLOAD-*/afs_init.c is a
    symlink to src/afs/afs_init.c.
    
    We determine where each source file lives by looking at our Makefile
    rules. This works for all of our source files, except
    AFS_component_version_number.c, which has no single location in the
    tree, but is built inside every subsystem. For
    AFS_component_version_number.c, we don't make a symlink, but instead
    copy the rules from Makefile.version so that
    AFS_component_version_number.c is generated locally, and does not use a
    symlink like our other source files.
    
    The rules in Makefile.version look like this:
    
    AFS_component_version_number.o: AFS_component_version_number.c
    AFS_component_version_number.c: [...]/src/config/Makefile.version
    	[logic to generate AFS_component_version_number.c]
    
    But for the Linux build before Linux 6.13, that doesn't work as-is
    because the Linux buildsystem is not running in our MODLOAD directory,
    but inside the Linux source tree. So, to make this work,
    make_kbuild_makefile.pl modifies the rules so they look like this:
    
    /path/to/src/libafs/MODLOAD-x.y.z/AFS_component_version_number.o: /path/to/src/libafs/MODLOAD-x.y.z/AFS_component_version_number.c
    /path/to/src/libafs/MODLOAD-x.y.z/AFS_component_version_number.c: [...]/src/config/Makefile.version
    	[logic to generate AFS_component_version_number.c]
    
    Which works, before Linux 6.13. After the build runs, our source files
    look like this, for example:
    
      $ ls -l src/libafs/MODLOAD-*/AFS_component_version_number.c src/libafs/MODLOAD-*/afs_init.c
      -rw-r--r-- 1 [...] src/libafs/MODLOAD-x.y.z/AFS_component_version_number.c
      lrwxrwxrwx 1 [...] src/libafs/MODLOAD-x.y.z/afs_init.c -> /path/to/src/afs/afs_init.c
    
    With Linux 6.13, Linux changed how the kbuild process builds external
    kernel modules with this commit:
    
     'kbuild: change working directory to external module directory with M='
     (13b25489b6f8)
    
    which is followed by additional follow-up changes within the merge
    commit:
    
     Merge tag 'kbuild-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
    
     Pull Kbuild updates from Masahiro Yamada:' (6a34dfa15d6e)
    
    With these changes, our working directory is now src/libafs/MODLOAD-*
    when building the openafs kernel module, and we try to build
    AFS_component_version_number.o instead of
    /path/to/.../AFS_component_version_number.o. As a result, 'make' doesn't
    know how to generate AFS_component_version_number.c, and the build
    fails:
    
      make[8]: *** No rule to make target 'AFS_component_version_number.o', needed by 'openafs.o'.  Stop.
      make[7]: *** [/usr/src/linux-6.13/Makefile:1989: .] Error 2
      make[6]: *** [/usr/src/linux-6.13/Makefile:251: __sub-make] Error 2
      make[5]: Leaving directory '/usr/src/linux-6.13/'
      FAILURE: make exit code 2
      make[4]: Leaving directory '/home/../openafs/src/libafs/MODLOAD-6.13.0-rc2-SP'
      make[4]: *** [Makefile.afs:283: openafs.ko] Error 1
    
    To fix this, change make_kbuild_makefile.pl to create a symlink for
    AFS_component_version_number.c just like it does for all other source
    files. Use a target of src/libafs/AFS_component_version_number.c, and
    make sure that AFS_component_version_number.c is generated for the
    'setup' libafs target.
    
    We have to hard-code this special case for
    AFS_component_version_number.c, since none of our Makefile rules specify
    a full path to AFS_component_version_number.c as a dependency for
    AFS_component_version_number.o. But otherwise,
    AFS_component_version_number.c is now treated the same as all other
    source files.
    
    With this commit, our source files now look like this:
    
      $ ls -l src/libafs/MODLOAD-*/AFS_component_version_number.c src/libafs/MODLOAD-*/afs_init.c
      lrwxrwxrwx 1 [...] src/libafs/MODLOAD-x.y.z/AFS_component_version_number.c -> /path/to/src/libafs/AFS_component_version_number.c
      lrwxrwxrwx 1 [...] src/libafs/MODLOAD-x.y.z/afs_init.c -> /path/to/src/afs/afs_init.c
    
    Remove the make_kbuild_makefile.pl code that copies the Makefile.version
    rules, since AFS_component_version_number.c is not generated locally
    anymore.
    
    Written in collaboration with cwills@sinenomine.net.
    
    Change-Id: Ia179f760022c9d9102e4357f38b38632d21de23b
    Reviewed-on: https://gerrit.openafs.org/16034
    Tested-by: Andrew Deason <adeason@sinenomine.net>
    Tested-by: BuildBot <buildbot@rampaginggeek.com>
    Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
    Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
    Reviewed-by: Andrew Deason <adeason@sinenomine.net>

 src/libafs/MakefileProto.LINUX.in  |  2 +-
 src/libafs/make_kbuild_makefile.pl | 17 ++++++++---------
 2 files changed, 9 insertions(+), 10 deletions(-)

-- 
OpenAFS Master Repository