一、背景
之前编译过老版的dpdk,听说新版的dpdk编译都使用meson、ninja工具编译,和以前的方法不太一样,一直想体验一下。而且最近工作需要使用yocto的编译链,所以就尝试配置yocto的编译链来交叉编译下dpdk。
二、编译前准备
我的环境是ubuntu 20.04
安装meson ninja
pyelftools
apt-get
install
python3-pyelftools
Python 3.5 or later
libnuma-dev
libelf
从dpdk官网下载了dpdk-stable-20.11.4版本。
这些网上都有。
三、主机编译
Build libraries, drivers and test applicmeson buildations.
meson build
ninja -C build
meson build命令后,创建build目录,ninja命令编译后的结果文件都在这个目录中
也可以部分编译
meson -Dexamples=all build
ninja -C build
第一次配置编译目录后,可以重新配置目录,查看支持哪些配置参数可以使用
meson configure查看支持的配置
可以重新配置使能内核模块的编译,指定内核编译目录
build目录中修改配置,
meson configure -Denable_kmods=true -Dkernel_dir=/home/oem/test/
注意:其中kernel默认会查找的目录会为/home/oem/test/build
退到上一级目录,编译
ninja -C build
主机编译默认的机器类型为-Dplatform=native
上面这些官网文档介绍的很全。
四、使用YOCTO交叉编译链
使用yocto编译链交叉编译的格式为:
meson cross-build --cross-file <target_machine_configuration>
ninja -C cross-build
上面这个编译命令的关键就在于<target_machine_configuration>,刚开始没搞懂这个文件是个什么类型的文件,编译不成功。后来经过仔细查看官网文档后,发现dpdk的源码目录下有config/x86/cross-mingw,猜测这个文件就属<target_machine_configuration>,参考格式配置之后,出现找不到标准头文件如stdio.h之类的文件的错误,说明交叉编译的头文件路径配置的不对,说明配置方法不对,经过再查看官网文档,创建文件config/x86/cross-yocto
[binaries]
c_args = ['-target', 'x86_64-poky-linux', '--sysroot', '/home/oem/toolchain-test/sysroots/skylake-64-poky-linux']
c_link_args = ['-target', 'x86_64-poky-linux', '-fuse-ld=lld', '--sysroot', '/home/oem/toolchain-test/sysroots/skylake-64-poky-linux', '--gcc-toolchain=/home/oem/toolchain-test/sysroots/x86_64-pokysdk-linux/usr/bin']
[host_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'skylake'
endian = 'little'
这个文件就是yocto交叉编译DPDK的关键,也是本文的关键。
有了这个文件后,就可以编译了
使能yocto交叉编译变量
source ~/toolchain-test/environment-setup-skylake-64-poky-linux
配置工程
meson -Denable_kmods=true -Dkernel_dir=/home/oem/test/ yocto-cross-build --cross-file config/x86/cross-yocto
编译
ninja -C yocto-cross-build
感兴趣的同学加关注,欢迎一起交流学习