当前位置:   article > 正文

往Buildroot中增加Qt项目_linux buildroot qt

linux buildroot qt

前言

目的:应用开发时最初是没有和buildroot中一起编译时,后面应用程序写的差不多时,同事问我怎么把应用程序打包到文件系统中,然后发布时跟随文件系统一起发布,并且增加打包启动脚本。所以本文在已经可以单独编译的基础上把项目放入buildroot一起编译。

应用程序单独可以编译(buildroot 有make sdk 单独打包编译环境)。

本文简化了项目部分内容,仅以demo 为项目代号,记录在buildroot中增加qt项目的过程。

环境:ubuntu20.04 、瑞芯微 RV1109 SDK 

实现方法

1. 在app 目录下创建一个qt工程

创建过程省略,当然后创建工程的路径也可以任务指定,不一定非得在SDK中的app目录下,只是app下面有很多其它的demo,这里也就放在app路径下了。这里假设app目录下创建工程文件名为demo/gui/demo.pro 工程

2.buildroot的操作

在SDK路径/buildroot/package 创建一个demo 文件夹,文件夹中分别创建二个文件,一个demo.mk 另一个为Config.in ; 内容分别为

demo.mk:

  1. ################################################################################
  2. #
  3. # demo
  4. #
  5. ################################################################################
  6. DEMO_VERSION = 1.0
  7. DEMO_SITE = ${TOPDIR}/../app/demo
  8. DEMO_SITE_METHOD = local
  9. DEMO_LICENSE = Apache V2.0
  10. DEMO_LICENSE_FILES = NOTICE
  11. #rkmedia 会包含 libeasymedia librkuvc 的依赖 , 而librkuvc在rv1108 package中,会自动去设置BR2_PACKAGE_RV1108
  12. BRONCHUSMIRRORRGA_DEPENDENCIES = qt5base qt5multimedia sqlite rkfacial libv4l rkmedia
  13. define DEMO_CONFIGURE_CMDS
  14. cd $(@D)/gui/;$(TARGET_MAKE_ENV) $(HOST_DIR)/bin/qmake ;
  15. endef
  16. define DEMO_BUILD_CMDS
  17. source $(@D)/gui/../work_sdk_path.sh; $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/gui/
  18. endef
  19. define DEMO_INSTALL_TARGET_CMDS
  20. $(@D)/app_install.sh $(TARGET_DIR)
  21. endef
  22. $(eval $(generic-package))

注意这里 多了个/gui/ ,因为写建工程时demo.pro 是放在工程目录gui下方的。

mk文件要增加依赖

  1. #rkmedia 会包含 libeasymedia librkuvc 的依赖 , 而librkuvc在rv1108 package中,会自动去设置BR2_PACKAGE_RV1108
  2. DEMO_DEPENDENCIES = qt5base qt5multimedia sqlite rkfacial libv4l rkmedia


如注释所写,这里面增加了依赖会自动选择对应的设置BR2_PACKAGE_RV1108 ,与make menuconfig 等效。

Config.in:

  1. config BR2_PACKAGE_DEMO
  2. bool "demo"
  3. help
  4. this is a app for QT Buildroot demo

在/buildroot/package 路径下增加“source "package/demo/Config.in"”

  1. menu "Target packages"
  2. source "package/busybox/Config.in"
  3. source "package/rockchip/Config.in"
  4. source "package/skeleton/Config.in"
  5. source "package/skeleton-custom/Config.in"
  6. source "package/skeleton-init-common/Config.in"
  7. source "package/skeleton-init-none/Config.in"
  8. source "package/skeleton-init-systemd/Config.in"
  9. source "package/skeleton-init-sysv/Config.in"
  10. source "package/testApp/Config.in"
  11. source "package/demo/Config.in"

3.验证使用buildroot 编译是否正确

先设置编译buildroot的环境,执行source envsetup.sh rockchip_rv1126_rv1109_facial_gate。下面是查看当前sdk使用哪个环境编译的。

  1. ubuntu:~/work/rv1109_rq/rv1126_1109_20220429$ ./build.sh -h rootfs
  2. ###Current SDK Default [ rootfs ] Build Command###
  3. source envsetup.sh rockchip_rv1126_rv1109_facial_gate
  4. make

然后再进入buildroot目录 执行 

(1)make demo-dirclean  删除掉工buildroot缓存的工程目录 ,因为在测试过程中,我们的文件一直是放在app下,有时增加或者修改(单独编译qmake)与buildroot下的不同,所以需要先clean 删除。

(2)make demo-rebuild   进行编译,看是否报错

如果不报错,就接近使用了。

4.buildroot  的menuconfig中设置

选择BR2_PACKAGE_DEMO 后面在buildrootk 整个make 就可以执行整个流程了

实际问题

从上面的流程中,只是一般性的描述了如何把一个工程放入buildroot下编译,并且编译成功,但并没有解决打包的问题,同时增加的buildrot,因为文件目录众多,关系有点绕。其他人只关心怎么把应用程序、配置、资源文件、启动脚本打包进文件系统。至于buildroot 如果去配置,他们不关心,也不想经常去改。且多人配合时,路径问题如何管理。

路径管理

多人开发时引用头文件或者库的路径问题,怎么才不至于不同开发人员间频繁的修改代码或者配置

下面方式通过设置WORK_SDK_PATH 来实现不同路径的切换

  1. INCLUDEPATH += $(WORK_SDK_PATH)/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/easymedia
  2. INCLUDEPATH += $(WORK_SDK_PATH)/rv1126_1109_20220429/external/rkfacial
  3. INCLUDEPATH += $(WORK_SDK_PATH)/rv1126_1109_20220429/external/rknpu/rknn/rknn_api/librknn_api/include
  4. INCLUDEPATH += $(WORK_SDK_PATH)/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/drm

程序编译时环境配置

修改DEMO_BUILD_CMDS

source $(@D)/gui/../work_sdk_path.sh; $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/gui/

来设置“路径管理”中设置的变量,这个脚本在app/demo/work_sdk_path.sh 路径下。

打包时调用自定义脚本

修改DEMO_INSTALL_TARGET_CMDS 

$(@D)/app_install.sh $(TARGET_DIR)

这个脚本在app/demo/app_install.sh 路径下

注意$(@D) 表示的并不是app/demo的目录,表示的是buildroot/output/build/demo 下的路径

userdata相关的问题

编译buildroot

  1. xxx@ubuntu:~/work/rv1126_1109_20220429$ ./build.sh rootfs
  2. xxx@ubuntu:~/work/rv1126_1109_20220429$ ./build.sh firmware && ./build.sh updateimg

会发现烧录updateimg 时对应的userdata 文件夹没有对应的文件
烧入方法如下(对tool对应的目录下)

sudo ./upgrade_tool uf ../../../../rockdev/update.img

这时阅读SDK中的build.sh mkfirmware.sh /tools/linux/Linux_Pack_Firmware/rockdev/mkupdate.sh 脚本,跟踪和调试update.img 制作过程,发现updte.img 没有把userdata.img 打包进来; 也就是说update.img 是空的。

在设备中df -h 中查看,userdata挂载的是/dev/mmcblk0p8 也就是制作img时的userdata, 与根文件系统的userdata文件夹名字相同,但性质不一样

  1. [root@RV1126_RV1109:/]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/root 1.5G 601M 761M 45% /
  4. devtmpfs 449M 0 449M 0% /dev
  5. tmpfs 449M 0 449M 0% /dev/shm
  6. tmpfs 449M 464K 449M 1% /tmp
  7. tmpfs 449M 328K 449M 1% /run
  8. /dev/mmcblk0p7 125M 1.7M 120M 2% /oem
  9. /dev/mmcblk0p8 5.5G 3.6M 5.5G 1% /userdata

在/etc/fstab 下把userdata的开机挂载屏蔽掉

  1. # <file system> <mount pt> <type> <options> <dump> <pass>
  2. /dev/root / ext2 rw,noauto 0 1
  3. proc /proc proc defaults 0 0
  4. devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
  5. tmpfs /dev/shm tmpfs mode=0777 0 0
  6. tmpfs /tmp tmpfs mode=1777 0 0
  7. tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
  8. sysfs /sys sysfs defaults 0 0
  9. debug /sys/kernel/debug debugfs defaults 0 0
  10. pstore /sys/fs/pstore pstore defaults 0 0
  11. /dev/block/by-name/misc /misc emmc defaults 0 0
  12. /dev/block/by-name/oem /oem ext2 defaults 0 2
  13. #/dev/block/by-name/userdata /userdata ext2 defaults 0 2

重启,可以看到根文件系统有对应的userdata的数据(不是挂载userdata.img的数据),此时S98Applaunch脚本生效,应用启动正常。

如果想把文件放在userdata 然后制作userdata.img 然后烧录时更新怎么处理?
把内容copy 到 device/rockchip/userdata/userdata_normal 目录下,./build.sh firmware 会自动打包生成userdata.img
烧入的方法

  1. sudo ./upgrade_tool ul ../../../../rockdev/MiniLoaderAll.bin
  2. sudo ./upgrade_tool di -p ../../../../rockdev/parameter.txt
  3. #sudo ./upgrade_tool di -u ../../../../rockdev/uboot.img
  4. #sudo ./upgrade_tool di -misc ../../../../rockdev/misc.img
  5. #sudo ./upgrade_tool di -b ../../../../rockdev/boot.img
  6. #sudo ./upgrade_tool di -recovery ../../../../rockdev/recovery.img
  7. #sudo ./upgrade_tool di -oem ../../../../rockdev/oem.img
  8. #sudo ./upgrade_tool di -rootfs ../../../../rockdev/rootfs.img
  9. sudo ./upgrade_tool di -userdata ../../../../rockdev/userdata.img
  10. sudo ./upgrade_tool rd

把应用程序放在userdata.img 中的缺点
1.打包update.img 时不会打包进去,烧入update.img 时无法更新userdata。
2.影响启动应用程序的速度,因为要先挂载userdata,然后才能启动应用程序。
优点
1.如果ramdisk 的方式启动,根文件系统是只读的,此时想调试方便,应用程序只能放在后面挂载的userdata中,这里调试会较方便。

最后给出demo.mk 和app_install.sh脚本内容,把应用程序打包到userdata.img中

demo.mk

  1. ################################################################################
  2. #
  3. # demo
  4. #
  5. ################################################################################
  6. DEMO_VERSION = 1.0
  7. DEMO_SITE = ${TOPDIR}/../app/demo
  8. DEMO_SITE_METHOD = local
  9. DEMO_LICENSE = Apache V2.0
  10. DEMO_LICENSE_FILES = NOTICE
  11. #rkmedia 会包含 libeasymedia librkuvc 的依赖 , 而librkuvc在rv1108 package中,会自动去设置BR2_PACKAGE_RV1108
  12. BRONCHUSMIRRORRGA_DEPENDENCIES = qt5base qt5multimedia sqlite rkfacial libv4l rkmedia
  13. define DEMO_CONFIGURE_CMDS
  14. cd $(@D)/gui/;$(TARGET_MAKE_ENV) $(HOST_DIR)/bin/qmake ;
  15. endef
  16. define DEMO_BUILD_CMDS
  17. source $(@D)/gui/../work_sdk_path.sh; $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/gui/
  18. endef
  19. define DEMO_INSTALL_TARGET_CMDS
  20. $(@D)/app_install.sh $(TARGET_DIR) $(TOPDIR)
  21. endef
  22. $(eval $(generic-package))

app_install.sh脚本

  1. #!/bin/bash
  2. echo "current pwd => `pwd`"
  3. echo "install dir => $1"
  4. echo "top dir => $2"
  5. if [ ! -e ./gui/demo]; then
  6. echo "=====> app_install error !!!!!!!!!!!\n"
  7. exit 1
  8. fi
  9. install_path=$2/../device/rockchip/userdata/userdata_normal
  10. mkdir -p $install_path/bin
  11. # 可以使用install 命令代替 cp
  12. \cp ./gui/5g/*.sh $install_path/bin/
  13. \cp ./rknn/*.rknn $install_path/bin/
  14. \cp ./gui/*.db $install_path/bin/
  15. \cp ./gui/demo $install_path/bin/
  16. \cp -rf ./conf $install_path/
  17. \cp -rf ./res $install_path/
  18. \cp -rf ./translation $install_path/
  19. \cp ./S98Applaunch $1/etc/init.d/
  20. exit 0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/634464
推荐阅读
相关标签
  

闽ICP备14008679号