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