Spack 是一个跨平台的包管理器,可以用来安装和编译不同版本的软件,使得他们不与系统环境冲突并且多个版本可以共存。
1. 下载和安装
spack无需安装,下载完成后,直接调用/spack/bin/下的可执行文件即可。
git clone https://github.com/spack/spack.git
export SPACK_ROOT=/path/to/spack
export PATH=${SPACK_ROOT}/bin:${PATH}
source ${SPACK_ROOT}/share/spack/setup-env.sh
2. 常用的命令
官方的get started比较详细,而且手册也很全面。这里仅简单记录几种我常用的命令。
2.1 添加外部compiler
# 列出当前所有添加到spack里的compiler
spack compilers
# 自动检测系统环境中可以用的compiler并添加进来
# An alias for spack compiler find
spack compiler add
# 添加特定路径的compiler到spack中
spack compiler find /home/test/opt/gcc10.0
2.2 安装软件
https://spack.readthedocs.io/en/latest/package_list.html
这个页面显示了当前spack维护的所有软件及其版本。(不是所有的软件版本都在支持列表中)
# 新版本的spack需要先add到环境中
spack add gcc@9.4.0
spack install
spack add zlib@1.1.0%gcc@9.0.1 target=icelake
spack install -j 12
如果不加@9.4.0
,将默认安装master版本。
-j 12
跟make的一致,表示12个thread来执行。
注意观察安装过程中出现的错误。最后软件安装的位置在类似:
/home/test/spack/opt/spack/linux-ubuntu18.04-zen/gcc-7.5.0/gcc-9.4.0-XXXX
你的spck路径/opt/spack/你的操作系统和cpu架构/编译使用的compiler/安装的软件包
安装完成后可以通过spack load [email protected]
来加载gcc8.4.0。
spack find -l
可以列出包的hash,spack load /hash
可以指定想要加载的包,在装了多个相同软件(不同的vairants)时很有用。
2.3 虚拟环境
spack支持类似python的virtualenv的功能,可以通过创建虚拟环境来将自己安装的软件隔离开。
spack env create myenv
# 如果之前创建过,可以直接activate
spack env activate myenv
# 如果已经在默认的spack环境中安装过,这里将只是在当前的myenv里注册一下
spack install [email protected]
# 或者使用load加载特定的已经安装的包到当前的虚拟环境中,这样下次激活这个环境,将默认加载这些包
spack load [email protected] arch=$(spack arch)
# 取消虚拟环境
despacktivate
如果上述环境不生效,可以和module配合来改变环境变量。
如果有多个相同的包,除了hash code不同,可以通过spack load /hash_code
来load特定的包。如果是在集群上,可以在login node安装所有集群包括的架构的包,然后在compute node上使用arch=$(spack arch)
来load特定架构的包。
3. Tips
Curl
由于spack需要用curl从软件的官网或者mirror下载源码,而有些站点仅支持https或者自动转发请求为https请求,所以要求curl必须支持https协议。在部分发行版上(比如centos7),默认的curl可能不支持https,导致安装软件的过程出现curl的错误。可以通过curl --version
查看curl支持的协议。如果不支持https,那么需要自己手动编译下curl。
cd /home/test/opt/Downloads/curl/
mkdir build && cd build
../configure --with-ssl
make
export PATH/home/test/opt/Downloads/curl/bin/:$PATH
hash校验
可能由于网络问题,极少情况会出现下载的源码包校验出错的问题。在spack的源码中,对每个源码包都有固定的hash值。一个临时解决方案是顺着错误提示,找到对应的spack源码,修改下载的包的hash值。spack目录下的var/cache/
里存储了下载的源码包。
默认的compiler
目前好像不支持在interactive模式下的灵活修改
https://github.com/spack/spack/issues/8635
指定spack使用系统的一些包
通过修改~/.spack/packages.yaml
文件,可以指定spack使用系统的一些包,比如python,gcc等。
packages:
openmpi:
buildable: False
externals:
- spec: "[email protected]"
prefix: /usr/
buildable:False
意思是凡是用到这个包的,都用外部版本,而不是从源码编译。
Reference
https://spack.readthedocs.io/en/latest/environments.html
https://spack.readthedocs.io/en/latest/basic_usage.html
https://askubuntu.com/questions/821186/protocol-https-not-supported-or-disabled-in-libcurl
https://spack.readthedocs.io/en/latest/build_settings.html
Comments