Я сопоставляю систему сборки ядра Linux (Kbuild, kernel ≥2.6.28) со структурой каталогов и системой сборки для более крупного проекта.Наш проект содержит модуль ядра Linux из дерева, и наша структура каталогов выглядит так (очевидно, упрощенно):
checkout/src/common/*.c source files (common to Linux and other platforms)
checkout/src/linux-driver/*.c source files (for the Linux kernel driver)
checkout/build/linux/Kbuild Kbuild
tmp/linux-2.6.xx/ where the Linux kernel is unpacked and configured
output/linux-arm-debug/ where object files must end up
Процесс сборки не должен ничего изменять под checkout
, и сборкамодуль не должен ничего изменять под tmp/linux-2.6.xx
.Все выходные файлы должны заканчиваться output/linux-arm-debug
(или любой другой архитектурой и вариантом отладки, которые были выбраны во время сборки).
Я прочитал kbuild/modules.txt
и начал писать свой Kbuild
file:
MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)
obj-m += $(MOD_OUTPUT_DIR)/foo_mod.o
$(MOD_OUTPUT_DIR)/our_module-objs := $(MOD_OUTPUT_DIR)/foo_common.o $(MOD_OUTPUT_DIR)/foo_linux.o
Это позволяет хранить объектные файлы в другом каталоге, из которого находится Kbuild
.Теперь, как я могу указать, что foo_common.o
нужно компилировать из …/checkout/src/common/foo_common.c
и foo_linux.o
из …/checkout/src/linux-driver/foo_linux.c
?