Out-of-tree module build in a dedicated build directory.

Aleksei Fedotov lexa at cfotr.com
Thu Mar 15 08:14:57 EDT 2018


Hello,

I have a question regarding building of out-of-tree kernel modules in
separate build directory.

I have a source tree containing two out-of-tree kernel modules which is spread
in two directories, module1 and module2. The build produces two independent
modules: module1.ko and module2.ko.

$ tree --charset=ascii
.
|-- Kbuild
|-- module1
|   |-- Kbuild
|   `-- task1.c
`-- module2
    |-- Kbuild
    `-- task2.c

The root Kbuild points on sub-directories where the actual modules are located:

$ cat Kbuild
obj-y += module1/
obj-y += module2/

I want to use a dedicated build directory, so I could build the same set of
sources for different platforms (ARM and x86).

It looks like passing O= or KBUILD_OUTPUT= doesn't work for out of tree modules.
So, I've tried passing 'src' directory directly to the make command, but that
seems to cause a run-away recursion in the Kbuild:

make V=1 -C $(KDIR) M=`pwd`/build_x86 src=`pwd`

make: Entering directory '/home/lexa/linux_build'
make -C /home/lexa/linux O=/home/lexa/linux_build/.
make -C /home/lexa/linux_build KBUILD_SRC=/home/lexa/linux \
-f /home/lexa/linux/Makefile
test -e include/generated/autoconf.h -a -e include/config/auto.conf || (		\
echo >&2;							\
echo >&2 "  ERROR: Kernel configuration is invalid.";		\
echo >&2 "         include/generated/autoconf.h or
include/config/auto.conf are missing.";\
echo >&2 "         Run 'make oldconfig && make prepare' on kernel src
to fix it.";	\
echo >&2 ;							\
/bin/false)
mkdir -p /home/lexa/module/build_arm/.tmp_versions ; rm -f
/home/lexa/module/build_arm/.tmp_versions/*
make -f /home/lexa/linux/scripts/Makefile.build obj=/home/lexa/module/build_arm
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1/module1/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1/module1/module1/module1/module1/module1
make -f /home/lexa/linux/scripts/Makefile.build
obj=/home/lexa/module/build_arm/module1/module1/module1/module1/module1/module1/module1/module1/module1/module1

... and this goes on ...

It looks like this happen because in 'src' from command line overrides the 'src'
assignment in scripts/Makefile.modbuiltin:5 and then it is not handled when
descending the source tree in scripts/Makefile.modbuiltin:53

I was wondering, what is the right way to build the module with separate build
directory?

-- 
Kind Regards,
Aleksei



More information about the Kernelnewbies mailing list