Go to file
Andrew Deason 6e32ca8129 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.

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>
(cherry picked from commit 5b01ee836d)

Change-Id: Ic94d525a24b53195f010d3530d6f15cb4ad1e430
Reviewed-on: https://gerrit.openafs.org/16063
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
2025-01-16 12:26:18 -05:00
build-tools build: package ltmain.sh in the libafs_tree 2023-10-05 08:39:33 -04:00
doc Add command fallback to server config 2023-08-17 13:13:55 -04:00
src LINUX: Symlink src/libafs/AFS_cvn.c 2025-01-16 12:26:18 -05:00
tests tests: rx/perf wait for server init before client 2024-05-19 18:03:48 -04:00
.gitignore Remove alpha_dux/alpha_osf references 2023-01-20 09:22:36 -05:00
.gitreview Add .gitreview 2018-02-09 21:48:12 -05:00
.mailmap git: add a mailmap file 2016-09-25 21:05:23 -04:00
.splintrc start-splint-support-20030528 2003-05-28 19:18:08 +00:00
acinclude.m4 dir: Introduce struct DirEntryFlex 2024-01-06 14:53:33 -05:00
CODING gcc: Avoid false positive use-after-free in crypto 2023-08-17 13:08:32 -04:00
configure-libafs.ac Make OpenAFS 1.8.13.1 2024-12-12 12:20:05 -05:00
configure.ac Make OpenAFS 1.8.13.1 2024-12-12 12:20:05 -05:00
CONTRIBUTING openafs: add a contributor code of conduct 2015-09-18 20:38:28 -04:00
INSTALL configure: Add platform rs_aix73 2023-04-13 16:58:38 -04:00
libafsdep Move build support files into build-tools 2010-07-14 20:40:36 -07:00
LICENSE Use autoconf-archive m4 from src/external 2022-08-04 12:26:41 -04:00
Makefile-libafs.in Fix libafs_tree's cross-architecture support 2010-05-24 20:28:41 -07:00
Makefile.in build: Add rpm target 2023-08-17 13:23:40 -04:00
NEWS Update NEWS for OpenAFS 1.8.13.1 2024-12-12 12:14:14 -05:00
NTMakefile WINNT: Build bubasics before audit 2020-01-25 15:53:31 -05:00
README Tweak grammar in README 2015-12-28 19:32:17 -05:00
README-WINDOWS Update windows build documentation 2013-07-02 15:14:09 -07:00
regen.sh Use autoconf-archive m4 from src/external 2022-08-04 12:26:41 -04:00

AFS is a distributed file system that enables users to share and
access all of the files stored in a network of computers as easily as
they access the files stored on their local machines. The file system is
called distributed for this exact reason: files can reside on many
different machines, but are available to users on every machine.

OpenAFS 1.0 was originally released by IBM under the terms of the
IBM Public License 1.0 (IPL10).  For details on IPL10 see the LICENSE
file in this directory.  The current OpenAFS distribution is licensed
under a combination of the IPL10 and many other licenses as granted by
the relevant copyright holders.  The LICENSE file in this directory
contains more details, thought it is not a comprehensive statement.

See INSTALL for information about building and installing OpenAFS
on various platforms.

See CODING for developer information and guidelines.

See NEWS for recent changes to OpenAFS.