目录
1. rust编译环境的安装
2. 交叉编译的设置
3. cross工具的安装
4. docker的安装
5. Cargo.toml文件的修改
6. 编译
前言(可跳过)
某rust项目仓库,预编译的可执行文件未加入某一特性(在仓库主页有说明该可选项),现欲加入该特性。注意目标平台为arm64(aarch64)且希望musl静态链接。
在成功之前,经历过几次失败,主要是平台不同,但流程类似。
最开始直接在arm64平台上编译。若不设置交叉编译的target,则可以编译成功,但生成的是glibc动态链接。然后发现是需要指定目标(交叉编译),并需要先安装相应的工具
然而出现其中一个依赖包(ring)无法编译的问题。
error: failed to run custom build command for `ring v0.16.20`
然后尝试在alpine linux的docker中编译,原生的musl库无需设置交叉编译,但也报了相同的错误。互联网上的搜索结果大致指向编译环境的问题,最好的方法是docker或者指定的工具链,但是这些解决方案是基于x86平台的,我先前的尝试均在arm上进行
后来发现仓库中提供了一键build脚本,打算进行尝试,但是其因为使用了docker打包了编译环境且只能在x86平台上运行,故环境切换到x86上,下面简要介绍搭建环境过程
1. rust编译环境的安装
假定已有gcc、wegt等工具
设置镜像以加速
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
然后获取安装脚本并执行
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
执行时会询问你安装方式,一般一路默认即可
安装完成后,根据提示source环境变量:
source "$HOME/.cargo/env"
可以通过查看版本的方式确认rust编译器是否安装成功
rustc -V
2. 交叉编译的设置(根据实际情况选装)
这一步实际上可以略去,因采用脚本编译,届时依赖会带上。
分为rust支持包和本机gcc工具链侧两部分:
rustup target add aarch64-unknown-linux-musl sudo apt install musl-gcc
3. cross工具的安装(根据实际情况选装)
一键build脚本里面需要用到一个rust工具cross,需要先安装
cargo install cross
4. docker的安装(根据实际情况选装)
因本仓库编译脚本需要使用docker,故先给系统安装docker,不是所有场景都需要。此部分资料很多,但还是在此做个记录
mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce
然后设置国内镜像以加速拉镜像,编辑/etc/docker/daemon.json:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
给docker添加权限,使其可以不用sudo进行操作
sudo groupadd docker sudo gpasswd -a ${USER} docker sudo service docker restart sudo chmod a+rw /var/run/docker.sock
5. Cargo.toml文件的修改
前面提到,本次编译是为了开启选项。这些选项在toml文件的[features]一栏中指定,可以进行增删:
[features] default = [ "option1", "option2", "optionx", ]
6. 编译
因为是交叉编译,故编译的时候要带上目标平台的参数。若手动build,需要指定target,如
cargo build --target aarch64-unknown-linux-musl
此构建脚本也是需要传递类似参数进去
./build/build-release -t aarch64-unknown-linux-musl
转自https://www.bilibili.com/read/cv20572204
标签:sudo,编译,https,docker,安装,rust From: https://www.cnblogs.com/xiaoBastard/p/17166872.html