From: Alexey K. <ale...@or...> - 2013-09-17 11:23:12
|
Signed-off-by: Alexey Kodanev <ale...@or...> --- include/mk/module.mk | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) create mode 100644 include/mk/module.mk diff --git a/include/mk/module.mk b/include/mk/module.mk new file mode 100644 index 0000000..99d4c0a --- /dev/null +++ b/include/mk/module.mk @@ -0,0 +1,43 @@ +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Author: Alexey Kodanev <ale...@or...> +# +# Include it to build kernel modules. +# MODULE_NAMES must be defined beforehand. +# + +ifneq ($(KERNELRELEASE),) + +obj-m := $(addsuffix .o, $(MODULE_NAMES)) + +else + +include $(top_srcdir)/include/mk/env_pre.mk + +export abs_srcdir + +MAKE_TARGETS += $(addsuffix .ko, $(MODULE_NAMES)) + +# Ignoring the exit status of commands is done to be forward compatible with +# kernel internal API changes. The user-space test will return TCONF, if it +# doesn't find the module (i.e. it wasn't built either due to kernel-devel +# missing or module build failure). +%.ko: %.c + -$(MAKE) -C $(LINUX_DIR) M=$(abs_srcdir) + -rm -rf *.mod.c *.o modules.order .tmp* .*.ko .*.cmd Module.symvers + +endif -- 1.7.1 |
From: Alexey K. <ale...@or...> - 2013-09-18 08:29:11
|
Makefile example: top_srcdir ?= ../../../.. REQ_VERSION_MAJOR := 2 REQ_VERSION_PATCH := 6 MODULE_NAMES := Module01 Module02 ... MAKE_TARGETS := test01 test02 ... include $(top_srcdir)/include/mk/module.mk Signed-off-by: Alexey Kodanev <ale...@or...> --- include/mk/module.mk | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 69 insertions(+), 0 deletions(-) create mode 100644 include/mk/module.mk diff --git a/include/mk/module.mk b/include/mk/module.mk new file mode 100644 index 0000000..25f0903 --- /dev/null +++ b/include/mk/module.mk @@ -0,0 +1,69 @@ +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Author: Alexey Kodanev <ale...@or...> +# +# Include it to build kernel modules. +# MODULE_NAMES must be defined beforehand. +# + +ifneq ($(KERNELRELEASE),) + +obj-m := $(addsuffix .o, $(MODULE_NAMES)) + +else + +# included in case user-space tests must be built as well +include $(top_srcdir)/include/mk/testcases.mk + +export top_srcdir := $(abs_srcdir)/$(top_srcdir) + +ifeq ($(MAKECMDGOALS),clean) +SKIP := 0 +endif + +ifeq ($(WITH_MODULES),yes) + +ifneq ($(REQ_VERSION_MAJOR),) +SKIP ?= $(shell test $(LINUX_VERSION_MAJOR) -gt $(REQ_VERSION_MAJOR); echo $$?) + +ifeq ($(SKIP),1) +SKIP := $(shell test $(LINUX_VERSION_MAJOR) -eq $(REQ_VERSION_MAJOR); echo $$?) +ifeq ($(SKIP),0) +SKIP := $(shell test $(LINUX_VERSION_PATCH) -ge $(REQ_VERSION_PATCH); echo $$?) +endif +endif + +else +SKIP ?= 0 +endif + +endif + +ifeq ($(SKIP),0) +MAKE_TARGETS += $(addsuffix .ko, $(MODULE_NAMES)) +endif + +# Ignoring the exit status of commands is done to be forward compatible with +# kernel internal API changes. The user-space test will return TCONF, if it +# doesn't find the module (i.e. it wasn't built either due to kernel-devel +# missing or module build failure). +%.ko: %.c + -$(MAKE) -C $(LINUX_DIR) M=$(abs_srcdir) + -rm -rf *.mod.c *.o modules.order .tmp* .*.ko .*.cmd Module.symvers + +include $(top_srcdir)/include/mk/generic_leaf_target.mk +endif -- 1.7.1 |
From: <ch...@su...> - 2013-09-19 11:59:39
|
Hi! > Makefile example: > > top_srcdir ?= ../../../.. > Why aren't you including env_pre.mk here? It contains mostly compatibility hack for older Make. Does it break something? > REQ_VERSION_MAJOR := 2 > REQ_VERSION_PATCH := 6 > > MODULE_NAMES := Module01 Module02 ... > MAKE_TARGETS := test01 test02 ... > > include $(top_srcdir)/include/mk/module.mk > +ifeq ($(WITH_MODULES),yes) > + > +ifneq ($(REQ_VERSION_MAJOR),) > +SKIP ?= $(shell test $(LINUX_VERSION_MAJOR) -gt $(REQ_VERSION_MAJOR); echo $$?) > + > +ifeq ($(SKIP),1) > +SKIP := $(shell test $(LINUX_VERSION_MAJOR) -eq $(REQ_VERSION_MAJOR); echo $$?) > +ifeq ($(SKIP),0) > +SKIP := $(shell test $(LINUX_VERSION_PATCH) -ge $(REQ_VERSION_PATCH); echo $$?) > +endif > +endif > + > +else > +SKIP ?= 0 > +endif > + > +endif > + > +ifeq ($(SKIP),0) > +MAKE_TARGETS += $(addsuffix .ko, $(MODULE_NAMES)) As Jan pointed out, it will be a bit more complicated here. If the module build fails, we need to skip it in the install phase as well. So here we sould add special case if the make target is install and if the module does not exists do not add it to MAKE_TARGETS... > +endif > + > +# Ignoring the exit status of commands is done to be forward compatible with > +# kernel internal API changes. The user-space test will return TCONF, if it > +# doesn't find the module (i.e. it wasn't built either due to kernel-devel > +# missing or module build failure). > +%.ko: %.c > + -$(MAKE) -C $(LINUX_DIR) M=$(abs_srcdir) > + -rm -rf *.mod.c *.o modules.order .tmp* .*.ko .*.cmd Module.symvers > + > +include $(top_srcdir)/include/mk/generic_leaf_target.mk > +endif -- Cyril Hrubis ch...@su... |
From: <ale...@or...> - 2013-09-19 12:26:19
|
Hi! On 09/19/2013 03:59 PM, ch...@su... wrote: > Hi! >> Makefile example: >> >> top_srcdir ?= ../../../.. >> > Why aren't you including env_pre.mk here? > > It contains mostly compatibility hack for older Make. > > Does it break something? > Yes, I would include it only inside ifeq($(KERNELRELEASE),) otherwise make stops in the kernel tree with error "Fix it to use EXTRA_CFLAGS", it finds that CFLAGS is not empty... may be we can add ifneq($(KERNELRELEASE),) to the "env_pre.mk and "testcases.mk"? |
From: <ch...@su...> - 2013-09-19 14:44:48
|
Hi! > >> Makefile example: > >> > >> top_srcdir ?= ../../../.. > >> > > Why aren't you including env_pre.mk here? > > > > It contains mostly compatibility hack for older Make. > > > > Does it break something? > > > Yes, I would include it only inside ifeq($(KERNELRELEASE),) otherwise > make stops in the kernel tree with error "Fix it to use EXTRA_CFLAGS", > it finds that CFLAGS is not empty... may be we can add > ifneq($(KERNELRELEASE),) to the "env_pre.mk and "testcases.mk"? And what about this then: Makefile: top_srcdir ?= ../../../.. include $(top_srcdir)/include/mk/env_pre.mk REQ_VERSION_MAJOR := 2 REQ_VERSION_PATCH := 6 MODULE_NAMES := ltp_foo include $(top_srcdir)/include/mk/module.mk include $(top_srcdir)/include/mk/generic_leaf_target.mk And make module.mk either to set MAKE_TARGETS to the ltp_foo.ko or to be empty in case we don't want to build anything (which should be NOOP). -- Cyril Hrubis ch...@su... |
From: Alexey K. <ale...@or...> - 2013-09-19 17:23:47
|
On 19.09.2013 18:45, ch...@su... wrote: > Hi! >>>> Makefile example: >>>> >>>> top_srcdir ?= ../../../.. >>>> >>> Why aren't you including env_pre.mk here? >>> >>> It contains mostly compatibility hack for older Make. >>> >>> Does it break something? >>> >> Yes, I would include it only inside ifeq($(KERNELRELEASE),) otherwise >> make stops in the kernel tree with error "Fix it to use EXTRA_CFLAGS", >> it finds that CFLAGS is not empty... may be we can add >> ifneq($(KERNELRELEASE),) to the "env_pre.mk and "testcases.mk"? > And what about this then: > > Makefile: > > top_srcdir ?= ../../../.. > > include $(top_srcdir)/include/mk/env_pre.mk > > REQ_VERSION_MAJOR := 2 > REQ_VERSION_PATCH := 6 > > MODULE_NAMES := ltp_foo > > include $(top_srcdir)/include/mk/module.mk > include $(top_srcdir)/include/mk/generic_leaf_target.mk > > > > And make module.mk either to set MAKE_TARGETS to the ltp_foo.ko or to be > empty in case we don't want to build anything (which should be NOOP). Sorry, but I didn't get how it'll fix the error mentioned above? I've found that env_pre.mk content can be omitted using variable ENV_PRE_LOADED, I will set it in the module.mk (export), so make should know about it when building modules and it won't be included again. After that the above Makefile can be used. Is it acceptable? Thanks, Alexey |
From: Alexey K. <ale...@or...> - 2013-09-20 11:22:51
|
Makefile example: top_srcdir ?= ../../../.. include $(top_srcdir)/include/mk/testcases.mk REQ_VERSION_MAJOR := 2 REQ_VERSION_PATCH := 6 MODULE_NAMES := Module01 Module02 ... MAKE_TARGETS := test01 test02 ... include $(top_srcdir)/include/mk/module.mk include $(top_srcdir)/include/mk/generic_leaf_target.mk Signed-off-by: Alexey Kodanev <ale...@or...> --- include/mk/module.mk | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 69 insertions(+), 0 deletions(-) create mode 100644 include/mk/module.mk diff --git a/include/mk/module.mk b/include/mk/module.mk new file mode 100644 index 0000000..9304e4c --- /dev/null +++ b/include/mk/module.mk @@ -0,0 +1,69 @@ +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Author: Alexey Kodanev <ale...@or...> +# +# Include it to build kernel modules. +# MODULE_NAMES, REQ_VERSION_MAJOR and REQ_VERSION_PATCH must be defined +# beforehand. +# + +ifneq ($(KERNELRELEASE),) + +obj-m := $(addsuffix .o, $(MODULE_NAMES)) + +else + +# prerequisites +$(if $(ENV_PRE_LOADED),,\ + $(error You must load env_pre.mk before including this file)) + +$(if $(MODULE_NAMES),,\ + $(error You must define MODULE_NAMES)) + +$(if $(REQ_VERSION_MAJOR),,\ + $(error You must define REQ_VERSION_MAJOR)) + +$(if $(REQ_VERSION_PATCH),,\ + $(error You must define REQ_VERSION_MINOR)) + +export ENV_PRE_LOADED +export top_srcdir := $(abs_srcdir)/$(top_srcdir) + +ifeq ($(MAKECMDGOALS),clean) +SKIP := 0 +endif + +SKIP ?= $(shell [ "$(WITH_MODULES)" = yes ] && \ + [ $(LINUX_VERSION_MAJOR) -gt $(REQ_VERSION_MAJOR) ] || \ + [ $(LINUX_VERSION_MAJOR) -eq $(REQ_VERSION_MAJOR) -a \ + $(LINUX_VERSION_PATCH) -ge $(REQ_VERSION_PATCH) ]; echo $$?) + +ifeq ($(SKIP),0) +MODULE_FILES := $(addsuffix .ko, $(MODULE_NAMES)) +MAKE_TARGETS += $(if $(filter $(MAKECMDGOALS),install),\ + $(wildcard $(MODULE_FILES)),$(MODULE_FILES)) +endif + +# Ignoring the exit status of commands is done to be forward compatible with +# kernel internal API changes. The user-space test will return TCONF, if it +# doesn't find the module (i.e. it wasn't built either due to kernel-devel +# missing or module build failure). +%.ko: %.c + -$(MAKE) -C $(LINUX_DIR) M=$(abs_srcdir) + -rm -rf *.mod.c *.o modules.order .tmp* .*.ko .*.cmd Module.symvers + +endif -- 1.7.1 |
From: <ch...@su...> - 2013-09-25 17:02:23
|
Hi! > Makefile example: > > top_srcdir ?= ../../../.. > > include $(top_srcdir)/include/mk/testcases.mk > > REQ_VERSION_MAJOR := 2 > REQ_VERSION_PATCH := 6 > > MODULE_NAMES := Module01 Module02 ... > MAKE_TARGETS := test01 test02 ... > > include $(top_srcdir)/include/mk/module.mk > include $(top_srcdir)/include/mk/generic_leaf_target.mk Looks good. > --- > include/mk/module.mk | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 69 insertions(+), 0 deletions(-) > create mode 100644 include/mk/module.mk > > diff --git a/include/mk/module.mk b/include/mk/module.mk > new file mode 100644 > index 0000000..9304e4c > --- /dev/null > +++ b/include/mk/module.mk > @@ -0,0 +1,69 @@ > +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation; either version 2 of > +# the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +# > +# Author: Alexey Kodanev <ale...@or...> > +# > +# Include it to build kernel modules. > +# MODULE_NAMES, REQ_VERSION_MAJOR and REQ_VERSION_PATCH must be defined > +# beforehand. > +# > + > +ifneq ($(KERNELRELEASE),) > + > +obj-m := $(addsuffix .o, $(MODULE_NAMES)) > + > +else > + > +# prerequisites > +$(if $(ENV_PRE_LOADED),,\ > + $(error You must load env_pre.mk before including this file)) > + > +$(if $(MODULE_NAMES),,\ > + $(error You must define MODULE_NAMES)) > + > +$(if $(REQ_VERSION_MAJOR),,\ > + $(error You must define REQ_VERSION_MAJOR)) > + > +$(if $(REQ_VERSION_PATCH),,\ > + $(error You must define REQ_VERSION_MINOR)) > + > +export ENV_PRE_LOADED > +export top_srcdir := $(abs_srcdir)/$(top_srcdir) I fail to see what are these two exports are for. For what reason do we need to redefine top_srcdir? > +ifeq ($(MAKECMDGOALS),clean) > +SKIP := 0 > +endif > + > +SKIP ?= $(shell [ "$(WITH_MODULES)" = yes ] && \ > + [ $(LINUX_VERSION_MAJOR) -gt $(REQ_VERSION_MAJOR) ] || \ > + [ $(LINUX_VERSION_MAJOR) -eq $(REQ_VERSION_MAJOR) -a \ > + $(LINUX_VERSION_PATCH) -ge $(REQ_VERSION_PATCH) ]; echo $$?) > + > +ifeq ($(SKIP),0) > +MODULE_FILES := $(addsuffix .ko, $(MODULE_NAMES)) > +MAKE_TARGETS += $(if $(filter $(MAKECMDGOALS),install),\ > + $(wildcard $(MODULE_FILES)),$(MODULE_FILES)) > +endif > + > +# Ignoring the exit status of commands is done to be forward compatible with > +# kernel internal API changes. The user-space test will return TCONF, if it > +# doesn't find the module (i.e. it wasn't built either due to kernel-devel > +# missing or module build failure). > +%.ko: %.c > + -$(MAKE) -C $(LINUX_DIR) M=$(abs_srcdir) > + -rm -rf *.mod.c *.o modules.order .tmp* .*.ko .*.cmd Module.symvers I think that we don't have to ignore the retval from 'rm -rf' as the -f causes the rm ignore nonexistent files anyway. But that is minor. > +endif -- Cyril Hrubis ch...@su... |
From: <ale...@or...> - 2013-09-30 13:39:20
|
Hi! On 09/25/2013 09:02 PM, ch...@su... wrote: > Hi! >> Makefile example: >> >> top_srcdir ?= ../../../.. >> >> include $(top_srcdir)/include/mk/testcases.mk >> >> REQ_VERSION_MAJOR := 2 >> REQ_VERSION_PATCH := 6 >> >> MODULE_NAMES := Module01 Module02 ... >> MAKE_TARGETS := test01 test02 ... >> >> include $(top_srcdir)/include/mk/module.mk >> include $(top_srcdir)/include/mk/generic_leaf_target.mk > Looks good. > >> --- >> include/mk/module.mk | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 69 insertions(+), 0 deletions(-) >> create mode 100644 include/mk/module.mk >> >> diff --git a/include/mk/module.mk b/include/mk/module.mk >> new file mode 100644 >> index 0000000..9304e4c >> --- /dev/null >> +++ b/include/mk/module.mk >> @@ -0,0 +1,69 @@ >> +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. >> +# >> +# This program is free software; you can redistribute it and/or >> +# modify it under the terms of the GNU General Public License as >> +# published by the Free Software Foundation; either version 2 of >> +# the License, or (at your option) any later version. >> +# >> +# This program is distributed in the hope that it would be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program; if not, write the Free Software Foundation, >> +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA >> +# >> +# Author: Alexey Kodanev<ale...@or...> >> +# >> +# Include it to build kernel modules. >> +# MODULE_NAMES, REQ_VERSION_MAJOR and REQ_VERSION_PATCH must be defined >> +# beforehand. >> +# >> + >> +ifneq ($(KERNELRELEASE),) >> + >> +obj-m := $(addsuffix .o, $(MODULE_NAMES)) >> + >> +else >> + >> +# prerequisites >> +$(if $(ENV_PRE_LOADED),,\ >> + $(error You must load env_pre.mk before including this file)) >> + >> +$(if $(MODULE_NAMES),,\ >> + $(error You must define MODULE_NAMES)) >> + >> +$(if $(REQ_VERSION_MAJOR),,\ >> + $(error You must define REQ_VERSION_MAJOR)) >> + >> +$(if $(REQ_VERSION_PATCH),,\ >> + $(error You must define REQ_VERSION_MINOR)) >> + >> +export ENV_PRE_LOADED >> +export top_srcdir := $(abs_srcdir)/$(top_srcdir) > I fail to see what are these two exports are for. > > For what reason do we need to redefine top_srcdir? > I redefine top_srcdir to make it absolute because when "make" cd to kernel build directory and once again include LTP Makefile, the first include of env_pre.mk leads to non-existed file and kernel build stops with error. If top_srcdir absolute, no include errors in the kernel build. Actually we don't need this include of env_pre.mk in the kernel build system because it does nothing with the module build and usually it accomplished with the KERNELRELEASE variable or separate kbuild file. But to preserve the LTP Makefile API and also have a chance to build user-space tests, we include it and tell kernel build system that this one have already been loaded (exporting ENV_PRE_LOAD). |
From: <ch...@su...> - 2013-09-30 15:45:45
|
Hi! > >> Makefile example: > >> > >> top_srcdir ?= ../../../.. > >> > >> include $(top_srcdir)/include/mk/testcases.mk > >> > >> REQ_VERSION_MAJOR := 2 > >> REQ_VERSION_PATCH := 6 > >> > >> MODULE_NAMES := Module01 Module02 ... > >> MAKE_TARGETS := test01 test02 ... > >> > >> include $(top_srcdir)/include/mk/module.mk > >> include $(top_srcdir)/include/mk/generic_leaf_target.mk > > I redefine top_srcdir to make it absolute because when "make" cd to > kernel build directory and once again include LTP Makefile, the first > include of env_pre.mk leads to non-existed file and kernel build stops > with error. If top_srcdir absolute, no include errors in the kernel build. > > Actually we don't need this include of env_pre.mk in the kernel build > system because it does nothing with the module build and usually it > accomplished with the KERNELRELEASE variable or separate kbuild file. > But to preserve the LTP Makefile API and also have a chance to build > user-space tests, we include it and tell kernel build system that this > one have already been loaded (exporting ENV_PRE_LOAD). Hmm, I think that it may be more clear to put the linux kernel Makefile part to the Makefile that is in the test directory, so that it will became: ifneq ($(KERNELRELEASE),) obj-m := $(addsuffix .o, $(MODULE_NAMES)) else top_srcdir ?= ../../../.. include $(top_srcdir)/include/mk/testcases.mk REQ_VERSION_MAJOR := 2 REQ_VERSION_PATCH := 6 MAKE_TARGETS := test01 test02 ... include $(top_srcdir)/include/mk/module.mk include $(top_srcdir)/include/mk/generic_leaf_target.mk endif Which moves all the common code into module.mk and just leaves the kernel recipe in the particular Makefile. That should guarantee that the LTP build system and kernel build system stay separated and won't interact. What do you think? Or to use Kbuild file which should be preffered over Makefile, unfortunately the documentation does not say which kernel version gets the support for Kbuild for extrenal modules, so if it's a recent feature we must go with the Makefile. -- Cyril Hrubis ch...@su... |
From: <ale...@or...> - 2013-09-30 16:22:58
|
On 09/30/2013 07:46 PM, ch...@su... wrote: > Hi! >>>> Makefile example: >>>> >>>> top_srcdir ?= ../../../.. >>>> >>>> include $(top_srcdir)/include/mk/testcases.mk >>>> >>>> REQ_VERSION_MAJOR := 2 >>>> REQ_VERSION_PATCH := 6 >>>> >>>> MODULE_NAMES := Module01 Module02 ... >>>> MAKE_TARGETS := test01 test02 ... >>>> >>>> include $(top_srcdir)/include/mk/module.mk >>>> include $(top_srcdir)/include/mk/generic_leaf_target.mk >> I redefine top_srcdir to make it absolute because when "make" cd to >> kernel build directory and once again include LTP Makefile, the first >> include of env_pre.mk leads to non-existed file and kernel build stops >> with error. If top_srcdir absolute, no include errors in the kernel build. >> >> Actually we don't need this include of env_pre.mk in the kernel build >> system because it does nothing with the module build and usually it >> accomplished with the KERNELRELEASE variable or separate kbuild file. >> But to preserve the LTP Makefile API and also have a chance to build >> user-space tests, we include it and tell kernel build system that this >> one have already been loaded (exporting ENV_PRE_LOAD). > Hmm, I think that it may be more clear to put the linux kernel Makefile > part to the Makefile that is in the test directory, so that it will > became: > > ifneq ($(KERNELRELEASE),) > > obj-m := $(addsuffix .o, $(MODULE_NAMES)) > > else > > top_srcdir ?= ../../../.. > > include $(top_srcdir)/include/mk/testcases.mk > > REQ_VERSION_MAJOR := 2 > REQ_VERSION_PATCH := 6 > MAKE_TARGETS := test01 test02 ... > > include $(top_srcdir)/include/mk/module.mk > include $(top_srcdir)/include/mk/generic_leaf_target.mk > > endif And "MODULE_NAMES := Module01 Module02" on the top of it, right? > Which moves all the common code into module.mk and just leaves the > kernel recipe in the particular Makefile. That should guarantee that the > LTP build system and kernel build system stay separated and won't > interact. What do you think? Yes, this approach much better. > Or to use Kbuild file which should be preffered over Makefile, > unfortunately the documentation does not say which kernel version gets > the support for Kbuild for extrenal modules, so if it's a recent feature > we must go with the Makefile. > It can be made backward compatible with just the include of that file in the ifneq ($(KERNELRELEASE,)). But we have only one line, I don't think it necessary to do so. |
From: <ch...@su...> - 2013-09-30 16:39:56
|
Hi! > > Hmm, I think that it may be more clear to put the linux kernel Makefile > > part to the Makefile that is in the test directory, so that it will > > became: > > > > ifneq ($(KERNELRELEASE),) > > > > obj-m := $(addsuffix .o, $(MODULE_NAMES)) > > > > else > > > > top_srcdir ?= ../../../.. > > > > include $(top_srcdir)/include/mk/testcases.mk > > > > REQ_VERSION_MAJOR := 2 > > REQ_VERSION_PATCH := 6 > > MAKE_TARGETS := test01 test02 ... > > > > include $(top_srcdir)/include/mk/module.mk > > include $(top_srcdir)/include/mk/generic_leaf_target.mk > > > > endif > And "MODULE_NAMES := Module01 Module02" on the top of it, right? Or directly written in the $(addsuffix ...) expression, or just write the obj-m := foo.o there, since it's in one file it does not matter. > > Or to use Kbuild file which should be preffered over Makefile, > > unfortunately the documentation does not say which kernel version gets > > the support for Kbuild for extrenal modules, so if it's a recent feature > > we must go with the Makefile. > > > It can be made backward compatible with just the include of that file in > the ifneq ($(KERNELRELEASE,)). But we have only one line, I don't think > it necessary to do so. Right. I've looked into the kernel git log and the Kbuild documentation was updated to mention the posibility to use Kbuild files around 2.6.33 which is still to late for us. -- Cyril Hrubis ch...@su... |
From: Alexey K. <ale...@or...> - 2013-10-01 11:33:02
|
Makefile example: ifneq ($(KERNELRELEASE),) obj-m := module01.o else top_srcdir ?= ../../../.. include $(top_srcdir)/include/mk/testcases.mk REQ_VERSION_MAJOR := 2 REQ_VERSION_PATCH := 6 MAKE_TARGETS := test01 test02 module01.ko include $(top_srcdir)/include/mk/module.mk include $(top_srcdir)/include/mk/generic_leaf_target.mk endif Signed-off-by: Alexey Kodanev <ale...@or...> --- include/mk/module.mk | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 46 insertions(+), 0 deletions(-) create mode 100644 include/mk/module.mk diff --git a/include/mk/module.mk b/include/mk/module.mk new file mode 100644 index 0000000..b903e8f --- /dev/null +++ b/include/mk/module.mk @@ -0,0 +1,46 @@ +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Author: Alexey Kodanev <ale...@or...> +# +# Include it to build kernel modules. +# REQ_VERSION_MAJOR and REQ_VERSION_PATCH must be defined beforehand. +# + +$(if $(REQ_VERSION_MAJOR),,$(error You must define REQ_VERSION_MAJOR)) +$(if $(REQ_VERSION_PATCH),,$(error You must define REQ_VERSION_MINOR)) + +ifneq ($(filter install clean,$(MAKECMDGOALS)),) +SKIP := 2 +endif + +SKIP ?= $(shell [ "$(WITH_MODULES)" = yes ] && \ + [ $(LINUX_VERSION_MAJOR) -gt $(REQ_VERSION_MAJOR) ] || \ + [ $(LINUX_VERSION_MAJOR) -eq $(REQ_VERSION_MAJOR) -a \ + $(LINUX_VERSION_PATCH) -ge $(REQ_VERSION_PATCH) ]; echo $$?) + +ifneq ($(SKIP),0) +MAKE_TARGETS := $(filter-out %.ko, $(MAKE_TARGETS)) +MAKE_TARGETS += $(if $(filter 2,$(SKIP)),$(wildcard *.ko),) +endif + +# Ignoring the exit status of commands is done to be forward compatible with +# kernel internal API changes. The user-space test will return TCONF, if it +# doesn't find the module (i.e. it wasn't built either due to kernel-devel +# missing or module build failure). +%.ko: %.c + -$(MAKE) -C $(LINUX_DIR) M=$(abs_srcdir) + rm -rf *.mod.c *.o modules.order .tmp* .*.ko .*.cmd Module.symvers -- 1.7.1 |
From: <ch...@su...> - 2013-10-01 13:40:06
|
Hi! Pushed along with my patch for build system documentation, thanks. -- Cyril Hrubis ch...@su... |