spack添加external及load完整流程

一、简介 

  在使用spack的时候总会遇到比如超时或者下载不了等问题,而你本地恰好有一个你需要的软件包,那如何用spack去进行管理?

  显然,国内的资料我是没找到什么完整的使用流程,而在我踩坑两天之后,现在大概是成功了,并以此文介绍一下如何用spack将本地的软件包进行管理

 

  因为我是在管理intel-oneapi-compilers的时候遇到的这个问题,所以下文都在此基础上进行介绍

  linux版本:CentOS7

 

  这里放上spack关于packages.yaml的原文

二、具体流程

1、编辑packages.yaml

  这个文件的路径是/path/to/your/.spack/packages.yaml(这里改成你的.spack路径)。如果没有,用spack config edit packages指令也可以,同样可以用spack config get packages查看完整的 packages.yaml 信息。

  我这里本地oneapi文件的结构如下

├── 2021.4.0
│   ├── ccl
│   ├── clck
│   ├── compiler
│   │    ├── 2021.4.0
│   │    │   ├── documentation
│   │    │   │   └── en
│   │    │   ├── env
│   │    │   │   └── vars.sh
│   ├── conda_channel
│   ├── dal
│   ├── debugger
│   ├── dev-utilities
│   ├── dpcpp-ct
│   ├── dpl
│   ├── etc
│   ├── inspector
│   ├── intelpython
│   ├── ipp
│   ├── ippcp
│   ├── itac
│   ├── licensing
│   ├── logs
│   ├── mkl
│   ├── mpi
│   ├── setvars.sh
│   ├── tbb
│   └── vpl
└── 2024.1.0

  我需要的是2021.4.0版本,而spack在load时,是会从当前路径沿着/compiler/2021.4.0/env/vars.sh去找到这个.sh文件。所以我这里只需要保留/oneapi/2021.4.0就可以了。所以,如果你出现如下问题:

spack load intel-oneapi-compilers@2021.4.0
==> Error: Trying to source non-existing file: /path/to/your/oneapi/2021.4.0/compiler/2021.4.0/compiler/2021.4.0/env/vars.sh

就表示路径错了。而这里的路径,就是要在packages.yaml中添加的部分

  我们要在packages.yaml中添加如下代码:

 packages:
  intel-oneapi-compilers:
    externals:
    - spec: "intel-oneapi-compilers@2021.4.0"
      prefix: /path/to/your/oneapi/2021.4.0
    buildable: false

 

这里的packages: 如果已给出,就在里面添加 intel.. 之后的内容就可以了。其中buildable: false表示不用再编译了

  这样我们就把本地的软件包添加到spack的external之中。

2、验证是否存在

  添加之后,我们可以用spack spec intel-oneapi-compilers指令查看是否已经存在:

spack spec intel-oneapi-compilers
Input spec
--------------------------------
intel-oneapi-compilers

Concretized
--------------------------------
intel-oneapi-compilers@2021.4.0%gcc@10.2.0 build_system=generic arch=linux-centos7-cascadelake

如果出现和你本地版本号对应的intel-oneapi-compilers,那就证明修改成功了。

  但是此时你发现,在键入spack find intel-oneapi-compilers指令时依然返回 no package 的字样。所以到这一步还是不能用的,只能说spack认为自己有。

(这里我可以用icc --version来检测是否已经在使用了,但是返回-bash: icc: command not found。这也是一种检测方法)

3、下载 intel-oneapi-compilers

  键入:

spack install intel-oneapi-compilers@2021.4.0%gcc@10.2.0 build_system=generic arch=linux-centos7-cascadelake

可以看到这里的名称是完全从spack spec intel-oneapi-compilers得到的结果中复制过来的全称。

  至于为什么要写这么多,讲真我也不知道为什么,但是我知道要是只保留intel-oneapi-compilers@2021.4.0的话spack又要开始自己下载了。

如果看到报错,那就是packages.yaml里面的路径写的有问题,正常情况下应该是这样的:

spack install intel-oneapi-compilers@2021.4.0%gcc@10.2.0 build_system=generic arch=linux-centos7-cascadelake
[+] /path/to/tour//oneapi/2021.4.0 (external intel-oneapi-compilers-2021.4.0-一串字符)

  这个时候再看spack find intel-oneapi-compilers的输出,就能看到结果了:

spack find intel-oneapi-compilers
-- linux-centos7-cascadelake / gcc@10.2.0 -----------------------
intel-oneapi-compilers@2021.4.0
==> 1 installed package

(当然,这个时候执行icc --version还是-bash: icc: command not found

4、load

  这里仅键入spack load intel-oneapi-compilers@2021.4.0就可以了,会得到如下结果:(哦,好像正确的话没有结果,如果报错了,还是packages.yaml路径写的不对。)

这里再执行icc --version,就可以得到如下结果了:

icc --version
icc (ICC) 2021.4.0 20210910

 

posted @ 2025-06-18 16:20  euphria  阅读(88)  评论(0)    收藏  举报