开发方式指导¶
代码开发可以分为基于SDK的开发以及基于yocto的开发,下面分别进行详细解释。
基于SDK的开发方式¶
该开发方式在 快速上手 中 基于SDK的应用开发 章节有详细介绍。
基于yocto的开发方式¶
openEuler Embedded提供了基于yocto工程的开发方式,开发者可以依赖yocto构建工程中的编译器、库、头文件等进行开发。不同于SDK开发方式,yocto构建工程不需要手动设置编译器等,适用于添加软件包开发的场景,若只需单独编译用户态程序或内核,建议采用基于SDK的开发方式。
下面将介绍如何使用ARM64的yocto构建工程进行开发。
1. 搭建yocto构建环境¶
按照 快速上手 指导搭建ARM64构建环境,完成必要主机包安装以及oebuild构建环境初始化后,构建容器会被拉取到本地,此时在
<work_dir>
执行以下命令即可进入构建容器的环境:cd <work_dir> # 下载yocto-meta-openeuler以及构建使用的容器 oebuild update # 下载全部源码,便于后续基于yocto的开发;也可以不下载,yocto构建时会按需下载源码。 oebuild manifest download -f src/yocto-meta-openeuler/.oebuild/manifest.yaml构建环境生成后即可开始进行软件包/内核开发。
2. 添加软件目录及代码¶
下面介绍两种添加软件目录及代码的方式,分别为本地添加及通过yaml添加。
通过本地添加软件目录及代码
本方式适用于纯本地调试,新增的目录无对应的远程仓库,以添加hello软件包(功能为打印hello world)为例,运行在openEuler Embedded根文件系统镜像中。
在src目录下创建一个hello目录,其中包含
hello.c
文件,源码如下:#include <stdio.h> int main(void) { printf("hello world\n"); }编写CMakeLists.txt,和hello.c文件放在同一个目录,参考如下:
project(hello C) add_executable(hello hello.c) install(TARGETS hello DESTINATION ${CMAKE_INSTALL_BINDIR})
通过yaml添加软件目录及代码
本方式适用于远程仓库已建立的情况,详细用法可参考 通过openeuler_fetch使用openEuler软件包,在 gitee 或其他线上托管仓库上建立 hello 仓库,仓库中添加如上的hello.c及CMakeLists.txt文件,将仓库地址添加至 yaml 文件
yocto-meta-openeuler/.oebuild/manifest.yaml
末尾:hello: remote_url: https://gitee.com/openeuler/hello.git version: 4da472bba5924d1d422b595ae7497935ee678de0
3. 添加BB文件¶
添加完软件目录后,在yocto仓库中添加 hello 仓库的编译配方,配方添加方式参考 Yocto开发指导,将BB文件添加至
yocto-meta-openeuler/meta-openeuler/recipes-examples/hello/
目录中,添加文件 hello_1.0.bb,BB文件参考如下:### 包描述信息 DESCRIPTION = "Simple helloworld application by cmake" ### 包组分类 SECTION = "examples" ### LICENSE信息 LICENSE = "MIT" ### LICENSE 文件路径以及对应的 md5sum 校验值 ### COMMON_LICENSE_DIR 变量指向 src/yocto-poky/meta/files/common-licenses 目录 ### 如果用户源码包含 license 文件,则不需要使用 COMMON_LICENSE_DIR 变量,直接使用相对路径指向 license 文件的位置即可 LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" ### 源码文件位置,"file://" 开头表示文件为本地文件 ### 编译时框架会从如 src/bb名(不含版本号) 等相对路径查找文件,不需要从官方链接下载 SRC_URI = "file://hello \ " ### 构建时源码所在的目录,yocto构建时会将源码拷贝/解压到 WORKDIR 目录 ### 若软件包为压缩包,解压后可能生成新一级目录,此时 S 需要赋值为: WORKDIR/解压后的目录 S = "${WORKDIR}/hello" # 表示基于cmake构建系统编译 inherit cmake更多的软件包添加配方解析参考 Yocto 标准配方解析,上述讲解为软件包定制添加,若开发者需要进行镜像定制则可参考 镜像定制
4. 添加编译项并编译全量镜像¶
根据 镜像定制 章节,修改
yocto-meta-openeuler/meta-openeuler/recipes-core/images/openeuler-image-common.inc
IMAGE_INSTALL 变量,追加 hello 包:IMAGE_INSTALL += "\ hello \ "进入yocto编译环境, 命令如下:
$ oebuild generate -p qemu-aarch64 -d build_arm64 $ oebuild bitbake $ bitbake openeuler-image把编译好的镜像和文件系统通过qemu启动。
5. 运行软件¶
运行用户态程序
在openEuler Embedded系统中运行hello程序。
$ hello
如运行成功,则会输出
hello world
。