2、源码获取与分支选择:从官方仓库拉取代码、如何选择正确的分支、LTS版本与开发版本的区别
好,咱们正式开始动手。这一章要解决一个很实际的问题——代码从哪来,分支怎么选。
我见过不少新手,上来就 git clone 一把梭,结果编译到一半发现 API 对不上,或者某个关键驱动根本不存在。嗯,这种坑我踩过不止一次。所以这一章,咱们把源码获取和分支选择这件事彻底讲清楚。
2.1 官方仓库在哪里?
ATF 的官方代码托管在 Trusted Firmware Project 的 GitHub 仓库里:
https://github.com/TrustedFirmware-A/trusted-firmware-a
我个人习惯直接 clone 这个仓库。但注意,不要用默认的 master 分支直接开干。为什么?往下看。
2.2 分支命名规则
ATF 的分支命名其实挺有规律的。我总结了一下:
| 分支类型 | 命名示例 | 说明 |
|---|---|---|
| LTS 分支 | lts-v2.8 | 长期支持版本,稳定,适合产品 |
| 开发分支 | master | 最新代码,可能有 API 变动 |
| 发布标签 | v2.9.0 | 正式发布版本,带 release notes |
| 集成分支 | integration | 开发中的特性合并,不稳定 |
你想想看,如果你做产品,选 master 分支,那风险有多大?我曾在项目中遇到过,master 分支上某个驱动接口突然改了,导致整个 BSP 层都要重调。那叫一个酸爽。
2.3 LTS 版本 vs 开发版本
这里我重点说一下 LTS 和开发版本的区别。说白了,就是「稳」和「新」的取舍。
LTS 版本(长期支持)
- 官方承诺至少 2 年的安全更新和 bug 修复
- API 稳定,不会出现突然的接口变更
- 适合量产产品、车规、工业控制等场景
- 我个人的建议:只要不是做原型验证,一律选 LTS
开发版本(master / integration)
- 包含最新特性,比如新架构支持、新安全扩展
- API 可能随时变化,没有向后兼容保证
- 适合评估新功能、学术研究、早期原型
- 注意:不要直接用于产品
我曾经在一个车规项目里,团队图省事直接用了 master 分支。结果三个月后,ATF 升级了 SMC 调用约定,整个安全监控层的代码全部要重写。嗯,从那以后,我再也不敢在产品里用非 LTS 分支了。
2.4 如何选择正确的分支?
我一般按这个流程来选:
- 先确定你的平台——比如你是 ARMv8.2 还是 ARMv9?
- 查看官方支持的平台列表——在 docs/plat/ 目录下
- 选择最近的 LTS 分支——比如 lts-v2.8 或 lts-v2.10
- 检查该 LTS 是否支持你的 SoC——如果不支持,再考虑最新的 release tag
- 实在不行才用 master——但要做好随时 rebase 的准备
小技巧: 你可以用 git tag 查看所有发布版本:
git tag -l 'v*' | sort -V
然后挑最新的稳定版本。我个人习惯看 release notes,确认有没有针对我用的 SoC 的修复。
2.5 实际操作:拉取代码并切换分支
好,咱们动手。假设你要用 LTS v2.8 分支:
git clone https://github.com/TrustedFirmware-A/trusted-firmware-a.git
cd trusted-firmware-a
git checkout lts-v2.8
就这么简单。但注意,LTS 分支可能不包含最新的安全补丁。所以拉下来之后,我建议你:
git log --oneline -10
看看最近的提交时间。如果超过 3 个月没有更新,可以考虑切换到更新的 LTS 分支。
警告: 不要直接修改 LTS 分支的代码然后用于产品。如果你需要定制,请基于 LTS 创建自己的特性分支:
git checkout -b my-product-v2.8 lts-v2.8
这样后续官方更新 LTS 时,你可以方便地合并安全补丁。
2.6 分支选择决策流程图
下面这张图是我自己总结的,每次做新项目都会拿出来看一眼:
2.7 避坑指南
最后,分享几个我踩过的坑:
- 不要直接 clone 后就用 master——我见过有人编译通过但运行时 panic,查了两天发现是 master 分支的代码和板子的 DTS 不匹配。
- LTS 分支也可能有 bug——虽然概率低,但建议拉下来后先跑一遍官方测试用例。
- 注意交叉编译工具链的版本——LTS 分支通常对工具链版本有要求,别用太新或太旧的 gcc。
- 如果你用的是树莓派或 QEMU——这些平台在 master 分支上支持最好,LTS 可能缺少某些驱动。
我的个人习惯: 每次开始一个新项目,我都会先创建一个 docs/ 目录,里面放一个 BRANCH_CHOICE.md 文件,记录我为什么选这个分支、选了哪个版本、以及后续如何更新。这样半年后回头看,不会一脸懵。
好,这一章就到这里。源码拉下来了,分支也选好了,下一章咱们聊聊如何配置编译环境——嗯,这部分也有不少坑等着你。