lvgl v8 linux下使用xmake交叉编译移植
移植准备
针对linux移植lvgl官方已经提供了移植工程,只需要根据自己板子修改frambuffer
的设备节点和input event
设备节点。
1、下载移植工程源码
下载地址:
由于速度问题只使用以下方式下载:
git clone https://github.com/lvgl/lv_port_linux_frame_buffer]
下载下来发现lv_drivers
和lvgl
目录是空的,对于这个问题直接去lvgl github仓库那里
下载release的压缩包:
lvgl-8.3.1.tar.gz
lv_drivers-8.3.0.tar.gz
解压并重命名为lvgl、lv_driver:
# 解压
tar xvf lvgl-8.3.1.tar.gz
tar xvf lv_drivers-8.3.0.tar.gz
# 重命名
mv lvgl-8.3.1 lvgl
mv lv_drivers-8.3.0 lv_drivers
移植修改
修改驱动配置头文件lv_drv_conf.h
322 #if USE_FBDEV
323 # define FBDEV_PATH "/dev/fb0"
324 #endif
根据板子实际情况选择fb
设备节点
449 #if USE_EVDEV || USE_BSD_EVDEV
450 # define EVDEV_NAME "/dev/input/event1"
根据实际情况选择 input event
交叉编译
lvgl官方的移植工程已经写好makefile,只需要make就可以编译成功。
但是这里不使用写好的makefile,使用makefile后续添加自己应用的目录和文件太麻烦,
这里我使用xmake
进行工程构建工作。
xmake
是类似cmake的构建工具。
cmake也用过,cmake似乎每个有源码的目录都需要一个CMakeList.txt ?像lvgl移植工程源码目录层级太多,添加CMakeLists.txt要吐血。
xmake
可以只有一个xmake.lua
在根目录。
xmake github : https://github.com/xmake-io/xmake
xmake 文档 :https://xmake.io/#/
编写xmake.lua :
target("mutlimedia") -- 设置目标程序名字
set_kind("binary") -- 设置编译成二进制程序,不设置默认编译成二进制程序,可选择编译成动静态库等
-- 设置交叉编译工具链头文件目录
add_includedirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include")
-- 设置链接库搜索路径
add_linkdirs("/opt/tslib-1.21/lib")
add_linkdirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib")
-- 设置链接的库
add_links("m", "pthread", "ts");
stdc = "c99"
set_languages(stdc, "c++11")
add_files("./*.c")
-- 递归遍历获取所有子目录
for _, dir in ipairs(os.dirs("lvgl/src/**")) do
add_files(dir.."/*.c");
add_includedirs(dir);
end
-- 递归遍历获取所有子目录
for _, dir in ipairs(os.dirs("lvgl/demos/**")) do
add_files(dir.."/*.c"); -- 添加目录下所有C文件
add_includedirs(dir); -- 添加目录作为头文件搜索路径
end
for _, v in ipairs(os.dirs("lv_drivers/**")) do
add_files(v.."/*.c");
add_includedirs(v);
end
add_includedirs(".")
add_includedirs("/opt/tslib-1.21/include")
编写build_xmake.sh脚本方便编译和拷贝程序到nfs目录:
#!/bin/bash
xmake f -p cross --sdk=/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf
xmake -P . -v
app_file=build/cross/arm/release/mutlimedia
if [ -e "${app_file}" ]; then # if this file is exist?
sudo cp build/cross/arm/release/mutlimedia /mnt/nfs/
echo "copy app to nfs directory ok!!!"
else
echo "file is not exist!!!"
fi
xmake f -p cross --sdk=/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf
配置交叉编译工具链路径- xmake -P . -v ,构建编译工程;-P表示强制在当前目录构建编译工程,-v表示输出更多编译信息。
- 执行./build_xmake.sh进行编译
编译完成会输出以下字样:
[100%]: build ok!
在build/cross/arm/release/下生成app程序mutlimedia
。build等目录是xmake自动生成的。
开发板测试
测试成功显示,使用官方移植好的工程来移植是很容易。
测试发现触摸不灵敏,使用tslib库来解决:修改lvgl Linux demo使用tslib获取触摸坐标
xmake构建文件优化
-- 设置工程名
set_project("mutilmedia")
-- 设置工程版本
set_version("1.1.0")
-- 自定义工具链
toolchain("arm-linux-gnueabihf")
-- 标记为独立工具链
set_kind("standalone")
-- 定义交叉编译工具链地址
set_sdkdir("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf")
add_linkdirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib")
add_includedirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include")
toolchain_end()
target("lvglv8")
-- static lib
set_kind("static")
-- 设置使用的交叉编译工具链
set_toolchains("arm-linux-gnueabihf")
set_languages("c99", "c++11")
local lvgl_src_path = {
"lvgl/src/",
}
for _, index in ipairs(lvgl_src_path) do
for _, dir in ipairs(os.dirs(index.."/**")) do
add_files(dir.."/*.c");
add_includedirs(dir);
end
end
add_includedirs("lvgl");
target("mutlimedia") -- 设置目标程序名字
set_kind("binary") -- 设置编译成二进制程序,不设置默认编译成二进制程序,可选择编译成动静态库等
-- 设置使用的交叉编译工具链
set_toolchains("arm-linux-gnueabihf")
-- 设置平台
set_plat("cross")
-- 设置架构
set_arch("arm")
-- 设置链接库搜索路径
add_linkdirs("/opt/tslib-1.21/lib")
-- 设置链接的库
add_links("m", "pthread", "ts");
add_deps("lvglv8")
stdc = "c99"
set_languages(stdc, "c++11")
add_cflags(
"-O3"
)
local lvgl_src_path = {
"lvgl/demos/",
"lv_drivers/"
}
for _, index in ipairs(lvgl_src_path) do
for _, dir in ipairs(os.dirs(index.."/**")) do
add_files(dir.."/*.c");
add_includedirs(dir);
end
end
add_includedirs("lvgl");
local usr_src_path = {
".",
"multimedia",
"multimedia/font",
"multimedia/img/camera",
"multimedia/img/desktop",
"multimedia/img/light",
"multimedia/img/music",
"multimedia/img/time",
"multimedia/img/video",
"multimedia/img/weather",
}
for _, dir in ipairs(usr_src_path) do
add_files(dir.."/*.c");
end
-- 排除文件,不参与编译
remove_files("multimedia/font/myFontDailyWeather.c")
remove_files("multimedia/font/myFont_Foshan.c")
remove_files("multimedia/font/myFontNumber.c")
add_includedirs(".")
add_includedirs("/opt/tslib-1.21/include")
after_build(
function(target)
cprint("Compile finished!!!")
print(" ");
os.exec("sudo cp build/cross/arm/release/mutlimedia /mnt/nfs/")
end)
toolchain("arm-linux-gnueabihf")
,定义工具链,不使用shell脚本设置工具链,直接执行xmake编译target("lvglv8")
,定义target目标,set_kind("static")
将lvgl编译成静态库add_deps("lvglv8")
,设置app程序依赖lvglv8静态库