Re: [PATCH v2] Add MO(mod objs) variable to process ext modules with subdirs

From: Randy Dunlap
Date: Fri Apr 05 2024 - 12:22:19 EST


Hi--

On 4/5/24 3:01 AM, Valerii Chernous wrote:
> The change allow to build external modules with nested makefiles.
> With current unofficial way(using "src" variable) it is possible to build
> external(out of tree) kernel module with separating source and build

separate

> artifacts dirs but with nested makefiles it doesn't work properly.
> Build system trap to recursion inside makefiles, artifacts output dir
> path grow with each iteration until exceed max path len and build failed

failed.

> Providing "MO" variable and using "override" directive with declaring
> "src" variable solve the problem

solves the problem.

> Usage example:
> make -C KERNEL_SOURCE_TREE MO=BUILD_OUT_DIR M=EXT_MOD_SRC_DIR modules
>
> Cc: xe-linux-external@xxxxxxxxx
> Cc: Valerii Chernous <vchernou@xxxxxxxxx>
> Signed-off-by: Valerii Chernous <vchernou@xxxxxxxxx>
> ---
> Documentation/kbuild/kbuild.rst | 14 +++++++++++++-
> Documentation/kbuild/modules.rst | 16 +++++++++++++++-
> Makefile | 17 +++++++++++++++++
> scripts/Makefile.build | 7 +++++++
> 4 files changed, 52 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/kbuild/kbuild.rst b/Documentation/kbuild/kbuild.rst
> index 9c8d1d046ea5..63e1a71a3b9a 100644
> --- a/Documentation/kbuild/kbuild.rst
> +++ b/Documentation/kbuild/kbuild.rst
> @@ -121,10 +121,22 @@ Setting "V=..." takes precedence over KBUILD_VERBOSE.
> KBUILD_EXTMOD
> -------------
> Set the directory to look for the kernel source when building external
> -modules.
> +modules. In case of using separate sources and module artifatcs directories

artifacts

> +(KBUILD_EXTMOD + KBUILD_EXTMOD_SRC), KBUILD_EXTMOD working as output
> +artifacts directory

directory.

>
> Setting "M=..." takes precedence over KBUILD_EXTMOD.
>
> +KBUILD_EXTMOD_SRC
> +-------------

Extend the underline to the same length as the title.

> +Set the external module source directory in case when separate module
> +sources and build artifacts directories required. Working in pair with

are required.
or
are used.

> +KBUILD_EXTMOD. If KBUILD_EXTMOD_SRC is set then KBUILD_EXTMOD working as

works as
or
is used as

> +module build artifacts directory

directory.

> +
> +Setting "MO=..." takes precedence over KBUILD_EXTMOD.
> +Setting "M=..." takes precedence over KBUILD_EXTMOD_SRC.
> +
> KBUILD_OUTPUT
> -------------
> Specify the output directory when building the kernel.
> diff --git a/Documentation/kbuild/modules.rst b/Documentation/kbuild/modules.rst
> index a1f3eb7a43e2..135be2fc798e 100644
> --- a/Documentation/kbuild/modules.rst
> +++ b/Documentation/kbuild/modules.rst
> @@ -79,6 +79,14 @@ executed to make module versioning work.
> The kbuild system knows that an external module is being built
> due to the "M=<dir>" option given in the command.
>
> + To build an external module with separate src and artifacts dirs use::
> +
> + $ make -C <path_to_kernel_src> M=$PWD MO=<output_dir>
> +
> + The kbuild system knows that an external module with separate sources
> + and build artifacts dirs is being built due to the "M=<dir>" and
> + "MO=<output_dir>" options given in the command.
> +
> To build against the running kernel use::
>
> $ make -C /lib/modules/`uname -r`/build M=$PWD
> @@ -93,7 +101,7 @@ executed to make module versioning work.
>
> ($KDIR refers to the path of the kernel source directory.)
>
> - make -C $KDIR M=$PWD
> + make -C $KDIR M=$PWD MO=<module_output_dir>
>
> -C $KDIR
> The directory where the kernel source is located.
> @@ -106,6 +114,12 @@ executed to make module versioning work.
> directory where the external module (kbuild file) is
> located.
>
> + MO=<module_output_dir>
> + Informs kbuild that an external module build artifacts

drop an

> + should be placed into specific dir(<module_output_dir>)

).

> + This parameter optional, without it "M" working as

parameter is optional. Without it "M" works as both

> + source provider and build output location

location.

> +
> 2.3 Targets
> ===========
>
> diff --git a/Makefile b/Makefile
> index 4bef6323c47d..3d45a41737a6 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -142,6 +142,7 @@ ifeq ("$(origin M)", "command line")
> KBUILD_EXTMOD := $(M)
> endif
>
> +define kbuild_extmod_check_TEMPLATE
> $(if $(word 2, $(KBUILD_EXTMOD)), \
> $(error building multiple external modules is not supported))
>
> @@ -152,9 +153,25 @@ $(foreach x, % :, $(if $(findstring $x, $(KBUILD_EXTMOD)), \
> ifneq ($(filter %/, $(KBUILD_EXTMOD)),)
> KBUILD_EXTMOD := $(shell dirname $(KBUILD_EXTMOD).)
> endif
> +endef
> +$(eval $(call kbuild_extmod_check_TEMPLATE))
>
> export KBUILD_EXTMOD
>
> +# Use make M=src_dir MO=ko_dir or set the environment variables:
> +# KBUILD_EXTMOD_SRC, KBUILD_EXTMOD to specify separate directories of
> +# external module sources and build artifacts.
> +ifeq ("$(origin MO)", "command line")
> +ifeq ($(KBUILD_EXTMOD),)
> + $(error Ext module objects without module sources is not supported))
> +endif
> +KBUILD_EXTMOD_SRC := $(KBUILD_EXTMOD)
> +KBUILD_EXTMOD := $(MO)
> +$(eval $(call kbuild_extmod_check_TEMPLATE))
> +endif
> +
> +export KBUILD_EXTMOD_SRC
> +
> # backward compatibility
> KBUILD_EXTRA_WARN ?= $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)
>
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index baf86c0880b6..a293950e2e07 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -3,7 +3,14 @@
> # Building
> # ==========================================================================
>
> +ifeq ($(KBUILD_EXTMOD_SRC),)
> src := $(obj)
> +else ifeq ($(KBUILD_EXTMOD),$(obj))
> +override src := $(KBUILD_EXTMOD_SRC)
> +else
> +src_subdir := $(patsubst $(KBUILD_EXTMOD)/%,%,$(obj))
> +override src := $(KBUILD_EXTMOD_SRC)/$(src_subdir)
> +endif
>
> PHONY := $(obj)/
> $(obj)/:

--
#Randy