简介
Meson 旨在开发最具可用性和快速的构建系统。提供简单但强大的声明式语言用来描述构建。原生支持最新的工具和框架,如 Qt5 、代码覆盖率、单元测试和预编译头文件等。利用一组优化技术来快速编译代码,包括增量编译和完全编译。
交叉编译
以在x86环境编译arm平台可执行文.件为例。
保存配置
meson 使用 ndk 工具链交叉编译 arm64 的配置。
将下述内容保存成类似叫做 arm64.txt 的文件。
[binaries]
c = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang'
cpp = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++'
ar = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar'
strip = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip'
#pkgconfig = '/usr/bin/x86_64-pc-linux-gnu-pkg-config'
cmake = '/Android/Sdk/cmake/3.18.1/bin/cmake'
ld = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld.gold'
#pcap-config = ''
[properties]
skip_sanity_check = true
sys_root = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot'
root = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29'
[built-in options]
c_args = ['-O2', '-pipe', '-g', '-feliminate-unused-debug-types']
c_link_args = ['-Wl,-O1', '-Wl,--hash-style=gnu', '-Wl,--as-needed']
cpp_args = ['-O2', '-pipe', '-g', '-feliminate-unused-debug-types']
cpp_link_args = ['-Wl,-O1', '-Wl,--hash-style=gnu', '-Wl,--as-needed']
#sys_root = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot'
#pkg_config_libdir ='/Android/Sdk/ndk/22.1.7171670/prebuilt/linux-x86_64/lib/pkgconfig'
#pkg_config_libdir ='/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29'
[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'
[target_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'armv8a'
endian = 'little'
修改配置
以下修改项在不同平台略有差异,但关键修改项基本一致。
以x86编译服务器10.44.3.21上编译arm64平台二进制为例。
修改C代码编译工具
将
c = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang'
修改为
c = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-gcc'
修改C++代码编译工具
将
cpp = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++'
修改为
cpp = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-g++'
修改库处理工具
将
ar = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar'
修改为
ar = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-ar'
修改strip工具
将
strip = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip'
修改为
strip = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-strip'
修改链接工具
将
ld = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld.gold'
修改为
ld = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-ld'
修改sys_root路径
将
root = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29'
修改为
sys_root = '/home/buildarm64/ft-yinhe-cross/host/aarch64-buildroot-linux-gnu/sysroot'
解析配置
然后运行:meson arm64-build --cross-file arm64.txt
解析文件arm64.txt中对编译器的配置信息。
编译
运行:ninja -C arm64-build
编译,其编译中间结果及最终结果将输出到./arm64-build/目录。
DPDK19.11.13编译实例
添加编译配置文件arm64.txt
实施过程中除了按“修改配置”章节中修改响应编译工具,还将cmake/root关键字响应配置屏蔽。
[binaries]
c = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-gcc'
cpp = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-g++'
ar = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-ar'
strip = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-strip'
#pkgconfig = '/usr/bin/x86_64-pc-linux-gnu-pkg-config'
#cmake = ''
ld = '/home/buildarm64/ft-yinhe-cross/host/usr/bin/aarch64-linux-gnu-ld'
#pcap-config = ''
[properties]
skip_sanity_check = true
sys_root = '/home/buildarm64/ft-yinhe-cross/host/aarch64-buildroot-linux-gnu/sysroot'
#root = 'lib/aarch64-linux-android/29'
[built-in options]
c_args = ['-O2', '-pipe', '-g', '-feliminate-unused-debug-types']
c_link_args = ['-Wl,-O1', '-Wl,--hash-style=gnu', '-Wl,--as-needed']
cpp_args = ['-O2', '-pipe', '-g', '-feliminate-unused-debug-types']
cpp_link_args = ['-Wl,-O1', '-Wl,--hash-style=gnu', '-Wl,--as-needed']
#sys_root = '/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot'
#pkg_config_libdir ='/Android/Sdk/ndk/22.1.7171670/prebuilt/linux-x86_64/lib/pkgconfig'
#pkg_config_libdir ='/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29'
[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'
[target_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'armv8a'
endian = 'little'
解析配置
meson arm64-build --cross-file arm64.txt
编译
ninja -C arm64-build
meson -Dexamples=all arm64-build
获取testpmd
编译完成生成可执行文件testpmd,路径如下:
./arm64-build/app/dpdk-testpmd