基于yocto编译编译工具链

一. 准备工作


1. 先查看yocto的系统依赖 :

https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html

sudo apt-get install build-essential chrpath cpio debianutils diffstat file gawk gcc git iputils-ping libacl1 liblz4-tool locales python3 python3-git python3-jinja2 python3-pexpect python3-pip python3-subunit socat texinfo unzip wget xz-utils zstd

2. 关键版本信息

注意目标的分支,我选择的是walnasacar,关键的库的版本信息如下:https://wiki.yoctoproject.org/wiki/Recipe_Versions

Release linux-yocto (kernel) gcc binutils glibc python3
walnascar (5.2) 6.12.x 14.2 2.44 2.41 3.13.x
scarthgap (5.0) 6.6.x 13.2 2.42 2.39 3.12.x
kirkstone (4.0) 5.10.x / 5.15.x 11.4 2.38 2.35 3.10.x
dunfell (3.1) 5.4.x 9.5 2.34 2.31 3.8.x

3. 下载poky

git clone https://git.yoctoproject.org/poky -b walnascar

下载比较慢,可以使用镜像仓库,或者走代理加速 --  (注意clone用的http地址才会走git的http.proxy);

git config --global http.proxy http://127.0.0.1:xx
git config --global https.proxy http://127.0.0.1:xx

# 如果遇到ssl报错可以设置
git config --global http.sslVerify false

4. 配置编译

  • 进入编译环境

(我的目标只是编译nativesdk)

cd poky
source oe-init-build-env

回显如下:

### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-full-cmdline
    core-image-sato
    core-image-weston
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86-64'.

Other commonly useful commands are:
 - 'devtool' and 'recipetool' handle common recipe tasks
 - 'bitbake-layers' handles common layer tasks
 - 'oe-pkgdata-util' handles common target package tasks
You had no /root/work_code/debian13_toolchain/poky/.vscode configuration.
These configuration files have therefore been created for you.
  • meta-ide-support和meta-toolchain的区别是什么?

----- 因为我是需要编译一个目标平台的工具链SDK,我们可以看到两个接近的目标定义,其中meta-ide-support 是把Yocto构建环境本身变成你的“SDK”;而meta-toolchain 是生成一个独立的SDK包供你或他人使用。那么meta-toolchain应该是我想要的目标;

  • meta-toolchain和populate_sdk的联系是什么?

------ meta-toolchain的目标是提供一个最小化的、用于交叉编译的基础工具链(编译器、链接器、基础库头文件)。populate_sdk目标是生成一个与指定目标镜像完全匹配的、功能完整的SDK,包含工具链、目标系统的所有库和头文件,以及环境脚本。那么meta-toolchain应该依旧是我想要的目标,目标系统的sysroot我用其他方法生成;

  • yocto esdk和sdk的区别?

---- 标准SDK:如果你的应用程序需要目标系统里没有的库(如 libjson-c),你需要自行交叉编译该库、处理依赖,并手动配置SDK的 sysroot,过程繁琐。

---- eSDK:你只需运行 devtool add libjson-c (或指向源码),devtool 会自动创建配方、解析依赖、调用内置的BitBake进行构建,并将编译好的库和头文件自动部署并更新到eSDK的 sysroot 中。之后你的应用程序就能直接找到这个库了。

  • 增加下官方的镜像源,也可以配置本地或者内网的加速源

修改conf/local.conf

MIRRORS += "\
git://.*/.* https://downloads.yoctoproject.org/mirror/sources/ \n \
https://.*/.* https://downloads.yoctoproject.org/mirror/sources/ \
"

EMIRRORS += "\
git://sourceware.org/git/glibc.git https://downloads.yoctoproject.org/mirror/sources/ \n \
git://sourceware.org/git/binutils-gdb.git https://downloads.yoctoproject.org/mirror/sources/ \
"
  • 精简需要编译打包的内容

    • 查看初始状态

在正式编译之前先看下meta-toolchain到底依赖哪些软件包,也就是会编译哪些东西

bitbake -g meta-toolchain

生成了pn-buildlist和task-depends.dot

sudo apt install graphviz
dot -Tpng task-depends.dot -o depends.png
这个时候的pn-buildlist内容如下(计337个):
acl
acl-native
attr
attr-native
autoconf-archive-native
autoconf-native
automake-native
base-files
base-passwd
bash
bash-completion
bc
bc-native
binutils
binutils-cross-canadian-x86-64
binutils-cross-x86_64
binutils-crosssdk-x86_64-pokysdk-linux
bison-native
btrfs-tools
bzip2
bzip2-native
ca-certificates
chrpath-native
cmake-native
coreutils
createrepo-c-native
cross-localedef-native
curl
curl-native
cwautomacros-native
debianutils-native
depmodwrapper-cross
diffutils
dnf-native
docbook-xml-dtd4-native
docbook-xsl-stylesheets-native
dwarfsrcfiles-native
e2fsprogs
e2fsprogs-native
elfutils
elfutils-native
expat
expat-native
file
file-native
findutils
flex-native
gawk
gcc
gcc-cross-canadian-x86-64
gcc-cross-x86_64
gcc-crosssdk-x86_64-pokysdk-linux
gcc-runtime
gcc-source-14.3.0
gdb-cross-canadian-x86-64
gdbm
gdbm-native
gettext-minimal-native
gettext-native
git-native
glib-2.0-native
glibc
glibc-locale
gmp
gmp-native
gnu-config-native
gnutls
gnutls-native
gobject-introspection-native
gperf-native
gpgme-native
grep
gtk-doc-native
help2man-native
iproute2
iptables
json-c
json-c-native
kern-tools-native
kmod
kmod-native
libarchive
libarchive-native
libassuan-native
libbsd-native
libcap
libcap-native
libcap-ng
libcap-ng-native
libcheck-native
libcomps-native
libdnf-native
libedit
libedit-native
libffi
libffi-native
libgcc
libgcc-initial
libgcrypt
libgcrypt-native
libgpg-error
libgpg-error-native
libidn2
libidn2-native
libmd-native
libmicrohttpd
libmicrohttpd-native
libmnl
libmodulemd-native
libmpc
libmpc-native
libpcre2
libpcre2-native
librepo-native
libseccomp
libsolv-native
libtasn1
libtasn1-native
libtool-cross
libtool-native
libunistring
libunistring-native
libxcrypt
libxml2-native
libxslt-native
libyaml-native
linux-libc-headers
linux-yocto
lua-native
lzlib
lzlib-native
m4-native
make
make-native
makedepend-native
meson-native
meta-environment-qemux86-64
meta-toolchain
mpfr
mpfr-native
nativesdk-acl
nativesdk-attr
nativesdk-autoconf
nativesdk-automake
nativesdk-bash
nativesdk-bash-completion
nativesdk-bison
nativesdk-bzip2
nativesdk-ca-certificates
nativesdk-cmake
nativesdk-curl
nativesdk-debugedit
nativesdk-diffutils
nativesdk-dtc
nativesdk-elfutils
nativesdk-expat
nativesdk-file
nat
### 如何在 Yocto 项目中编译生成静态库 `.a` 文件 #### 修改 `no-static-libs.inc` 为了使 Yocto 支持静态库的构建,需要修改配置文件以允许启用静态库的支持。具体来说,在 `meta/conf/distro/include/no-static-libs.inc` 中取消对静态库禁用选项 `-DISABLE_STATIC ?= " --disable-static"` 的设置[^4]。 ```diff -DISABLE_STATIC ?= " --disable-static" +DISABLE_STATIC ?= "" ``` 此更改使得项目的构建过程不再强制关闭静态库支持,默认情况下会尝试创建静态版本的库文件。 #### 配置 BitBake 构建环境 BitBake 是 Yocto Project 使用的核心工具之一,负责处理各种包管理任务以及自动化软件构建流程。通过继承自定义类或调整现有类中的参数可以控制具体的编译行为。由于所有配方都会自动加载 `base.bbclass` 类,因此无需额外操作即可利用其内置功能来完成大多数常规工作[^3]。 对于特定于某个应用程序或者库的情况,则可以在对应的 recipe 文件里指定更详细的指令集用于指导编译器生成所需的输出形式——在这里就是指`.a`类型的存档文件而不是共享对象(`.so`)。 #### 设置 Makefile 或 CMakeLists.txt 如果目标程序采用的是 Autotools 工具链(如 Autoconf 和 Automake),那么通常只需要确保 configure 脚本接收到合适的命令行开关就可以让它们知道要制作什么类型的产品;而对于基于 CMake 的工程而言,则可能涉及到编辑顶层目录下的 `CMakeLists.txt` 来显式声明希望得到的结果: - 对于使用 GNU make 的项目,可以通过传递 `--enable-static --disable-shared` 参数给 configure 命令来指示只建立静态库; - 如果是 CMake 项目,则应该查找并适当设置变量 `BUILD_SHARED_LIBS` 到 OFF 并确认其他相关属性也指向正确的方向以便最终产出期望格式的目标产物。 #### 编辑 Recipe 文件 最后一步是在对应的应用层面上编写好 bitbake 可识别使用的 recipe 文档。这包括但不限于提供源码下载地址、补丁集合路径以及其他必要的元数据信息。当一切准备就绪之后执行 `bitbake <recipe-name>` 即可触发整个流水线作业直至获得预期成果为止。 例如,假设有一个名为 `mylibrary_1.0.bb` 的 recipie 文件用来描述如何获取和组装第三方依赖项 libDataCollect.a 及其所涉及的一切关联资源。在这个过程中需要注意按照正确次序罗列各个组成部分,并且保证最底层的基础组件最先被引入到链接阶段当中去[^1]。 ```bash SRC_URI += "file://path/to/libDataCollect.patch" do_compile() { oe_runmake 'LDFLAGS=-static' } ``` 上述脚本片段展示了怎样向现有的编译规则追加新的 LDFLAGS 宏定义从而影响链接期间的行为模式,进而促成纯静态二进制文件的成功诞生。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值