使用Spack快速搭建开发环境
针对新加入的开发人员,可以根据以下步骤快速搭建开发环境
一、本地快速构建
1.本地快速搭建环境并构建
方法一、运行一键式脚本快速构建
prepare_cann_env.sh会一键式搭建Spack环境并安装ops-math的全部依赖
# 进入代码根目录
cd ${local_repo_path}/ops-math
source spack/prepare_cann_env.sh
方法二、手动配置环境(适合高级用户或自定义配置)
如果您希望更精细地控制环境配置,可以按照以下步骤手动配置:
步骤 1:下载并安装 Spack(Spack已安装可跳过)
# 选择安装目录(默认为 $HOME)
export SPACK_INSTALL_DIR="$HOME"
# 下载 Spack v1.1.0 并激活 Spack 工具
cd $SPACK_INSTALL_DIR
git clone https://gitcode.com/GitHub_Trending/sp/spack.git -b v1.1.0 --depth=2
source $SPACK_INSTALL_DIR/spack/share/spack/setup-env.sh
# 验证 Spack 安装后的版本
spack --version
步骤 2:设置Spack 软件包默认安装路径
Spack软件包默认安装路径在$SPACK_INSTALL_DIR/spack/opt,可以通过如下命令进行修改:
#普通用户
spack config --scope user add "config:install_tree:root:$HOME/.spack"
#root 管理员
spack config --scope user add "config:install_tree:root:/opt/spack"
普通用户建议使用个人home下目录,避免被其他用户修改导致环境不稳定 管理员建议使用全局路径,便于使用Spack串联能力统一安装软件提供给其他用户使用:
步骤 3:添加外部已安装工具到Spack环境中
spack compiler find # 配置本地已安装的编译器,如gcc
步骤 4:配置 Spack 官方仓库gitcode镜像源
Spack默认官方仓库地址为github地址,可以通过如下方式修改默认官方仓库,使用GitCode镜像源起到加速作用: 修改~/.spack目录下的repos.yaml,如不存在则新建该文件,写入以下内容
repos:
# Spack 内置仓库
builtin:
git: https://gitcode.com/spack/spack-packages.git
branch: releases/v2025.11
验证仓库配置:spack repo list
步骤 5:下载并添加 CANN社区Spack 包仓库
# 克隆 CANN Spack 包仓库
cd $SPACK_INSTALL_DIR
git clone --depth=1 https://gitcode.com/cann/cann-spack-package.git
# 添加到 Spack 仓库列表
spack repo add $SPACK_INSTALL_DIR/cann-spack-package
# 验证添加成功
spack repo list | grep cann
步骤 6:创建并激活 Spack 环境
# 创建名为 cann-dev-env 的环境
spack env create cann-dev-env ${local_repo_path}/ops-math/spack/spack.yaml
# 激活环境
spack env activate cann-dev-env
# 验证环境激活
spack env status
步骤 7:设置终端自动加载(可选)
# 将 Spack 环境配置添加到 .bashrc
echo "source $SPACK_INSTALL_DIR/spack/share/spack/setup-env.sh" >> ~/.bashrc
# 立即生效
source ~/.bashrc
步骤 8:配置开发模式并安装
# 设置 ops-math 为开发模式(指向本地代码)
spack develop -p ${local_repo_path}/ops-math cann-ops-math@master
# 添加包到环境(根据需要调整变体)
spack add cann-ops-math@master+pkg+jit
# 解析依赖关系
spack concretize -f
# 安装
spack install
2. 查看产物位置
执行命令
spack location -i cann-ops-math
即可查看ops-math编译生成run包的位置,run包已自动安装到ASCEND_HOME_PATH下
二、修改代码后重新构建
1. 卸载已构建的产物
spack uninstall -y cann-ops-math
2. 移除已有变体并添加新变体
如果想指定不同的构建参数,可通过更换Spack包变体来实现 (不更改构建参数,可跳过此步骤)
spack change cann-ops-math@master +pkg +jit soc=ascend910b # 举例
3. 重新进行依赖解析
spack concretize -f
4. 重新构建
spack install
三、重新进入Spack环境
开启新终端需要重新进入Spack环境
spack env activate cann-dev-env
四、清理环境或卸载Spack
如果不想继续使用Spack,可使用prepare_cann_env.sh的clean参数卸载Spack并通过重启终端来清理环境变量
source prepare_cann_env.sh clean
五、ops-math的Spack构建变体
通过spack info cann-ops-math命令可以查看ops-math支持的参数,变体具体含义请参考build.md.
六、Spack开发与调试命令指导
#查看当前环境列表:如果是从一键式脚本prepare_cann_env.sh生成,已准备好开发环境cann-dev-env
spack env list
#创建环境:Spack管理的环境之间互相隔离,以链接的形式与软件包关联
spack env create <env-name>
#启用环境:当前激活的环境字体为绿色,Spack的命令以当前激活环境为准,与所处位置无关
spack env activate <env-name>
#查看当前环境中都引入了哪些软件包:如果不在特定环境中执行则为查看所有环境
spack find #列出所有软件包
spack find -L #显示完整哈希
spack find <package-name> #按包名过滤,不提供则为全部包
spack find --deps <package-name> #显示该包的依赖树
spack find --explicit <package-name> #显示手动安装的定级包 缩写:-e
spack find -p <package-name> #显示完整安装路径
spack find -lv <package-name> #显示完整哈希和变体信息
#向当前环境中添加软件包:
spack add <package-name> #同样支持spec语法,指定版本,变体,编译器等
#从当前环境中移除软件包: Spack不会删除软件包,只是移除当前环境与软件包之间的依赖
spack remove <package-name>
#卸载软件包:需要所有的Spack环境都不依赖该软件包才可以由Spack卸载,会卸载本地安装好的包,慎用
spack uninstall <package-name>
#删除某个Spack环境:物理删除文件,慎用
spack env remove <env-name>
#取消激活当前环境:
spack env deactivate
#搜索Spack支持的软件包
spack list <package-name>
spack list 'py-*' #列出所有 Python 包
spack list -d 'mpi' #在描述中搜索 mpi
#查看可用版本号
spack versions <package-name>
#清除Spack构建缓存:
spack clean
spack clean -all #将旧源码与旧构建记录及缓存全部清除,慎用
#查看当前软件包信息:查看该软件包所有支持的版本,Spack默认倾向于最新版本
spack info <package-name>
#安装软件包,Spack自动选择最新版本
spack install #安装当前环境中所有未安装的软件包
spack install <package-name> #指定具体的软件包名
spack install <package-name>@1.12.0%gcc@11.4.0 #spec语法,指定版本与编译器版本
spack install <package-name>+mpi+fortran ^openmpi@4.1 #spec语法,指定变体
spack install <package-name1> <package-name2> <package-name3> #同时安装多个包
spack -k install #安装时跳过安全认证,慎用
spack install --verbose #输出详细构建日志,缩写:-v
spack install --no-checksum #安装时禁用网络校验和检查,慎用
#具体化当前环境:Spack的策略是默认倾向于重用已安装在本地的软件包,即使已有更高版本且满足依赖条件,除非本地包已不符合依赖条件
spack concretize
#从远端下载软件包源码到本地并注册为开发包:否则Spack引用的远端文件会作为缓存临时文件,会被spack clean清除
spack develop <package-name>
#从本地代码开发目录注册开发包
git clone <git-path> #克隆源码并进入目录
cd /package/path
spack develop --no-clone <package-name>
#解析该软件包依赖信息:
spack spec <package-name>
# 如果git仓有更新,该命令可以根据repos.yaml中配置的远程仓库地址与分支进行同步更新
spack repo update <repo name>
#定位软件包安装位置:
spack location -b <package-name>
#查看编译器配置:
spack compilers #查看所有支持的编译器,同spack compiler list
spack compiler add /path/to/compiler/bin #手动添加编译器
#查看Spack复用的本机已安装的软件
spack external find
#查看Spack版本,验证安装:
spack --version
#编辑Spack配置: 会自动打开vim
spack config edit config
spack config edit packages
七、一键式脚本prepare_cann_env.sh生成路径(默认)
#cann开源仓目录:
$HOME/cann-spack-package
#Spack管理的软件包安装目录:
root用户:/opt/spack/linux-*
普通用户:$HOME/.spack/linux-*
#Spack配置目录:
$HOME/.spack
#Spack自身提供的builtin软件包目录:
$HOME/.spack/package_repos/opgus4u/repos/spack_repo/builtin/packages
#Spack本体目录:
$HOME/spack
#Spack环境目录:
$HOME/spack/var/spack/environments
八、FAQ
1.执行prepare_cann_env.sh出现报错怎么办
如果机器在以前安装过Spack可能会导致环境变量或配置文件残留,可在备份关键数据后执行source prepare_cann_env.sh clean并重启终端后重新执行
2.安装过程中出现ssl类报错怎么办
此类报错是由于机器缺少相关证书导致,请自行配置证书并重新运行
3.不想使用Spack了如何卸载
执行source prepare_cann_env.sh clean可自动卸载Spack,root用户还需要执行rm -rf /opt/spack卸载所有Spack软件包