2. 源码获取与编译:Tina SDK源码下载、首次编译流程与产物分析
好,咱们正式开始动手。这一章我带你走一遍Tina SDK的完整获取和编译流程。说实话,很多初学者卡就卡在第一步——环境没配好、源码没下对、编译命令敲错。别急,我把自己踩过的坑都标出来,你跟着走就行。
2.1 环境准备:先把坑填平
在下载源码之前,有几样东西必须装好。我见过有人Ubuntu 14.04折腾三天编译不过,最后发现是Python版本太老。
| 依赖项 | 最低版本 | 备注 |
|---|---|---|
| Ubuntu | 16.04 / 18.04 | 我推荐18.04,兼容性最好 |
| Python | 2.7 + 3.x | Tina同时依赖两个版本 |
| gcc / g++ | 5.4+ | apt install build-essential |
| repo工具 | 最新 | Google的repo,用于多仓库管理 |
| 磁盘空间 | 至少80GB | 全编译后约40GB,留余量 |
sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip python python3。这条命令我存了个脚本,每次新机器直接执行。
2.2 源码下载:repo sync的正确姿势
Tina SDK不是单个git仓库,而是由几十个仓库组成的。全志用Google的repo工具来管理。我第一次用repo时也被它的逻辑绕晕过——说白了,repo就是一个脚本,帮你批量操作多个git仓库。
下载步骤很简单,但有几个细节要注意:
- 创建工作目录:
mkdir tina-sdk && cd tina-sdk - 初始化repo:
repo init -u https://github.com/allwinner-tina/tina-manifest.git -b master - 同步源码:
repo sync -j4
repo sync --force-sync -j4,强制重新同步。另外,-j4是并发数,网络好的话可以开到-j8,但别超过CPU核心数。
同步完成后,你会看到这样的目录结构:
tina-sdk/
├── build/ # 编译系统核心脚本
├── device/ # 板级配置(全志各芯片)
├── kernel/ # Linux内核源码
├── lichee/ # 启动相关(uboot、boot0等)
├── out/ # 编译输出目录(初始为空)
├── package/ # 应用层包配置
├── prebuilt/ # 预编译工具链
├── target/ # 根文件系统配置
├── tools/ # 辅助工具
└── Makefile # 顶层Makefile
2.3 首次编译:source、make、pack三部曲
编译Tina SDK就三个命令,但顺序不能乱。我见过有人直接敲make然后报错——因为环境变量没加载。
第一步:source环境变量
source build/envsetup.sh
这条命令会加载所有编译需要的环境变量,包括交叉编译链路径、目标架构、包路径等。执行后你会看到类似这样的输出:
Setup environment for tina SDK...
Usage: lunch [platform] [board] [config]
然后执行lunch选择目标平台:
lunch
# 会列出所有支持的平台,比如:
# 1. tina-v853-xxx
# 2. tina-t113-xxx
# 选择对应的数字即可
我个人习惯直接指定:lunch tina-v853-perf1,省得每次选。
第二步:make编译
make -j8
这里-j8是并行编译线程数。我建议设为CPU核心数的1.5倍左右。第一次全编译大概需要30分钟到1小时,取决于机器性能。
编译过程会依次做这些事:
- 编译交叉工具链(如果prebuilt里没有)
- 编译uboot
- 编译Linux内核
- 编译根文件系统(busybox + 应用包)
- 生成最终镜像
编译过程中如果报错,别慌。90%的错误都是依赖缺失。看错误日志最后几行,缺什么装什么。我遇到过最奇葩的一次是缺libncurses5-dev,装完就好了。
第三步:pack打包
pack
这个命令把编译出来的内核、根文件系统、uboot打包成一个完整的烧录镜像。执行后会在out/目录下生成tina_xxx.img文件。
整个流程可以用下面这张图来理解:
2.4 编译产物分析:到底生成了什么?
编译完成后,out/目录下会多出一堆东西。很多新手看到这堆文件就懵了。我帮你拆开看:
out/
├── tina_xxx.img # 完整烧录镜像(约200MB)
├── boot.img # 内核+dtb+ramdisk
├── rootfs.img # 根文件系统镜像
├── u-boot-sunxi-with-spl.bin # uboot+SPL
├── zImage # 压缩后的内核
├── *.dtb # 设备树文件
└── target/ # 各模块编译中间产物
| 产物文件 | 大小(典型值) | 作用 |
|---|---|---|
| tina_xxx.img | 150~300 MB | 最终烧录文件,包含所有分区 |
| boot.img | 5~10 MB | 启动分区,内核+设备树+initramfs |
| rootfs.img | 50~200 MB | 根文件系统,包含busybox和库文件 |
| u-boot-sunxi-with-spl.bin | ~500 KB | 引导加载程序,负责加载内核 |
| zImage | 3~6 MB | 压缩后的Linux内核镜像 |
pack。直接make kernel -j8只编译内核,然后用pack重新打包。这样能省下一大半时间。我在调试驱动时,一天要编译几十次内核,每次都全编译的话,一天就过去了。
2.5 避坑指南:我替你试过的错
编译过程中有几个常见问题,我直接列出来:
- repo sync超时:国内网络问题。解决办法:挂代理,或者用全志的国内镜像源。
- make报错“No rule to make target”:通常是
lunch没执行,或者选错了平台。重新lunch一下。 - pack报错“image too large”:根文件系统超出分区大小。去
device/config/下调整分区表。 - 编译到一半磁盘满了:
out/目录占空间最大。可以用rm -rf out清理,但下次要全量编译。
make,结果发现修改没生效。后来才意识到,Tina的编译系统有缓存机制。修改配置后,需要先make kernel_clean清除内核编译缓存,再重新编译。不然它以为没变化,直接跳过。
嗯,到这里,源码获取和首次编译的流程就走通了。你跟着操作一遍,应该能顺利生成第一个tina_xxx.img。记住,编译环境一次配好,后面就省心了。