mirror of
https://git.openafs.org/openafs.git
synced 2025-01-18 06:50:12 +00:00
5b01ee836d
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> |
||
---|---|---|
build-tools | ||
doc | ||
src | ||
tests | ||
.gitignore | ||
.gitreview | ||
.mailmap | ||
.splintrc | ||
acinclude.m4 | ||
CODING | ||
configure-libafs.ac | ||
configure.ac | ||
CONTRIBUTING | ||
INSTALL | ||
libafsdep | ||
LICENSE | ||
Makefile-libafs.in | ||
Makefile.in | ||
NEWS | ||
NTMakefile | ||
README | ||
README-WINDOWS | ||
regen.sh |
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.