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