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