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