基于Arm架构的M1芯片的Macbook
20年果粉圈最大的新闻应该就是Apple推出第一款基于Arm架构的自研SoC M1,并且装备在了自己的Macbook,Mac Mini产品上。
具体的评测,大家可以参考这篇文章
笔者有幸拿到了一台M1版本的Macbook Air。尝试了搭建TF-M的开发环境,非常顺利。所以把相关步骤和注意事项分享给大家。
编译TF-M的前期准备
最重要的问题应该就是编译TF-M所需的工具及库软件的安装。
以前在x86下可能问题并不是太大,但是现在切换到Arm架构的M1,软件适配方面的问题就尤为重要。
所幸笔者发现,常用工具对M1架构的还是不错的,而且适配的速度远超笔者预期。
下面以GNUArm编译器为例,介绍一下M1芯片的系统中,如何搭建TF-M开发环境。
一下内容基于
硬件:Macbook Air M1 8G 256GB
系统:macOS Big Sur 11.1
macOS基础设定
在开始安装TF-M相关环境之前,我们先把macOS的环境设定好。
命令行改为bash
笔者因为长期用Linux环境开发,所以先把macOS默认的zsh改为bash。
简单点说,就是在命令行执行chsh -s /bin/bash
,然后重启命令行。详细介绍可以参考这篇文章。
bash配置文件
由于后面我们会修改环境变量,所以首先把bash的配置文件创建好。关于.bash_profile和.bashrc文件在macOS下的问题,参考这篇文章
简单的说,在用户的家目录下创建这两个文件,然后.bash_profile调用.bashrc。这样做是因为保持与其他Linux/Unix平台做法一致。当然,你也可以在.bash_profile中做所有事情而忽略.bashrc。
创建.bash_profile(这里使用vi作为文本编辑器,可以替换为你喜欢的)
vi ~/.bash_profile
编辑.bash_profile并保存
if [ -r ~/.bashrc ]; then
source ~/.bashrc
fi
创建.bashrc
vi ~/.bashrc
以后可以像其他Linux平台一样,修改.bashrc文件。
安装homebrew
为了后面安装软件更方便,推荐安装homebrew。
方法非常简单,在命令行执行
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
这里如果出现无法连接的情况,需要检查一下DNS设置。添加114.114.114.114和8.8.8.8作为DNS服务器地址。DNS设置方法这里不详细描述,可以很容易在网上找到。这里主要介绍与搭建环境相关的步骤和要点。
homebrew安装好之后,会出现在/opt/homebrew目录,可以把可执行文件加入到PATH中,编辑~/.bashrc,添加:
export PATH="$PATH:/opt/homebrew/bin"
重启终端或者source ~/.bashrc
之后,如果可以使用brew命令,则说明安装设置正确。
TF-M的依赖软件
参考TF-M的帮助文档,我们可以知道,TF-M的开发环境需要的软件大致有:
- CMake
- GNUArm Compiler
- Python3以及Pip3,相应的Python依赖包
下面一一介绍他们的安装步骤和要点
CMake
可以在CMake的官方网站下载安装包-地址
比如,下载cmake-3.19.5-macos10.10-universal.dmg文件或者其他最新版本的CMake。
下载好之后,和安装其他macOS软件的方法一样安装就可以。
命令行环境变量的使用,放在后面一起介绍。
ANUArm Compiler
在Arm官网下载-地址。
选择Mac的安装包,如gcc-arm-none-eabi-10-2020-q4-major-mac.pkg,或者更新的版本。
下载好之后,和安装其他macOS软件的方法一样安装就可以。
命令行环境变量的使用,放在后面一起介绍。
Python3和TF-M的Python依赖库安装
系统可能已经安装python3,但是为了确保安装正确,我们通过brew安装python3。在命令行中执行brew install python3
此时,python3和pip3应该已经一起安装完毕。
随后,进入TF-M的安装目录,进行python依赖库的安装cd <your tf-m folder>
pip3 install -r tools/requirements.txt
这时,很有可能你会遇到安装cryptography时的错误。
这里遇到的唯一一个难点。
总结下来,问题有:
- 缺少Rust编译环境
访问Rust官网安装,简单的说,就是执行curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装成功后,在你的.bashrc文件会看到多了下面一行source "$HOME/.cargo/env"
重新打开终端或者source ~/.bashrc
后解决。
如果安装过程有问题,可以通过brew安装。这里不再赘述。
- 找不到openssl头文件
首先确定安装openssl:brew install openssl@1.1
然后手动带路径安装cryptographyenv LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" pip3 install cryptography
如果手动安装cryptography成功,可以再回去安装其他的TF-M依赖库pip3 install -r tools/requirements.txt
现在安装应该全部没有问题了。
把CMake和GNUArm的路径加入PATH
前面安装好CMake和GNUArm之后,还没有把可执行文件路径加入PATH。
编辑~/.bashrc,加入export PATH="$PATH:/Applications/CMake.app/Contents/bin"
export PATH="$PATH:/Applications/ARM/bin"
如果你把这两个软件安装到了不同目录,则只要修改路径即可
重启启动终端或者source ~/.bashrc
后,可以尝试能否找到这两个工具cmake --version
arm-none-eabi-gcc --version
尝试编译TF-M
在所有环境都安装好之后,我们进入TF-M代码目录,尝试编译TF-M
cmake -S . -B cmake_build -DTFM_PLATFORM=mps2/an521 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake
cmake --build cmake_build -- install
一切顺利的话,TF-M应该可以正常编译了。