LinMao's Blog
学习科研记录与分享!

Spack Basic Usage

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

刚接触spack,虽然不是很熟悉,但是发现了spack有很多优点:1,spack可以在自己的目录下的opt文件夹安装很多工具,使用spack load命令就可以自动设置$PATHLA_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:

  1. Python 2 (2.6 or 2.7) or 3 (3.5 – 3.9) to run Spack
  2. A C/C++ compiler for building
  3. The make executable for building
  4. The tar, gzip, unzip, bzip2, xz and optionally zstd executables for extracting source code
  5. The patch command to apply patches
  6. The git and curl commands for fetching
  7. If using the gpg subcommand, gnupg2 is required

安装

 

Spack常用命令

spack list

使用spack list在终端中查看可以安装的软件。Spack package list列出所有可以安装的软件。

spack info

获取特定的软件包的详细信息。

spack install

普通安装

spack install会首先安装相应的包对应的依赖。

例如,对于spack install mpileaks,spack首先下载mpileaks压缩包,然后解压并验证正确性,然后编译,最后安装到$SPACK_ROOT/opt目录下:

最后一行[+]表示该package已经安装。

加上debug选项可以输出更多信息,spack -d install mpileaks可以输出更多安装信息。

安装特定版本

在软件包的package name后面添加@,然后加上对应的版本信息。spack除了指定版本信息,还能指定安装过程中的编译时信息、编译选项、编译平台(交叉编译);此外,spack还可以配置package的依赖。

spack uninstall

--dependents选项

当卸载一个package时,还有其他的package依赖这个package时,spack会拒绝卸载该package。

如果想卸载一个package以及每个依赖它的package时,使用--dependents选项。

终端会输出一系列依赖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 installspack uninstall命令,常常会在版本说明符@后面加上对应的版本选项。这些选项可以来指定从源码编译安装package过程的配置;出来指定package版本,还可以指定编译package的编译器、编译器版本、架构、编译选项以及相关依赖。

例如,一个完整的带参数选项的安装命令如下:

分布说明上面的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的值)有:cflagscxxflagsfflagscppflagsldflags以及ldlibs
  • target=<value> os=<value>:架构和系统指定(例如,target=haswell os=CNL10);
  • ^:依赖specs(例如,^[email protected])。

 

package与依赖之间组成一个有向无环图,spack能够知道各个package之间的依赖关系,用户不用知道需要安装的package的完整的有向无环图依赖关系。如果使用^在specs中指定一个需要安装的package并不依赖的包时,spack会报错。

 

References:

Spack Getting Start

Spack Basic Usage

科学计算包管理神器Spack

 

赞(1) 打赏
转载请注明出处:LinMao's Blog(林茂的博客) » Spack Basic Usage

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

LinMao's Blog(林茂的博客)

了解更多联系我们

觉得文章有用就打赏一下作者吧~

支付宝扫一扫打赏

微信扫一扫打赏