Spack是一个软件包管理工具,类似于debain中的apt,pthon中的pip,node中的npm。与其他的包管理工具不一样的是,spack install时,所下载的时对应库的源代码,整个配置、编译、安装的过程时在本地完成的。和其他包管理器不同,spack 没有中心的 repository 服务器,这是因为每个具体软件的 url 都指向了对应软件的官网,因此 spack 本身并不需要维护一个服务器。

刚接触spack,虽然不是很熟悉,但是发现了spack有很多优点:1,spack可以在自己的目录下的opt文件夹安装很多工具,使用spack load命令就可以自动设置$PATH、LA_LIBRARY_PATH等环境变量,极大简化操作;2,spack将package安装到本目录下的opt文件夹下面,避免使得/usr/local下面文件臃肿;3,可以通过spack clone复制生成新的spack环境,可以在一台电脑上面管理多个安装环境;4,无需root权限就可以安装环境。
但是还有一些需要不太明白的地方:就是对于同一spack下,可以同事共存多个版本的package,那么在使用的过程中是怎么区分和使用的。
Spack下载安装
环境要求
Spack has the following minimum requirements, which must be installed before Spack is run:
- Python 2 (2.6 or 2.7) or 3 (3.5 – 3.9) to run Spack
- A C/C++ compiler for building
- The
makeexecutable for building - The
tar,gzip,unzip,bzip2,xzand optionallyzstdexecutables for extracting source code - The
patchcommand to apply patches - The
gitandcurlcommands for fetching - If using the
gpgsubcommand,gnupg2is required
安装
|
1 2 3 4 5 6 7 8 |
# pull spack代码 git clone https://github.com/spack/spack # 配置环境变量 export SPACK_ROOT=/path/to/spack export PATH=${SPACK_ROOT}/bin:${PATH} source ${SPACK_ROOT}/share/spack/setup-env.sh |
Spack常用命令
spack list
使用spack list在终端中查看可以安装的软件。Spack package list列出所有可以安装的软件。
spack info
获取特定的软件包的详细信息。
spack install
普通安装
spack install会首先安装相应的包对应的依赖。
例如,对于spack install mpileaks,spack首先下载mpileaks压缩包,然后解压并验证正确性,然后编译,最后安装到$SPACK_ROOT/opt目录下:
|
1 2 3 4 5 6 7 8 9 10 |
$ spack install mpileaks ... dependency build output ... ==> Installing mpileaks-1.0-ph7pbnhl334wuhogmugriohcwempqry2 ==> No binary for mpileaks-1.0-ph7pbnhl334wuhogmugriohcwempqry2 found: installing from source ==> mpileaks: Executing phase: 'autoreconf' ==> mpileaks: Executing phase: 'configure' ==> mpileaks: Executing phase: 'build' ==> mpileaks: Executing phase: 'install' [+] ~/spack/opt/linux-rhel7-broadwell/gcc-8.1.0/mpileaks-1.0-ph7pbnhl334wuhogmugriohcwempqry2 |
最后一行[+]表示该package已经安装。
加上debug选项可以输出更多信息,spack -d install mpileaks可以输出更多安装信息。
安装特定版本
在软件包的package name后面添加@,然后加上对应的版本信息。spack除了指定版本信息,还能指定安装过程中的编译时信息、编译选项、编译平台(交叉编译);此外,spack还可以配置package的依赖。
spack uninstall
--dependents选项
当卸载一个package时,还有其他的package依赖这个package时,spack会拒绝卸载该package。
如果想卸载一个package以及每个依赖它的package时,使用--dependents选项。
|
1 2 3 |
# 卸载mpich以及依赖mpich的package spack uninstall --dependents mpich |
终端会输出一系列依赖mpich的package,经确认后会删除。
--all选项
当同一个package安装了多个版本,可以使用--all选项全部删除,也可以使用@指定特定的版本。
--force选项
使用--force选项可以强制删除对应的版本,但是这种方式可能破坏依赖,不建议该操作。
spack gc
在spack从源码编译和构建软件过程中,会临时安装有些工具来构建和测试安装的软件,spack提供垃圾回收(”garbage collector”)工具。使用spack gc命令能够卸载不需要的packages。
spack find
spack find命令能够输出已经安装的package,输出信息为package@version,并根据结构和编译器分成不同的组。spack find命令可以添加不同的参数来筛选输出。
例如,加入--paths选项,spack find --paths可以获取对应package安装的目录。
spack load / spack unload
spack将package安装在$SPACK_ROOT/opt下的哈希长目录下,所以如果要使用这个package首先应该讲这些路径添加到环境变量中,spack load / spack unload就是做这个工作的。
规格和依赖(Specs & dependencies)
对于spack install和spack uninstall命令,常常会在版本说明符@后面加上对应的版本选项。这些选项可以来指定从源码编译安装package过程的配置;出来指定package版本,还可以指定编译package的编译器、编译器版本、架构、编译选项以及相关依赖。
例如,一个完整的带参数选项的安装命令如下:
|
1 2 3 |
# 安装特定的package mpileaks spack install mpileaks @1.2:1.4 %gcc@4.7.5 +debug -qt target=x86_64 ^callpath @1.1 %gcc@4.7.2 |
分布说明上面的specs的含义:
@1.2:1.4:安装mpieaks版本在1.2到1.4(包含1.4)之间
%[email protected]:使用4.7.5版本的gcc来编译构建package mpileaks
debug:开启debug选项
-qt:关掉Qt支持选项
target=x86_64:使用通用x86_64架构编译
^callpath @1.1:将package mpileaks与版本1.1的callpath关联起来(依赖[email protected])
%[email protected]:使用4.7.2版本安装gcc编译构建package callpath
上面mpileaks @1.2:1.4 %[email protected] +debug -qt target=x86_64 ^callpath @1.1 %[email protected]称之为一个specs(规格?)。一般情况下,specs包括下面几个部分:
- package name(上面的
mpileaks); @版本指定符(上面的@1.2:1.4);- %编译器指定符(可以不指定版本
%gcc,也可以像上面指定编译器版本); +、-或~可选项指定符(+debug、-qt或~qt),指定布尔型的可选项;name=<value>:可选项指定符,非布尔型可选项;name=<value>:编译选项(compile flags)指定符。有效的编译选项(name的值)有:cflags,cxxflags,fflags,cppflags,ldflags以及ldlibs;target=<value> os=<value>:架构和系统指定(例如,target=haswell os=CNL10);^:依赖specs(例如,^[email protected])。
package与依赖之间组成一个有向无环图,spack能够知道各个package之间的依赖关系,用户不用知道需要安装的package的完整的有向无环图依赖关系。如果使用^在specs中指定一个需要安装的package并不依赖的包时,spack会报错。
References:
LinMao's Blog(林茂的博客)
最新评论
感谢博主,让我PyTorch入了门!
博主你好,今晚我们下馆子不?
博主,你的博客用的哪家的服务器。
您好,请问您对QNN-MO-PYNQ这个项目有研究吗?想请问如何去训练自己的数据集从而实现新的目标检测呢?
where is the source code ? bomb1 188 2 8 0 0 hello world 0 0 0 0 0 0 1 1 9?5
在安装qemu的过程中,一定在make install 前加入 sudo赋予权限。
所以作者你是训练的tiny-yolov3还是yolov3...
很有用