Сборка модуля ядра из дерева с отдельным каталогом исходного кода и сборки через 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, что не идеально. Я надеюсь, что для этого можно использовать скрытые настройки.

0 ответов

Другие вопросы по тегам