[yocto]基于yocto交叉编译开源包Flite,写配方文件和产生的问题

基于yocto交叉编译开源包Flite

Flite codehttps://github.com/festvox/flite

配方文件

## flite_2.2.bb
SUMMARY = "Flite Library"
DESCRIPTION = "Flite is a small, open source, fast-running text-to-speech engine that can be used to build synthesized speech."

SRCREV = "e9e2e37c329dbe98bfeb27a1828ef9a71fa84f88"
SRC_URI = "git://github.com/festvox/flite.git;branch=master;protocol=https"

LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://COPYING;md5=************************************"

DEPENDS = "alsa-lib"
RDEPENDS_${PN} = "alsa-lib" 

S = "${WORKDIR}/git"

inherit pkgconfig
inherit sanity

PACKAGECONFIG ??= ""

do_configure() {
    ./configure --prefix=${prefix} \
            	--host=aarch64-poky-linux \
            	--target=aarch64-poky-linux \
           		--enable-shared \
            	--with-audio=alsa
}

do_compile() {
    oe_runmake
}

do_install() {
    oe_runmake DESTDIR=${D} install
	rm -rf ${D}${libdir}/lib*.a
	chown -R root.root ${D}${libdir}
}

INSANE_SKIP:${PN} += "dev-so already-stripped ldflags"
FILES:${PN}-dev = "${includedir} ${libdir}/pkgconfig"
FILES:${PN} = "${libdir} ${bindir}"

Q&A

Q1:怎么参照源码写出这个配方文件?

A1:
在github上根据官方文档阅读交叉编译步骤

##README.md
Cross-compiling to WASI (experimental)
In order to successfully cross-compile to WASI, firstly head over to CraneStation/wasi-sdk and install the WASI toolchain.

Afterwards, you can cross-compile to WASI as follows:

./configure --host=wasm32-wasi \
CC=/path/to/wasi-sdk/bin/clang \
AR=/path/to/wasi-sdk/bin/llvm-ar \
RANLIB=/path/to/wasi-sdk/bin/llvm-ranlib
It is important to correctly specify ar and ranlib that is bundled with the WASI clang. Otherwise, you will most likely experience missing symbols during linking, plus you may experience weird llvm errors such as

LLVM ERROR: malformed uleb128, extends past end
When cross-compiling from macOS, you might have to manually specify the sysroot. You can do this by tweaking the CC variable as follows:

CC="/path/to/wasi-sdk/bin/clang --sysroot=/path/to/wasi-sdk/share/sysroot"
After the configure step is successful, simply run as usual:

make
The generated WASI binary can then be found in bin/ directory:

file bin/flite
> bin/flite: WebAssembly (wasm) binary module version 0x1 (MVP)
  • 可以发现在编译之前需要通过configure脚本配置参数,所以在配方文件里面新增task:do_configure,按照提示添加host/CC/AR/RANLIN等参数;
  • 因为编译环境为yocto,会自动生成交叉编译工具链,所以AR/CC/RANLIB等参数均可忽略不写(只要yocto能找到就可以不用显示指定)
    • enable-share参数为指定编译.sowith-audio显式指定为alsa
  • 之后步骤就是makeinstall。这些命令都可以在官方文件的Makefile中查询
  • 关于交叉编译使用的host/target/CC/AR/RANLIB等参数介绍
    • build 编译平台 x86_64-linux-gnu
    • host 运行平台 交叉编译工具的前缀就是host aarch64-poky-linux
      gcc -v  Target
      x86_64-linux-gnu
      
      aarch64-poky-linux-gcc -v  Target: aarch64-poky-linux
      
    • tartget 需要处理的目标平台名称 无指定使用host相同名称,大多数软件交叉编译此参数无用处
    • prefix 用于指定库install的路径,和编译无关
    • RANLIB 对静态库的符号索引表进行更新
    • ARGUN提供的用于制作库文件的,使用AR同时需要提供一个ranlib
    • 因为最早在unix系统上AR程序是单纯用来打包多个.o.a,而不处理.o里面的符号表Linker程序则需要.a文件提供一个完整的符号表,所以就写了专门的程序ranlib用于产生linker的符号信息
    • CC 指定C编译器
      • 例如 Makfile
        • CC=gcc
        • ${CC} test.c test
Q2:SRCREV如何指定?

A2:

  • git上会存在多个版本,所以yoctogit clone代码时,需要根据recipes文件中的hash值去链接上匹配查找对应版本
  • 可以在git上点击tag,然后点击版本号,出现网址的hash值就是正确的https://github.com/festvox/flite/commit/e9e2e37c329dbe98bfeb27a1828ef9a71fa84f88
  • 也可以从Flite官网下载压缩包解压编译,区别主要是需要填写正确的压缩包正确的版本号和md5码
Q3:依赖问题
ERROR: Nothing PROVIDES 'libalsa' (but */flite/flite_2.2.bb DEPENDS on or otherwise required
  libasf
  libass
  libassuan
ERROR: Required build target 'flite' has no buildable providers.

A3:

  • 根据错误log可以知道配方文件没有正确添加alsa的依赖,这时用户可以自己下载alsa源码包编译也可以先去poky提供的一些包中查找
    poky$ find -name  *alsa*
    ./meta/recipes-bsp/alsa-state
    ./meta/recipes-bsp/alsa-state/alsa-state.bb
    ./meta/recipes-bsp/alsa-state/alsa-state
    ./meta/recipes-bsp/alsa-state/alsa-state/alsa-state-init
    ./meta/recipes-multimedia/alsa
    ./meta/recipes-multimedia/alsa/alsa-lib_1.2.6.1.bb
    ./meta/recipes-multimedia/alsa/alsa-plugins_1.2.6.bb
    ./meta/recipes-multimedia/alsa/alsa-tools_1.2.5.bb
    ./meta/recipes-multimedia/alsa/alsa-topology-conf_1.2.5.1.bb
    ./meta/recipes-multimedia/alsa/alsa-ucm-conf_1.2.6.3.bb
    ./meta/recipes-multimedia/alsa/alsa-utils-scripts_1.2.6.bb
    ./meta/recipes-multimedia/alsa/alsa-utils.inc
    ./meta/recipes-multimedia/alsa/alsa-utils_1.2.6.bb
    
  • 添加DEPENDS = "alsa-lib"
Q4:只需要install动态库,删除多余的静态库
WARNING: flite-2.2-r0 do_package: KeyError in ./package/usr/lib/libflite.a
ERROR: flite-2.2-r0 do_package: Error executing a python function in exec_func_python() autogenerated:
...
Exception: Exception: KeyError: 'getpwuid(): uid not found: 947'
Path ./package/usr/lib/libflite.a is owned by uid 947, gid 500, which doesn't match any user/group on target. This may be due to host contamination.

A4:

  • .a存在 然后去out下面发现有.a 所以在安装时删掉
  • 错误log显示实际还是因为权限问题造成错误,但是我们不希望生成.a所以可以在do_installtask中将.a都删除
    • rm -rf ${D}${libdir}/lib*.a
Q5:权限问题
Exception: Exception: KeyError: 'getpwuid(): uid not found: 947'
Path ./package/usr/lib/libflite.a is owned by uid 947, gid 500, which doesn't match any user/group on target. This may be due to host contamination.

A5:

  • 原因:
    • 如果使用用cp之类的方法把文件放到${D},它并没有设置特定的所有权信息;而使用cp安装文件的软件包通常会调用chown/chgrp将编译用户更改为root或其他适当的所有权。
    • 因此,大多数配方都使用"install",在许多情况下,它都会在幕后处理这个问题;FliteMakefile中使用的是cp而不是install,所以造成了这个权限问题
  • 解决: 在do_install中添加chown -R root.root ${D}${libdir}
  • 参考链接:
    如何解决权限问题
Q6:RDEPENDS报错
ERROR: */flite/flite_2.2.bb: QA Issue: *
/flite/flite_2.2.bb: Variable RDEPENDS is set as not being package specific, please fix this. [pkgvarcheck]
ERROR: */flite/flite_2.2.bb: Fatal QA errors were found, failing task.
ERROR: Parsing halted due to errors, see error messages above

A5:

  • 原因:
    • 某些变量 (RDEPENDS、RRECOMMENDS、RSUGGESTS、RCONFLICTS、RPROVIDES、RREPLACES、FILES、pkg_preinst、pkg_postinst、pkg_prerm、pkg_postrm 和 ALLOW_EMPTY)应始终针对特定的软件包进行设置
      • 即应使用软件包名称覆盖设置,如RDEPENDS:${PN} = "value",而不是RDEPENDS = "value"
    • 例如,应使用软件包名称覆盖设置,如RDEPENDS:${PN} = "value",而不是 RDEPENDS = "value"
    • 如果出现此错误,请更正配方中对这些变量的赋值
  • 解决: 将 RDEPENDS = "alsa-lib" 改为 RDEPENDS_${PN} = "alsa-lib" 或者 RDEPENDS:${PN} = "alsa-lib"
  • 参考链接:
    QA错误和警告消息

直接交叉编译

#### build.sh
export PATH=*/aarch64-linux-gnu:$PATH   ###根据自己使用的交叉编译工具指定绝对路径

ALSA=*/alsa-lib/
CFLAGS="-I${ALSA}/include"     
LDFLAGS="-L${ALSA}/usr/lib -lasound"

./configure --prefix=/usr \
            --build=x86_64-linux-gnu \
            --host=aarch64-linux-gnu \
            --target=aarch64-linux-gnu \
            --enable-shared \
            --with-audio=alsa \
            CFLAGS="${CFLAGS}" \
            LDFLAGS="${LDFLAGS}" && make
  • 交叉编译相关
    • 库编译和使用
      • 静态库在链接是被使用,动态库在运行时被使用,搜索路径是在系统中进行设置的
      • 在链接阶段会把汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,静态链接
        • 静态库的搜索路径
          • /lib
          • /usr/lib
          • /etc/ld.so.conf文件中添加库的搜索路径
          • /etc/ld.so.conf.d下新建一个.conf文件
        • 动态库的搜索路径
          • LD_LIBRARY_PATH (env)
          • /lib
          • /usr/lib
          • /etc/ld.so.cache
          • /etc/ld.so.conf文件中添加库的搜索路径
          • /etc/ld.so.conf.d下新建一个.conf文件
    • 编译流程
      • 预处理 编译 汇编 链接
      • 预处理 将**#**所包含的内容处理,包括将include的文件插入源文件,将宏展开替换代码位置,根据条件选择需要编译的代码,然后将处理好的文件保存到.i
      • 编译 将预处理后的.i源码翻译为汇编代码.s
      • 汇编 使用汇编工具将编译好的汇编代码.s翻译为为二进制机器代码.o
      • 链接 将汇编生成的文件和库文件链接成一个大的可执行文件.out
        • 链接过程中主要进行地址重定位符号统一
          • 地址重定位
            • 编译一般都是将多个目标文件整合到一起 目标文件主要分为两个区域:数据区域和指令区域;每个数据和指令都被安排了地址,需要将多个目标文件的数据区和地址区整合到一起,重新编排地址
          • 符号统一
            • 比如多个文件中的存在重名变量和函数,需要将他们进行名称统一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值