DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ilya Maximets <i.maximets@samsung.com>
To: dev@dpdk.org, Thomas Monjalon <thomas@monjalon.net>
Cc: Bruce Richardson <bruce.richardson@intel.com>,
	Aaron Conole <aconole@redhat.com>,
	Kevin Traynor <ktraynor@redhat.com>,
	Ilya Maximets <i.maximets@samsung.com>
Subject: [dpdk-dev] [PATCH 2/2] meson: make build configurable
Date: Wed, 29 May 2019 19:39:58 +0300	[thread overview]
Message-ID: <20190529163958.30796-3-i.maximets@samsung.com> (raw)
In-Reply-To: <20190529163958.30796-1-i.maximets@samsung.com>

The first thing many developers do before start building DPDK is
disabling all the not needed divers and libraries. This happens
just because more than a half of DPDK dirvers and libraries are not
needed for the particular reason. For example, you don't need
dpaa*, octeon*, various croypto devices, eventdev, etc. if you're
only want to build OVS for x86_64 with static linking.

By disabling everything you don't need, build speeds up literally 10x
times. This is important for CI systems. For example, TravisCI wastes
10 minutes for the default DPDK build just to check linking with OVS.

Another thing is the binary size. Number of DPDK libraries and,
as a result, size of resulted statically linked application decreases
significantly.

Important thing also that you're able to not install some dependencies
if you don't have them on a target platform. Just disable libs/drivers
that depends on it. Similar thing for the glibc version mismatch
between build and target platforms.

Also, I have to note that less code means less probability of
failures and less number of attack vectors.

This patch gives 'meson' the power of configurability that we
have with 'make'. Using new options it's possible to enable just
what you need and nothing more.

For example, following cmdline could be used to build almost minimal
set of DPDK libs and drivers to check OVS build:

  $ meson build -Dexamples='' -Dtests=false -Denable_kmods=false \
                -Ddrivers_bus=pci,vdev          \
                -Ddrivers_mempool=ring          \
                -Ddrivers_net=null,virtio,ring  \
                -Ddrivers_crypto=virtio         \
                -Ddrivers_compress=none         \
                -Ddrivers_event=none            \
                -Ddrivers_baseband=none         \
                -Ddrivers_raw=none              \
                -Ddrivers_common=none           \
                -Dlibs=kvargs,eal,cmdline,ring,mempool,mbuf,net,meter,\
                       ethdev,pci,hash,cryptodev,pdump,vhost \
                -Dapps=none

Adding a few real net drivers will give configuration that can be used
in production environment.

Looks not very pretty, but this could be moved to a script.

Build details:

  Build targets in project: 57

  $ time ninja
  real    0m11,528s
  user    1m4,137s
  sys     0m4,935s

  $ du -sh ../dpdk_meson_install/
  3,5M    ../dpdk_meson_install/

To compare with what we have without these options:

  $ meson build -Dexamples='' -Dtests=false -Denable_kmods=false
  Build targets in project: 434

  $ time ninja
  real    1m38,963s
  user    10m18,624s
  sys     0m45,478s

  $ du -sh ../dpdk_meson_install/
  27M     ../dpdk_meson_install/

10x speed up for the user time.
7.7 times size decrease.

This is probably not much user-friendly because it's not a Kconfig
and dependency tracking in meson is really poor, so it requires
usually few iterations to pick correct set of libraries to satisfy
all dependencies. However, it's not a big deal. Options intended
for a proficient users who knows what they need.

Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
---
 app/meson.build              |  5 +++++
 drivers/baseband/meson.build |  5 +++++
 drivers/bus/meson.build      |  6 ++++++
 drivers/common/meson.build   |  6 ++++++
 drivers/compress/meson.build |  5 +++++
 drivers/crypto/meson.build   |  5 +++++
 drivers/event/meson.build    |  6 ++++++
 drivers/mempool/meson.build  |  6 ++++++
 drivers/net/meson.build      |  6 ++++++
 drivers/raw/meson.build      |  6 ++++++
 lib/meson.build              |  5 +++++
 meson_options.txt            | 22 ++++++++++++++++++++++
 12 files changed, 83 insertions(+)

diff --git a/app/meson.build b/app/meson.build
index 2b9fdef74..48972954c 100644
--- a/app/meson.build
+++ b/app/meson.build
@@ -17,6 +17,11 @@ apps = [
 	'test-pipeline',
 	'test-pmd']
 
+enabled_apps = get_option('apps')
+if enabled_apps != 'all'
+	apps = (enabled_apps == 'none') ? [] : enabled_apps.split(',')
+endif
+
 # for BSD only
 lib_execinfo = cc.find_library('execinfo', required: false)
 
diff --git a/drivers/baseband/meson.build b/drivers/baseband/meson.build
index 52489df35..fabc80fc2 100644
--- a/drivers/baseband/meson.build
+++ b/drivers/baseband/meson.build
@@ -3,5 +3,10 @@
 
 drivers = ['null']
 
+enabled_drivers = get_option('drivers_baseband')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 config_flag_fmt = 'RTE_LIBRTE_@0@_PMD'
 driver_name_fmt = 'rte_pmd_@0@'
diff --git a/drivers/bus/meson.build b/drivers/bus/meson.build
index 80de2d91d..d1400ff28 100644
--- a/drivers/bus/meson.build
+++ b/drivers/bus/meson.build
@@ -2,6 +2,12 @@
 # Copyright(c) 2017 Intel Corporation
 
 drivers = ['dpaa', 'fslmc', 'ifpga', 'pci', 'vdev', 'vmbus']
+
+enabled_drivers = get_option('drivers_bus')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['eal']
 config_flag_fmt = 'RTE_LIBRTE_@0@_BUS'
 driver_name_fmt = 'rte_bus_@0@'
diff --git a/drivers/common/meson.build b/drivers/common/meson.build
index a50934108..311511365 100644
--- a/drivers/common/meson.build
+++ b/drivers/common/meson.build
@@ -3,5 +3,11 @@
 
 std_deps = ['eal']
 drivers = ['cpt', 'dpaax', 'mvep', 'octeontx', 'qat']
+
+enabled_drivers = get_option('drivers_common')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 config_flag_fmt = 'RTE_LIBRTE_@0@_COMMON'
 driver_name_fmt = 'rte_common_@0@'
diff --git a/drivers/compress/meson.build b/drivers/compress/meson.build
index 817ef3be4..5585ec537 100644
--- a/drivers/compress/meson.build
+++ b/drivers/compress/meson.build
@@ -3,6 +3,11 @@
 
 drivers = ['isal', 'octeontx', 'qat', 'zlib']
 
+enabled_drivers = get_option('drivers_compress')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['compressdev'] # compressdev pulls in all other needed deps
 config_flag_fmt = 'RTE_LIBRTE_@0@_PMD'
 driver_name_fmt = 'rte_pmd_@0@'
diff --git a/drivers/crypto/meson.build b/drivers/crypto/meson.build
index 83e78860e..7b1363f23 100644
--- a/drivers/crypto/meson.build
+++ b/drivers/crypto/meson.build
@@ -5,6 +5,11 @@ drivers = ['aesni_gcm', 'aesni_mb', 'caam_jr', 'ccp', 'dpaa_sec', 'dpaa2_sec',
 	'kasumi', 'mvsam', 'null', 'octeontx', 'openssl', 'qat', 'scheduler',
 	'snow3g', 'virtio', 'zuc']
 
+enabled_drivers = get_option('drivers_crypto')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['cryptodev'] # cryptodev pulls in all other needed deps
 config_flag_fmt = 'RTE_LIBRTE_@0@_PMD'
 driver_name_fmt = 'rte_pmd_@0@'
diff --git a/drivers/event/meson.build b/drivers/event/meson.build
index fb723f727..14e0c68ac 100644
--- a/drivers/event/meson.build
+++ b/drivers/event/meson.build
@@ -6,6 +6,12 @@ if not (toolchain == 'gcc' and cc.version().version_compare('<4.8.6') and
 	dpdk_conf.has('RTE_ARCH_ARM64'))
 	drivers += 'octeontx'
 endif
+
+enabled_drivers = get_option('drivers_event')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['eventdev', 'kvargs']
 config_flag_fmt = 'RTE_LIBRTE_@0@_EVENTDEV_PMD'
 driver_name_fmt = 'rte_pmd_@0@_event'
diff --git a/drivers/mempool/meson.build b/drivers/mempool/meson.build
index 4527d9806..cfacedd1b 100644
--- a/drivers/mempool/meson.build
+++ b/drivers/mempool/meson.build
@@ -2,6 +2,12 @@
 # Copyright(c) 2017 Intel Corporation
 
 drivers = ['bucket', 'dpaa', 'dpaa2', 'octeontx', 'ring', 'stack']
+
+enabled_drivers = get_option('drivers_mempool')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['mempool']
 config_flag_fmt = 'RTE_LIBRTE_@0@_MEMPOOL'
 driver_name_fmt = 'rte_mempool_@0@'
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index ed99896c3..901be5eac 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -42,6 +42,12 @@ drivers = ['af_packet',
 	'virtio',
 	'vmxnet3',
 ]
+
+enabled_drivers = get_option('drivers_net')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['ethdev', 'kvargs'] # 'ethdev' also pulls in mbuf, net, eal etc
 std_deps += ['bus_pci']         # very many PMDs depend on PCI, so make std
 std_deps += ['bus_vdev']        # same with vdev bus
diff --git a/drivers/raw/meson.build b/drivers/raw/meson.build
index a61cdccef..ca98e92f0 100644
--- a/drivers/raw/meson.build
+++ b/drivers/raw/meson.build
@@ -2,6 +2,12 @@
 # Copyright 2018 NXP
 
 drivers = ['skeleton_rawdev', 'dpaa2_cmdif', 'dpaa2_qdma', 'ifpga_rawdev']
+
+enabled_drivers = get_option('drivers_raw')
+if enabled_drivers != 'all'
+	drivers = (enabled_drivers == 'none') ? [] : enabled_drivers.split(',')
+endif
+
 std_deps = ['rawdev']
 config_flag_fmt = 'RTE_LIBRTE_PMD_@0@_RAWDEV'
 driver_name_fmt = 'rte_pmd_@0@'
diff --git a/lib/meson.build b/lib/meson.build
index e067ce5ea..384867926 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -34,6 +34,11 @@ if is_windows
 	libraries = ['kvargs','eal'] # only supported libraries for windows
 endif
 
+enabled_libs = get_option('libs')
+if enabled_libs != 'all'
+	libraries = (enabled_libs == 'none') ? [] : enabled_libs.split(',')
+endif
+
 default_cflags = machine_args
 if cc.has_argument('-Wno-format-truncation')
 	default_cflags += '-Wno-format-truncation'
diff --git a/meson_options.txt b/meson_options.txt
index 16d9f92c6..5184917b0 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -2,6 +2,26 @@
 
 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('apps', type: 'string', value: 'all',
+	description: 'List of applications to build. Defaults to all')
+option('drivers_baseband', type: 'string', value: 'all',
+	description: 'List of baseband drivers to build. Defaults to all')
+option('drivers_bus', type: 'string', value: 'all',
+	description: 'List of bus drivers to build. Defaults to all')
+option('drivers_common', type: 'string', value: 'all',
+	description: 'List of common drivers to build. Defaults to all')
+option('drivers_compress', type: 'string', value: 'all',
+	description: 'List of compress drivers to build. Defaults to all')
+option('drivers_crypto', type: 'string', value: 'all',
+	description: 'List of crypto drivers to build. Defaults to all')
+option('drivers_event', type: 'string', value: 'all',
+	description: 'List of event drivers to build. Defaults to all')
+option('drivers_mempool', type: 'string', value: 'all',
+	description: 'List of mempool drivers to build. Defaults to all')
+option('drivers_net', type: 'string', value: 'all',
+	description: 'List of net drivers to build. Defaults to all')
+option('drivers_raw', type: 'string', value: 'all',
+	description: 'List of rawdev drivers to build. Defaults to all')
 option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>',
 	description: 'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
 option('enable_docs', type: 'boolean', value: false,
@@ -16,6 +36,8 @@ option('include_subdir_arch', type: 'string', value: '',
 	description: 'subdirectory where to install arch-dependent headers')
 option('kernel_dir', type: 'string', value: '',
 	description: 'path to the kernel for building kernel modules, they will be installed in $DEST_DIR/$kernel_dir/../extra/dpdk')
+option('libs', type: 'string', value: 'all',
+	description: 'List of libraries to build. Defaults to all')
 option('lib_musdk_dir', type: 'string', value: '',
 	description: 'path to the MUSDK library installation directory')
 option('machine', type: 'string', value: 'native',
-- 
2.17.1


  parent reply	other threads:[~2019-05-29 16:40 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20190529164004eucas1p154674b298c0b906f663ae04ebfcbc33c@eucas1p1.samsung.com>
2019-05-29 16:39 ` [dpdk-dev] [PATCH 0/2] Make meson configurable Ilya Maximets
     [not found]   ` <CGME20190529164006eucas1p296e902a46cb3ef7ac436d619f9e55d5b@eucas1p2.samsung.com>
2019-05-29 16:39     ` [dpdk-dev] [PATCH 1/2] meson: don't check dependencies for tests if not required Ilya Maximets
2019-05-30 11:55       ` Bruce Richardson
2019-05-30 12:06         ` Ilya Maximets
2019-05-30 12:20           ` Bruce Richardson
     [not found]       ` <CGME20190530123840eucas1p216e6df3737209db26e2b0ce678ba9da4@eucas1p2.samsung.com>
2019-05-30 12:38         ` [dpdk-dev] [PATCH v2] " Ilya Maximets
2019-05-30 12:48           ` Bruce Richardson
2019-06-05 16:48             ` Thomas Monjalon
2019-05-30 13:08           ` Aaron Conole
2019-05-30 13:34           ` Luca Boccassi
     [not found]   ` <CGME20190529164009eucas1p289f1dcf87012ecf049efc8eee2c2ea9d@eucas1p2.samsung.com>
2019-05-29 16:39     ` Ilya Maximets [this message]
2019-05-29 20:15       ` [dpdk-dev] [PATCH 2/2] meson: make build configurable Michael Santana Francisco
2019-05-30  9:22         ` Ilya Maximets
2019-05-29 20:37       ` Luca Boccassi
2019-05-30 10:03         ` Ilya Maximets
2019-05-30 11:06           ` Luca Boccassi
2019-05-30 11:59             ` Ilya Maximets
2019-05-30 13:30               ` Luca Boccassi
2019-05-30 10:22         ` Bruce Richardson
2019-05-30 11:46           ` Ilya Maximets

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190529163958.30796-3-i.maximets@samsung.com \
    --to=i.maximets@samsung.com \
    --cc=aconole@redhat.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=ktraynor@redhat.com \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).