build: Allow explicit module dependencies

The build system deduces inter-module dependencies from the symbols
required and exported by the modules. This works well, except for some
rare cases where the dependency is indirect or hidden. A module might
not make use of any function of some other module, but still expect its
functionality to be available to GRUB.

To solve this, introduce a new file, currently empty, called extra_deps.lst
to track these cases manually. This file gets processed in the same way
as the automatically generated syminfo.lst, making it possible to inject
data into the dependency resolver.

Since *.lst files are set to be ignored by git, add an exception for
extra_deps.lst.

Additionally, introduce a new keyword for the syminfo.lst syntax:
"depends" allows specifying a module dependency directly:

  depends <module> <depdendency>...

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Oliver Steffen 2023-11-16 16:37:38 +01:00 committed by Daniel Kiper
parent 17c68472d1
commit 154dcb1aea
4 changed files with 7 additions and 2 deletions

1
.gitignore vendored
View File

@ -11,6 +11,7 @@
*.img
*.log
*.lst
!/grub-core/extra_deps.lst
*.marker
*.mod
*.o

View File

@ -454,8 +454,8 @@ crypto.lst: $(srcdir)/lib/libgcrypt-grub/cipher/crypto.lst
platform_DATA += crypto.lst
CLEANFILES += crypto.lst
syminfo.lst: gensyminfo.sh kernel_syms.lst $(MODULE_FILES)
cat kernel_syms.lst > $@.new
syminfo.lst: gensyminfo.sh kernel_syms.lst extra_deps.lst $(MODULE_FILES)
cat kernel_syms.lst extra_deps.lst > $@.new
for m in $(MODULE_FILES); do \
sh $< $$m >> $@.new || exit 1; \
done

0
grub-core/extra_deps.lst Normal file
View File

View File

@ -31,6 +31,10 @@ BEGIN {
printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr";
error++;
}
} else if ($1 == "depends") {
for (i = 3; i <= NF; i++) {
modtab[$2] = modtab[$2] " " $i;
}
}
else {
printf "error: %u: unrecognized input format\n", NR >"/dev/stderr";