xref: /dpdk/doc/guides/prog_guide/build-sdk-meson.rst (revision a39f5e14560df310e7af3c135a11bb6f51eb92e6)
1..  SPDX-License-Identifier: BSD-3-Clause
2    Copyright(c) 2018 Intel Corporation.
3
4Installing DPDK Using the meson build system
5============================================
6
7Summary
8--------
9For many platforms, compiling and installing DPDK should work using the
10following set of commands::
11
12	meson build
13	cd build
14	ninja
15	ninja install
16
17This will compile DPDK in the ``build`` subdirectory, and then install the
18resulting libraries, drivers and header files onto the system - generally
19in /usr/local. A package-config file, ``libdpdk.pc``,  for DPDK will also
20be installed to allow ease of compiling and linking with applications.
21
22After installation, to use DPDK, the necessary CFLAG and LDFLAG variables
23can be got from pkg-config::
24
25	pkg-config --cflags libdpdk
26	pkg-config --libs libdpdk
27
28More detail on each of these steps can be got from the following sections.
29
30
31Getting the Tools
32------------------
33
34The ``meson`` tool is used to configure a DPDK build. On most Linux
35distributions this can be got using the local package management system,
36e.g. ``dnf install meson`` or ``apt-get install meson``. If meson is not
37available as a suitable package, it can also be installed using the Python
383 ``pip`` tool, e.g. ``pip3 install meson``. Version 0.53.2 or later of meson is
39required - if the version packaged is too old, the latest version is
40generally available from "pip".
41
42The other dependency for building is the ``ninja`` tool, which acts similar
43to make and performs the actual build using information provided by meson.
44Installing meson will, in many cases, also install ninja, but, if not
45already installed, it too is generally packaged by most Linux distributions.
46If not available as a package, it can be downloaded as source or binary from
47https://ninja-build.org/
48
49It is best advised to go over the following links for the complete dependencies:
50
51* :doc:`Linux <../linux_gsg/sys_reqs>`
52* :doc:`FreeBSD <../freebsd_gsg/build_dpdk>`
53* :doc:`Windows <../windows_gsg/build_dpdk>`
54
55
56Configuring the Build
57----------------------
58
59To configure a build, run the meson tool, passing the path to the directory
60to be used for the build e.g. ``meson build``, as shown above. If calling
61meson from somewhere other than the root directory of the DPDK project the
62path to the root directory should be passed as the first parameter, and the
63build path as the second. For example, to build DPDK in /tmp/dpdk-build::
64
65	user@host:/tmp$ meson ~user/dpdk dpdk-build
66
67Meson will then configure the build based on settings in the project's
68meson.build files, and by checking the build environment for e.g. compiler
69properties or the presence of dependencies, such as libpcap, or openssl
70libcrypto libraries. Once done, meson writes a ``build.ninja`` file in the
71build directory to be used to do the build itself when ninja is called.
72
73Tuning of the build is possible, both as part of the original meson call,
74or subsequently using ``meson configure`` command (``mesonconf`` in some
75older versions). Some options, such as ``buildtype``, or ``werror`` are
76built into meson, while others, such as ``max_lcores``, or the list of
77examples to build, are DPDK-specific. To have a list of all options
78available run ``meson configure`` in the build directory.
79
80Examples of adjusting the defaults when doing initial meson configuration.
81Project-specific options are passed used -Doption=value::
82
83	meson --werror werrorbuild  # build with warnings as errors
84
85	meson --buildtype=debug debugbuild  # build for debugging
86
87	meson -Dexamples=l3fwd,l2fwd fwdbuild  # build some examples as
88					# part of the normal DPDK build
89
90	meson -Dmax_lcores=8 smallbuild  # scale build for smaller systems
91
92	meson -Denable_docs=true fullbuild  # build and install docs
93
94	meson -Dcpu_instruction_set=generic  # use builder-independent baseline -march
95
96	meson -Ddisable_drivers=event/*,net/tap  # disable tap driver and all
97					# eventdev PMDs for a smaller build
98
99	meson -Denable_trace_fp=true tracebuild # build with fast path traces
100					# enabled
101
102Examples of setting some of the same options using meson configure::
103
104	meson configure -Dwerror=true
105
106	meson configure -Dbuildtype=debug
107
108	meson configure -Dexamples=l3fwd,l2fwd
109
110	meson configure -Dmax_lcores=8
111
112	meson configure -Denable_trace_fp=true
113
114.. note::
115
116        once meson has been run to configure a build in a directory, it
117        cannot be run again on the same directory. Instead ``meson configure``
118        should be used to change the build settings within the directory, and when
119        ``ninja`` is called to do the build itself, it will trigger the necessary
120        re-scan from meson.
121
122.. note::
123
124   cpu_instruction_set=generic uses an instruction set that works on
125   all supported architectures regardless of the capabilities of the machine
126   where the build is happening.
127
128.. note::
129
130   cpu_instruction_set is not used in Arm builds, as setting the instruction set
131   without other parameters leads to inferior builds.
132   The way to tailor Arm builds is to build for a SoC using -Dplatform=<SoC>.
133
134As well as those settings taken from ``meson configure``, other options
135such as the compiler to use can be passed via environment variables. For
136example::
137
138	CC=clang meson clang-build
139
140.. note::
141
142        for more comprehensive overriding of compilers or other environment
143        settings, the tools for cross-compilation may be considered. However, for
144        basic overriding of the compiler etc., the above form works as expected.
145
146
147Performing the Build
148---------------------
149
150Use ``ninja`` to perform the actual build inside the build folder
151previously configured. In most cases no arguments are necessary.
152
153Ninja accepts a number of flags which are similar to make. For example, to
154call ninja from outside the build folder, you can use ``ninja -C build``.
155Ninja also runs parallel builds by default, but you can limit this using
156the ``-j`` flag, e.g. ``ninja -j1 -v`` to do the build one step at a time,
157printing each command on a new line as it runs.
158
159
160Installing the Compiled Files
161------------------------------
162
163Use ``ninja install`` to install the required DPDK files onto the system.
164The install prefix defaults to ``/usr/local`` but can be used as with other
165options above. The environment variable ``DESTDIR`` can be used to adjust
166the root directory for the install, for example when packaging.
167
168With the base install directory, the individual directories for libraries
169and headers are configurable. By default, the following will be the
170installed layout::
171
172	headers -> /usr/local/include
173	libraries -> /usr/local/lib64
174	drivers -> /usr/local/lib64/dpdk/drivers
175	libdpdk.pc -> /usr/local/lib64/pkgconfig
176
177For the drivers, these will also be symbolically linked into the library
178install directory, so that ld.so can find them in cases where one driver may
179depend on another, e.g. a NIC PMD depending upon the PCI bus driver. Within
180the EAL, the default search path for drivers will be set to the configured
181driver install path, so dynamically-linked applications can be run without
182having to pass in ``-d /path/to/driver`` options for standard drivers.
183
184
185Cross Compiling DPDK
186--------------------
187
188To cross-compile DPDK on a desired target machine we can use the following
189command::
190
191	meson cross-build --cross-file <target_machine_configuration>
192
193For example if the target machine is arm64 we can use the following
194command::
195
196        meson arm-build --cross-file config/arm/arm64_armv8_linux_gcc
197
198where config/arm/arm64_armv8_linux_gcc contains settings for the compilers
199and other build tools to be used, as well as characteristics of the target
200machine.
201
202Using the DPDK within an Application
203-------------------------------------
204
205To compile and link against DPDK within an application, pkg-config should
206be used to query the correct parameters. Examples of this are given in the
207makefiles for the example applications included with DPDK. They demonstrate
208how to link either against the DPDK shared libraries, or against the static
209versions of the same.
210
211From examples/helloworld/Makefile::
212
213	PC_FILE := $(shell pkg-config --path libdpdk)
214	CFLAGS += -O3 $(shell pkg-config --cflags libdpdk)
215	LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk)
216	LDFLAGS_STATIC = $(shell pkg-config --static --libs libdpdk)
217
218	build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
219		$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
220
221	build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build
222		$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
223
224	build:
225		@mkdir -p $@
226