1 为什么使用SDK

在上一篇文章中讲解了如何添加自定义软件,整个过程还是较麻烦的,那若有一些软件是开源工具呢?比如某个性能测试工具,按上一篇文章添加方式添加太麻烦,并且标准工具也不需要修改,所以不需要将工具源码一起加入项目工程编译,只需使用yocto工程编译环境编译好工具再加入映像中即可。

以下为SDK生成输出工作流。

构建输出的是一组特定形式文件,其中包括SDK自解压安装程序(*.sh)、主机、目标清单文件以及用于SDK测试的文件。SDK详细介绍可参阅 https://www.yoctoproject.org/docs/2.7/sdk-manual/sdk-manual.html。

2 SDK构建及安装

下面介绍sdk构建过程。

2.1 查看并选择机型

~/work/byobmc$ . setup
Target machine must be specified. Use one of:1u-x91          2u-x201         4u-x201         atx-i1331

还是以4u-x201机型为例,设置环境变量并解析。

export TEMPLATECONF=meta-byosoft/meta-4u-x201/conf
. openbmc-env

这样就选择了4u-x201机型。

2.2 执行命令编译构建SDK

bitbake obmc-phosphor-image -c populate_sdk

将出现下图类似错误:

这是因为源码缺少一些组件包,并且编译过程未连接网络(或下载网址不可访问),后续也会陆陆续续提示缺少其他组件包,这些组件包可从提示的网址中下载(或网络中搜索下载一样的组件),并放至build/downloads/目录下,然后在该目录下创建 组件包名+ .done 的文件即可。

例如:

~/work/byobmc$ ls build/downloads/
Cython-0.29.21.tar.gz
Cython-0.29.21.tar.gz.done
Linux-PAM-1.3.1.tar.xz
Linux-PAM-1.3.1.tar.xz.done
Mako-1.1.4.tar.gz
Mako-1.1.4.tar.gz.done
...

不断尝试,直到所有缺少的组件下载完成后即可编译,编译大概需要1到2小时,具体看编译机器配置。

2.3 查看编译输出

编译输出位于 build/tmp/deploy/sdk 目录:

~/work/byobmc$ ls build/tmp/deploy/sdk/
oecore-x86_64-armv6-toolchain-nodistro.0.host.manifest  oecore-x86_64-armv6-toolchain-nodistro.0.target.manifest
oecore-x86_64-armv6-toolchain-nodistro.0.sh             oecore-x86_64-armv6-toolchain-nodistro.0.testdata.json

其中 *.sh 文件时SDK自解压程序,执行该文件将在指定目录下安装SDK。

2.4 安装sdk

在build目录下创建mytest/sdk目录并记录其绝对路径,然后执行build/tmp/deploy/sdk目录下sdk安装脚本并指定安装目录为build/mytest/sdk,结果如下:

~/work/byobmc/build$ mkdir -p mytest/sdk
~/work/byobmc/build$ ls
bitbake-cookerdaemon.log  cache  conf  mytest  sstate-cache  tmp~/work/byobmc/build$ cd mytest/sdk/
~/work/byobmc/build/mytest/sdk$ pwd
/data1/hostname/work/byobmc/build/mytest/sdk~/work/byobmc/build/mytest/sdk$ cd ../..
~/work/byobmc/build$ ./tmp/deploy/sdk/oecore-x86_64-armv6-toolchain-nodistro.0.shPhosphor OpenBMC (Phosphor OpenBMC Project Reference Distro) SDK installer version nodistro.0
=============================================================================================Enter target directory for SDK (default: /usr/local/oecore-x86_64): /data1/hostname/work/byobmc/build/mytest/sdk
You are about to install the SDK to "/data1/hostname/work/byobmc/build/mytest/sdk". Proceed [Y/n]? Y
Extracting SDK......................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.$ . /data1/hostname/work/byobmc/build/mytest/sdk/environment-setup-armv6-openbmc-linux-gnueabi

进入build/mytest/sdk目录查看,结果如下:

~/work/byobmc/build/mytest/sdk$ ls
environment-setup-armv6-openbmc-linux-gnueabi  sysroots
site-config-armv6-openbmc-linux-gnueabi        version-armv6-openbmc-linux-gnueabi

SDK是由一个交叉开发工具链、一组库、头文件以及一个SDK环境设置脚本组成,如上所示sysroots就是最终打包到映像中的文件系统。

3 SDK使用

进入build/mytest/sdk目录下,执行 . environment-setup-armv6-openbmc-linux-gnueabi命令(注意前面有个 . 号且.号后面有空格),结果如下。

~/work/byobmc/build/mytest/sdk$ . environment-setup-armv6-openbmc-linux-gnueabi
Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'
but please check why this was set in the first place and that it's safe to unset.
The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set.
For more references see:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80http://xahlee.info/UnixResource_dir/_/ldpath.html

提示设置了环境变量保护,执行 unset LD_LIBRARY_PATH 命令解保护,再次执行脚本即可(如果没有提示,则不需要执行解锁命令)。

注意:每次使用SDK都需要执行一次该脚本(或新打开终端)。

执行 $CC -v 命令查看编译器详情:

~/work/byobmc/build/mytest/sdk$ $CC -v
Using built-in specs.
COLLECT_GCC=arm-openbmc-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/data1/hostname/work/byobmc/build/mytest/sdk/sysroots/x86_64-oesdk-linux/usr/libexec/arm-openbmc-linux-gnueabi/gcc/arm-openbmc-linux-gnueabi/8.3.0/lto-wrapper
Target: arm-openbmc-linux-gnueabi
Configured with: ...
...

在build/mytest/sdk目录下新建test目录,并在test目录下新建hello.c文件,填入以下。

#include <stdio.h>int main (int argc, char *argv[])
{printf("Hello World!\n");return 0;
}

在build/mytest/sdk/test目录下执行编译命令 $CC -o hello hello.c ,一定要使用$CC,注意,如果是通过CMAKE方式编译的程序,必须指定host,即执行 ./configure --host=arm-openbmc-linux-gnueabi (通过$CC -v获取编译器名称)。

~/work/byobmc/build/mytest/sdk$ mkdir test
~/work/byobmc/build/mytest/sdk$ cd test/
~/work/byobmc/build/mytest/sdk/test$ vim hello.c
~/work/byobmc/build/mytest/sdk/test$ $CC -o hello hello.c
~/work/byobmc/build/mytest/sdk/test$ ls
hello  hello.c

执行 file ./hello 命令,可以看到hello二进制文件,通过file命令查看文件信息,为32位arm,并且是动态链接。

~/work/byobmc/build/mytest/sdk/test$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, BuildID[sha1]=a21307be9712a1e4522b888615593960f945ac8b, for GNU/Linux 3.2.0, with debug_info, not stripped

在build/opt/bmcsdk/test目录下,直接执行 qemu-arm ./helloc 命令,提示找不到so库文件。

~/work/byobmc/build/mytest/sdk/test$ qemu-arm ./hello
/lib/ld-linux.so.3: No such file or directory

需要指定映像文件系统中库路径,即SDK安装生成sysroots目录中的库。

最终执行结果如下:

~/work/byobmc/build/mytest/sdk/test$ qemu-arm /data1/hostname/work/byobmc/build/mytest/sdk/sysroots/armv6-openbmc-linux-gnueabi/lib/ld-linux.so.3 --library-path /data1/hostname/work/byobmc/build/mytest/sdk/sysroots/armv6-openbmc-linux-gnueabi/lib ./hello
Hello World!

这样一来,编译生成的hello程序可直接加入映像打包,加入过程参考上一篇文章脚本添加方式。

提醒一下:在使用SDK编译程序前,一定要先执行环境变量插入脚本,并且每次新打开的终端都需要插入环境变量

4 固件中添加工具链

有时我们想要在目标设备上编译调试程序怎么办?

临时方法:在build/conf/local.conf添加

EXTRA_IMAGE_FEATURES += "tools-sdk"

这种方式随着build目录下配置文件改变就丢失了,另一种是在机型的配置文件中添加,不需要的时候再去掉(不建议使用这种方式),比如在meta-byosoft/meta-4u-x201/conf/local.conf.sample文件中添加。

yocto(五)——构建SDK及添加工具链相关推荐

  1. 官方iPhone SDK和开源工具链

    当Jobs宣称"iPhone SDK提供的是和苹果内部开发人员使用的相同的工具"时,他显然忘了在iPhone SDK发布之前几个月,就有人开始使用开源的Open Tool Chai ...

  2. 联盛德W800开发板|SDK|make menuconfig|工具链|本地命令行编译|Windows11|msys|清华源|(4)、联盛德W800开发板命令行编译指南

    目录 W800 芯片介绍: W800开发板 主要接口如下: 1 概述 2 准备工作 3.SDK目录结构如下: 4 W800编译固件编译 4.1 安装MSYS到本地: 4.2增加国内软件更新源 ​编辑4 ...

  3. Buildroot构建指南——工具链

    Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件.一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工 ...

  4. 构建gcc交叉编译工具链

    如何构建一个GCC交叉编译工具链 GCC不仅是一个编译器,它是一个开源工程,可以让你建立各种编译器.一些编译器支持多线程,一些支持共享库,一些支持Multilib(典型的应用是在64位机上运行32位应 ...

  5. DevOps 工具链可推动你的创新计划!

    一套完整启用的 DevOps 工具链可推动你的创新计划,实现快速部署并节约成本.不同规模和不同行业组织都致力于为提高软件交付的速度和质量提供解决方案.这不仅保证了他们的生存,还令他们在全球市场取得了成 ...

  6. 全手工制作arm-linux交叉编译工具链《一》-转

    全手工制作arm-linux交叉编译工具链 (Gcc 4.2.1 + Glibc 2.6.1 + Linux 2.6.22.6)<一> 作者:Garfield Trump 仅仅是本人在学习 ...

  7. STM32MP157基于Yocto构建Qt镜像和SDK工具链

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 记录下整个过程以及在该过程中遇到的问题和解决方法. 一.获取软件仓库 $ mkdir -p openstlinux-5.4- ...

  8. 《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.2 工具链技术备注...

    本节解释总体构建方法之中的某些基本原理和技术细节.并不需要立即理解本节中的所有问题.在进行实际构建的过程中,绝大部分的信息将会变得愈加清晰.在该过程中可随时查阅本小节的内容. 第五章的总体目标是生成一 ...

  9. Linux 之八 完整嵌入式 Linux 环境及构建工具、(交叉)编译工具链、CPU 体系架构

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

最新文章

  1. 深入java虚拟机学习 -- 类的加载机制(续)
  2. python脚本语言是什么意思_python为什么是脚本语言
  3. CVE-2015-0235: GHOST – A Critical Vulnerability in the Glibc Library
  4. 排列组合思维导图_排列组合——排列数专题
  5. Java 9 中的 9 个新特性
  6. 【Jquery系列】之DOM属性
  7. XSS-Game Level1
  8. Servlet是什么?有什么用?
  9. jsp登陆界面链接mysql_用jsp实现网站登录界面的制作,并连接数据库
  10. 谷歌gmail注册入口_Google向GMail添加免费电话语音通话
  11. 带农历和法定节假日的 日历控件_带节日和农历的js日历
  12. 错误:安装autocad2012的时候提示Command line option syntax error.Type Command/?for help.
  13. 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
  14. 导出DNS服务器上的记录
  15. 解决Chrome无法自动同步书签
  16. 微信登录API使用小结
  17. 案例学习|Python实现某医院药品销售分析
  18. U盘病毒-----文件变为受保护的操作系统隐藏文件
  19. Nginx配置HTTPS客户端认证
  20. java命令行交互_java控制台(命令行)输入交互(入门级示例)

热门文章

  1. win10系统怎么搜索xp计算机,win10安装xp系统的详细操作步骤
  2. 微信小程序原生实现日历功能
  3. 微信公众号--开发模式之用户关注后自动回复(Java实现)
  4. [6] 支付漏洞( 0 元购 )
  5. 小度计算机笔记,“一场无速记发布会”,小度真无线智能耳机革新语音笔记功能...
  6. 快捷指令,自动化脚本工具
  7. 用Python画一棵分形树
  8. C语言:判断质数合数的代码
  9. 2022年圣诞节 | matlab实现炫酷的圣诞树
  10. android摇一摇功能实现