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