OTBR移植
准备工作
1、准备好交叉编译工具,并配置路径到环境变量 这块内容不多赘述
大致步骤:
将编译工具链路径配置到/etc/profile 中
如按自己实际路径进行配置
export PATH="/opt/toolchains/crosstools-arm-gcc-9.2-linux-4.19-glibc-2.30-binutils-2.32/bin:$PATH"
export C_INCLUDE_PATH="/home/arm_include:$C_INCLUDE_PATH"
export LD_LIBRARY_PATH="/opt/arm_lib":$LD_LIBRARY_PATH
配置完后 source 一下这个文件
完成验证:
在终端任意界面输入arm 按table能够得到如下提示
2、在/opt 下创建一个存放arm 库的文件夹arm_lib 用来存放前置arm库
mkdir arm_lib
移植一些必要库
1、mdns库移植如果使用avahi则可以跳过这步
mdns 库地址
https://codeload.github.com/apple-oss-distributions/mDNSResponder/tar.gz/refs/tags/mDNSResponder-1310.80.1
$ tar -zxvf mDNSResponder-1310.80.1-modifyMakefile.tar.gz
$ cd mDNSResponder-1310.80.1/mDNSPosix/
$ vi ../Clients/Makefile
增加:
CC = arm-buildroot-linux-gnueabi-gcc
$ vi Makefile
CC = arm-buildroot-linux-gnueabi-gcc
STRIP = arm-buildroot-linux-gnueabi-strip
$ make os=linux
编译完成后会生成build文件夹,将里面的libdns_sd.so copy到自己存放库的文件夹内
编译报错:
undefined reference to `va_start'
进入Clients 文件夹 修改dns-sd.c
增加头文件
#include <sys/param.h>
#include <stdarg.h>
保存退出 继续编译
OTBR 源码编译
源码下载
git clone ---recursive https://github.com/openthread/ot-br-posix.git
增加交叉编译工具配置文件
在examples/platforms 文件夹中增加自己所用平台的文件夹,并在该文件夹中增加arm.cmake文件
如
examples/platforms/bcm6756/arm.cmake
文件内容为
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-buildroot-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-buildroot-linux-gnueabi-g++)
set(CMAKE_C_COMPILER_LAUNCHER)
set(CMAKE_CXX_COMPILER_LAUNCHER)
set(CMAKE_ASM_COMPILER arm-buildroot-linux-gnueabi-gcc)
find_program(CMAKE_AR arm-buildroot-linux-gnueabi-gcc-ar DOC "Archiver" REQUIRED)
set(CMAKE_C_FLAGS "-mthumb-interwork -mfloat-abi=soft -march=armv7-a+mp+sec -mcpu=cortex-a9 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security -pipe -g -feliminate-unused-debug-types -Wno-psabi -lpthread" CACHE STRING "CFLAGS")
set(CMAKE_ASM_FLAGS "-mthumb-interwork -mfloat-abi=soft -mcpu=cortex-a9 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security " CACHE STRING "ASM FLAGS")
set(CMAKE_C_LINK_FLAGS "-mthumb -mfpu=neon -mfloat-abi=soft -mcpu=cortex-a9 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security -Wl,-z,relro,-z,now -L/opt/arm_lib -I/home/lyle/arm_include" CACHE STRING "LDFLAGS")
set(CMAKE_CXX_FLAGS "-mthumb-interwork -mfloat-abi=soft -march=armv7-a+mp+sec -mcpu=cortex-a9 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security -fvisibility-inlines-hidden -Wno-psabi -lpthread" CACHE STRING "CXXFLAGS")
set(CMAKE_CXX_LINK_FLAGS "-mthumb -mfpu=neon -mfloat-abi=soft -mcpu=cortex-a9 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security -fvisibility-inlines-hidden -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now -L/opt/arm_lib " CACHE STRING "LDFLAGS")
FLAGS按所用平台内容进行修改
初始化编译环境
./script/bootstrap
修改配置项
vim etc/cmake/options.cmake
-option(OTBR_BORDER_ROUTING "Enable Border Routing Manager" OFF)
+option(OTBR_BORDER_ROUTING "Enable Border Routing Manager" ON)
-option(OTBR_SRP_ADVERTISING_PROXY "Enable Advertising Proxy" OFF)
+option(OTBR_SRP_ADVERTISING_PROXY "Enable Advertising Proxy" ON)
-option(OTBR_DNSSD_DISCOVERY_PROXY "Enable DNS-SD Discovery Proxy support" OFF)
+option(OTBR_DNSSD_DISCOVERY_PROXY "Enable DNS-SD Discovery Proxy support" ON)
-option(OTBR_NAT64 "Enable NAT64 support" OFF)
+option(OTBR_NAT64 "Enable NAT64 support" ON)
编译otbr
./script/cmake-build -DCMAKE_TOOLCHAIN_FILE=./examples/platforms/bcm6756/arm.cmake -DOT_DAEMON=ON -DBUILD_TESTING=OFF -DOTBR_BORDER_ROUTING=ON -DOT_JOINER=ON -DOT_COMMISSIONER=ON -DOTBR_MDNS=mDNSResponder
重要参数解释
-DBUILD_TESTING=OFF 表示关闭test测试内容,此内容容易导致编译不通过
-DOTBR_MDNS=mDNSResponder otbr默认使用的多播方式为avahi,如果平台中已经存在AVAHI,则不要此选项,使用mdns的进行多播的使用此选项
报错解决
报这个问题
../../src/mdns/mdns_mdnssd.hpp:44:10: fatal error: dns_sd.h: No such file or directory
44 | #include <dns_sd.h>
打开mdns_mdnssd.hpp 将<dns_sd.h> 修改为 "dns_sd.h" 并将dns_sd.h文件copy到mdns_mdnssd.hpp所在文件夹内
报问题
cannot find -ldns_sd
将保存上面所移植的dns_sd库添加到环境变量所写的LD_LIBRARY_PATH 路径中
然后
rm -rf build/* 后
重新执行编译