Сборка модуля ядра из дерева с отдельным каталогом исходного кода и сборки через autoconf
Имеется пакет, который использует autoconf (скрипт configure) для предоставления приложения пользовательского режима и драйвера ядра со структурой каталогов, подобной этой:
configure.ac
configure
Makefile.am
user
Makefile.am
user.c
driver
Makefile.am
Kbuild.in
driver.c
Это успешно настраивает и создает как пользователя, так и драйвер при локальной настройке (запустить ./configure --options
).
Однако полезной особенностью сценариев настройки является то, что вы можете иметь отдельный каталог с исходным кодом и каталогом сборки, просто запустив сценарий из каталога сборки, например:
mkdir build && cd build && ../configure --options
Это прекрасно работает для пользовательского приложения, но у меня возникают проблемы с сборкой драйвера ядра в этом контексте. В водительском Makefile.am
У меня есть следующее, как предлагается в этом ответе:
modules:
$(MAKE) -C "$(LINUX_SOURCE_DIR)" M="@abs_builddir@" src="@abs_srcdir@" modules
Но это не скомпилируется, так как ожидается, что Kbuild или Makefile будут в src
, но они на самом деле в M
, Опуская src
позволяет ему найти Kbuild, но затем не может найти фактические исходные файлы (no rule to make target //path/in/build//driver.o
).
С помощью O=
как предполагают некоторые другие ответы, неверно, так как здесь указывается путь для поиска выходных файлов ядра(.config
и т.д.), и они все еще находятся в LINUX_SOURCE_DIR
, (Таким образом, попытка использовать его приводит к различным ошибкам отсутствующего файла.)
Я надеюсь на решение, которое не требует модификации каких-либо реальных скриптов Kbuild, так как они находятся вне контроля моего пакета.
Пока что лучший вариант, который я придумал, - это скопировать / связать все исходные файлы модуля в каталог сборки перед вызовом Kbuild, что не идеально. Я надеюсь, что для этого можно использовать скрытые настройки.