[dpdk-dev,03/17] igb_uio: add igb_uio kmod to meson build

Message ID 20170901100416.80264-4-bruce.richardson@intel.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Bruce Richardson Sept. 1, 2017, 10:04 a.m. UTC
  Support building igb_uio using meson and ninja. For this, we still use the
kernel's kbuild system, by calling out to make, since it's safer and easier
than trying to reproduce that in meson. A list of suitable file
dependencies is given so that we have a reasonable chance of a rebuild when
necessary.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/librte_eal/linuxapp/igb_uio/Kbuild      |  1 +
 lib/librte_eal/linuxapp/igb_uio/meson.build | 47 +++++++++++++++++++++++++++++
 lib/librte_eal/linuxapp/meson.build         | 10 ++++++
 meson_options.txt                           |  2 ++
 4 files changed, 60 insertions(+)
 create mode 100644 lib/librte_eal/linuxapp/igb_uio/Kbuild
 create mode 100644 lib/librte_eal/linuxapp/igb_uio/meson.build
  

Comments

Luca Boccassi Sept. 1, 2017, 1:32 p.m. UTC | #1
On Fri, 2017-09-01 at 11:04 +0100, Bruce Richardson wrote:
> Support building igb_uio using meson and ninja. For this, we still
> use the
> kernel's kbuild system, by calling out to make, since it's safer and
> easier
> than trying to reproduce that in meson. A list of suitable file
> dependencies is given so that we have a reasonable chance of a
> rebuild when
> necessary.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  lib/librte_eal/linuxapp/igb_uio/Kbuild      |  1 +
>  lib/librte_eal/linuxapp/igb_uio/meson.build | 47
> +++++++++++++++++++++++++++++
>  lib/librte_eal/linuxapp/meson.build         | 10 ++++++
>  meson_options.txt                           |  2 ++
>  4 files changed, 60 insertions(+)
>  create mode 100644 lib/librte_eal/linuxapp/igb_uio/Kbuild
>  create mode 100644 lib/librte_eal/linuxapp/igb_uio/meson.build
> 
> diff --git a/lib/librte_eal/linuxapp/igb_uio/Kbuild
> b/lib/librte_eal/linuxapp/igb_uio/Kbuild
> new file mode 100644
> index 000000000..98c98fe52
> --- /dev/null
> +++ b/lib/librte_eal/linuxapp/igb_uio/Kbuild
> @@ -0,0 +1 @@
> +obj-m := igb_uio.o
> diff --git a/lib/librte_eal/linuxapp/igb_uio/meson.build
> b/lib/librte_eal/linuxapp/igb_uio/meson.build
> new file mode 100644
> index 000000000..c046e1d66
> --- /dev/null
> +++ b/lib/librte_eal/linuxapp/igb_uio/meson.build
> @@ -0,0 +1,47 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2017 Intel Corporation. All rights reserved.
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or
> without
> +#   modification, are permitted provided that the following
> conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above
> copyright
> +#       notice, this list of conditions and the following
> disclaimer.
> +#     * Redistributions in binary form must reproduce the above
> copyright
> +#       notice, this list of conditions and the following disclaimer
> in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products
> derived
> +#       from this software without specific prior written
> permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> +
> +mkfile = custom_target('igb_uio_makefile',
> +	output: 'Makefile',
> +	command: ['touch', '@OUTPUT@'])
> +
> +custom_target('igb_uio',
> +	input: ['igb_uio.c', 'Kbuild'],
> +	output: 'igb_uio.ko',
> +	command: ['make', '-C', kernel_dir,
> +		'M=' + meson.current_build_dir(),
> +		'src=' + meson.current_source_dir(),
> +		'EXTRA_CFLAGS=-I' + meson.current_source_dir() +
> +			'/../../common/include',
> +		'modules'],
> +	depends: mkfile,
> +	depend_files: [join_paths(kernel_dir, 'Kconfig')],

Can this be made optional somehow?

There's no build/Kconfig on Debian:

$ ls /lib/modules/4.9.0-3-amd64/build
arch  include  Makefile  Module.symvers  scripts

But the build works fine without that depend_files line.

> +	build_by_default: true)
> diff --git a/lib/librte_eal/linuxapp/meson.build
> b/lib/librte_eal/linuxapp/meson.build
> index bc9f22175..2383bd368 100644
> --- a/lib/librte_eal/linuxapp/meson.build
> +++ b/lib/librte_eal/linuxapp/meson.build
> @@ -30,3 +30,13 @@
>  #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
>  
>  subdir('eal')
> +
> +if get_option('enable_kmods')
> +	kernel_dir = get_option('kernel_dir')
> +	if kernel_dir == ''
> +		kernel_version = run_command('uname', '-
> r').stdout().strip()
> +		kernel_dir = '/lib/modules/' + kernel_version +
> '/build'
> +	endif
> +
> +	subdir('igb_uio')
> +endif
> diff --git a/meson_options.txt b/meson_options.txt
> index c03b79fbd..9c45b8159 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -4,3 +4,5 @@ option('max_numa_nodes', type: 'string', value: '4',
> description: 'maximum numbe
>  option('use_hpet', type: 'boolean', value: false, description: 'use
> HPET timer in EAL')
>  option('allow_invalid_socket_id', type: 'boolean', value: false,
>  	description: 'allow out-of-range NUMA socket id\'s for
> platforms that don\'t report the value correctly')
> +option('enable_kmods', type: 'boolean', value: true, description:
> 'build kernel modules')
> +option('kernel_dir', type: 'string', value: '', description: 'path
> to the kernel for building kernel modules')
  
Bruce Richardson Sept. 1, 2017, 1:55 p.m. UTC | #2
On Fri, Sep 01, 2017 at 02:32:52PM +0100, Luca Boccassi wrote:
> On Fri, 2017-09-01 at 11:04 +0100, Bruce Richardson wrote:
> > Support building igb_uio using meson and ninja. For this, we still
> > use the
> > kernel's kbuild system, by calling out to make, since it's safer and
> > easier
> > than trying to reproduce that in meson. A list of suitable file
> > dependencies is given so that we have a reasonable chance of a
> > rebuild when
> > necessary.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > ---
> >  lib/librte_eal/linuxapp/igb_uio/Kbuild      |  1 +
> >  lib/librte_eal/linuxapp/igb_uio/meson.build | 47
> > +++++++++++++++++++++++++++++
> >  lib/librte_eal/linuxapp/meson.build         | 10 ++++++
> >  meson_options.txt                           |  2 ++
> >  4 files changed, 60 insertions(+)
> >  create mode 100644 lib/librte_eal/linuxapp/igb_uio/Kbuild
> >  create mode 100644 lib/librte_eal/linuxapp/igb_uio/meson.build
> > 
> > diff --git a/lib/librte_eal/linuxapp/igb_uio/Kbuild
> > b/lib/librte_eal/linuxapp/igb_uio/Kbuild
> > new file mode 100644
> > index 000000000..98c98fe52
> > --- /dev/null
> > +++ b/lib/librte_eal/linuxapp/igb_uio/Kbuild
> > @@ -0,0 +1 @@
> > +obj-m := igb_uio.o
> > diff --git a/lib/librte_eal/linuxapp/igb_uio/meson.build
> > b/lib/librte_eal/linuxapp/igb_uio/meson.build
> > new file mode 100644
> > index 000000000..c046e1d66
> > --- /dev/null
> > +++ b/lib/librte_eal/linuxapp/igb_uio/meson.build
> > @@ -0,0 +1,47 @@
> > +#   BSD LICENSE
> > +#
> > +#   Copyright(c) 2017 Intel Corporation. All rights reserved.
> > +#   All rights reserved.
> > +#
> > +#   Redistribution and use in source and binary forms, with or
> > without
> > +#   modification, are permitted provided that the following
> > conditions
> > +#   are met:
> > +#
> > +#     * Redistributions of source code must retain the above
> > copyright
> > +#       notice, this list of conditions and the following
> > disclaimer.
> > +#     * Redistributions in binary form must reproduce the above
> > copyright
> > +#       notice, this list of conditions and the following disclaimer
> > in
> > +#       the documentation and/or other materials provided with the
> > +#       distribution.
> > +#     * Neither the name of Intel Corporation nor the names of its
> > +#       contributors may be used to endorse or promote products
> > derived
> > +#       from this software without specific prior written
> > permission.
> > +#
> > +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> > CONTRIBUTORS
> > +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> > NOT
> > +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> > FITNESS FOR
> > +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> > COPYRIGHT
> > +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> > INCIDENTAL,
> > +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> > +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> > USE,
> > +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> > ON ANY
> > +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> > TORT
> > +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> > THE USE
> > +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> > DAMAGE.
> > +
> > +mkfile = custom_target('igb_uio_makefile',
> > +	output: 'Makefile',
> > +	command: ['touch', '@OUTPUT@'])
> > +
> > +custom_target('igb_uio',
> > +	input: ['igb_uio.c', 'Kbuild'],
> > +	output: 'igb_uio.ko',
> > +	command: ['make', '-C', kernel_dir,
> > +		'M=' + meson.current_build_dir(),
> > +		'src=' + meson.current_source_dir(),
> > +		'EXTRA_CFLAGS=-I' + meson.current_source_dir() +
> > +			'/../../common/include',
> > +		'modules'],
> > +	depends: mkfile,
> > +	depend_files: [join_paths(kernel_dir, 'Kconfig')],
> 
> Can this be made optional somehow?
> 
> There's no build/Kconfig on Debian:
> 
> $ ls /lib/modules/4.9.0-3-amd64/build
> arch  include  Makefile  Module.symvers  scripts
> 
> But the build works fine without that depend_files line.
> 
Yep, definitely can be removed. I was just looking for some way to give
meson the smarts to know when the kmod needed to be recompiled, and it
seemed a likely candidate to watch for changes.

/Bruce
  
Luca Boccassi Sept. 1, 2017, 2:27 p.m. UTC | #3
On Fri, 2017-09-01 at 14:55 +0100, Bruce Richardson wrote:
> On Fri, Sep 01, 2017 at 02:32:52PM +0100, Luca Boccassi wrote:
> > On Fri, 2017-09-01 at 11:04 +0100, Bruce Richardson wrote:
> > > Support building igb_uio using meson and ninja. For this, we
> > > still
> > > use the
> > > kernel's kbuild system, by calling out to make, since it's safer
> > > and
> > > easier
> > > than trying to reproduce that in meson. A list of suitable file
> > > dependencies is given so that we have a reasonable chance of a
> > > rebuild when
> > > necessary.
> > > 
> > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > ---
> > >  lib/librte_eal/linuxapp/igb_uio/Kbuild      |  1 +
> > >  lib/librte_eal/linuxapp/igb_uio/meson.build | 47
> > > +++++++++++++++++++++++++++++
> > >  lib/librte_eal/linuxapp/meson.build         | 10 ++++++
> > >  meson_options.txt                           |  2 ++
> > >  4 files changed, 60 insertions(+)
> > >  create mode 100644 lib/librte_eal/linuxapp/igb_uio/Kbuild
> > >  create mode 100644 lib/librte_eal/linuxapp/igb_uio/meson.build
> > > 
> > > diff --git a/lib/librte_eal/linuxapp/igb_uio/Kbuild
> > > b/lib/librte_eal/linuxapp/igb_uio/Kbuild
> > > new file mode 100644
> > > index 000000000..98c98fe52
> > > --- /dev/null
> > > +++ b/lib/librte_eal/linuxapp/igb_uio/Kbuild
> > > @@ -0,0 +1 @@
> > > +obj-m := igb_uio.o
> > > diff --git a/lib/librte_eal/linuxapp/igb_uio/meson.build
> > > b/lib/librte_eal/linuxapp/igb_uio/meson.build
> > > new file mode 100644
> > > index 000000000..c046e1d66
> > > --- /dev/null
> > > +++ b/lib/librte_eal/linuxapp/igb_uio/meson.build
> > > @@ -0,0 +1,47 @@
> > > +#   BSD LICENSE
> > > +#
> > > +#   Copyright(c) 2017 Intel Corporation. All rights reserved.
> > > +#   All rights reserved.
> > > +#
> > > +#   Redistribution and use in source and binary forms, with or
> > > without
> > > +#   modification, are permitted provided that the following
> > > conditions
> > > +#   are met:
> > > +#
> > > +#     * Redistributions of source code must retain the above
> > > copyright
> > > +#       notice, this list of conditions and the following
> > > disclaimer.
> > > +#     * Redistributions in binary form must reproduce the above
> > > copyright
> > > +#       notice, this list of conditions and the following
> > > disclaimer
> > > in
> > > +#       the documentation and/or other materials provided with
> > > the
> > > +#       distribution.
> > > +#     * Neither the name of Intel Corporation nor the names of
> > > its
> > > +#       contributors may be used to endorse or promote products
> > > derived
> > > +#       from this software without specific prior written
> > > permission.
> > > +#
> > > +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> > > CONTRIBUTORS
> > > +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
> > > BUT
> > > NOT
> > > +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> > > FITNESS FOR
> > > +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> > > COPYRIGHT
> > > +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> > > INCIDENTAL,
> > > +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> > > NOT
> > > +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> > > LOSS OF
> > > USE,
> > > +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> > > AND
> > > ON ANY
> > > +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> > > OR
> > > TORT
> > > +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> > > OF
> > > THE USE
> > > +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> > > DAMAGE.
> > > +
> > > +mkfile = custom_target('igb_uio_makefile',
> > > +	output: 'Makefile',
> > > +	command: ['touch', '@OUTPUT@'])
> > > +
> > > +custom_target('igb_uio',
> > > +	input: ['igb_uio.c', 'Kbuild'],
> > > +	output: 'igb_uio.ko',
> > > +	command: ['make', '-C', kernel_dir,
> > > +		'M=' + meson.current_build_dir(),
> > > +		'src=' + meson.current_source_dir(),
> > > +		'EXTRA_CFLAGS=-I' + meson.current_source_dir() +
> > > +			'/../../common/include',
> > > +		'modules'],
> > > +	depends: mkfile,
> > > +	depend_files: [join_paths(kernel_dir, 'Kconfig')],
> > 
> > Can this be made optional somehow?
> > 
> > There's no build/Kconfig on Debian:
> > 
> > $ ls /lib/modules/4.9.0-3-amd64/build
> > arch  include  Makefile  Module.symvers  scripts
> > 
> > But the build works fine without that depend_files line.
> > 
> 
> Yep, definitely can be removed. I was just looking for some way to
> give
> meson the smarts to know when the kmod needed to be recompiled, and
> it
> seemed a likely candidate to watch for changes.
> 
> /Bruce

Thanks. This is the content of build/ and the parent directory in
Debian, in case you want to try and find some common ground:

$ ls -la /lib/modules/4.9.0-3-amd64/
total 4120
drwxr-xr-x  4 root root    4096 Aug 15 11:13 .
drwxr-xr-x  4 root root    4096 Aug 25 17:55 ..
lrwxrwxrwx  1 root root      36 May  2 16:21 build -> /usr/src/linux-
headers-4.9.0-3-amd64
drwxr-xr-x 12 root root    4096 May 17 18:58 kernel
-rw-r--r--  1 root root 1009588 Aug 15 11:13 modules.alias
-rw-r--r--  1 root root  968576 Aug 15 11:13 modules.alias.bin
-rw-r--r--  1 root root    4018 Aug  6 05:24 modules.builtin
-rw-r--r--  1 root root    5327 Aug 15 11:13 modules.builtin.bin
-rw-r--r--  1 root root  400037 Aug 15 11:13 modules.dep
-rw-r--r--  1 root root  551081 Aug 15 11:13 modules.dep.bin
-rw-r--r--  1 root root     402 Aug 15 11:13 modules.devname
-rw-r--r--  1 root root  133512 Aug  6 05:24 modules.order
-rw-r--r--  1 root root     523 Aug 15 11:13 modules.softdep
-rw-r--r--  1 root root  495231 Aug 15 11:13 modules.symbols
-rw-r--r--  1 root root  610575 Aug 15 11:13 modules.symbols.bin
lrwxrwxrwx  1 root root      37 May  2 16:21 source -> /usr/src/linux-
headers-4.9.0-3-common
drwxr-xr-x  3 root root    4096 May 17 18:58 updates

$ ls -la /lib/modules/4.9.0-3-amd64/build/
total 1460
drwxr-xr-x 4 root root    4096 Aug  7 10:27 .
drwxr-xr-x 9 root root    4096 Aug 25 17:55 ..
drwxr-xr-x 3 root root    4096 May 17 18:58 arch
-rw-r--r-- 1 root root  186386 Aug  6 05:24 .config
drwxr-xr-x 4 root root    4096 May 17 18:58 include
-rw-r--r-- 1 root root     242 Aug  6 05:24 .kernelvariables
-rw-r--r-- 1 root root     304 Aug  6 05:24 Makefile
-rw-r--r-- 1 root root 1278637 Aug  6 05:24 Module.symvers
lrwxrwxrwx 1 root root      34 May  2 16:21 scripts -> ../../lib/linux-
kbuild-4.9/scripts
  
Van Haaren, Harry Sept. 4, 2017, 1:57 p.m. UTC | #4
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> Sent: Friday, September 1, 2017 11:04 AM
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>
> Subject: [dpdk-dev] [PATCH 03/17] igb_uio: add igb_uio kmod to meson build
> 
> Support building igb_uio using meson and ninja. For this, we still use the
> kernel's kbuild system, by calling out to make, since it's safer and easier
> than trying to reproduce that in meson. A list of suitable file
> dependencies is given so that we have a reasonable chance of a rebuild when
> necessary.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>
  

Patch

diff --git a/lib/librte_eal/linuxapp/igb_uio/Kbuild b/lib/librte_eal/linuxapp/igb_uio/Kbuild
new file mode 100644
index 000000000..98c98fe52
--- /dev/null
+++ b/lib/librte_eal/linuxapp/igb_uio/Kbuild
@@ -0,0 +1 @@ 
+obj-m := igb_uio.o
diff --git a/lib/librte_eal/linuxapp/igb_uio/meson.build b/lib/librte_eal/linuxapp/igb_uio/meson.build
new file mode 100644
index 000000000..c046e1d66
--- /dev/null
+++ b/lib/librte_eal/linuxapp/igb_uio/meson.build
@@ -0,0 +1,47 @@ 
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+mkfile = custom_target('igb_uio_makefile',
+	output: 'Makefile',
+	command: ['touch', '@OUTPUT@'])
+
+custom_target('igb_uio',
+	input: ['igb_uio.c', 'Kbuild'],
+	output: 'igb_uio.ko',
+	command: ['make', '-C', kernel_dir,
+		'M=' + meson.current_build_dir(),
+		'src=' + meson.current_source_dir(),
+		'EXTRA_CFLAGS=-I' + meson.current_source_dir() +
+			'/../../common/include',
+		'modules'],
+	depends: mkfile,
+	depend_files: [join_paths(kernel_dir, 'Kconfig')],
+	build_by_default: true)
diff --git a/lib/librte_eal/linuxapp/meson.build b/lib/librte_eal/linuxapp/meson.build
index bc9f22175..2383bd368 100644
--- a/lib/librte_eal/linuxapp/meson.build
+++ b/lib/librte_eal/linuxapp/meson.build
@@ -30,3 +30,13 @@ 
 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 subdir('eal')
+
+if get_option('enable_kmods')
+	kernel_dir = get_option('kernel_dir')
+	if kernel_dir == ''
+		kernel_version = run_command('uname', '-r').stdout().strip()
+		kernel_dir = '/lib/modules/' + kernel_version + '/build'
+	endif
+
+	subdir('igb_uio')
+endif
diff --git a/meson_options.txt b/meson_options.txt
index c03b79fbd..9c45b8159 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -4,3 +4,5 @@  option('max_numa_nodes', type: 'string', value: '4', description: 'maximum numbe
 option('use_hpet', type: 'boolean', value: false, description: 'use HPET timer in EAL')
 option('allow_invalid_socket_id', type: 'boolean', value: false,
 	description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
+option('enable_kmods', type: 'boolean', value: true, description: 'build kernel modules')
+option('kernel_dir', type: 'string', value: '', description: 'path to the kernel for building kernel modules')