Compare commits
1 Commits
woptim/spa
...
features/r
Author | SHA1 | Date | |
---|---|---|---|
![]() |
719d31682f |
@@ -5,7 +5,7 @@ coverage:
|
|||||||
status:
|
status:
|
||||||
project:
|
project:
|
||||||
default:
|
default:
|
||||||
threshold: 2.0%
|
threshold: 0.2%
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
- lib/spack/spack/test/.*
|
- lib/spack/spack/test/.*
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Load spack environment at terminal startup
|
|
||||||
cat <<EOF >> /root/.bashrc
|
|
||||||
. /workspaces/spack/share/spack/setup-env.sh
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Load spack environment in this script
|
|
||||||
. /workspaces/spack/share/spack/setup-env.sh
|
|
||||||
|
|
||||||
# Ensure generic targets for maximum matching with buildcaches
|
|
||||||
spack config --scope site add "packages:all:require:[target=x86_64_v3]"
|
|
||||||
spack config --scope site add "concretizer:targets:granularity:generic"
|
|
||||||
|
|
||||||
# Find compiler and install gcc-runtime
|
|
||||||
spack compiler find --scope site
|
|
||||||
|
|
||||||
# Setup buildcaches
|
|
||||||
spack mirror add --scope site develop https://binaries.spack.io/develop
|
|
||||||
spack buildcache keys --install --trust
|
|
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Ubuntu 20.04",
|
|
||||||
"image": "ghcr.io/spack/ubuntu20.04-runner-amd64-gcc-11.4:2023.08.01",
|
|
||||||
"postCreateCommand": "./.devcontainer/postCreateCommand.sh"
|
|
||||||
}
|
|
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Ubuntu 22.04",
|
|
||||||
"image": "ghcr.io/spack/ubuntu-22.04:v2024-05-07",
|
|
||||||
"postCreateCommand": "./.devcontainer/postCreateCommand.sh"
|
|
||||||
}
|
|
43
.flake8
43
.flake8
@@ -1,25 +1,43 @@
|
|||||||
# -*- conf -*-
|
# -*- conf -*-
|
||||||
# flake8 settings for Spack.
|
# flake8 settings for Spack core files.
|
||||||
#
|
#
|
||||||
# These exceptions are for Spack core files. We're slightly more lenient
|
# These exceptions are for Spack core files. We're slightly more lenient
|
||||||
# with packages. See .flake8_packages for that.
|
# with packages. See .flake8_packages for that.
|
||||||
#
|
#
|
||||||
# This is the only flake8 rule Spack violates somewhat flagrantly
|
# E1: Indentation
|
||||||
|
# - E129: visually indented line with same indent as next logical line
|
||||||
|
#
|
||||||
|
# E2: Whitespace
|
||||||
|
# - E221: multiple spaces before operator
|
||||||
|
# - E241: multiple spaces after ','
|
||||||
|
# - E272: multiple spaces before keyword
|
||||||
|
#
|
||||||
|
# E7: Statement
|
||||||
# - E731: do not assign a lambda expression, use a def
|
# - E731: do not assign a lambda expression, use a def
|
||||||
#
|
#
|
||||||
# This is the only flake8 exception needed when using Black.
|
# W5: Line break warning
|
||||||
# - E203: white space around slice operators can be required, ignore : warn
|
# - W503: line break before binary operator
|
||||||
|
# - W504: line break after binary operator
|
||||||
#
|
#
|
||||||
# We still allow these in packages (Would like to get rid of them or rely on mypy
|
# These are required to get the package.py files to test clean:
|
||||||
# in the future)
|
# - F999: syntax error in doctest
|
||||||
# - F403: from/import * used; unable to detect undefined names
|
#
|
||||||
|
# N8: PEP8-naming
|
||||||
|
# - N801: class names should use CapWords convention
|
||||||
|
# - N813: camelcase imported as lowercase
|
||||||
|
# - N814: camelcase imported as constant
|
||||||
|
#
|
||||||
|
# F4: pyflakes import checks, these are now checked by mypy more precisely
|
||||||
|
# - F403: from module import *
|
||||||
# - F405: undefined name or from *
|
# - F405: undefined name or from *
|
||||||
# - F821: undefined name (needed with from/import *)
|
#
|
||||||
|
# Black ignores, these are incompatible with black style and do not follow PEP-8
|
||||||
|
# - E203: white space around slice operators can be required, ignore : warn
|
||||||
|
# - W503: see above, already ignored for line-breaks
|
||||||
#
|
#
|
||||||
[flake8]
|
[flake8]
|
||||||
#ignore = E129,,W503,W504,F999,N801,N813,N814,F403,F405,E203
|
ignore = E129,E221,E241,E272,E731,W503,W504,F999,N801,N813,N814,F403,F405
|
||||||
extend-ignore = E731,E203
|
max-line-length = 88
|
||||||
max-line-length = 99
|
|
||||||
|
|
||||||
# F4: Import
|
# F4: Import
|
||||||
# - F405: `name` may be undefined, or undefined from star imports: `module`
|
# - F405: `name` may be undefined, or undefined from star imports: `module`
|
||||||
@@ -28,8 +46,7 @@ max-line-length = 99
|
|||||||
# - F821: undefined name `name`
|
# - F821: undefined name `name`
|
||||||
#
|
#
|
||||||
per-file-ignores =
|
per-file-ignores =
|
||||||
var/spack/repos/*/package.py:F403,F405,F821
|
var/spack/repos/*/package.py:F405,F821
|
||||||
*-ci-package.py:F403,F405,F821
|
|
||||||
|
|
||||||
# exclude things we usually do not want linting for.
|
# exclude things we usually do not want linting for.
|
||||||
# These still get linted when passed explicitly, as when spack flake8 passes
|
# These still get linted when passed explicitly, as when spack flake8 passes
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
# .git-blame-ignore-revs
|
|
||||||
# Formatted entire codebase with black 23
|
|
||||||
603569e321013a1a63a637813c94c2834d0a0023
|
|
||||||
# Formatted entire codebase with black 22
|
|
||||||
f52f6e99dbf1131886a80112b8c79dfc414afb7c
|
|
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1,4 +1,3 @@
|
|||||||
*.py diff=python
|
*.py diff=python
|
||||||
*.lp linguist-language=Prolog
|
*.lp linguist-language=Prolog
|
||||||
lib/spack/external/* linguist-vendored
|
lib/spack/external/* linguist-vendored
|
||||||
*.bat text eol=crlf
|
|
4
.github/ISSUE_TEMPLATE/build_error.yml
vendored
4
.github/ISSUE_TEMPLATE/build_error.yml
vendored
@@ -29,9 +29,7 @@ body:
|
|||||||
description: |
|
description: |
|
||||||
Please post the error message from spack inside the `<details>` tag below:
|
Please post the error message from spack inside the `<details>` tag below:
|
||||||
value: |
|
value: |
|
||||||
<details><summary>Error message</summary>
|
<details><summary>Error message</summary><pre>
|
||||||
|
|
||||||
<pre>
|
|
||||||
...
|
...
|
||||||
</pre></details>
|
</pre></details>
|
||||||
validations:
|
validations:
|
||||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -29,6 +29,8 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: General information
|
label: General information
|
||||||
options:
|
options:
|
||||||
|
- label: I have run `spack --version` and reported the version of Spack
|
||||||
|
required: true
|
||||||
- label: I have searched the issues of this repo and believe this is not a duplicate
|
- label: I have searched the issues of this repo and believe this is not a duplicate
|
||||||
required: true
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
|
64
.github/ISSUE_TEMPLATE/test_error.yml
vendored
64
.github/ISSUE_TEMPLATE/test_error.yml
vendored
@@ -1,64 +0,0 @@
|
|||||||
name: "\U0001F4A5 Tests error"
|
|
||||||
description: Some package in Spack had stand-alone tests that didn't pass
|
|
||||||
title: "Testing issue: "
|
|
||||||
labels: [test-error]
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: reproduce
|
|
||||||
attributes:
|
|
||||||
label: Steps to reproduce the failure(s) or link(s) to test output(s)
|
|
||||||
description: |
|
|
||||||
Fill in the test output from the exact spec that is having stand-alone test failures. Links to test outputs (e.g., CDash) can also be provided.
|
|
||||||
value: |
|
|
||||||
```console
|
|
||||||
$ spack spec -I <spec>
|
|
||||||
...
|
|
||||||
```
|
|
||||||
- type: textarea
|
|
||||||
id: error
|
|
||||||
attributes:
|
|
||||||
label: Error message
|
|
||||||
description: |
|
|
||||||
Please post the error message from spack inside the `<details>` tag below:
|
|
||||||
value: |
|
|
||||||
<details><summary>Error message</summary>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
...
|
|
||||||
</pre></details>
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: information
|
|
||||||
attributes:
|
|
||||||
label: Information on your system or the test runner
|
|
||||||
description: Please include the output of `spack debug report` for your system.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
If you have any relevant configuration detail (custom `packages.yaml` or `modules.yaml`, etc.) you can add that here as well.
|
|
||||||
- type: textarea
|
|
||||||
id: additional_information
|
|
||||||
attributes:
|
|
||||||
label: Additional information
|
|
||||||
description: |
|
|
||||||
Please upload test logs or any additional information about the problem.
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Some packages have maintainers who have volunteered to debug build failures. Run `spack maintainers <name-of-the-package>` and **@mention** them here if they exist.
|
|
||||||
- type: checkboxes
|
|
||||||
id: checks
|
|
||||||
attributes:
|
|
||||||
label: General information
|
|
||||||
options:
|
|
||||||
- label: I have reported the version of Spack/Python/Platform/Runner
|
|
||||||
required: true
|
|
||||||
- label: I have run `spack maintainers <name-of-the-package>` and **@mentioned** any maintainers
|
|
||||||
required: true
|
|
||||||
- label: I have uploaded any available logs
|
|
||||||
required: true
|
|
||||||
- label: I have searched the issues of this repo and believe this is not a duplicate
|
|
||||||
required: true
|
|
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@@ -5,10 +5,3 @@ updates:
|
|||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
# Requirements to run style checks and build documentation
|
|
||||||
- package-ecosystem: "pip"
|
|
||||||
directories:
|
|
||||||
- "/.github/workflows/requirements/style/*"
|
|
||||||
- "/lib/spack/docs"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
|
6
.github/pull_request_template.md
vendored
6
.github/pull_request_template.md
vendored
@@ -1,6 +0,0 @@
|
|||||||
<!--
|
|
||||||
Remember that `spackbot` can help with your PR in multiple ways:
|
|
||||||
- `@spackbot help` shows all the commands that are currently available
|
|
||||||
- `@spackbot fix style` tries to push a commit to fix style issues in this PR
|
|
||||||
- `@spackbot re-run pipeline` runs the pipelines again, if you have write access to the repository
|
|
||||||
-->
|
|
74
.github/workflows/audit.yaml
vendored
74
.github/workflows/audit.yaml
vendored
@@ -1,74 +0,0 @@
|
|||||||
name: audit
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
with_coverage:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
python_version:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: audit-${{inputs.python_version}}-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Run audits on all the packages in the built-in repository
|
|
||||||
package-audits:
|
|
||||||
runs-on: ${{ matrix.system.os }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
system:
|
|
||||||
- { os: windows-latest, shell: 'powershell Invoke-Expression -Command "./share/spack/qa/windows_test_setup.ps1"; {0}' }
|
|
||||||
- { os: ubuntu-latest, shell: bash }
|
|
||||||
- { os: macos-latest, shell: bash }
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: ${{ matrix.system.shell }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: ${{inputs.python_version}}
|
|
||||||
- name: Install Python packages
|
|
||||||
run: |
|
|
||||||
pip install --upgrade pip setuptools pytest coverage[toml]
|
|
||||||
- name: Setup for Windows run
|
|
||||||
if: runner.os == 'Windows'
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pywin32
|
|
||||||
- name: Package audits (with coverage)
|
|
||||||
env:
|
|
||||||
COVERAGE_FILE: coverage/.coverage-audits-${{ matrix.system.os }}
|
|
||||||
if: ${{ inputs.with_coverage == 'true' && runner.os != 'Windows' }}
|
|
||||||
run: |
|
|
||||||
. share/spack/setup-env.sh
|
|
||||||
coverage run $(which spack) audit packages
|
|
||||||
coverage run $(which spack) audit configs
|
|
||||||
coverage run $(which spack) -d audit externals
|
|
||||||
coverage combine
|
|
||||||
- name: Package audits (without coverage)
|
|
||||||
if: ${{ inputs.with_coverage == 'false' && runner.os != 'Windows' }}
|
|
||||||
run: |
|
|
||||||
. share/spack/setup-env.sh
|
|
||||||
spack -d audit packages
|
|
||||||
spack -d audit configs
|
|
||||||
spack -d audit externals
|
|
||||||
- name: Package audits (without coverage)
|
|
||||||
if: ${{ runner.os == 'Windows' }}
|
|
||||||
run: |
|
|
||||||
. share/spack/setup-env.sh
|
|
||||||
spack -d audit packages
|
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
|
||||||
spack -d audit configs
|
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
|
||||||
spack -d audit externals
|
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
|
||||||
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
|
||||||
if: ${{ inputs.with_coverage == 'true' && runner.os != 'Windows' }}
|
|
||||||
with:
|
|
||||||
name: coverage-audits-${{ matrix.system.os }}
|
|
||||||
path: coverage
|
|
||||||
include-hidden-files: true
|
|
8
.github/workflows/bin/bootstrap-test.sh
vendored
8
.github/workflows/bin/bootstrap-test.sh
vendored
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
source share/spack/setup-env.sh
|
|
||||||
$PYTHON bin/spack bootstrap disable github-actions-v0.5
|
|
||||||
$PYTHON bin/spack bootstrap disable spack-install
|
|
||||||
$PYTHON bin/spack $SPACK_FLAGS solve zlib
|
|
||||||
tree $BOOTSTRAP/store
|
|
||||||
exit 0
|
|
424
.github/workflows/bootstrap.yml
vendored
424
.github/workflows/bootstrap.yml
vendored
@@ -3,32 +3,135 @@ name: Bootstrapping
|
|||||||
on:
|
on:
|
||||||
# This Workflow can be triggered manually
|
# This Workflow can be triggered manually
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
workflow_call:
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
- releases/**
|
||||||
|
paths-ignore:
|
||||||
|
# Don't run if we only modified packages in the
|
||||||
|
# built-in repository or documentation
|
||||||
|
- 'var/spack/repos/builtin/**'
|
||||||
|
- '!var/spack/repos/builtin/packages/clingo-bootstrap/**'
|
||||||
|
- '!var/spack/repos/builtin/packages/python/**'
|
||||||
|
- '!var/spack/repos/builtin/packages/re2c/**'
|
||||||
|
- 'lib/spack/docs/**'
|
||||||
schedule:
|
schedule:
|
||||||
# nightly at 2:16 AM
|
# nightly at 2:16 AM
|
||||||
- cron: '16 2 * * *'
|
- cron: '16 2 * * *'
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: bootstrap-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
distros-clingo-sources:
|
|
||||||
|
fedora-clingo-sources:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ${{ matrix.image }}
|
container: "fedora:latest"
|
||||||
strategy:
|
if: github.repository == 'spack/spack'
|
||||||
matrix:
|
|
||||||
image: ["fedora:latest", "opensuse/leap:latest"]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Fedora
|
- name: Install dependencies
|
||||||
if: ${{ matrix.image == 'fedora:latest' }}
|
|
||||||
run: |
|
run: |
|
||||||
dnf install -y \
|
dnf install -y \
|
||||||
bzip2 curl file gcc-c++ gcc gcc-gfortran git gzip \
|
bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
||||||
make patch unzip which xz python3 python3-devel tree \
|
make patch unzip which xz python3 python3-devel tree \
|
||||||
cmake bison bison-devel libstdc++-static
|
cmake bison bison-devel libstdc++-static
|
||||||
- name: Setup OpenSUSE
|
- name: Checkout
|
||||||
if: ${{ matrix.image == 'opensuse/leap:latest' }}
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- name: Setup non-root user
|
||||||
|
run: |
|
||||||
|
# See [1] below
|
||||||
|
git config --global --add safe.directory /__w/spack/spack
|
||||||
|
useradd spack-test && mkdir -p ~spack-test
|
||||||
|
chown -R spack-test . ~spack-test
|
||||||
|
- name: Setup repo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Bootstrap clingo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack bootstrap untrust github-actions-v0.2
|
||||||
|
spack external find cmake bison
|
||||||
|
spack -d solve zlib
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
ubuntu-clingo-sources:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: "ubuntu:latest"
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
run: |
|
||||||
|
apt-get update -y && apt-get upgrade -y
|
||||||
|
apt-get install -y \
|
||||||
|
bzip2 curl file g++ gcc gfortran git gnupg2 gzip \
|
||||||
|
make patch unzip xz-utils python3 python3-dev tree \
|
||||||
|
cmake bison
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- name: Setup non-root user
|
||||||
|
run: |
|
||||||
|
# See [1] below
|
||||||
|
git config --global --add safe.directory /__w/spack/spack
|
||||||
|
useradd spack-test && mkdir -p ~spack-test
|
||||||
|
chown -R spack-test . ~spack-test
|
||||||
|
- name: Setup repo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Bootstrap clingo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack bootstrap untrust github-actions-v0.2
|
||||||
|
spack external find cmake bison
|
||||||
|
spack -d solve zlib
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
ubuntu-clingo-binaries-and-patchelf:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: "ubuntu:latest"
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
run: |
|
||||||
|
apt-get update -y && apt-get upgrade -y
|
||||||
|
apt-get install -y \
|
||||||
|
bzip2 curl file g++ gcc gfortran git gnupg2 gzip \
|
||||||
|
make patch unzip xz-utils python3 python3-dev tree
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- name: Setup non-root user
|
||||||
|
run: |
|
||||||
|
# See [1] below
|
||||||
|
git config --global --add safe.directory /__w/spack/spack
|
||||||
|
useradd spack-test && mkdir -p ~spack-test
|
||||||
|
chown -R spack-test . ~spack-test
|
||||||
|
- name: Setup repo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Bootstrap clingo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack -d solve zlib
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
opensuse-clingo-sources:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: "opensuse/leap:latest"
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
# Harden CI by applying the workaround described here: https://www.suse.com/support/kb/doc/?id=000019505
|
# Harden CI by applying the workaround described here: https://www.suse.com/support/kb/doc/?id=000019505
|
||||||
zypper update -y || zypper update -y
|
zypper update -y || zypper update -y
|
||||||
@@ -37,158 +140,199 @@ jobs:
|
|||||||
make patch unzip which xz python3 python3-devel tree \
|
make patch unzip which xz python3 python3-devel tree \
|
||||||
cmake bison
|
cmake bison
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
with:
|
- name: Setup repo
|
||||||
fetch-depth: 0
|
run: |
|
||||||
|
# See [1] below
|
||||||
|
git config --global --add safe.directory /__w/spack/spack
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
- name: Bootstrap clingo
|
- name: Bootstrap clingo
|
||||||
run: |
|
run: |
|
||||||
source share/spack/setup-env.sh
|
source share/spack/setup-env.sh
|
||||||
spack bootstrap disable github-actions-v0.6
|
spack bootstrap untrust github-actions-v0.2
|
||||||
spack bootstrap disable github-actions-v0.5
|
|
||||||
spack external find cmake bison
|
spack external find cmake bison
|
||||||
spack -d solve zlib
|
spack -d solve zlib
|
||||||
tree ~/.spack/bootstrap/store/
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
clingo-sources:
|
macos-clingo-sources:
|
||||||
runs-on: ${{ matrix.runner }}
|
runs-on: macos-latest
|
||||||
strategy:
|
if: github.repository == 'spack/spack'
|
||||||
matrix:
|
|
||||||
runner: ['macos-13', 'macos-14', "ubuntu-latest"]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Setup macOS
|
- name: Install dependencies
|
||||||
if: ${{ matrix.runner != 'ubuntu-latest' }}
|
|
||||||
run: |
|
run: |
|
||||||
brew install cmake bison tree
|
brew install cmake bison@2.7 tree
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: "3.12"
|
|
||||||
- name: Bootstrap clingo
|
- name: Bootstrap clingo
|
||||||
run: |
|
run: |
|
||||||
source share/spack/setup-env.sh
|
source share/spack/setup-env.sh
|
||||||
spack bootstrap disable github-actions-v0.6
|
export PATH=/usr/local/opt/bison@2.7/bin:$PATH
|
||||||
spack bootstrap disable github-actions-v0.5
|
spack bootstrap untrust github-actions-v0.2
|
||||||
spack external find --not-buildable cmake bison
|
spack external find --not-buildable cmake bison
|
||||||
spack -d solve zlib
|
spack -d solve zlib
|
||||||
tree $HOME/.spack/bootstrap/store/
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
gnupg-sources:
|
macos-clingo-binaries:
|
||||||
runs-on: ${{ matrix.runner }}
|
runs-on: macos-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
runner: [ 'macos-13', 'macos-14', "ubuntu-latest" ]
|
python-version: ['3.5', '3.6', '3.7', '3.8', '3.9', '3.10']
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
steps:
|
steps:
|
||||||
- name: Setup macOS
|
- name: Install dependencies
|
||||||
if: ${{ matrix.runner != 'ubuntu-latest' }}
|
|
||||||
run: brew install tree gawk
|
|
||||||
- name: Remove system executables
|
|
||||||
run: |
|
run: |
|
||||||
while [ -n "$(command -v gpg gpg2 patchelf)" ]; do
|
brew install tree
|
||||||
sudo rm $(command -v gpg gpg2 patchelf)
|
|
||||||
done
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- name: Bootstrap clingo
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack bootstrap untrust spack-install
|
||||||
|
spack -d solve zlib
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
ubuntu-clingo-binaries:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: ['2.7', '3.5', '3.6', '3.7', '3.8', '3.9', '3.10']
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- name: Setup repo
|
||||||
|
run: |
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Bootstrap clingo
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack bootstrap untrust spack-install
|
||||||
|
spack -d solve zlib
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
ubuntu-gnupg-binaries:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: "ubuntu:latest"
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
run: |
|
||||||
|
apt-get update -y && apt-get upgrade -y
|
||||||
|
apt-get install -y \
|
||||||
|
bzip2 curl file g++ gcc patchelf gfortran git gzip \
|
||||||
|
make patch unzip xz-utils python3 python3-dev tree
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- name: Setup non-root user
|
||||||
|
run: |
|
||||||
|
# See [1] below
|
||||||
|
git config --global --add safe.directory /__w/spack/spack
|
||||||
|
useradd spack-test && mkdir -p ~spack-test
|
||||||
|
chown -R spack-test . ~spack-test
|
||||||
|
- name: Setup repo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Bootstrap GnuPG
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack bootstrap untrust spack-install
|
||||||
|
spack -d gpg list
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
ubuntu-gnupg-sources:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: "ubuntu:latest"
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
run: |
|
||||||
|
apt-get update -y && apt-get upgrade -y
|
||||||
|
apt-get install -y \
|
||||||
|
bzip2 curl file g++ gcc patchelf gfortran git gzip \
|
||||||
|
make patch unzip xz-utils python3 python3-dev tree \
|
||||||
|
gawk
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- name: Setup non-root user
|
||||||
|
run: |
|
||||||
|
# See [1] below
|
||||||
|
git config --global --add safe.directory /__w/spack/spack
|
||||||
|
useradd spack-test && mkdir -p ~spack-test
|
||||||
|
chown -R spack-test . ~spack-test
|
||||||
|
- name: Setup repo
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
git --version
|
||||||
|
git fetch --unshallow
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Bootstrap GnuPG
|
||||||
|
shell: runuser -u spack-test -- bash {0}
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack solve zlib
|
||||||
|
spack bootstrap untrust github-actions-v0.2
|
||||||
|
spack -d gpg list
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
macos-gnupg-binaries:
|
||||||
|
runs-on: macos-latest
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
brew install tree
|
||||||
|
# Remove GnuPG since we want to bootstrap it
|
||||||
|
sudo rm -rf /usr/local/bin/gpg
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- name: Bootstrap GnuPG
|
||||||
|
run: |
|
||||||
|
source share/spack/setup-env.sh
|
||||||
|
spack bootstrap untrust spack-install
|
||||||
|
spack -d gpg list
|
||||||
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
|
macos-gnupg-sources:
|
||||||
|
runs-on: macos-latest
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
brew install gawk tree
|
||||||
|
# Remove GnuPG since we want to bootstrap it
|
||||||
|
sudo rm -rf /usr/local/bin/gpg
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
- name: Bootstrap GnuPG
|
- name: Bootstrap GnuPG
|
||||||
run: |
|
run: |
|
||||||
source share/spack/setup-env.sh
|
source share/spack/setup-env.sh
|
||||||
spack solve zlib
|
spack solve zlib
|
||||||
spack bootstrap disable github-actions-v0.6
|
spack bootstrap untrust github-actions-v0.2
|
||||||
spack bootstrap disable github-actions-v0.5
|
|
||||||
spack -d gpg list
|
spack -d gpg list
|
||||||
tree ~/.spack/bootstrap/store/
|
tree ~/.spack/bootstrap/store/
|
||||||
|
|
||||||
from-binaries:
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
runner: ['macos-13', 'macos-14', "ubuntu-latest"]
|
|
||||||
steps:
|
|
||||||
- name: Setup macOS
|
|
||||||
if: ${{ matrix.runner != 'ubuntu-latest' }}
|
|
||||||
run: brew install tree
|
|
||||||
- name: Remove system executables
|
|
||||||
run: |
|
|
||||||
while [ -n "$(command -v gpg gpg2 patchelf)" ]; do
|
|
||||||
sudo rm $(command -v gpg gpg2 patchelf)
|
|
||||||
done
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: |
|
|
||||||
3.8
|
|
||||||
3.9
|
|
||||||
3.10
|
|
||||||
3.11
|
|
||||||
3.12
|
|
||||||
3.13
|
|
||||||
- name: Set bootstrap sources
|
|
||||||
run: |
|
|
||||||
source share/spack/setup-env.sh
|
|
||||||
spack bootstrap disable github-actions-v0.5
|
|
||||||
spack bootstrap disable spack-install
|
|
||||||
- name: Bootstrap clingo
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
for ver in '3.8' '3.9' '3.10' '3.11' '3.12' '3.13'; do
|
|
||||||
not_found=1
|
|
||||||
ver_dir="$(find $RUNNER_TOOL_CACHE/Python -wholename "*/${ver}.*/*/bin" | grep . || true)"
|
|
||||||
if [[ -d "$ver_dir" ]] ; then
|
|
||||||
echo "Testing $ver_dir"
|
|
||||||
if $ver_dir/python --version ; then
|
|
||||||
export PYTHON="$ver_dir/python"
|
|
||||||
not_found=0
|
|
||||||
old_path="$PATH"
|
|
||||||
export PATH="$ver_dir:$PATH"
|
|
||||||
./bin/spack-tmpconfig -b ./.github/workflows/bin/bootstrap-test.sh
|
|
||||||
export PATH="$old_path"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if (($not_found)) ; then
|
|
||||||
echo Required python version $ver not found in runner!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
- name: Bootstrap GnuPG
|
|
||||||
run: |
|
|
||||||
source share/spack/setup-env.sh
|
|
||||||
spack -d gpg list
|
|
||||||
tree $HOME/.spack/bootstrap/store/
|
|
||||||
|
|
||||||
|
# [1] Distros that have patched git to resolve CVE-2022-24765 (e.g. Ubuntu patching v2.25.1)
|
||||||
windows:
|
# introduce breaking behaviorso we have to set `safe.directory` in gitconfig ourselves.
|
||||||
runs-on: "windows-latest"
|
# See:
|
||||||
steps:
|
# - https://github.blog/2022-04-12-git-security-vulnerability-announced/
|
||||||
- name: Checkout
|
# - https://github.com/actions/checkout/issues/760
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
# - http://changelogs.ubuntu.com/changelogs/pool/main/g/git/git_2.25.1-1ubuntu3.3/changelog
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: "3.12"
|
|
||||||
- name: Setup Windows
|
|
||||||
run: |
|
|
||||||
Remove-Item -Path (Get-Command gpg).Path
|
|
||||||
Remove-Item -Path (Get-Command file).Path
|
|
||||||
- name: Bootstrap clingo
|
|
||||||
run: |
|
|
||||||
./share/spack/setup-env.ps1
|
|
||||||
spack bootstrap disable github-actions-v0.6
|
|
||||||
spack bootstrap disable github-actions-v0.5
|
|
||||||
spack external find --not-buildable cmake bison
|
|
||||||
spack -d solve zlib
|
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
|
||||||
tree $env:userprofile/.spack/bootstrap/store/
|
|
||||||
- name: Bootstrap GnuPG
|
|
||||||
run: |
|
|
||||||
./share/spack/setup-env.ps1
|
|
||||||
spack -d gpg list
|
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
|
||||||
tree $env:userprofile/.spack/bootstrap/store/
|
|
||||||
|
88
.github/workflows/build-containers.yml
vendored
88
.github/workflows/build-containers.yml
vendored
@@ -13,16 +13,12 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- '.github/workflows/build-containers.yml'
|
- '.github/workflows/build-containers.yml'
|
||||||
- 'share/spack/docker/*'
|
- 'share/spack/docker/*'
|
||||||
- 'share/spack/templates/container/*'
|
- 'share/templates/container/*'
|
||||||
- 'lib/spack/spack/container/*'
|
- 'lib/spack/spack/container/*'
|
||||||
# Let's also build & tag Spack containers on releases.
|
# Let's also build & tag Spack containers on releases.
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: build_containers-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy-images:
|
deploy-images:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -38,52 +34,38 @@ jobs:
|
|||||||
# Meaning of the various items in the matrix list
|
# Meaning of the various items in the matrix list
|
||||||
# 0: Container name (e.g. ubuntu-bionic)
|
# 0: Container name (e.g. ubuntu-bionic)
|
||||||
# 1: Platforms to build for
|
# 1: Platforms to build for
|
||||||
# 2: Base image (e.g. ubuntu:22.04)
|
# 2: Base image (e.g. ubuntu:18.04)
|
||||||
dockerfile: [[amazon-linux, 'linux/amd64,linux/arm64', 'amazonlinux:2'],
|
dockerfile: [[amazon-linux, 'linux/amd64,linux/arm64', 'amazonlinux:2'],
|
||||||
[centos-stream9, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:stream9'],
|
[centos7, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:7'],
|
||||||
|
[centos-stream, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:stream'],
|
||||||
[leap15, 'linux/amd64,linux/arm64,linux/ppc64le', 'opensuse/leap:15'],
|
[leap15, 'linux/amd64,linux/arm64,linux/ppc64le', 'opensuse/leap:15'],
|
||||||
|
[ubuntu-bionic, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:18.04'],
|
||||||
[ubuntu-focal, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:20.04'],
|
[ubuntu-focal, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:20.04'],
|
||||||
[ubuntu-jammy, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:22.04'],
|
[ubuntu-jammy, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:22.04']]
|
||||||
[ubuntu-noble, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:24.04'],
|
|
||||||
[almalinux8, 'linux/amd64,linux/arm64,linux/ppc64le', 'almalinux:8'],
|
|
||||||
[almalinux9, 'linux/amd64,linux/arm64,linux/ppc64le', 'almalinux:9'],
|
|
||||||
[rockylinux8, 'linux/amd64,linux/arm64', 'rockylinux:8'],
|
|
||||||
[rockylinux9, 'linux/amd64,linux/arm64', 'rockylinux:9'],
|
|
||||||
[fedora39, 'linux/amd64,linux/arm64,linux/ppc64le', 'fedora:39'],
|
|
||||||
[fedora40, 'linux/amd64,linux/arm64,linux/ppc64le', 'fedora:40']]
|
|
||||||
name: Build ${{ matrix.dockerfile[0] }}
|
name: Build ${{ matrix.dockerfile[0] }}
|
||||||
if: github.repository == 'spack/spack'
|
if: github.repository == 'spack/spack'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
|
||||||
- name: Determine latest release tag
|
- name: Set Container Tag Normal (Nightly)
|
||||||
id: latest
|
|
||||||
run: |
|
run: |
|
||||||
git fetch --quiet --tags
|
container="${{ matrix.dockerfile[0] }}:latest"
|
||||||
echo "tag=$(git tag --list --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)" | tee -a $GITHUB_OUTPUT
|
echo "container=${container}" >> $GITHUB_ENV
|
||||||
|
echo "versioned=${container}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96
|
# On a new release create a container with the same tag as the release.
|
||||||
id: docker_meta
|
- name: Set Container Tag on Release
|
||||||
with:
|
if: github.event_name == 'release'
|
||||||
images: |
|
run: |
|
||||||
ghcr.io/${{ github.repository_owner }}/${{ matrix.dockerfile[0] }}
|
versioned="${{matrix.dockerfile[0]}}:${GITHUB_REF##*/}"
|
||||||
${{ github.repository_owner }}/${{ matrix.dockerfile[0] }}
|
echo "versioned=${versioned}" >> $GITHUB_ENV
|
||||||
tags: |
|
|
||||||
type=schedule,pattern=nightly
|
|
||||||
type=schedule,pattern=develop
|
|
||||||
type=semver,pattern={{version}}
|
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
|
||||||
type=semver,pattern={{major}}
|
|
||||||
type=ref,event=branch
|
|
||||||
type=ref,event=pr
|
|
||||||
type=raw,value=latest,enable=${{ github.ref == format('refs/tags/{0}', steps.latest.outputs.tag) }}
|
|
||||||
|
|
||||||
- name: Generate the Dockerfile
|
- name: Generate the Dockerfile
|
||||||
env:
|
env:
|
||||||
SPACK_YAML_OS: "${{ matrix.dockerfile[2] }}"
|
SPACK_YAML_OS: "${{ matrix.dockerfile[2] }}"
|
||||||
run: |
|
run: |
|
||||||
.github/workflows/bin/generate_spack_yaml_containerize.sh
|
.github/workflows/generate_spack_yaml_containerize.sh
|
||||||
. share/spack/setup-env.sh
|
. share/spack/setup-env.sh
|
||||||
mkdir -p dockerfiles/${{ matrix.dockerfile[0] }}
|
mkdir -p dockerfiles/${{ matrix.dockerfile[0] }}
|
||||||
spack containerize --last-stage=bootstrap | tee dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile
|
spack containerize --last-stage=bootstrap | tee dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile
|
||||||
@@ -94,19 +76,19 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Upload Dockerfile
|
- name: Upload Dockerfile
|
||||||
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8
|
||||||
with:
|
with:
|
||||||
name: dockerfiles_${{ matrix.dockerfile[0] }}
|
name: dockerfiles
|
||||||
path: dockerfiles
|
path: dockerfiles
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf
|
uses: docker/setup-qemu-action@8b122486cedac8393e77aa9734c3528886e4a1a8 # @v1
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5
|
uses: docker/setup-buildx-action@dc7b9719a96d48369863986a06765841d7ea23f6 # @v1
|
||||||
|
|
||||||
- name: Log in to GitHub Container Registry
|
- name: Log in to GitHub Container Registry
|
||||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
|
uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b # @v1
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
@@ -114,27 +96,21 @@ jobs:
|
|||||||
|
|
||||||
- name: Log in to DockerHub
|
- name: Log in to DockerHub
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
|
uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b # @v1
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Build & Deploy ${{ matrix.dockerfile[0] }}
|
- name: Build & Deploy ${{ matrix.dockerfile[0] }}
|
||||||
uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355
|
uses: docker/build-push-action@e551b19e49efd4e98792db7592c17c09b89db8d8 # @v2
|
||||||
with:
|
with:
|
||||||
context: dockerfiles/${{ matrix.dockerfile[0] }}
|
context: dockerfiles/${{ matrix.dockerfile[0] }}
|
||||||
platforms: ${{ matrix.dockerfile[1] }}
|
platforms: ${{ matrix.dockerfile[1] }}
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.docker_meta.outputs.tags }}
|
cache-from: type=gha
|
||||||
labels: ${{ steps.docker_meta.outputs.labels }}
|
cache-to: type=gha,mode=max
|
||||||
|
tags: |
|
||||||
merge-dockerfiles:
|
spack/${{ env.container }}
|
||||||
runs-on: ubuntu-latest
|
spack/${{ env.versioned }}
|
||||||
needs: deploy-images
|
ghcr.io/spack/${{ env.container }}
|
||||||
steps:
|
ghcr.io/spack/${{ env.versioned }}
|
||||||
- name: Merge Artifacts
|
|
||||||
uses: actions/upload-artifact/merge@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
|
||||||
with:
|
|
||||||
name: dockerfiles
|
|
||||||
pattern: dockerfiles_*
|
|
||||||
delete-merged: true
|
|
||||||
|
119
.github/workflows/ci.yaml
vendored
119
.github/workflows/ci.yaml
vendored
@@ -1,119 +0,0 @@
|
|||||||
name: ci
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
- releases/**
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
- releases/**
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ci-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Check which files have been updated by the PR
|
|
||||||
changes:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# Set job outputs to values from filter step
|
|
||||||
outputs:
|
|
||||||
bootstrap: ${{ steps.filter.outputs.bootstrap }}
|
|
||||||
core: ${{ steps.filter.outputs.core }}
|
|
||||||
packages: ${{ steps.filter.outputs.packages }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
if: ${{ github.event_name == 'push' }}
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
# For pull requests it's not necessary to checkout the code
|
|
||||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
|
|
||||||
id: filter
|
|
||||||
with:
|
|
||||||
# See https://github.com/dorny/paths-filter/issues/56 for the syntax used below
|
|
||||||
# Don't run if we only modified packages in the
|
|
||||||
# built-in repository or documentation
|
|
||||||
filters: |
|
|
||||||
bootstrap:
|
|
||||||
- 'var/spack/repos/builtin/packages/clingo-bootstrap/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/clingo/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/python/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/re2c/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/gnupg/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/libassuan/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/libgcrypt/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/libgpg-error/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/libksba/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/npth/**'
|
|
||||||
- 'var/spack/repos/builtin/packages/pinentry/**'
|
|
||||||
- 'lib/spack/**'
|
|
||||||
- 'share/spack/**'
|
|
||||||
- '.github/workflows/bootstrap.yml'
|
|
||||||
- '.github/workflows/ci.yaml'
|
|
||||||
core:
|
|
||||||
- './!(var/**)/**'
|
|
||||||
packages:
|
|
||||||
- 'var/**'
|
|
||||||
# Some links for easier reference:
|
|
||||||
#
|
|
||||||
# "github" context: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context
|
|
||||||
# job outputs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
|
|
||||||
# setting environment variables from earlier steps: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable
|
|
||||||
#
|
|
||||||
bootstrap:
|
|
||||||
if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.bootstrap == 'true' }}
|
|
||||||
needs: [ prechecks, changes ]
|
|
||||||
uses: ./.github/workflows/bootstrap.yml
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
unit-tests:
|
|
||||||
if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.core == 'true' }}
|
|
||||||
needs: [ prechecks, changes ]
|
|
||||||
uses: ./.github/workflows/unit_tests.yaml
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
prechecks:
|
|
||||||
needs: [ changes ]
|
|
||||||
uses: ./.github/workflows/valid-style.yml
|
|
||||||
secrets: inherit
|
|
||||||
with:
|
|
||||||
with_coverage: ${{ needs.changes.outputs.core }}
|
|
||||||
|
|
||||||
all-prechecks:
|
|
||||||
needs: [ prechecks ]
|
|
||||||
if: ${{ always() }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Success
|
|
||||||
run: |
|
|
||||||
if [ "${{ needs.prechecks.result }}" == "failure" ] || [ "${{ needs.prechecks.result }}" == "canceled" ]; then
|
|
||||||
echo "Unit tests failed."
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
needs: [ unit-tests, prechecks ]
|
|
||||||
uses: ./.github/workflows/coverage.yml
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
all:
|
|
||||||
needs: [ unit-tests, coverage, bootstrap ]
|
|
||||||
if: ${{ always() }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# See https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#needs-context
|
|
||||||
steps:
|
|
||||||
- name: Status summary
|
|
||||||
run: |
|
|
||||||
if [ "${{ needs.unit-tests.result }}" == "failure" ] || [ "${{ needs.unit-tests.result }}" == "canceled" ]; then
|
|
||||||
echo "Unit tests failed."
|
|
||||||
exit 1
|
|
||||||
elif [ "${{ needs.bootstrap.result }}" == "failure" ] || [ "${{ needs.bootstrap.result }}" == "canceled" ]; then
|
|
||||||
echo "Bootstrap tests failed."
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
exit 0
|
|
||||||
fi
|
|
35
.github/workflows/coverage.yml
vendored
35
.github/workflows/coverage.yml
vendored
@@ -1,35 +0,0 @@
|
|||||||
name: coverage
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Upload coverage reports to codecov once as a single bundle
|
|
||||||
upload:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: '3.11'
|
|
||||||
cache: 'pip'
|
|
||||||
|
|
||||||
- name: Install python dependencies
|
|
||||||
run: pip install -r .github/workflows/requirements/coverage/requirements.txt
|
|
||||||
|
|
||||||
- name: Download coverage artifact files
|
|
||||||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
|
|
||||||
with:
|
|
||||||
pattern: coverage-*
|
|
||||||
path: coverage
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
- run: ls -la coverage
|
|
||||||
- run: coverage combine -a coverage/.coverage*
|
|
||||||
- run: coverage xml
|
|
||||||
|
|
||||||
- name: "Upload coverage report to CodeCov"
|
|
||||||
uses: codecov/codecov-action@1e68e06f1dbfde0e4cefc87efeba9e4643565303
|
|
||||||
with:
|
|
||||||
verbose: true
|
|
||||||
fail_ci_if_error: false
|
|
8
.github/workflows/install_spack.sh
vendored
Executable file
8
.github/workflows/install_spack.sh
vendored
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. share/spack/setup-env.sh
|
||||||
|
echo -e "config:\n build_jobs: 2" > etc/spack/config.yaml
|
||||||
|
spack config add "packages:all:target:[x86_64]"
|
||||||
|
spack compiler find
|
||||||
|
spack compiler info apple-clang
|
||||||
|
spack debug report
|
||||||
|
spack solve zlib
|
67
.github/workflows/macos_python.yml
vendored
Normal file
67
.github/workflows/macos_python.yml
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# These are nightly package tests for macOS
|
||||||
|
# focus areas:
|
||||||
|
# - initial user experience
|
||||||
|
# - scientific python stack
|
||||||
|
name: macOS builds nightly
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# nightly at 1 AM
|
||||||
|
- cron: '0 1 * * *'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
paths:
|
||||||
|
# Run if we modify this yaml file
|
||||||
|
- '.github/workflows/macos_python.yml'
|
||||||
|
# TODO: run if we touch any of the recipes involved in this
|
||||||
|
|
||||||
|
# GitHub Action Limits
|
||||||
|
# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
install_gcc:
|
||||||
|
name: gcc with clang
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: spack install
|
||||||
|
run: |
|
||||||
|
. .github/workflows/install_spack.sh
|
||||||
|
# 9.2.0 is the latest version on which we apply homebrew patch
|
||||||
|
spack install -v --fail-fast gcc@11.2.0 %apple-clang
|
||||||
|
|
||||||
|
install_jupyter_clang:
|
||||||
|
name: jupyter
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
runs-on: macos-latest
|
||||||
|
timeout-minutes: 700
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: spack install
|
||||||
|
run: |
|
||||||
|
. .github/workflows/install_spack.sh
|
||||||
|
spack install -v --fail-fast py-jupyterlab %apple-clang
|
||||||
|
|
||||||
|
install_scipy_clang:
|
||||||
|
name: scipy, mpl, pd
|
||||||
|
if: github.repository == 'spack/spack'
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: spack install
|
||||||
|
run: |
|
||||||
|
. .github/workflows/install_spack.sh
|
||||||
|
spack install -v --fail-fast py-scipy %apple-clang
|
||||||
|
spack install -v --fail-fast py-matplotlib %apple-clang
|
||||||
|
spack install -v --fail-fast py-pandas %apple-clang
|
31
.github/workflows/nightly-win-builds.yml
vendored
31
.github/workflows/nightly-win-builds.yml
vendored
@@ -1,31 +0,0 @@
|
|||||||
name: Windows Paraview Nightly
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 2 * * *' # Run at 2 am
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell:
|
|
||||||
powershell Invoke-Expression -Command "./share/spack/qa/windows_test_setup.ps1"; {0}
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-paraview-deps:
|
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: 3.9
|
|
||||||
- name: Install Python packages
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip six pywin32 setuptools coverage
|
|
||||||
- name: Build Test
|
|
||||||
run: |
|
|
||||||
spack compiler find
|
|
||||||
spack external find cmake ninja win-sdk win-wdk wgl msmpi
|
|
||||||
spack -d install -y --cdash-upload-url https://cdash.spack.io/submit.php?project=Spack+on+Windows --cdash-track Nightly --only dependencies paraview
|
|
||||||
exit 0
|
|
@@ -1 +0,0 @@
|
|||||||
coverage==7.6.1
|
|
@@ -1,7 +0,0 @@
|
|||||||
black==24.10.0
|
|
||||||
clingo==5.7.1
|
|
||||||
flake8==7.1.1
|
|
||||||
isort==5.13.2
|
|
||||||
mypy==1.11.2
|
|
||||||
types-six==1.17.0.20241205
|
|
||||||
vermin==1.6.0
|
|
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2021 Lawrence Livermore National Laboratory
|
||||||
|
|
||||||
|
Set-Location spack
|
||||||
|
|
||||||
git config --global user.email "spack@example.com"
|
git config --global user.email "spack@example.com"
|
||||||
git config --global user.name "Test User"
|
git config --global user.name "Test User"
|
||||||
git config --global core.longpaths true
|
git config --global core.longpaths true
|
379
.github/workflows/unit_tests.yaml
vendored
379
.github/workflows/unit_tests.yaml
vendored
@@ -1,49 +1,115 @@
|
|||||||
name: unit tests
|
name: linux tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
push:
|
||||||
workflow_call:
|
branches:
|
||||||
|
- develop
|
||||||
concurrency:
|
- releases/**
|
||||||
group: unit_tests-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
pull_request:
|
||||||
cancel-in-progress: true
|
branches:
|
||||||
|
- develop
|
||||||
|
- releases/**
|
||||||
jobs:
|
jobs:
|
||||||
# Run unit tests with different configurations on linux
|
# Validate that the code can be run on all the Python versions
|
||||||
ubuntu:
|
# supported by Spack
|
||||||
runs-on: ${{ matrix.os }}
|
validate:
|
||||||
strategy:
|
runs-on: ubuntu-latest
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest]
|
|
||||||
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
|
|
||||||
on_develop:
|
|
||||||
- ${{ github.ref == 'refs/heads/develop' }}
|
|
||||||
include:
|
|
||||||
- python-version: '3.6'
|
|
||||||
os: ubuntu-20.04
|
|
||||||
on_develop: ${{ github.ref == 'refs/heads/develop' }}
|
|
||||||
- python-version: '3.7'
|
|
||||||
os: ubuntu-22.04
|
|
||||||
on_develop: ${{ github.ref == 'refs/heads/develop' }}
|
|
||||||
exclude:
|
|
||||||
- python-version: '3.8'
|
|
||||||
os: ubuntu-latest
|
|
||||||
on_develop: false
|
|
||||||
- python-version: '3.9'
|
|
||||||
os: ubuntu-latest
|
|
||||||
on_develop: false
|
|
||||||
- python-version: '3.10'
|
|
||||||
os: ubuntu-latest
|
|
||||||
on_develop: false
|
|
||||||
- python-version: '3.11'
|
|
||||||
os: ubuntu-latest
|
|
||||||
on_develop: false
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
- name: Install Python Packages
|
||||||
|
run: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install --upgrade vermin
|
||||||
|
- name: vermin (Spack's Core)
|
||||||
|
run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.5- -vvv lib/spack/spack/ lib/spack/llnl/ bin/
|
||||||
|
- name: vermin (Repositories)
|
||||||
|
run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.5- -vvv var/spack/repos
|
||||||
|
# Run style checks on the files that have been changed
|
||||||
|
style:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
pip install --upgrade pip six setuptools types-six
|
||||||
|
- name: Setup git configuration
|
||||||
|
run: |
|
||||||
|
# Need this for the git tests to succeed.
|
||||||
|
git --version
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
|
- name: Run style tests
|
||||||
|
run: |
|
||||||
|
share/spack/qa/run-style-tests
|
||||||
|
# Check which files have been updated by the PR
|
||||||
|
changes:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# Set job outputs to values from filter step
|
||||||
|
outputs:
|
||||||
|
core: ${{ steps.filter.outputs.core }}
|
||||||
|
packages: ${{ steps.filter.outputs.packages }}
|
||||||
|
with_coverage: ${{ steps.coverage.outputs.with_coverage }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
if: ${{ github.event_name == 'push' }}
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
# For pull requests it's not necessary to checkout the code
|
||||||
|
- uses: dorny/paths-filter@b2feaf19c27470162a626bd6fa8438ae5b263721
|
||||||
|
id: filter
|
||||||
|
with:
|
||||||
|
# See https://github.com/dorny/paths-filter/issues/56 for the syntax used below
|
||||||
|
filters: |
|
||||||
|
core:
|
||||||
|
- './!(var/**)/**'
|
||||||
|
packages:
|
||||||
|
- 'var/**'
|
||||||
|
# Some links for easier reference:
|
||||||
|
#
|
||||||
|
# "github" context: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context
|
||||||
|
# job outputs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
|
||||||
|
# setting environment variables from earlier steps: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable
|
||||||
|
#
|
||||||
|
- id: coverage
|
||||||
|
# Run the subsequent jobs with coverage if core has been modified,
|
||||||
|
# regardless of whether this is a pull request or a push to a branch
|
||||||
|
run: |
|
||||||
|
echo Core changes: ${{ steps.filter.outputs.core }}
|
||||||
|
echo Event name: ${{ github.event_name }}
|
||||||
|
if [ "${{ steps.filter.outputs.core }}" == "true" ]
|
||||||
|
then
|
||||||
|
echo "::set-output name=with_coverage::true"
|
||||||
|
else
|
||||||
|
echo "::set-output name=with_coverage::false"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run unit tests with different configurations on linux
|
||||||
|
unittests:
|
||||||
|
needs: [ validate, style, changes ]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: ['2.7', '3.5', '3.6', '3.7', '3.8', '3.9', '3.10']
|
||||||
|
concretizer: ['clingo']
|
||||||
|
include:
|
||||||
|
- python-version: 2.7
|
||||||
|
concretizer: original
|
||||||
|
- python-version: 3.6
|
||||||
|
concretizer: original
|
||||||
|
- python-version: 3.9
|
||||||
|
concretizer: original
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Install System packages
|
- name: Install System packages
|
||||||
@@ -52,212 +118,239 @@ jobs:
|
|||||||
# Needed for unit tests
|
# Needed for unit tests
|
||||||
sudo apt-get -y install \
|
sudo apt-get -y install \
|
||||||
coreutils cvs gfortran graphviz gnupg2 mercurial ninja-build \
|
coreutils cvs gfortran graphviz gnupg2 mercurial ninja-build \
|
||||||
cmake bison libbison-dev subversion
|
patchelf cmake bison libbison-dev kcov
|
||||||
# On ubuntu 24.04, kcov was removed. It may come back in some future Ubuntu
|
|
||||||
- name: Set up Homebrew
|
|
||||||
id: set-up-homebrew
|
|
||||||
uses: Homebrew/actions/setup-homebrew@40e9946c182a64b3db1bf51be0dcb915f7802aa9
|
|
||||||
- name: Install kcov with brew
|
|
||||||
run: "brew install kcov"
|
|
||||||
- name: Install Python packages
|
- name: Install Python packages
|
||||||
run: |
|
run: |
|
||||||
pip install --upgrade pip setuptools pytest pytest-xdist pytest-cov
|
pip install --upgrade pip six setuptools pytest codecov "coverage[toml]<=6.2"
|
||||||
pip install --upgrade flake8 "isort>=4.3.5" "mypy>=0.900" "click" "black"
|
# ensure style checks are not skipped in unit tests for python >= 3.6
|
||||||
|
# note that true/false (i.e., 1/0) are opposite in conditions in python and bash
|
||||||
|
if python -c 'import sys; sys.exit(not sys.version_info >= (3, 6))'; then
|
||||||
|
pip install --upgrade flake8 isort>=4.3.5 mypy>=0.900 black
|
||||||
|
fi
|
||||||
|
- name: Pin pathlib for Python 2.7
|
||||||
|
if: ${{ matrix.python-version == 2.7 }}
|
||||||
|
run: |
|
||||||
|
pip install -U pathlib2==2.3.6
|
||||||
- name: Setup git configuration
|
- name: Setup git configuration
|
||||||
run: |
|
run: |
|
||||||
# Need this for the git tests to succeed.
|
# Need this for the git tests to succeed.
|
||||||
git --version
|
git --version
|
||||||
. .github/workflows/bin/setup_git.sh
|
. .github/workflows/setup_git.sh
|
||||||
- name: Bootstrap clingo
|
- name: Bootstrap clingo
|
||||||
if: ${{ matrix.concretizer == 'clingo' }}
|
if: ${{ matrix.concretizer == 'clingo' }}
|
||||||
env:
|
env:
|
||||||
SPACK_PYTHON: python
|
SPACK_PYTHON: python
|
||||||
run: |
|
run: |
|
||||||
. share/spack/setup-env.sh
|
. share/spack/setup-env.sh
|
||||||
spack bootstrap disable spack-install
|
spack bootstrap untrust spack-install
|
||||||
spack bootstrap now
|
|
||||||
spack -v solve zlib
|
spack -v solve zlib
|
||||||
- name: Run unit tests
|
- name: Run unit tests (full suite with coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
env:
|
env:
|
||||||
SPACK_PYTHON: python
|
SPACK_PYTHON: python
|
||||||
SPACK_TEST_PARALLEL: 2
|
|
||||||
COVERAGE: true
|
COVERAGE: true
|
||||||
COVERAGE_FILE: coverage/.coverage-${{ matrix.os }}-python${{ matrix.python-version }}
|
SPACK_TEST_SOLVER: ${{ matrix.concretizer }}
|
||||||
UNIT_TEST_COVERAGE: ${{ matrix.python-version == '3.11' }}
|
|
||||||
run: |
|
run: |
|
||||||
share/spack/qa/run-unit-tests
|
share/spack/qa/run-unit-tests
|
||||||
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
coverage combine
|
||||||
|
coverage xml
|
||||||
|
- name: Run unit tests (reduced suite without coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'false' }}
|
||||||
|
env:
|
||||||
|
SPACK_PYTHON: python
|
||||||
|
ONLY_PACKAGES: true
|
||||||
|
SPACK_TEST_SOLVER: ${{ matrix.concretizer }}
|
||||||
|
run: |
|
||||||
|
share/spack/qa/run-unit-tests
|
||||||
|
- uses: codecov/codecov-action@81cd2dc8148241f03f5839d295e000b8f761e378 # @v2.1.0
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
with:
|
with:
|
||||||
name: coverage-${{ matrix.os }}-python${{ matrix.python-version }}
|
flags: unittests,linux,${{ matrix.concretizer }}
|
||||||
path: coverage
|
|
||||||
include-hidden-files: true
|
|
||||||
# Test shell integration
|
# Test shell integration
|
||||||
shell:
|
shell:
|
||||||
|
needs: [ validate, style, changes ]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: '3.10'
|
||||||
- name: Install System packages
|
- name: Install System packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
# Needed for shell tests
|
# Needed for shell tests
|
||||||
sudo apt-get install -y coreutils csh zsh tcsh fish dash bash subversion
|
sudo apt-get install -y coreutils kcov csh zsh tcsh fish dash bash
|
||||||
# On ubuntu 24.04, kcov was removed. It may come back in some future Ubuntu
|
|
||||||
- name: Set up Homebrew
|
|
||||||
id: set-up-homebrew
|
|
||||||
uses: Homebrew/actions/setup-homebrew@40e9946c182a64b3db1bf51be0dcb915f7802aa9
|
|
||||||
- name: Install kcov with brew
|
|
||||||
run: "brew install kcov"
|
|
||||||
- name: Install Python packages
|
- name: Install Python packages
|
||||||
run: |
|
run: |
|
||||||
pip install --upgrade pip setuptools pytest coverage[toml] pytest-xdist
|
pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2
|
||||||
- name: Setup git configuration
|
- name: Setup git configuration
|
||||||
run: |
|
run: |
|
||||||
# Need this for the git tests to succeed.
|
# Need this for the git tests to succeed.
|
||||||
git --version
|
git --version
|
||||||
. .github/workflows/bin/setup_git.sh
|
. .github/workflows/setup_git.sh
|
||||||
- name: Run shell tests
|
- name: Run shell tests (without coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'false' }}
|
||||||
|
run: |
|
||||||
|
share/spack/qa/run-shell-tests
|
||||||
|
- name: Run shell tests (with coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
env:
|
env:
|
||||||
COVERAGE: true
|
COVERAGE: true
|
||||||
run: |
|
run: |
|
||||||
share/spack/qa/run-shell-tests
|
share/spack/qa/run-shell-tests
|
||||||
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
- uses: codecov/codecov-action@81cd2dc8148241f03f5839d295e000b8f761e378 # @v2.1.0
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
with:
|
with:
|
||||||
name: coverage-shell
|
flags: shelltests,linux
|
||||||
path: coverage
|
|
||||||
include-hidden-files: true
|
|
||||||
|
|
||||||
# Test RHEL8 UBI with platform Python. This job is run
|
# Test RHEL8 UBI with platform Python. This job is run
|
||||||
# only on PRs modifying core Spack
|
# only on PRs modifying core Spack
|
||||||
rhel8-platform-python:
|
rhel8-platform-python:
|
||||||
|
needs: [ validate, style, changes ]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
container: registry.access.redhat.com/ubi8/ubi
|
container: registry.access.redhat.com/ubi8/ubi
|
||||||
steps:
|
steps:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
dnf install -y \
|
dnf install -y \
|
||||||
bzip2 curl gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
||||||
make patch tcl unzip which xz
|
make patch tcl unzip which xz
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
- name: Setup repo and non-root user
|
- name: Setup repo and non-root user
|
||||||
run: |
|
run: |
|
||||||
git --version
|
git --version
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
git fetch --unshallow
|
git fetch --unshallow
|
||||||
. .github/workflows/bin/setup_git.sh
|
. .github/workflows/setup_git.sh
|
||||||
useradd spack-test
|
useradd spack-test
|
||||||
chown -R spack-test .
|
chown -R spack-test .
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
shell: runuser -u spack-test -- bash {0}
|
shell: runuser -u spack-test -- bash {0}
|
||||||
run: |
|
run: |
|
||||||
source share/spack/setup-env.sh
|
source share/spack/setup-env.sh
|
||||||
spack -d bootstrap now --dev
|
spack -d solve zlib
|
||||||
spack unit-test -k 'not cvs and not svn and not hg' -x --verbose
|
spack unit-test -k 'not cvs and not svn and not hg' -x --verbose
|
||||||
# Test for the clingo based solver (using clingo-cffi)
|
# Test for the clingo based solver (using clingo-cffi)
|
||||||
clingo-cffi:
|
clingo-cffi:
|
||||||
|
needs: [ validate, style, changes ]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
with:
|
with:
|
||||||
python-version: '3.13'
|
python-version: '3.10'
|
||||||
- name: Install System packages
|
- name: Install System packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install coreutils gfortran graphviz gnupg2
|
# Needed for unit tests
|
||||||
|
sudo apt-get -y install \
|
||||||
|
coreutils cvs gfortran graphviz gnupg2 mercurial ninja-build \
|
||||||
|
patchelf kcov
|
||||||
- name: Install Python packages
|
- name: Install Python packages
|
||||||
run: |
|
run: |
|
||||||
pip install --upgrade pip setuptools pytest coverage[toml] pytest-cov clingo
|
pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2 clingo
|
||||||
pip install --upgrade flake8 "isort>=4.3.5" "mypy>=0.900" "click" "black"
|
- name: Setup git configuration
|
||||||
|
run: |
|
||||||
|
# Need this for the git tests to succeed.
|
||||||
|
git --version
|
||||||
|
. .github/workflows/setup_git.sh
|
||||||
- name: Run unit tests (full suite with coverage)
|
- name: Run unit tests (full suite with coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
env:
|
env:
|
||||||
COVERAGE: true
|
COVERAGE: true
|
||||||
COVERAGE_FILE: coverage/.coverage-clingo-cffi
|
SPACK_TEST_SOLVER: clingo
|
||||||
run: |
|
run: |
|
||||||
. share/spack/setup-env.sh
|
share/spack/qa/run-unit-tests
|
||||||
spack bootstrap disable spack-install
|
coverage combine
|
||||||
spack bootstrap disable github-actions-v0.5
|
coverage xml
|
||||||
spack bootstrap disable github-actions-v0.6
|
- name: Run unit tests (reduced suite without coverage)
|
||||||
spack bootstrap status
|
if: ${{ needs.changes.outputs.with_coverage == 'false' }}
|
||||||
spack solve zlib
|
env:
|
||||||
spack unit-test --verbose --cov --cov-config=pyproject.toml --cov-report=xml:coverage.xml lib/spack/spack/test/concretization/core.py
|
ONLY_PACKAGES: true
|
||||||
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
SPACK_TEST_SOLVER: clingo
|
||||||
|
run: |
|
||||||
|
share/spack/qa/run-unit-tests
|
||||||
|
- uses: codecov/codecov-action@81cd2dc8148241f03f5839d295e000b8f761e378 # @v2.1.0
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
with:
|
with:
|
||||||
name: coverage-clingo-cffi
|
flags: unittests,linux,clingo
|
||||||
path: coverage
|
|
||||||
include-hidden-files: true
|
|
||||||
# Run unit tests on MacOS
|
# Run unit tests on MacOS
|
||||||
macos:
|
build:
|
||||||
runs-on: ${{ matrix.os }}
|
needs: [ validate, style, changes ]
|
||||||
|
runs-on: macos-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-13, macos-14]
|
python-version: [3.8]
|
||||||
python-version: ["3.11"]
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Install Python packages
|
- name: Install Python packages
|
||||||
run: |
|
run: |
|
||||||
pip install --upgrade pip setuptools
|
pip install --upgrade pip six setuptools
|
||||||
pip install --upgrade pytest coverage[toml] pytest-xdist pytest-cov
|
pip install --upgrade pytest codecov coverage[toml]==6.2
|
||||||
- name: Setup Homebrew packages
|
- name: Setup Homebrew packages
|
||||||
run: |
|
run: |
|
||||||
brew install dash fish gcc gnupg kcov
|
brew install dash fish gcc gnupg2 kcov
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
env:
|
env:
|
||||||
SPACK_TEST_PARALLEL: 4
|
SPACK_TEST_SOLVER: clingo
|
||||||
COVERAGE_FILE: coverage/.coverage-${{ matrix.os }}-python${{ matrix.python-version }}
|
|
||||||
run: |
|
run: |
|
||||||
git --version
|
git --version
|
||||||
. .github/workflows/bin/setup_git.sh
|
. .github/workflows/setup_git.sh
|
||||||
. share/spack/setup-env.sh
|
. share/spack/setup-env.sh
|
||||||
$(which spack) bootstrap disable spack-install
|
$(which spack) bootstrap untrust spack-install
|
||||||
$(which spack) solve zlib
|
$(which spack) solve zlib
|
||||||
common_args=(--dist loadfile --tx '4*popen//python=./bin/spack-tmpconfig python -u ./bin/spack python' -x)
|
if [ "${{ needs.changes.outputs.with_coverage }}" == "true" ]
|
||||||
$(which spack) unit-test --verbose --cov --cov-config=pyproject.toml --cov-report=xml:coverage.xml "${common_args[@]}"
|
then
|
||||||
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
coverage run $(which spack) unit-test -x
|
||||||
|
coverage combine
|
||||||
|
coverage xml
|
||||||
|
# Delete the symlink going from ./lib/spack/docs/_spack_root back to
|
||||||
|
# the initial directory, since it causes ELOOP errors with codecov/actions@2
|
||||||
|
rm lib/spack/docs/_spack_root
|
||||||
|
else
|
||||||
|
echo "ONLY PACKAGE RECIPES CHANGED [skipping coverage]"
|
||||||
|
$(which spack) unit-test -x -m "not maybeslow" -k "package_sanity"
|
||||||
|
fi
|
||||||
|
- uses: codecov/codecov-action@81cd2dc8148241f03f5839d295e000b8f761e378 # @v2.1.0
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
with:
|
with:
|
||||||
name: coverage-${{ matrix.os }}-python${{ matrix.python-version }}
|
files: ./coverage.xml
|
||||||
path: coverage
|
flags: unittests,macos
|
||||||
include-hidden-files: true
|
|
||||||
# Run unit tests on Windows
|
# Run audits on all the packages in the built-in repository
|
||||||
windows:
|
package-audits:
|
||||||
defaults:
|
needs: [ validate, style, changes ]
|
||||||
run:
|
runs-on: ubuntu-latest
|
||||||
shell:
|
|
||||||
powershell Invoke-Expression -Command "./share/spack/qa/windows_test_setup.ps1"; {0}
|
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # @v2
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
python-version: '3.10'
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: 3.9
|
|
||||||
- name: Install Python packages
|
- name: Install Python packages
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip pywin32 setuptools pytest-cov clingo
|
pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2
|
||||||
- name: Create local develop
|
- name: Package audits (with coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
run: |
|
run: |
|
||||||
./.github/workflows/bin/setup_git.ps1
|
. share/spack/setup-env.sh
|
||||||
- name: Unit Test
|
coverage run $(which spack) audit packages
|
||||||
env:
|
coverage combine
|
||||||
COVERAGE_FILE: coverage/.coverage-windows
|
coverage xml
|
||||||
|
- name: Package audits (wwithout coverage)
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'false' }}
|
||||||
run: |
|
run: |
|
||||||
spack unit-test -x --verbose --cov --cov-config=pyproject.toml
|
. share/spack/setup-env.sh
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
$(which spack) audit packages
|
||||||
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b
|
- uses: codecov/codecov-action@81cd2dc8148241f03f5839d295e000b8f761e378 # @v2.1.0
|
||||||
|
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||||
with:
|
with:
|
||||||
name: coverage-windows
|
flags: unittests,linux,audits
|
||||||
path: coverage
|
|
||||||
include-hidden-files: true
|
|
||||||
|
166
.github/workflows/valid-style.yml
vendored
166
.github/workflows/valid-style.yml
vendored
@@ -1,166 +0,0 @@
|
|||||||
name: style
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
with_coverage:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: style-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Validate that the code can be run on all the Python versions supported by Spack
|
|
||||||
validate:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: '3.13'
|
|
||||||
cache: 'pip'
|
|
||||||
- name: Install Python Packages
|
|
||||||
run: |
|
|
||||||
pip install --upgrade pip setuptools
|
|
||||||
pip install -r .github/workflows/requirements/style/requirements.txt
|
|
||||||
- name: vermin (Spack's Core)
|
|
||||||
run: vermin --backport importlib --backport argparse --violations --backport typing -t=3.6- -vvv lib/spack/spack/ lib/spack/llnl/ bin/
|
|
||||||
- name: vermin (Repositories)
|
|
||||||
run: vermin --backport importlib --backport argparse --violations --backport typing -t=3.6- -vvv var/spack/repos
|
|
||||||
# Run style checks on the files that have been changed
|
|
||||||
style:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: '3.13'
|
|
||||||
cache: 'pip'
|
|
||||||
- name: Install Python packages
|
|
||||||
run: |
|
|
||||||
pip install --upgrade pip setuptools
|
|
||||||
pip install -r .github/workflows/requirements/style/requirements.txt
|
|
||||||
- name: Setup git configuration
|
|
||||||
run: |
|
|
||||||
# Need this for the git tests to succeed.
|
|
||||||
git --version
|
|
||||||
. .github/workflows/bin/setup_git.sh
|
|
||||||
- name: Run style tests
|
|
||||||
run: |
|
|
||||||
share/spack/qa/run-style-tests
|
|
||||||
audit:
|
|
||||||
uses: ./.github/workflows/audit.yaml
|
|
||||||
secrets: inherit
|
|
||||||
with:
|
|
||||||
with_coverage: ${{ inputs.with_coverage }}
|
|
||||||
python_version: '3.13'
|
|
||||||
# Check that spack can bootstrap the development environment on Python 3.6 - RHEL8
|
|
||||||
bootstrap-dev-rhel8:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: registry.access.redhat.com/ubi8/ubi
|
|
||||||
steps:
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
dnf install -y \
|
|
||||||
bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
|
||||||
make patch tcl unzip which xz
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
- name: Setup repo and non-root user
|
|
||||||
run: |
|
|
||||||
git --version
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
git fetch --unshallow
|
|
||||||
. .github/workflows/bin/setup_git.sh
|
|
||||||
useradd spack-test
|
|
||||||
chown -R spack-test .
|
|
||||||
- name: Bootstrap Spack development environment
|
|
||||||
shell: runuser -u spack-test -- bash {0}
|
|
||||||
run: |
|
|
||||||
source share/spack/setup-env.sh
|
|
||||||
spack debug report
|
|
||||||
spack -d bootstrap now --dev
|
|
||||||
spack -d style -t black
|
|
||||||
spack unit-test -V
|
|
||||||
# Check we don't make the situation with circular imports worse
|
|
||||||
import-check:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: julia-actions/setup-julia@v2
|
|
||||||
with:
|
|
||||||
version: '1.10'
|
|
||||||
- uses: julia-actions/cache@v2
|
|
||||||
|
|
||||||
# PR: use the base of the PR as the old commit
|
|
||||||
- name: Checkout PR base commit
|
|
||||||
if: github.event_name == 'pull_request'
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
ref: ${{ github.event.pull_request.base.sha }}
|
|
||||||
path: old
|
|
||||||
# not a PR: use the previous commit as the old commit
|
|
||||||
- name: Checkout previous commit
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
path: old
|
|
||||||
- name: Checkout previous commit
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
run: git -C old reset --hard HEAD^
|
|
||||||
|
|
||||||
- name: Checkout new commit
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
path: new
|
|
||||||
- name: Install circular import checker
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
repository: haampie/circular-import-fighter
|
|
||||||
ref: b5d6ce9be35f602cca7d5a6aa0259fca10639cca
|
|
||||||
path: circular-import-fighter
|
|
||||||
- name: Install dependencies
|
|
||||||
working-directory: circular-import-fighter
|
|
||||||
run: make -j dependencies
|
|
||||||
- name: Problematic imports before
|
|
||||||
working-directory: circular-import-fighter
|
|
||||||
run: make SPACK_ROOT=../old SUFFIX=.old
|
|
||||||
- name: Problematic imports after
|
|
||||||
working-directory: circular-import-fighter
|
|
||||||
run: make SPACK_ROOT=../new SUFFIX=.new
|
|
||||||
- name: Compare import cycles
|
|
||||||
working-directory: circular-import-fighter
|
|
||||||
run: |
|
|
||||||
edges_before="$(head -n1 solution.old)"
|
|
||||||
edges_after="$(head -n1 solution.new)"
|
|
||||||
if [ "$edges_after" -gt "$edges_before" ]; then
|
|
||||||
printf '\033[1;31mImport check failed: %s imports need to be deleted, ' "$edges_after"
|
|
||||||
printf 'previously this was %s\033[0m\n' "$edges_before"
|
|
||||||
printf 'Compare \033[1;97m"Problematic imports before"\033[0m and '
|
|
||||||
printf '\033[1;97m"Problematic imports after"\033[0m.\n'
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
printf '\033[1;32mImport check passed: %s <= %s\033[0m\n' "$edges_after" "$edges_before"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Further style checks from pylint
|
|
||||||
pylint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: '3.13'
|
|
||||||
cache: 'pip'
|
|
||||||
- name: Install Python packages
|
|
||||||
run: |
|
|
||||||
pip install --upgrade pip setuptools pylint
|
|
||||||
- name: Pylint (Spack Core)
|
|
||||||
run: |
|
|
||||||
pylint -j 4 --disable=all --enable=unspecified-encoding --ignore-paths=lib/spack/external lib
|
|
188
.github/workflows/windows_python.yml
vendored
Normal file
188
.github/workflows/windows_python.yml
vendored
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
name: windows tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
- releases/**
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
- releases/**
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell:
|
||||||
|
powershell Invoke-Expression -Command ".\share\spack\qa\windows_test_setup.ps1"; {0}
|
||||||
|
jobs:
|
||||||
|
validate:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python Packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install --upgrade vermin
|
||||||
|
- name: vermin (Spack's Core)
|
||||||
|
run: vermin --backport argparse --backport typing -t='2.7-' -t='3.5-' -v spack/lib/spack/spack/ spack/lib/spack/llnl/ spack/bin/
|
||||||
|
- name: vermin (Repositories)
|
||||||
|
run: vermin --backport argparse --backport typing -t='2.7-' -t='3.5-' -v spack/var/spack/repos
|
||||||
|
# Run style checks on the files that have been changed
|
||||||
|
style:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip six setuptools flake8 isort>=4.3.5 mypy>=0.800 black pywin32 types-python-dateutil
|
||||||
|
- name: Create local develop
|
||||||
|
run: |
|
||||||
|
.\spack\.github\workflows\setup_git.ps1
|
||||||
|
- name: Run style tests
|
||||||
|
run: |
|
||||||
|
spack style
|
||||||
|
- name: Verify license headers
|
||||||
|
run: |
|
||||||
|
python spack\bin\spack license verify
|
||||||
|
unittest:
|
||||||
|
needs: [ validate, style ]
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||||
|
- name: Create local develop
|
||||||
|
run: |
|
||||||
|
.\spack\.github\workflows\setup_git.ps1
|
||||||
|
- name: Unit Test
|
||||||
|
run: |
|
||||||
|
echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml
|
||||||
|
spack unit-test --verbose --ignore=lib/spack/spack/test/cmd
|
||||||
|
unittest-cmd:
|
||||||
|
needs: [ validate, style ]
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||||
|
- name: Create local develop
|
||||||
|
run: |
|
||||||
|
.\spack\.github\workflows\setup_git.ps1
|
||||||
|
- name: Command Unit Test
|
||||||
|
run: |
|
||||||
|
echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml
|
||||||
|
spack unit-test lib/spack/spack/test/cmd --verbose
|
||||||
|
buildtest:
|
||||||
|
needs: [ validate, style ]
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||||
|
- name: Build Test
|
||||||
|
run: |
|
||||||
|
spack compiler find
|
||||||
|
echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml
|
||||||
|
spack external find cmake
|
||||||
|
spack external find ninja
|
||||||
|
spack install abseil-cpp
|
||||||
|
generate-installer-test:
|
||||||
|
needs: [ validate, style ]
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Disable Windows Symlinks
|
||||||
|
run: |
|
||||||
|
git config --global core.symlinks false
|
||||||
|
shell:
|
||||||
|
powershell
|
||||||
|
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||||
|
- name: Add Light and Candle to Path
|
||||||
|
run: |
|
||||||
|
$env:WIX >> $GITHUB_PATH
|
||||||
|
- name: Run Installer
|
||||||
|
run: |
|
||||||
|
.\spack\share\spack\qa\setup_spack.ps1
|
||||||
|
spack make-installer -s spack -g SILENT pkg
|
||||||
|
echo "installer_root=$((pwd).Path)" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
|
env:
|
||||||
|
ProgressPreference: SilentlyContinue
|
||||||
|
- uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8
|
||||||
|
with:
|
||||||
|
name: Windows Spack Installer Bundle
|
||||||
|
path: ${{ env.installer_root }}\pkg\Spack.exe
|
||||||
|
- uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8
|
||||||
|
with:
|
||||||
|
name: Windows Spack Installer
|
||||||
|
path: ${{ env.installer_root}}\pkg\Spack.msi
|
||||||
|
execute-installer:
|
||||||
|
needs: generate-installer-test
|
||||||
|
runs-on: windows-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: pwsh
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Install Python packages
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||||
|
- name: Setup installer directory
|
||||||
|
run: |
|
||||||
|
mkdir -p spack_installer
|
||||||
|
echo "spack_installer=$((pwd).Path)\spack_installer" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Windows Spack Installer Bundle
|
||||||
|
path: ${{ env.spack_installer }}
|
||||||
|
- name: Execute Bundled Installer
|
||||||
|
run: |
|
||||||
|
$proc = Start-Process ${{ env.spack_installer }}\spack.exe "/install /quiet" -Passthru
|
||||||
|
$handle = $proc.Handle # cache proc.Handle
|
||||||
|
$proc.WaitForExit();
|
||||||
|
$LASTEXITCODE
|
||||||
|
env:
|
||||||
|
ProgressPreference: SilentlyContinue
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Windows Spack Installer
|
||||||
|
path: ${{ env.spack_installer }}
|
||||||
|
- name: Execute MSI
|
||||||
|
run: |
|
||||||
|
$proc = Start-Process ${{ env.spack_installer }}\spack.msi "/quiet" -Passthru
|
||||||
|
$handle = $proc.Handle # cache proc.Handle
|
||||||
|
$proc.WaitForExit();
|
||||||
|
$LASTEXITCODE
|
@@ -1,39 +1,10 @@
|
|||||||
version: 2
|
version: 2
|
||||||
|
|
||||||
build:
|
|
||||||
os: "ubuntu-22.04"
|
|
||||||
apt_packages:
|
|
||||||
- graphviz
|
|
||||||
tools:
|
|
||||||
python: "3.11"
|
|
||||||
|
|
||||||
sphinx:
|
sphinx:
|
||||||
configuration: lib/spack/docs/conf.py
|
configuration: lib/spack/docs/conf.py
|
||||||
fail_on_warning: true
|
fail_on_warning: true
|
||||||
|
|
||||||
python:
|
python:
|
||||||
|
version: 3.7
|
||||||
install:
|
install:
|
||||||
- requirements: lib/spack/docs/requirements.txt
|
- requirements: lib/spack/docs/requirements.txt
|
||||||
|
|
||||||
search:
|
|
||||||
ranking:
|
|
||||||
spack.html: -10
|
|
||||||
spack.*.html: -10
|
|
||||||
llnl.html: -10
|
|
||||||
llnl.*.html: -10
|
|
||||||
_modules/*: -10
|
|
||||||
command_index.html: -9
|
|
||||||
basic_usage.html: 5
|
|
||||||
configuration.html: 5
|
|
||||||
config_yaml.html: 5
|
|
||||||
packages_yaml.html: 5
|
|
||||||
build_settings.html: 5
|
|
||||||
environments.html: 5
|
|
||||||
containers.html: 5
|
|
||||||
mirrors.html: 5
|
|
||||||
module_file_support.html: 5
|
|
||||||
repositories.html: 5
|
|
||||||
binary_caches.html: 5
|
|
||||||
chain.html: 5
|
|
||||||
pipelines.html: 5
|
|
||||||
packaging_guide.html: 5
|
|
||||||
|
1310
CHANGELOG.md
1310
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
58
CITATION.cff
58
CITATION.cff
@@ -27,57 +27,12 @@
|
|||||||
# And here's the CITATION.cff format:
|
# And here's the CITATION.cff format:
|
||||||
#
|
#
|
||||||
cff-version: 1.2.0
|
cff-version: 1.2.0
|
||||||
type: software
|
|
||||||
message: "If you are referencing Spack in a publication, please cite the paper below."
|
message: "If you are referencing Spack in a publication, please cite the paper below."
|
||||||
title: "The Spack Package Manager: Bringing Order to HPC Software Chaos"
|
|
||||||
abstract: >-
|
|
||||||
Large HPC centers spend considerable time supporting software for thousands of users, but the
|
|
||||||
complexity of HPC software is quickly outpacing the capabilities of existing software management
|
|
||||||
tools. Scientific applications require specific versions of compilers, MPI, and other dependency
|
|
||||||
libraries, so using a single, standard software stack is infeasible. However, managing many
|
|
||||||
configurations is difficult because the configuration space is combinatorial in size. We
|
|
||||||
introduce Spack, a tool used at Lawrence Livermore National Laboratory to manage this complexity.
|
|
||||||
Spack provides a novel, re- cursive specification syntax to invoke parametric builds of packages
|
|
||||||
and dependencies. It allows any number of builds to coexist on the same system, and it ensures
|
|
||||||
that installed packages can find their dependencies, regardless of the environment. We show
|
|
||||||
through real-world use cases that Spack supports diverse and demanding applications, bringing
|
|
||||||
order to HPC software chaos.
|
|
||||||
preferred-citation:
|
preferred-citation:
|
||||||
title: "The Spack Package Manager: Bringing Order to HPC Software Chaos"
|
|
||||||
type: conference-paper
|
type: conference-paper
|
||||||
url: "https://tgamblin.github.io/pubs/spack-sc15.pdf"
|
doi: "10.1145/2807591.2807623"
|
||||||
|
url: "https://github.com/spack/spack"
|
||||||
authors:
|
authors:
|
||||||
- family-names: "Gamblin"
|
|
||||||
given-names: "Todd"
|
|
||||||
- family-names: "LeGendre"
|
|
||||||
given-names: "Matthew"
|
|
||||||
- family-names: "Collette"
|
|
||||||
given-names: "Michael R."
|
|
||||||
- family-names: "Lee"
|
|
||||||
given-names: "Gregory L."
|
|
||||||
- family-names: "Moody"
|
|
||||||
given-names: "Adam"
|
|
||||||
- family-names: "de Supinski"
|
|
||||||
given-names: "Bronis R."
|
|
||||||
- family-names: "Futral"
|
|
||||||
given-names: "Scott"
|
|
||||||
conference:
|
|
||||||
name: "Supercomputing 2015 (SC’15)"
|
|
||||||
city: "Austin"
|
|
||||||
region: "Texas"
|
|
||||||
country: "US"
|
|
||||||
date-start: 2015-11-15
|
|
||||||
date-end: 2015-11-20
|
|
||||||
month: 11
|
|
||||||
year: 2015
|
|
||||||
identifiers:
|
|
||||||
- description: "The concept DOI of the work."
|
|
||||||
type: doi
|
|
||||||
value: 10.1145/2807591.2807623
|
|
||||||
- description: "The DOE Document Release Number of the work"
|
|
||||||
type: other
|
|
||||||
value: "LLNL-CONF-669890"
|
|
||||||
authors:
|
|
||||||
- family-names: "Gamblin"
|
- family-names: "Gamblin"
|
||||||
given-names: "Todd"
|
given-names: "Todd"
|
||||||
- family-names: "LeGendre"
|
- family-names: "LeGendre"
|
||||||
@@ -92,3 +47,12 @@ authors:
|
|||||||
given-names: "Bronis R."
|
given-names: "Bronis R."
|
||||||
- family-names: "Futral"
|
- family-names: "Futral"
|
||||||
given-names: "Scott"
|
given-names: "Scott"
|
||||||
|
title: "The Spack Package Manager: Bringing Order to HPC Software Chaos"
|
||||||
|
conference:
|
||||||
|
name: "Supercomputing 2015 (SC’15)"
|
||||||
|
city: "Austin"
|
||||||
|
region: "Texas"
|
||||||
|
country: "USA"
|
||||||
|
month: November 15-20
|
||||||
|
year: 2015
|
||||||
|
notes: LLNL-CONF-669890
|
||||||
|
11
COPYRIGHT
11
COPYRIGHT
@@ -8,9 +8,8 @@ or http://www.apache.org/licenses/LICENSE-2.0) or the MIT license,
|
|||||||
Copyrights and patents in the Spack project are retained by contributors.
|
Copyrights and patents in the Spack project are retained by contributors.
|
||||||
No copyright assignment is required to contribute to Spack.
|
No copyright assignment is required to contribute to Spack.
|
||||||
|
|
||||||
Spack was originally developed in 2013 by Lawrence Livermore National
|
Spack was originally distributed under the LGPL-2.1 license. Consent from
|
||||||
Security, LLC. It was originally distributed under the LGPL-2.1 license.
|
contributors to relicense to Apache-2.0/MIT is documented at
|
||||||
Consent from contributors to relicense to Apache-2.0/MIT is documented at
|
|
||||||
https://github.com/spack/spack/issues/9137.
|
https://github.com/spack/spack/issues/9137.
|
||||||
|
|
||||||
|
|
||||||
@@ -103,6 +102,6 @@ PackageName: sbang
|
|||||||
PackageHomePage: https://github.com/spack/sbang
|
PackageHomePage: https://github.com/spack/sbang
|
||||||
PackageLicenseDeclared: Apache-2.0 OR MIT
|
PackageLicenseDeclared: Apache-2.0 OR MIT
|
||||||
|
|
||||||
PackageName: typing_extensions
|
PackageName: six
|
||||||
PackageHomePage: https://pypi.org/project/typing-extensions/
|
PackageHomePage: https://pypi.python.org/pypi/six
|
||||||
PackageLicenseDeclared: Python-2.0
|
PackageLicenseDeclared: MIT
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) Spack Project Developers.
|
Copyright (c) 2013-2022 LLNS, LLC and other Spack Project Developers.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
60
README.md
60
README.md
@@ -1,38 +1,16 @@
|
|||||||
<div align="left">
|
# <img src="https://cdn.rawgit.com/spack/spack/develop/share/spack/logo/spack-logo.svg" width="64" valign="middle" alt="Spack"/> Spack
|
||||||
|
|
||||||
<h2>
|
[](https://github.com/spack/spack/actions)
|
||||||
<picture>
|
[](https://github.com/spack/spack/actions/workflows/bootstrap.yml)
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.rawgit.com/spack/spack/develop/share/spack/logo/spack-logo-white-text.svg" width="250">
|
[](https://github.com/spack/spack/actions?query=workflow%3A%22macOS+builds+nightly%22)
|
||||||
<source media="(prefers-color-scheme: light)" srcset="https://cdn.rawgit.com/spack/spack/develop/share/spack/logo/spack-logo-text.svg" width="250">
|
[](https://codecov.io/gh/spack/spack)
|
||||||
<img alt="Spack" src="https://cdn.rawgit.com/spack/spack/develop/share/spack/logo/spack-logo-text.svg" width="250">
|
[](https://github.com/spack/spack/actions/workflows/build-containers.yml)
|
||||||
</picture>
|
[](https://spack.readthedocs.io)
|
||||||
|
[](https://slack.spack.io)
|
||||||
<br>
|
|
||||||
<br clear="all">
|
|
||||||
|
|
||||||
<a href="https://github.com/spack/spack/actions/workflows/ci.yml"><img src="https://github.com/spack/spack/workflows/ci/badge.svg" alt="CI Status"></a>
|
|
||||||
<a href="https://github.com/spack/spack/actions/workflows/bootstrapping.yml"><img src="https://github.com/spack/spack/actions/workflows/bootstrap.yml/badge.svg" alt="Bootstrap Status"></a>
|
|
||||||
<a href="https://github.com/spack/spack/actions/workflows/build-containers.yml"><img src="https://github.com/spack/spack/actions/workflows/build-containers.yml/badge.svg" alt="Containers Status"></a>
|
|
||||||
<a href="https://spack.readthedocs.io"><img src="https://readthedocs.org/projects/spack/badge/?version=latest" alt="Documentation Status"></a>
|
|
||||||
<a href="https://codecov.io/gh/spack/spack"><img src="https://codecov.io/gh/spack/spack/branch/develop/graph/badge.svg" alt="Code coverage"/></a>
|
|
||||||
<a href="https://slack.spack.io"><img src="https://slack.spack.io/badge.svg" alt="Slack"/></a>
|
|
||||||
<a href="https://matrix.to/#/#spack-space:matrix.org"><img src="https://img.shields.io/matrix/spack-space%3Amatrix.org?label=matrix" alt="Matrix"/></a>
|
|
||||||
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
**[Getting Started] • [Config] • [Community] • [Contributing] • [Packaging Guide]**
|
|
||||||
|
|
||||||
[Getting Started]: https://spack.readthedocs.io/en/latest/getting_started.html
|
|
||||||
[Config]: https://spack.readthedocs.io/en/latest/configuration.html
|
|
||||||
[Community]: #community
|
|
||||||
[Contributing]: https://spack.readthedocs.io/en/latest/contribution_guide.html
|
|
||||||
[Packaging Guide]: https://spack.readthedocs.io/en/latest/packaging_guide.html
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Spack is a multi-platform package manager that builds and installs
|
Spack is a multi-platform package manager that builds and installs
|
||||||
multiple versions and configurations of software. It works on Linux,
|
multiple versions and configurations of software. It works on Linux,
|
||||||
macOS, Windows, and many supercomputers. Spack is non-destructive: installing a
|
macOS, and many supercomputers. Spack is non-destructive: installing a
|
||||||
new version of a package does not break existing installations, so many
|
new version of a package does not break existing installations, so many
|
||||||
configurations of the same package can coexist.
|
configurations of the same package can coexist.
|
||||||
|
|
||||||
@@ -46,18 +24,13 @@ See the
|
|||||||
[Feature Overview](https://spack.readthedocs.io/en/latest/features.html)
|
[Feature Overview](https://spack.readthedocs.io/en/latest/features.html)
|
||||||
for examples and highlights.
|
for examples and highlights.
|
||||||
|
|
||||||
To install spack and your first package, make sure you have Python & Git.
|
To install spack and your first package, make sure you have Python.
|
||||||
Then:
|
Then:
|
||||||
|
|
||||||
$ git clone -c feature.manyFiles=true --depth=2 https://github.com/spack/spack.git
|
$ git clone -c feature.manyFiles=true https://github.com/spack/spack.git
|
||||||
$ cd spack/bin
|
$ cd spack/bin
|
||||||
$ ./spack install zlib
|
$ ./spack install zlib
|
||||||
|
|
||||||
> [!TIP]
|
|
||||||
> `-c feature.manyFiles=true` improves git's performance on repositories with 1,000+ files.
|
|
||||||
>
|
|
||||||
> `--depth=2` prunes the git history to reduce the size of the Spack installation.
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
@@ -70,7 +43,7 @@ Tutorial
|
|||||||
----------------
|
----------------
|
||||||
|
|
||||||
We maintain a
|
We maintain a
|
||||||
[**hands-on tutorial**](https://spack-tutorial.readthedocs.io/).
|
[**hands-on tutorial**](https://spack.readthedocs.io/en/latest/tutorial.html).
|
||||||
It covers basic to advanced usage, packaging, developer features, and large HPC
|
It covers basic to advanced usage, packaging, developer features, and large HPC
|
||||||
deployments. You can do all of the exercises on your own laptop using a
|
deployments. You can do all of the exercises on your own laptop using a
|
||||||
Docker container.
|
Docker container.
|
||||||
@@ -89,14 +62,9 @@ Resources:
|
|||||||
|
|
||||||
* **Slack workspace**: [spackpm.slack.com](https://spackpm.slack.com).
|
* **Slack workspace**: [spackpm.slack.com](https://spackpm.slack.com).
|
||||||
To get an invitation, visit [slack.spack.io](https://slack.spack.io).
|
To get an invitation, visit [slack.spack.io](https://slack.spack.io).
|
||||||
* **Matrix space**: [#spack-space:matrix.org](https://matrix.to/#/#spack-space:matrix.org):
|
* **Mailing list**: [groups.google.com/d/forum/spack](https://groups.google.com/d/forum/spack)
|
||||||
[bridged](https://github.com/matrix-org/matrix-appservice-slack#matrix-appservice-slack) to Slack.
|
* **Twitter**: [@spackpm](https://twitter.com/spackpm). Be sure to
|
||||||
* [**Github Discussions**](https://github.com/spack/spack/discussions):
|
|
||||||
for Q&A and discussions. Note the pinned discussions for announcements.
|
|
||||||
* **X**: [@spackpm](https://twitter.com/spackpm). Be sure to
|
|
||||||
`@mention` us!
|
`@mention` us!
|
||||||
* **Mailing list**: [groups.google.com/d/forum/spack](https://groups.google.com/d/forum/spack):
|
|
||||||
only for announcements. Please use other venues for discussions.
|
|
||||||
|
|
||||||
Contributing
|
Contributing
|
||||||
------------------------
|
------------------------
|
||||||
|
32
SECURITY.md
32
SECURITY.md
@@ -2,26 +2,24 @@
|
|||||||
|
|
||||||
## Supported Versions
|
## Supported Versions
|
||||||
|
|
||||||
We provide security updates for `develop` and for the last two
|
We provide security updates for the following releases.
|
||||||
stable (`0.x`) release series of Spack. Security updates will be
|
|
||||||
made available as patch (`0.x.1`, `0.x.2`, etc.) releases.
|
|
||||||
|
|
||||||
For more on Spack's release structure, see
|
For more on Spack's release structure, see
|
||||||
[`README.md`](https://github.com/spack/spack#releases).
|
[`README.md`](https://github.com/spack/spack#releases).
|
||||||
|
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| develop | :white_check_mark: |
|
||||||
|
| 0.17.x | :white_check_mark: |
|
||||||
|
| 0.16.x | :white_check_mark: |
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
You can report a vulnerability using GitHub's private reporting
|
To report a vulnerability or other security
|
||||||
feature:
|
issue, email maintainers@spack.io.
|
||||||
|
|
||||||
1. Go to [github.com/spack/spack/security](https://github.com/spack/spack/security).
|
You can expect to hear back within two days.
|
||||||
2. Click "Report a vulnerability" in the upper right corner of that page.
|
If your security issue is accepted, we will do
|
||||||
3. Fill out the form and submit your draft security advisory.
|
our best to release a fix within a week. If
|
||||||
|
fixing the issue will take longer than this,
|
||||||
More details are available in
|
we will discuss timeline options with you.
|
||||||
[GitHub's docs](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability).
|
|
||||||
|
|
||||||
You can expect to hear back about security issues within two days.
|
|
||||||
If your security issue is accepted, we will do our best to release
|
|
||||||
a fix within a week. If fixing the issue will take longer than
|
|
||||||
this, we will discuss timeline options with you.
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
import subprocess
|
import subprocess
|
||||||
@@ -7,12 +8,13 @@
|
|||||||
|
|
||||||
def getpywin():
|
def getpywin():
|
||||||
try:
|
try:
|
||||||
import win32con # noqa: F401
|
import win32con # noqa
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print("pyWin32 not installed but is required...\nInstalling via pip:")
|
subprocess.check_call(
|
||||||
subprocess.check_call([sys.executable, "-m", "pip", "-q", "install", "--upgrade", "pip"])
|
[sys.executable, "-m", "pip", "-q", "install", "--upgrade", "pip"])
|
||||||
subprocess.check_call([sys.executable, "-m", "pip", "-q", "install", "pywin32"])
|
subprocess.check_call(
|
||||||
|
[sys.executable, "-m", "pip", "-q", "install", "pywin32"])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == '__main__':
|
||||||
getpywin()
|
getpywin()
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# Copyright sbang project developers. See COPYRIGHT file for details.
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# sbang project developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
59
bin/spack
59
bin/spack
@@ -1,7 +1,8 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# -*- python -*-
|
# -*- python -*-
|
||||||
#
|
#
|
||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -24,15 +25,19 @@ exit 1
|
|||||||
# Line above is a shell no-op, and ends a python multi-line comment.
|
# Line above is a shell no-op, and ends a python multi-line comment.
|
||||||
# The code above runs this file with our preferred python interpreter.
|
# The code above runs this file with our preferred python interpreter.
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
min_python3 = (3, 6)
|
min_python3 = (3, 5)
|
||||||
|
|
||||||
if sys.version_info[:2] < min_python3:
|
if sys.version_info[:2] < (2, 7) or (
|
||||||
|
sys.version_info[:2] >= (3, 0) and sys.version_info[:2] < min_python3
|
||||||
|
):
|
||||||
v_info = sys.version_info[:3]
|
v_info = sys.version_info[:3]
|
||||||
msg = "Spack requires Python %d.%d or higher " % min_python3
|
msg = "Spack requires Python 2.7 or %d.%d or higher " % min_python3
|
||||||
msg += "You are running spack with Python %d.%d.%d." % v_info
|
msg += "You are running spack with Python %d.%d.%d." % v_info
|
||||||
sys.exit(msg)
|
sys.exit(msg)
|
||||||
|
|
||||||
@@ -44,8 +49,50 @@ spack_prefix = os.path.dirname(os.path.dirname(spack_file))
|
|||||||
spack_lib_path = os.path.join(spack_prefix, "lib", "spack")
|
spack_lib_path = os.path.join(spack_prefix, "lib", "spack")
|
||||||
sys.path.insert(0, spack_lib_path)
|
sys.path.insert(0, spack_lib_path)
|
||||||
|
|
||||||
from spack_installable.main import main # noqa: E402
|
# Add external libs
|
||||||
|
spack_external_libs = os.path.join(spack_lib_path, "external")
|
||||||
|
|
||||||
|
if sys.version_info[:2] <= (2, 7):
|
||||||
|
sys.path.insert(0, os.path.join(spack_external_libs, "py2"))
|
||||||
|
|
||||||
|
sys.path.insert(0, spack_external_libs)
|
||||||
|
|
||||||
|
# Here we delete ruamel.yaml in case it has been already imported from site
|
||||||
|
# (see #9206 for a broader description of the issue).
|
||||||
|
#
|
||||||
|
# Briefly: ruamel.yaml produces a .pth file when installed with pip that
|
||||||
|
# makes the site installed package the preferred one, even though sys.path
|
||||||
|
# is modified to point to another version of ruamel.yaml.
|
||||||
|
if "ruamel.yaml" in sys.modules:
|
||||||
|
del sys.modules["ruamel.yaml"]
|
||||||
|
|
||||||
|
if "ruamel" in sys.modules:
|
||||||
|
del sys.modules["ruamel"]
|
||||||
|
|
||||||
|
# The following code is here to avoid failures when updating
|
||||||
|
# the develop version, due to spurious argparse.pyc files remaining
|
||||||
|
# in the libs/spack/external directory, see:
|
||||||
|
# https://github.com/spack/spack/pull/25376
|
||||||
|
# TODO: Remove in v0.18.0 or later
|
||||||
|
try:
|
||||||
|
import argparse
|
||||||
|
except ImportError:
|
||||||
|
argparse_pyc = os.path.join(spack_external_libs, 'argparse.pyc')
|
||||||
|
if not os.path.exists(argparse_pyc):
|
||||||
|
raise
|
||||||
|
try:
|
||||||
|
os.remove(argparse_pyc)
|
||||||
|
import argparse # noqa
|
||||||
|
except Exception:
|
||||||
|
msg = ('The file\n\n\t{0}\n\nis corrupted and cannot be deleted by Spack. '
|
||||||
|
'Either delete it manually or ask some administrator to '
|
||||||
|
'delete it for you.')
|
||||||
|
print(msg.format(argparse_pyc))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
import spack.main # noqa
|
||||||
|
|
||||||
# Once we've set up the system path, run the spack main method
|
# Once we've set up the system path, run the spack main method
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
sys.exit(main())
|
sys.exit(spack.main.main())
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -21,4 +22,4 @@
|
|||||||
#
|
#
|
||||||
# This is compatible across platforms.
|
# This is compatible across platforms.
|
||||||
#
|
#
|
||||||
exec spack python "$@"
|
exec /usr/bin/env spack python "$@"
|
||||||
|
@@ -1,96 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
[[ -n "${TMPCONFIG_DEBUG:=}" ]] && set -x
|
|
||||||
DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
mkdir -p "${XDG_RUNTIME_DIR:=/tmp}/spack-tests"
|
|
||||||
export TMPDIR="${XDG_RUNTIME_DIR}"
|
|
||||||
export TMP_DIR="$(mktemp -d -t spack-test-XXXXX)"
|
|
||||||
clean_up() {
|
|
||||||
[[ -n "$TMPCONFIG_DEBUG" ]] && printf "cleaning up: $TMP_DIR\n"
|
|
||||||
rm -rf "$TMP_DIR"
|
|
||||||
}
|
|
||||||
trap clean_up EXIT
|
|
||||||
trap clean_up ERR
|
|
||||||
|
|
||||||
[[ -n "$TMPCONFIG_DEBUG" ]] && printf "Redirecting TMP_DIR and spack directories to $TMP_DIR\n"
|
|
||||||
|
|
||||||
export BOOTSTRAP="${SPACK_USER_CACHE_PATH:=$HOME/.spack}/bootstrap"
|
|
||||||
export SPACK_USER_CACHE_PATH="$TMP_DIR/user_cache"
|
|
||||||
mkdir -p "$SPACK_USER_CACHE_PATH"
|
|
||||||
|
|
||||||
private_bootstrap="$SPACK_USER_CACHE_PATH/bootstrap"
|
|
||||||
use_spack=''
|
|
||||||
use_bwrap=''
|
|
||||||
# argument handling
|
|
||||||
while (($# >= 1)) ; do
|
|
||||||
case "$1" in
|
|
||||||
-b) # privatize bootstrap too, useful for CI but not always cheap
|
|
||||||
shift
|
|
||||||
export BOOTSTRAP="$private_bootstrap"
|
|
||||||
;;
|
|
||||||
-B) # use specified bootstrap dir
|
|
||||||
export BOOTSTRAP="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
-s) # run spack directly with remaining args
|
|
||||||
shift
|
|
||||||
use_spack=1
|
|
||||||
;;
|
|
||||||
--contain=bwrap)
|
|
||||||
if bwrap --help 2>&1 > /dev/null ; then
|
|
||||||
use_bwrap=1
|
|
||||||
else
|
|
||||||
echo Bubblewrap containment requested, but no bwrap command found
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--)
|
|
||||||
shift
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
typeset -a CMD
|
|
||||||
if [[ -n "$use_spack" ]] ; then
|
|
||||||
CMD=("$DIR/spack" "$@")
|
|
||||||
else
|
|
||||||
CMD=("$@")
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$BOOTSTRAP"
|
|
||||||
|
|
||||||
export SPACK_SYSTEM_CONFIG_PATH="$TMP_DIR/sys_conf"
|
|
||||||
export SPACK_USER_CONFIG_PATH="$TMP_DIR/user_conf"
|
|
||||||
mkdir -p "$SPACK_USER_CONFIG_PATH"
|
|
||||||
cat >"$SPACK_USER_CONFIG_PATH/config.yaml" <<EOF
|
|
||||||
config:
|
|
||||||
install_tree:
|
|
||||||
root: $TMP_DIR/install
|
|
||||||
misc_cache: $$user_cache_path/cache
|
|
||||||
source_cache: $$user_cache_path/source
|
|
||||||
environments_root: $TMP_DIR/envs
|
|
||||||
EOF
|
|
||||||
cat >"$SPACK_USER_CONFIG_PATH/bootstrap.yaml" <<EOF
|
|
||||||
bootstrap:
|
|
||||||
root: $BOOTSTRAP
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if [[ -n "$use_bwrap" ]] ; then
|
|
||||||
CMD=(
|
|
||||||
bwrap
|
|
||||||
--dev-bind / /
|
|
||||||
--ro-bind "$DIR/.." "$DIR/.." # do not touch spack root
|
|
||||||
--ro-bind $HOME/.spack $HOME/.spack # do not touch user config/cache dir
|
|
||||||
--bind "$TMP_DIR" "$TMP_DIR"
|
|
||||||
--bind "$BOOTSTRAP" "$BOOTSTRAP"
|
|
||||||
--die-with-parent
|
|
||||||
"${CMD[@]}"
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
|
|
||||||
(( ${TMPCONFIG_DEBUG:=0} > 1)) && echo "Running: ${CMD[@]}"
|
|
||||||
"${CMD[@]}"
|
|
118
bin/spack.bat
118
bin/spack.bat
@@ -1,4 +1,5 @@
|
|||||||
:: Copyright Spack Project Developers. See COPYRIGHT file for details.
|
:: Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
:: Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
::
|
::
|
||||||
:: SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
:: SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
::#######################################################################
|
::#######################################################################
|
||||||
@@ -13,7 +14,7 @@
|
|||||||
::
|
::
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
set spack="%SPACK_ROOT%"\bin\spack
|
set spack=%SPACK_ROOT%\bin\spack
|
||||||
|
|
||||||
::#######################################################################
|
::#######################################################################
|
||||||
:: This is a wrapper around the spack command that forwards calls to
|
:: This is a wrapper around the spack command that forwards calls to
|
||||||
@@ -49,48 +50,25 @@ setlocal enabledelayedexpansion
|
|||||||
:: flags will always start with '-', e.g. --help or -V
|
:: flags will always start with '-', e.g. --help or -V
|
||||||
:: subcommands will never start with '-'
|
:: subcommands will never start with '-'
|
||||||
:: everything after the subcommand is an arg
|
:: everything after the subcommand is an arg
|
||||||
|
for %%x in (%*) do (
|
||||||
|
set t="%%~x"
|
||||||
:process_cl_args
|
if "!t:~0,1!" == "-" (
|
||||||
rem Set first cl argument (denoted by %1) to be processed
|
if defined _sp_subcommand (
|
||||||
set t=%1
|
:: We already have a subcommand, processing args now
|
||||||
rem shift moves all cl positional arguments left by one
|
|
||||||
rem meaning %2 is now %1, this allows us to iterate over each
|
|
||||||
rem argument
|
|
||||||
shift
|
|
||||||
rem assign next "first" cl argument to cl_args, will be null when
|
|
||||||
rem there are now further arguments to process
|
|
||||||
set cl_args=%1
|
|
||||||
if "!t:~0,1!" == "-" (
|
|
||||||
if defined _sp_subcommand (
|
|
||||||
rem We already have a subcommand, processing args now
|
|
||||||
if not defined _sp_args (
|
|
||||||
set "_sp_args=!t!"
|
|
||||||
) else (
|
|
||||||
set "_sp_args=!_sp_args! !t!"
|
set "_sp_args=!_sp_args! !t!"
|
||||||
)
|
|
||||||
) else (
|
|
||||||
if not defined _sp_flags (
|
|
||||||
set "_sp_flags=!t!"
|
|
||||||
) else (
|
) else (
|
||||||
set "_sp_flags=!_sp_flags! !t!"
|
set "_sp_flags=!_sp_flags! !t!"
|
||||||
|
shift
|
||||||
)
|
)
|
||||||
)
|
) else if not defined _sp_subcommand (
|
||||||
) else if not defined _sp_subcommand (
|
set "_sp_subcommand=!t!"
|
||||||
set "_sp_subcommand=!t!"
|
shift
|
||||||
) else (
|
|
||||||
if not defined _sp_args (
|
|
||||||
set "_sp_args=!t!"
|
|
||||||
) else (
|
) else (
|
||||||
set "_sp_args=!_sp_args! !t!"
|
set "_sp_args=!_sp_args! !t!"
|
||||||
|
shift
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
rem if this is not nu;ll, we have more tokens to process
|
|
||||||
rem start above process again with remaining unprocessed cl args
|
|
||||||
if defined cl_args goto :process_cl_args
|
|
||||||
|
|
||||||
|
|
||||||
:: --help, -h and -V flags don't require further output parsing.
|
:: --help, -h and -V flags don't require further output parsing.
|
||||||
:: If we encounter, execute and exit
|
:: If we encounter, execute and exit
|
||||||
if defined _sp_flags (
|
if defined _sp_flags (
|
||||||
@@ -105,24 +83,24 @@ if defined _sp_flags (
|
|||||||
exit /B 0
|
exit /B 0
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if not defined _sp_subcommand (
|
|
||||||
if not defined _sp_args (
|
|
||||||
if not defined _sp_flags (
|
|
||||||
python "%spack%" --help
|
|
||||||
exit /B 0
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
:: pass parsed variables outside of local scope. Need to do
|
:: pass parsed variables outside of local scope. Need to do
|
||||||
:: this because delayedexpansion can only be set by setlocal
|
:: this because delayedexpansion can only be set by setlocal
|
||||||
endlocal & (
|
echo %_sp_flags%>flags
|
||||||
set "_sp_flags=%_sp_flags%"
|
echo %_sp_args%>args
|
||||||
set "_sp_args=%_sp_args%"
|
echo %_sp_subcommand%>subcmd
|
||||||
set "_sp_subcommand=%_sp_subcommand%"
|
endlocal
|
||||||
)
|
set /p _sp_subcommand=<subcmd
|
||||||
|
set /p _sp_flags=<flags
|
||||||
|
set /p _sp_args=<args
|
||||||
|
set str_subcommand=%_sp_subcommand:"='%
|
||||||
|
set str_flags=%_sp_flags:"='%
|
||||||
|
set str_args=%_sp_args:"='%
|
||||||
|
if "%str_subcommand%"=="ECHO is off." (set "_sp_subcommand=")
|
||||||
|
if "%str_flags%"=="ECHO is off." (set "_sp_flags=")
|
||||||
|
if "%str_args%"=="ECHO is off." (set "_sp_args=")
|
||||||
|
del subcmd
|
||||||
|
del flags
|
||||||
|
del args
|
||||||
|
|
||||||
:: Filter out some commands. For any others, just run the command.
|
:: Filter out some commands. For any others, just run the command.
|
||||||
if "%_sp_subcommand%" == "cd" (
|
if "%_sp_subcommand%" == "cd" (
|
||||||
@@ -165,9 +143,7 @@ goto :end_switch
|
|||||||
:: If no args or args contain --bat or -h/--help: just execute.
|
:: If no args or args contain --bat or -h/--help: just execute.
|
||||||
if NOT defined _sp_args (
|
if NOT defined _sp_args (
|
||||||
goto :default_case
|
goto :default_case
|
||||||
)
|
)else if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
||||||
|
|
||||||
if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
|
||||||
goto :default_case
|
goto :default_case
|
||||||
) else if NOT "%_sp_args%"=="%_sp_args: -h=%" (
|
) else if NOT "%_sp_args%"=="%_sp_args: -h=%" (
|
||||||
goto :default_case
|
goto :default_case
|
||||||
@@ -175,11 +151,11 @@ if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
|||||||
goto :default_case
|
goto :default_case
|
||||||
) else if NOT "%_sp_args%"=="%_sp_args:deactivate=%" (
|
) else if NOT "%_sp_args%"=="%_sp_args:deactivate=%" (
|
||||||
for /f "tokens=* USEBACKQ" %%I in (
|
for /f "tokens=* USEBACKQ" %%I in (
|
||||||
`call python %spack% %_sp_flags% env deactivate --bat %_sp_args:deactivate=%`
|
`call python "%spack%" %_sp_flags% env deactivate --bat %_sp_args:deactivate=%`
|
||||||
) do %%I
|
) do %%I
|
||||||
) else if NOT "%_sp_args%"=="%_sp_args:activate=%" (
|
) else if NOT "%_sp_args%"=="%_sp_args:activate=%" (
|
||||||
for /f "tokens=* USEBACKQ" %%I in (
|
for /f "tokens=* USEBACKQ" %%I in (
|
||||||
`python %spack% %_sp_flags% env activate --bat %_sp_args:activate=%`
|
`call python "%spack%" %_sp_flags% env activate --bat %_sp_args:activate=%`
|
||||||
) do %%I
|
) do %%I
|
||||||
) else (
|
) else (
|
||||||
goto :default_case
|
goto :default_case
|
||||||
@@ -187,27 +163,25 @@ if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
|||||||
goto :end_switch
|
goto :end_switch
|
||||||
|
|
||||||
:case_load
|
:case_load
|
||||||
if NOT defined _sp_args (
|
:: If args contain --sh, --csh, or -h/--help: just execute.
|
||||||
exit /B 0
|
if defined _sp_args (
|
||||||
)
|
if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
||||||
|
goto :default_case
|
||||||
:: If args contain --bat, or -h/--help: just execute.
|
) else if NOT "%_sp_args%"=="%_sp_args: -h=%" (
|
||||||
if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
goto :default_case
|
||||||
goto :default_case
|
) else if NOT "%_sp_args%"=="%_sp_args:--bat=%" (
|
||||||
) else if NOT "%_sp_args%"=="%_sp_args:-h=%" (
|
goto :default_case
|
||||||
goto :default_case
|
)
|
||||||
) else if NOT "%_sp_args%"=="%_sp_args:--bat=%" (
|
|
||||||
goto :default_case
|
|
||||||
) else if NOT "%_sp_args%"=="%_sp_args:--list=%" (
|
|
||||||
goto :default_case
|
|
||||||
)
|
)
|
||||||
|
|
||||||
for /f "tokens=* USEBACKQ" %%I in (
|
for /f "tokens=* USEBACKQ" %%I in (
|
||||||
`python "%spack%" %_sp_flags% %_sp_subcommand% --bat %_sp_args%`
|
`python "%spack%" %_sp_flags% %_sp_subcommand% --bat %_sp_args%`) do %%I
|
||||||
) do %%I
|
)
|
||||||
|
|
||||||
goto :end_switch
|
goto :end_switch
|
||||||
|
|
||||||
|
:case_unload
|
||||||
|
goto :case_load
|
||||||
|
|
||||||
:default_case
|
:default_case
|
||||||
python "%spack%" %_sp_flags% %_sp_subcommand% %_sp_args%
|
python "%spack%" %_sp_flags% %_sp_subcommand% %_sp_args%
|
||||||
goto :end_switch
|
goto :end_switch
|
||||||
|
147
bin/spack.ps1
147
bin/spack.ps1
@@ -1,147 +0,0 @@
|
|||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
||||||
|
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
# #######################################################################
|
|
||||||
|
|
||||||
function Compare-CommonArgs {
|
|
||||||
$CMDArgs = $args[0]
|
|
||||||
# These aruments take precedence and call for no futher parsing of arguments
|
|
||||||
# invoke actual Spack entrypoint with that context and exit after
|
|
||||||
"--help", "-h", "--version", "-V" | ForEach-Object {
|
|
||||||
$arg_opt = $_
|
|
||||||
if(($CMDArgs) -and ([bool]($CMDArgs.Where({$_ -eq $arg_opt})))) {
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
function Read-SpackArgs {
|
|
||||||
$SpackCMD_params = @()
|
|
||||||
$SpackSubCommand = $NULL
|
|
||||||
$SpackSubCommandArgs = @()
|
|
||||||
$args_ = $args[0]
|
|
||||||
$args_ | ForEach-Object {
|
|
||||||
if (!$SpackSubCommand) {
|
|
||||||
if($_.SubString(0,1) -eq "-")
|
|
||||||
{
|
|
||||||
$SpackCMD_params += $_
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$SpackSubCommand = $_
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$SpackSubCommandArgs += $_
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $SpackCMD_params, $SpackSubCommand, $SpackSubCommandArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
function Set-SpackEnv {
|
|
||||||
# This method is responsible
|
|
||||||
# for processing the return from $(spack <command>)
|
|
||||||
# which are returned as System.Object[]'s containing
|
|
||||||
# a list of env commands
|
|
||||||
# Invoke-Expression can only handle one command at a time
|
|
||||||
# so we iterate over the list to invoke the env modification
|
|
||||||
# expressions one at a time
|
|
||||||
foreach($envop in $args[0]){
|
|
||||||
Invoke-Expression $envop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function Invoke-SpackCD {
|
|
||||||
if (Compare-CommonArgs $SpackSubCommandArgs) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" cd -h
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$LOC = $(python "$Env:SPACK_ROOT/bin/spack" location $SpackSubCommandArgs)
|
|
||||||
if (($NULL -ne $LOC)){
|
|
||||||
if ( Test-Path -Path $LOC){
|
|
||||||
Set-Location $LOC
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Invoke-SpackEnv {
|
|
||||||
if (Compare-CommonArgs $SpackSubCommandArgs[0]) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" env -h
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$SubCommandSubCommand = $SpackSubCommandArgs[0]
|
|
||||||
$SubCommandSubCommandArgs = $SpackSubCommandArgs[1..$SpackSubCommandArgs.Count]
|
|
||||||
switch ($SubCommandSubCommand) {
|
|
||||||
"activate" {
|
|
||||||
if (Compare-CommonArgs $SubCommandSubCommandArgs) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" env activate $SubCommandSubCommandArgs
|
|
||||||
}
|
|
||||||
elseif ([bool]($SubCommandSubCommandArgs.Where({$_ -eq "--pwsh"}))) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" env activate $SubCommandSubCommandArgs
|
|
||||||
}
|
|
||||||
elseif (!$SubCommandSubCommandArgs) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" env activate $SubCommandSubCommandArgs
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$SpackEnv = $(python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params env activate "--pwsh" $SubCommandSubCommandArgs)
|
|
||||||
Set-SpackEnv $SpackEnv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"deactivate" {
|
|
||||||
if ([bool]($SubCommandSubCommandArgs.Where({$_ -eq "--pwsh"}))) {
|
|
||||||
python"$Env:SPACK_ROOT/bin/spack" env deactivate $SubCommandSubCommandArgs
|
|
||||||
}
|
|
||||||
elseif($SubCommandSubCommandArgs) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" env deactivate -h
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$SpackEnv = $(python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params env deactivate "--pwsh")
|
|
||||||
Set-SpackEnv $SpackEnv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default {python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Invoke-SpackLoad {
|
|
||||||
if (Compare-CommonArgs $SpackSubCommandArgs) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs
|
|
||||||
}
|
|
||||||
elseif ([bool]($SpackSubCommandArgs.Where({($_ -eq "--pwsh") -or ($_ -eq "--list")}))) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$SpackEnv = $(python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params $SpackSubCommand "--pwsh" $SpackSubCommandArgs)
|
|
||||||
Set-SpackEnv $SpackEnv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$SpackCMD_params, $SpackSubCommand, $SpackSubCommandArgs = Read-SpackArgs $args
|
|
||||||
|
|
||||||
if (Compare-CommonArgs $SpackCMD_params) {
|
|
||||||
python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs
|
|
||||||
exit $LASTEXITCODE
|
|
||||||
}
|
|
||||||
|
|
||||||
# Process Spack commands with special conditions
|
|
||||||
# all other commands are piped directly to Spack
|
|
||||||
switch($SpackSubCommand)
|
|
||||||
{
|
|
||||||
"cd" {Invoke-SpackCD}
|
|
||||||
"env" {Invoke-SpackEnv}
|
|
||||||
"load" {Invoke-SpackLoad}
|
|
||||||
"unload" {Invoke-SpackLoad}
|
|
||||||
default {python "$Env:SPACK_ROOT/bin/spack" $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit $LASTEXITCODE
|
|
@@ -1,11 +1,72 @@
|
|||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
|
setlocal EnableDelayedExpansion
|
||||||
:: (c) 2021 Lawrence Livermore National Laboratory
|
:: (c) 2021 Lawrence Livermore National Laboratory
|
||||||
:: To use this file independently of Spack's installer, execute this script in its directory, or add the
|
:: To use this file independently of Spack's installer, execute this script in its directory, or add the
|
||||||
:: associated bin directory to your PATH. Invoke to launch Spack Shell.
|
:: associated bin directory to your PATH. Invoke to launch Spack Shell.
|
||||||
::
|
::
|
||||||
:: source_dir/spack/bin/spack_cmd.bat
|
:: source_dir/spack/bin/spack_cmd.bat
|
||||||
::
|
::
|
||||||
|
pushd %~dp0..
|
||||||
|
set SPACK_ROOT=%CD%
|
||||||
|
pushd %CD%\..
|
||||||
|
set spackinstdir=%CD%
|
||||||
|
popd
|
||||||
|
|
||||||
call "%~dp0..\share\spack\setup-env.bat"
|
|
||||||
pushd %SPACK_ROOT%
|
:: Check if Python is on the PATH
|
||||||
%comspec% /K
|
if not defined python_pf_ver (
|
||||||
|
(for /f "delims=" %%F in ('where python.exe') do (
|
||||||
|
set "python_pf_ver=%%F"
|
||||||
|
goto :found_python
|
||||||
|
) ) 2> NUL
|
||||||
|
)
|
||||||
|
:found_python
|
||||||
|
if not defined python_pf_ver (
|
||||||
|
:: If not, look for Python from the Spack installer
|
||||||
|
:get_builtin
|
||||||
|
(for /f "tokens=*" %%g in ('dir /b /a:d "!spackinstdir!\Python*"') do (
|
||||||
|
set "python_ver=%%g")) 2> NUL
|
||||||
|
|
||||||
|
if not defined python_ver (
|
||||||
|
echo Python was not found on your system.
|
||||||
|
echo Please install Python or add Python to your PATH.
|
||||||
|
) else (
|
||||||
|
set "py_path=!spackinstdir!\!python_ver!"
|
||||||
|
set "py_exe=!py_path!\python.exe"
|
||||||
|
)
|
||||||
|
goto :exitpoint
|
||||||
|
) else (
|
||||||
|
:: Python is already on the path
|
||||||
|
set "py_exe=!python_pf_ver!"
|
||||||
|
(for /F "tokens=* USEBACKQ" %%F in (
|
||||||
|
`"!py_exe!" --version`) do (set "output=%%F")) 2>NUL
|
||||||
|
if not "!output:Microsoft Store=!"=="!output!" goto :get_builtin
|
||||||
|
goto :exitpoint
|
||||||
|
)
|
||||||
|
:exitpoint
|
||||||
|
|
||||||
|
set "PATH=%SPACK_ROOT%\bin\;%PATH%"
|
||||||
|
if defined py_path (
|
||||||
|
set "PATH=%py_path%;%PATH%"
|
||||||
|
)
|
||||||
|
|
||||||
|
if defined py_exe (
|
||||||
|
"%py_exe%" "%SPACK_ROOT%\bin\haspywin.py"
|
||||||
|
"%py_exe%" "%SPACK_ROOT%\bin\spack" external find python >NUL
|
||||||
|
)
|
||||||
|
|
||||||
|
set "EDITOR=notepad"
|
||||||
|
|
||||||
|
DOSKEY spacktivate=spack env activate $*
|
||||||
|
|
||||||
|
@echo **********************************************************************
|
||||||
|
@echo ** Spack Package Manager
|
||||||
|
@echo **********************************************************************
|
||||||
|
|
||||||
|
IF "%1"=="" GOTO CONTINUE
|
||||||
|
set
|
||||||
|
GOTO:EOF
|
||||||
|
|
||||||
|
:continue
|
||||||
|
set PROMPT=[spack] %PROMPT%
|
||||||
|
%comspec% /k
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
@@ -9,15 +9,14 @@ bootstrap:
|
|||||||
# may not be able to bootstrap all the software that Spack needs,
|
# may not be able to bootstrap all the software that Spack needs,
|
||||||
# depending on its type.
|
# depending on its type.
|
||||||
sources:
|
sources:
|
||||||
- name: github-actions-v0.6
|
- name: 'github-actions-v0.2'
|
||||||
metadata: $spack/share/spack/bootstrap/github-actions-v0.6
|
metadata: $spack/share/spack/bootstrap/github-actions-v0.2
|
||||||
- name: github-actions-v0.5
|
- name: 'github-actions-v0.1'
|
||||||
metadata: $spack/share/spack/bootstrap/github-actions-v0.5
|
metadata: $spack/share/spack/bootstrap/github-actions-v0.1
|
||||||
- name: spack-install
|
- name: 'spack-install'
|
||||||
metadata: $spack/share/spack/bootstrap/spack-install
|
metadata: $spack/share/spack/bootstrap/spack-install
|
||||||
trusted:
|
trusted:
|
||||||
# By default we trust bootstrapping from sources and from binaries
|
# By default we trust bootstrapping from sources and from binaries
|
||||||
# produced on Github via the workflow
|
# produced on Github via the workflow
|
||||||
github-actions-v0.6: true
|
github-actions-v0.2: true
|
||||||
github-actions-v0.5: true
|
|
||||||
spack-install: true
|
spack-install: true
|
||||||
|
@@ -13,18 +13,16 @@ concretizer:
|
|||||||
# Whether to consider installed packages or packages from buildcaches when
|
# Whether to consider installed packages or packages from buildcaches when
|
||||||
# concretizing specs. If `true`, we'll try to use as many installs/binaries
|
# concretizing specs. If `true`, we'll try to use as many installs/binaries
|
||||||
# as possible, rather than building. If `false`, we'll always give you a fresh
|
# as possible, rather than building. If `false`, we'll always give you a fresh
|
||||||
# concretization. If `dependencies`, we'll only reuse dependencies but
|
# concretization.
|
||||||
# give you a fresh concretization for your root specs.
|
|
||||||
reuse: true
|
reuse: true
|
||||||
# Options that tune which targets are considered for concretization. The
|
# Options that tune which targets are considered for concretization. The
|
||||||
# concretization process is very sensitive to the number targets, and the time
|
# concretization process is very sensitive to the number targets, and the time
|
||||||
# needed to reach a solution increases noticeably with the number of targets
|
# needed to reach a solution increases noticeably with the number of targets
|
||||||
# considered.
|
# considered.
|
||||||
targets:
|
targets:
|
||||||
# Determine whether we want to target specific or generic
|
# Determine whether we want to target specific or generic microarchitectures.
|
||||||
# microarchitectures. Valid values are: "microarchitectures" or "generic".
|
# An example of the first kind might be for instance "skylake" or "bulldozer",
|
||||||
# An example of "microarchitectures" would be "skylake" or "bulldozer",
|
# while generic microarchitectures are for instance "aarch64" or "x86_64_v4".
|
||||||
# while an example of "generic" would be "aarch64" or "x86_64_v4".
|
|
||||||
granularity: microarchitectures
|
granularity: microarchitectures
|
||||||
# If "false" allow targets that are incompatible with the current host (for
|
# If "false" allow targets that are incompatible with the current host (for
|
||||||
# instance concretize with target "icelake" while running on "haswell").
|
# instance concretize with target "icelake" while running on "haswell").
|
||||||
@@ -35,31 +33,4 @@ concretizer:
|
|||||||
# environments can always be activated. When "false" perform concretization separately
|
# environments can always be activated. When "false" perform concretization separately
|
||||||
# on each root spec, allowing different versions and variants of the same package in
|
# on each root spec, allowing different versions and variants of the same package in
|
||||||
# an environment.
|
# an environment.
|
||||||
unify: true
|
unify: false
|
||||||
# Option to deal with possible duplicate nodes (i.e. different nodes from the same package) in the DAG.
|
|
||||||
duplicates:
|
|
||||||
# "none": allows a single node for any package in the DAG.
|
|
||||||
# "minimal": allows the duplication of 'build-tools' nodes only
|
|
||||||
# (e.g. py-setuptools, cmake etc.)
|
|
||||||
# "full" (experimental): allows separation of the entire build-tool stack (e.g. the entire "cmake" subDAG)
|
|
||||||
strategy: minimal
|
|
||||||
# Option to specify compatibility between operating systems for reuse of compilers and packages
|
|
||||||
# Specified as a key: [list] where the key is the os that is being targeted, and the list contains the OS's
|
|
||||||
# it can reuse. Note this is a directional compatibility so mutual compatibility between two OS's
|
|
||||||
# requires two entries i.e. os_compatible: {sonoma: [monterey], monterey: [sonoma]}
|
|
||||||
os_compatible: {}
|
|
||||||
|
|
||||||
# Option to specify whether to support splicing. Splicing allows for
|
|
||||||
# the relinking of concrete package dependencies in order to better
|
|
||||||
# reuse already built packages with ABI compatible dependencies
|
|
||||||
splice:
|
|
||||||
explicit: []
|
|
||||||
automatic: false
|
|
||||||
# Maximum time, in seconds, allowed for the 'solve' phase. If set to 0, there is no time limit.
|
|
||||||
timeout: 0
|
|
||||||
# If set to true, exceeding the timeout will always result in a concretization error. If false,
|
|
||||||
# the best (suboptimal) model computed before the timeout is used.
|
|
||||||
#
|
|
||||||
# Setting this to false yields unreproducible results, so we advise to use that value only
|
|
||||||
# for debugging purposes (e.g. check which constraints can help Spack concretize faster).
|
|
||||||
error_on_timeout: true
|
|
@@ -19,7 +19,7 @@ config:
|
|||||||
install_tree:
|
install_tree:
|
||||||
root: $spack/opt/spack
|
root: $spack/opt/spack
|
||||||
projections:
|
projections:
|
||||||
all: "{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}"
|
all: "${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}"
|
||||||
# install_tree can include an optional padded length (int or boolean)
|
# install_tree can include an optional padded length (int or boolean)
|
||||||
# default is False (do not pad)
|
# default is False (do not pad)
|
||||||
# if padded_length is True, Spack will pad as close to the system max path
|
# if padded_length is True, Spack will pad as close to the system max path
|
||||||
@@ -54,11 +54,6 @@ config:
|
|||||||
# are that it precludes its use as a system package and its ability to be
|
# are that it precludes its use as a system package and its ability to be
|
||||||
# pip installable.
|
# pip installable.
|
||||||
#
|
#
|
||||||
# In Spack environment files, chaining onto existing system Spack
|
|
||||||
# installations, the $env variable can be used to download, cache and build
|
|
||||||
# into user-writable paths that are relative to the currently active
|
|
||||||
# environment.
|
|
||||||
#
|
|
||||||
# In any case, if the username is not already in the path, Spack will append
|
# In any case, if the username is not already in the path, Spack will append
|
||||||
# the value of `$user` in an attempt to avoid potential conflicts between
|
# the value of `$user` in an attempt to avoid potential conflicts between
|
||||||
# users in shared temporary spaces.
|
# users in shared temporary spaces.
|
||||||
@@ -81,10 +76,6 @@ config:
|
|||||||
source_cache: $spack/var/spack/cache
|
source_cache: $spack/var/spack/cache
|
||||||
|
|
||||||
|
|
||||||
## Directory where spack managed environments are created and stored
|
|
||||||
# environments_root: $spack/var/spack/environments
|
|
||||||
|
|
||||||
|
|
||||||
# Cache directory for miscellaneous files, like the package index.
|
# Cache directory for miscellaneous files, like the package index.
|
||||||
# This can be purged with `spack clean --misc-cache`
|
# This can be purged with `spack clean --misc-cache`
|
||||||
misc_cache: $user_cache_path/cache
|
misc_cache: $user_cache_path/cache
|
||||||
@@ -101,12 +92,6 @@ config:
|
|||||||
verify_ssl: true
|
verify_ssl: true
|
||||||
|
|
||||||
|
|
||||||
# This is where custom certs for proxy/firewall are stored.
|
|
||||||
# It can be a path or environment variable. To match ssl env configuration
|
|
||||||
# the default is the environment variable SSL_CERT_FILE
|
|
||||||
ssl_certs: $SSL_CERT_FILE
|
|
||||||
|
|
||||||
|
|
||||||
# Suppress gpg warnings from binary package verification
|
# Suppress gpg warnings from binary package verification
|
||||||
# Only suppresses warnings, gpg failure will still fail the install
|
# Only suppresses warnings, gpg failure will still fail the install
|
||||||
# Potential rationale to set True: users have already explicitly trusted the
|
# Potential rationale to set True: users have already explicitly trusted the
|
||||||
@@ -115,6 +100,12 @@ config:
|
|||||||
suppress_gpg_warnings: false
|
suppress_gpg_warnings: false
|
||||||
|
|
||||||
|
|
||||||
|
# If set to true, Spack will attempt to build any compiler on the spec
|
||||||
|
# that is not already available. If set to False, Spack will only use
|
||||||
|
# compilers already configured in compilers.yaml
|
||||||
|
install_missing_compilers: false
|
||||||
|
|
||||||
|
|
||||||
# If set to true, Spack will always check checksums after downloading
|
# If set to true, Spack will always check checksums after downloading
|
||||||
# archives. If false, Spack skips the checksum step.
|
# archives. If false, Spack skips the checksum step.
|
||||||
checksum: true
|
checksum: true
|
||||||
@@ -164,11 +155,28 @@ config:
|
|||||||
# If set to true, Spack will use ccache to cache C compiles.
|
# If set to true, Spack will use ccache to cache C compiles.
|
||||||
ccache: false
|
ccache: false
|
||||||
|
|
||||||
|
|
||||||
|
# The concretization algorithm to use in Spack. Options are:
|
||||||
|
#
|
||||||
|
# 'clingo': Uses a logic solver under the hood to solve DAGs with full
|
||||||
|
# backtracking and optimization for user preferences. Spack will
|
||||||
|
# try to bootstrap the logic solver, if not already available.
|
||||||
|
#
|
||||||
|
# 'original': Spack's original greedy, fixed-point concretizer. This
|
||||||
|
# algorithm can make decisions too early and will not backtrack
|
||||||
|
# sufficiently for many specs. This will soon be deprecated in
|
||||||
|
# favor of clingo.
|
||||||
|
#
|
||||||
|
# See `concretizer.yaml` for more settings you can fine-tune when
|
||||||
|
# using clingo.
|
||||||
|
concretizer: clingo
|
||||||
|
|
||||||
|
|
||||||
# How long to wait to lock the Spack installation database. This lock is used
|
# How long to wait to lock the Spack installation database. This lock is used
|
||||||
# when Spack needs to manage its own package metadata and all operations are
|
# when Spack needs to manage its own package metadata and all operations are
|
||||||
# expected to complete within the default time limit. The timeout should
|
# expected to complete within the default time limit. The timeout should
|
||||||
# therefore generally be left untouched.
|
# therefore generally be left untouched.
|
||||||
db_lock_timeout: 60
|
db_lock_timeout: 3
|
||||||
|
|
||||||
|
|
||||||
# How long to wait when attempting to modify a package (e.g. to install it).
|
# How long to wait when attempting to modify a package (e.g. to install it).
|
||||||
@@ -179,50 +187,17 @@ config:
|
|||||||
package_lock_timeout: null
|
package_lock_timeout: null
|
||||||
|
|
||||||
|
|
||||||
# Control how shared libraries are located at runtime on Linux. See the
|
# Control whether Spack embeds RPATH or RUNPATH attributes in ELF binaries.
|
||||||
# the Spack documentation for details.
|
# Has no effect on macOS. DO NOT MIX these within the same install tree.
|
||||||
shared_linking:
|
# See the Spack documentation for details.
|
||||||
# Spack automatically embeds runtime search paths in ELF binaries for their
|
shared_linking: 'rpath'
|
||||||
# dependencies. Their type can either be "rpath" or "runpath". For glibc, rpath is
|
|
||||||
# inherited and has precedence over LD_LIBRARY_PATH; runpath is not inherited
|
|
||||||
# and of lower precedence. DO NOT MIX these within the same install tree.
|
|
||||||
type: rpath
|
|
||||||
|
|
||||||
|
|
||||||
# (Experimental) Embed absolute paths of dependent libraries directly in ELF
|
|
||||||
# binaries to avoid runtime search. This can improve startup time of
|
|
||||||
# executables with many dependencies, in particular on slow filesystems.
|
|
||||||
bind: false
|
|
||||||
|
|
||||||
# Controls the handling of missing dynamic libraries after installation.
|
|
||||||
# Options are ignore (default), warn, or error. If set to error, the
|
|
||||||
# installation fails if installed binaries reference dynamic libraries that
|
|
||||||
# are not found in their specified rpaths.
|
|
||||||
missing_library_policy: ignore
|
|
||||||
|
|
||||||
|
|
||||||
# Set to 'false' to allow installation on filesystems that doesn't allow setgid bit
|
# Set to 'false' to allow installation on filesystems that doesn't allow setgid bit
|
||||||
# manipulation by unprivileged user (e.g. AFS)
|
# manipulation by unprivileged user (e.g. AFS)
|
||||||
allow_sgid: true
|
allow_sgid: true
|
||||||
|
|
||||||
# Whether to show status information during building and installing packages.
|
# Whether to set the terminal title to display status information during
|
||||||
# This gives information about Spack's current progress as well as the current
|
# building and installing packages. This gives information about Spack's
|
||||||
# and total number of packages. Information is shown both in the terminal
|
# current progress as well as the current and total number of packages.
|
||||||
# title and inline.
|
terminal_title: false
|
||||||
install_status: true
|
|
||||||
|
|
||||||
# Number of seconds a buildcache's index.json is cached locally before probing
|
|
||||||
# for updates, within a single Spack invocation. Defaults to 10 minutes.
|
|
||||||
binary_index_ttl: 600
|
|
||||||
|
|
||||||
flags:
|
|
||||||
# Whether to keep -Werror flags active in package builds.
|
|
||||||
keep_werror: 'none'
|
|
||||||
|
|
||||||
# A mapping of aliases that can be used to define new commands. For instance,
|
|
||||||
# `sp: spec -I` will define a new command `sp` that will execute `spec` with
|
|
||||||
# the `-I` argument. Aliases cannot override existing commands.
|
|
||||||
aliases:
|
|
||||||
concretise: concretize
|
|
||||||
containerise: containerize
|
|
||||||
rm: remove
|
|
||||||
|
21
etc/spack/defaults/cray/modules.yaml
Normal file
21
etc/spack/defaults/cray/modules.yaml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# This is the default configuration for Spack's module file generation.
|
||||||
|
#
|
||||||
|
# Settings here are versioned with Spack and are intended to provide
|
||||||
|
# sensible defaults out of the box. Spack maintainers should edit this
|
||||||
|
# file to keep it current.
|
||||||
|
#
|
||||||
|
# Users can override these settings by editing the following files.
|
||||||
|
#
|
||||||
|
# Per-spack-instance settings (overrides defaults):
|
||||||
|
# $SPACK_ROOT/etc/spack/modules.yaml
|
||||||
|
#
|
||||||
|
# Per-user settings (overrides default and site settings):
|
||||||
|
# ~/.spack/modules.yaml
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
modules:
|
||||||
|
prefix_inspections:
|
||||||
|
lib:
|
||||||
|
- LD_LIBRARY_PATH
|
||||||
|
lib64:
|
||||||
|
- LD_LIBRARY_PATH
|
@@ -15,7 +15,7 @@
|
|||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
modules:
|
modules:
|
||||||
prefix_inspections:
|
prefix_inspections:
|
||||||
./lib:
|
lib:
|
||||||
- DYLD_FALLBACK_LIBRARY_PATH
|
- DYLD_FALLBACK_LIBRARY_PATH
|
||||||
./lib64:
|
lib64:
|
||||||
- DYLD_FALLBACK_LIBRARY_PATH
|
- DYLD_FALLBACK_LIBRARY_PATH
|
||||||
|
@@ -19,23 +19,12 @@ packages:
|
|||||||
- apple-clang
|
- apple-clang
|
||||||
- clang
|
- clang
|
||||||
- gcc
|
- gcc
|
||||||
|
- intel
|
||||||
providers:
|
providers:
|
||||||
elf: [libelf]
|
elf: [libelf]
|
||||||
fuse: [macfuse]
|
fuse: [macfuse]
|
||||||
gl: [apple-gl]
|
|
||||||
glu: [apple-glu]
|
|
||||||
unwind: [apple-libunwind]
|
unwind: [apple-libunwind]
|
||||||
uuid: [apple-libuuid]
|
uuid: [apple-libuuid]
|
||||||
apple-gl:
|
|
||||||
buildable: false
|
|
||||||
externals:
|
|
||||||
- spec: apple-gl@4.1.0
|
|
||||||
prefix: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
|
|
||||||
apple-glu:
|
|
||||||
buildable: false
|
|
||||||
externals:
|
|
||||||
- spec: apple-glu@1.3.0
|
|
||||||
prefix: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
|
|
||||||
apple-libunwind:
|
apple-libunwind:
|
||||||
buildable: false
|
buildable: false
|
||||||
externals:
|
externals:
|
||||||
@@ -49,4 +38,4 @@ packages:
|
|||||||
# Apple bundles libuuid in libsystem_c version 1353.100.2,
|
# Apple bundles libuuid in libsystem_c version 1353.100.2,
|
||||||
# although the version number used here isn't critical
|
# although the version number used here isn't critical
|
||||||
- spec: apple-libuuid@1353.100.2
|
- spec: apple-libuuid@1353.100.2
|
||||||
prefix: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
|
prefix: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
|
||||||
|
@@ -13,4 +13,9 @@
|
|||||||
# Per-user settings (overrides default and site settings):
|
# Per-user settings (overrides default and site settings):
|
||||||
# ~/.spack/modules.yaml
|
# ~/.spack/modules.yaml
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
modules: {}
|
modules:
|
||||||
|
prefix_inspections:
|
||||||
|
lib:
|
||||||
|
- LD_LIBRARY_PATH
|
||||||
|
lib64:
|
||||||
|
- LD_LIBRARY_PATH
|
||||||
|
@@ -1,4 +1,2 @@
|
|||||||
mirrors:
|
mirrors:
|
||||||
spack-public:
|
spack-public: https://mirror.spack.io
|
||||||
binary: false
|
|
||||||
url: https://mirror.spack.io
|
|
||||||
|
@@ -14,24 +14,23 @@
|
|||||||
# ~/.spack/modules.yaml
|
# ~/.spack/modules.yaml
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
modules:
|
modules:
|
||||||
# This maps paths in the package install prefix to environment variables
|
# Paths to check when creating modules for all module sets
|
||||||
# they should be added to. For example, <prefix>/bin should be in PATH.
|
|
||||||
prefix_inspections:
|
prefix_inspections:
|
||||||
./bin:
|
bin:
|
||||||
- PATH
|
- PATH
|
||||||
./man:
|
man:
|
||||||
- MANPATH
|
- MANPATH
|
||||||
./share/man:
|
share/man:
|
||||||
- MANPATH
|
- MANPATH
|
||||||
./share/aclocal:
|
share/aclocal:
|
||||||
- ACLOCAL_PATH
|
- ACLOCAL_PATH
|
||||||
./lib/pkgconfig:
|
lib/pkgconfig:
|
||||||
- PKG_CONFIG_PATH
|
- PKG_CONFIG_PATH
|
||||||
./lib64/pkgconfig:
|
lib64/pkgconfig:
|
||||||
- PKG_CONFIG_PATH
|
- PKG_CONFIG_PATH
|
||||||
./share/pkgconfig:
|
share/pkgconfig:
|
||||||
- PKG_CONFIG_PATH
|
- PKG_CONFIG_PATH
|
||||||
./:
|
'':
|
||||||
- CMAKE_PREFIX_PATH
|
- CMAKE_PREFIX_PATH
|
||||||
|
|
||||||
# These are configurations for the module set named "default"
|
# These are configurations for the module set named "default"
|
||||||
@@ -40,12 +39,13 @@ modules:
|
|||||||
roots:
|
roots:
|
||||||
tcl: $spack/share/spack/modules
|
tcl: $spack/share/spack/modules
|
||||||
lmod: $spack/share/spack/lmod
|
lmod: $spack/share/spack/lmod
|
||||||
# What type of modules to use ("tcl" and/or "lmod")
|
# What type of modules to use
|
||||||
enable: []
|
enable:
|
||||||
|
- tcl
|
||||||
|
|
||||||
tcl:
|
tcl:
|
||||||
all:
|
all:
|
||||||
autoload: direct
|
autoload: none
|
||||||
|
|
||||||
# Default configurations if lmod is enabled
|
# Default configurations if lmod is enabled
|
||||||
lmod:
|
lmod:
|
||||||
|
@@ -15,48 +15,39 @@
|
|||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
compiler: [gcc, clang, oneapi, xl, nag, fj, aocc]
|
compiler: [gcc, intel, pgi, clang, xl, nag, fj, aocc]
|
||||||
providers:
|
providers:
|
||||||
awk: [gawk]
|
awk: [gawk]
|
||||||
armci: [armcimpi]
|
|
||||||
blas: [openblas, amdblis]
|
blas: [openblas, amdblis]
|
||||||
c: [gcc]
|
|
||||||
cxx: [gcc]
|
|
||||||
D: [ldc]
|
D: [ldc]
|
||||||
daal: [intel-oneapi-daal]
|
daal: [intel-daal]
|
||||||
elf: [elfutils]
|
elf: [elfutils]
|
||||||
fftw-api: [fftw, amdfftw]
|
fftw-api: [fftw, amdfftw]
|
||||||
flame: [libflame, amdlibflame]
|
flame: [libflame, amdlibflame]
|
||||||
fortran: [gcc]
|
|
||||||
fortran-rt: [gcc-runtime, intel-oneapi-runtime]
|
|
||||||
fuse: [libfuse]
|
fuse: [libfuse]
|
||||||
gl: [glx, osmesa]
|
gl: [mesa+opengl, mesa18, opengl]
|
||||||
glu: [mesa-glu, openglu]
|
glu: [mesa-glu, openglu]
|
||||||
golang: [go, gcc]
|
glx: [mesa+glx, mesa18+glx, opengl]
|
||||||
go-or-gccgo-bootstrap: [go-bootstrap, gcc]
|
golang: [gcc]
|
||||||
iconv: [libiconv]
|
iconv: [libiconv]
|
||||||
ipp: [intel-oneapi-ipp]
|
ipp: [intel-ipp]
|
||||||
java: [openjdk, jdk, ibm-java]
|
java: [openjdk, jdk, ibm-java]
|
||||||
jpeg: [libjpeg-turbo, libjpeg]
|
jpeg: [libjpeg-turbo, libjpeg]
|
||||||
lapack: [openblas, amdlibflame]
|
lapack: [openblas, amdlibflame]
|
||||||
libc: [glibc, musl]
|
libllvm: [llvm, llvm-amdgpu]
|
||||||
libgfortran: [gcc-runtime]
|
|
||||||
libglx: [mesa+glx]
|
|
||||||
libifcore: [intel-oneapi-runtime]
|
|
||||||
libllvm: [llvm]
|
|
||||||
lua-lang: [lua, lua-luajit-openresty, lua-luajit]
|
lua-lang: [lua, lua-luajit-openresty, lua-luajit]
|
||||||
luajit: [lua-luajit-openresty, lua-luajit]
|
luajit: [lua-luajit-openresty, lua-luajit]
|
||||||
mariadb-client: [mariadb-c-client, mariadb]
|
mariadb-client: [mariadb-c-client, mariadb]
|
||||||
mkl: [intel-oneapi-mkl]
|
mkl: [intel-mkl]
|
||||||
mpe: [mpe2]
|
mpe: [mpe2]
|
||||||
mpi: [openmpi, mpich]
|
mpi: [openmpi, mpich]
|
||||||
mysql-client: [mysql, mariadb-c-client]
|
mysql-client: [mysql, mariadb-c-client]
|
||||||
opencl: [pocl]
|
opencl: [pocl]
|
||||||
onedal: [intel-oneapi-dal]
|
onedal: [intel-oneapi-dal]
|
||||||
|
osmesa: [mesa+osmesa, mesa18+osmesa]
|
||||||
pbs: [openpbs, torque]
|
pbs: [openpbs, torque]
|
||||||
pil: [py-pillow]
|
pil: [py-pillow]
|
||||||
pkgconfig: [pkgconf, pkg-config]
|
pkgconfig: [pkgconf, pkg-config]
|
||||||
qmake: [qt-base, qt]
|
|
||||||
rpc: [libtirpc]
|
rpc: [libtirpc]
|
||||||
scalapack: [netlib-scalapack, amdscalapack]
|
scalapack: [netlib-scalapack, amdscalapack]
|
||||||
sycl: [hipsycl]
|
sycl: [hipsycl]
|
||||||
@@ -64,24 +55,9 @@ packages:
|
|||||||
tbb: [intel-tbb]
|
tbb: [intel-tbb]
|
||||||
unwind: [libunwind]
|
unwind: [libunwind]
|
||||||
uuid: [util-linux-uuid, libuuid]
|
uuid: [util-linux-uuid, libuuid]
|
||||||
wasi-sdk: [wasi-sdk-prebuilt]
|
|
||||||
xkbdata-api: [xkeyboard-config, xkbdata]
|
|
||||||
xxd: [xxd-standalone, vim]
|
xxd: [xxd-standalone, vim]
|
||||||
yacc: [bison, byacc]
|
yacc: [bison, byacc]
|
||||||
ziglang: [zig]
|
ziglang: [zig]
|
||||||
zlib-api: [zlib-ng+compat, zlib]
|
|
||||||
permissions:
|
permissions:
|
||||||
read: world
|
read: world
|
||||||
write: user
|
write: user
|
||||||
cray-mpich:
|
|
||||||
buildable: false
|
|
||||||
cray-mvapich2:
|
|
||||||
buildable: false
|
|
||||||
egl:
|
|
||||||
buildable: false
|
|
||||||
fujitsu-mpi:
|
|
||||||
buildable: false
|
|
||||||
hpcx-mpi:
|
|
||||||
buildable: false
|
|
||||||
spectrum-mpi:
|
|
||||||
buildable: false
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
config:
|
config:
|
||||||
locks: false
|
locks: false
|
||||||
|
concretizer: original
|
||||||
build_stage::
|
build_stage::
|
||||||
- '$spack/.staging'
|
- '$spack/.staging'
|
||||||
stage_name: '{name}-{version}-{hash:7}'
|
|
||||||
|
@@ -1,22 +0,0 @@
|
|||||||
# -------------------------------------------------------------------------
|
|
||||||
# This file controls default concretization preferences for Spack.
|
|
||||||
#
|
|
||||||
# Settings here are versioned with Spack and are intended to provide
|
|
||||||
# sensible defaults out of the box. Spack maintainers should edit this
|
|
||||||
# file to keep it current.
|
|
||||||
#
|
|
||||||
# Users can override these settings by editing the following files.
|
|
||||||
#
|
|
||||||
# Per-spack-instance settings (overrides defaults):
|
|
||||||
# $SPACK_ROOT/etc/spack/packages.yaml
|
|
||||||
#
|
|
||||||
# Per-user settings (overrides default and site settings):
|
|
||||||
# ~/.spack/packages.yaml
|
|
||||||
# -------------------------------------------------------------------------
|
|
||||||
packages:
|
|
||||||
all:
|
|
||||||
compiler:
|
|
||||||
- msvc
|
|
||||||
providers:
|
|
||||||
mpi: [msmpi]
|
|
||||||
gl: [wgl]
|
|
2
lib/spack/docs/.gitignore
vendored
2
lib/spack/docs/.gitignore
vendored
@@ -1,7 +1,7 @@
|
|||||||
|
package_list.html
|
||||||
command_index.rst
|
command_index.rst
|
||||||
spack*.rst
|
spack*.rst
|
||||||
llnl*.rst
|
llnl*.rst
|
||||||
_build
|
_build
|
||||||
.spack-env
|
.spack-env
|
||||||
spack.lock
|
spack.lock
|
||||||
_spack_root
|
|
||||||
|
@@ -1,15 +0,0 @@
|
|||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
# We use our own extension of the default style with a few modifications
|
|
||||||
from pygments.styles.default import DefaultStyle
|
|
||||||
from pygments.token import Generic
|
|
||||||
|
|
||||||
|
|
||||||
class SpackStyle(DefaultStyle):
|
|
||||||
styles = DefaultStyle.styles.copy()
|
|
||||||
background_color = "#f4f4f8"
|
|
||||||
styles[Generic.Output] = "#355"
|
|
||||||
styles[Generic.Prompt] = "bold #346ec9"
|
|
1
lib/spack/docs/_spack_root
Symbolic link
1
lib/spack/docs/_spack_root
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../..
|
12
lib/spack/docs/_templates/layout.html
vendored
12
lib/spack/docs/_templates/layout.html
vendored
@@ -1,12 +0,0 @@
|
|||||||
{% extends "!layout.html" %}
|
|
||||||
|
|
||||||
{%- block extrahead %}
|
|
||||||
<!-- Google tag (gtag.js) -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-S0PQ7WV75K"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag(){dataLayer.push(arguments);}
|
|
||||||
gtag('js', new Date());
|
|
||||||
gtag('config', 'G-S0PQ7WV75K');
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
162
lib/spack/docs/analyze.rst
Normal file
162
lib/spack/docs/analyze.rst
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
.. _analyze:
|
||||||
|
|
||||||
|
=======
|
||||||
|
Analyze
|
||||||
|
=======
|
||||||
|
|
||||||
|
|
||||||
|
The analyze command is a front-end to various tools that let us analyze
|
||||||
|
package installations. Each analyzer is a module for a different kind
|
||||||
|
of analysis that can be done on a package installation, including (but not
|
||||||
|
limited to) binary, log, or text analysis. Thus, the analyze command group
|
||||||
|
allows you to take an existing package install, choose an analyzer,
|
||||||
|
and extract some output for the package using it.
|
||||||
|
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
Analyzer Metadata
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
For all analyzers, we write to an ``analyzers`` folder in ``~/.spack``, or the
|
||||||
|
value that you specify in your spack config at ``config:analyzers_dir``.
|
||||||
|
For example, here we see the results of running an analysis on zlib:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ tree ~/.spack/analyzers/
|
||||||
|
└── linux-ubuntu20.04-skylake
|
||||||
|
└── gcc-9.3.0
|
||||||
|
└── zlib-1.2.11-sl7m27mzkbejtkrajigj3a3m37ygv4u2
|
||||||
|
├── environment_variables
|
||||||
|
│ └── spack-analyzer-environment-variables.json
|
||||||
|
├── install_files
|
||||||
|
│ └── spack-analyzer-install-files.json
|
||||||
|
└── libabigail
|
||||||
|
└── spack-analyzer-libabigail-libz.so.1.2.11.xml
|
||||||
|
|
||||||
|
|
||||||
|
This means that you can always find analyzer output in this folder, and it
|
||||||
|
is organized with the same logic as the package install it was run for.
|
||||||
|
If you want to customize this top level folder, simply provide the ``--path``
|
||||||
|
argument to ``spack analyze run``. The nested organization will be maintained
|
||||||
|
within your custom root.
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
Listing Analyzers
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
If you aren't familiar with Spack's analyzers, you can quickly list those that
|
||||||
|
are available:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze list-analyzers
|
||||||
|
install_files : install file listing read from install_manifest.json
|
||||||
|
environment_variables : environment variables parsed from spack-build-env.txt
|
||||||
|
config_args : config args loaded from spack-configure-args.txt
|
||||||
|
libabigail : Application Binary Interface (ABI) features for objects
|
||||||
|
|
||||||
|
|
||||||
|
In the above, the first three are fairly simple - parsing metadata files from
|
||||||
|
a package install directory to save
|
||||||
|
|
||||||
|
-------------------
|
||||||
|
Analyzing a Package
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The analyze command, akin to install, will accept a package spec to perform
|
||||||
|
an analysis for. The package must be installed. Let's walk through an example
|
||||||
|
with zlib. We first ask to analyze it. However, since we have more than one
|
||||||
|
install, we are asked to disambiguate:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze run zlib
|
||||||
|
==> Error: zlib matches multiple packages.
|
||||||
|
Matching packages:
|
||||||
|
fz2bs56 zlib@1.2.11%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
|
||||||
|
sl7m27m zlib@1.2.11%gcc@9.3.0 arch=linux-ubuntu20.04-skylake
|
||||||
|
Use a more specific spec.
|
||||||
|
|
||||||
|
|
||||||
|
We can then specify the spec version that we want to analyze:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze run zlib/fz2bs56
|
||||||
|
|
||||||
|
If you don't provide any specific analyzer names, by default all analyzers
|
||||||
|
(shown in the ``list-analyzers`` subcommand list) will be run. If an analyzer does not
|
||||||
|
have any result, it will be skipped. For example, here is a result running for
|
||||||
|
zlib:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ ls ~/.spack/analyzers/linux-ubuntu20.04-skylake/gcc-9.3.0/zlib-1.2.11-sl7m27mzkbejtkrajigj3a3m37ygv4u2/
|
||||||
|
spack-analyzer-environment-variables.json
|
||||||
|
spack-analyzer-install-files.json
|
||||||
|
spack-analyzer-libabigail-libz.so.1.2.11.xml
|
||||||
|
|
||||||
|
If you want to run a specific analyzer, ask for it with `--analyzer`. Here we run
|
||||||
|
spack analyze on libabigail (already installed) _using_ libabigail1
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze run --analyzer abigail libabigail
|
||||||
|
|
||||||
|
|
||||||
|
.. _analyze_monitoring:
|
||||||
|
|
||||||
|
----------------------
|
||||||
|
Monitoring An Analysis
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
For any kind of analysis, you can
|
||||||
|
use a `spack monitor <https://github.com/spack/spack-monitor>`_ "Spackmon"
|
||||||
|
as a server to upload the same run metadata to. You can
|
||||||
|
follow the instructions in the `spack monitor documentation <https://spack-monitor.readthedocs.org>`_
|
||||||
|
to first create a server along with a username and token for yourself.
|
||||||
|
You can then use this guide to interact with the server.
|
||||||
|
|
||||||
|
You should first export our spack monitor token and username to the environment:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ export SPACKMON_TOKEN=50445263afd8f67e59bd79bff597836ee6c05438
|
||||||
|
$ export SPACKMON_USER=spacky
|
||||||
|
|
||||||
|
|
||||||
|
By default, the host for your server is expected to be at ``http://127.0.0.1``
|
||||||
|
with a prefix of ``ms1``, and if this is the case, you can simply add the
|
||||||
|
``--monitor`` flag to the install command:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze run --monitor wget
|
||||||
|
|
||||||
|
If you need to customize the host or the prefix, you can do that as well:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze run --monitor --monitor-prefix monitor --monitor-host https://monitor-service.io wget
|
||||||
|
|
||||||
|
If your server doesn't have authentication, you can skip it:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze run --monitor --monitor-disable-auth wget
|
||||||
|
|
||||||
|
Regardless of your choice, when you run analyze on an installed package (whether
|
||||||
|
it was installed with ``--monitor`` or not, you'll see the results generating as they did
|
||||||
|
before, and a message that the monitor server was pinged:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack analyze --monitor wget
|
||||||
|
...
|
||||||
|
==> Sending result for wget bin/wget to monitor.
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -44,8 +45,7 @@ Listing available packages
|
|||||||
|
|
||||||
To install software with Spack, you need to know what software is
|
To install software with Spack, you need to know what software is
|
||||||
available. You can see a list of available package names at the
|
available. You can see a list of available package names at the
|
||||||
`packages.spack.io <https://packages.spack.io>`_ website, or
|
:ref:`package-list` webpage, or using the ``spack list`` command.
|
||||||
using the ``spack list`` command.
|
|
||||||
|
|
||||||
.. _cmd-spack-list:
|
.. _cmd-spack-list:
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ can install:
|
|||||||
:ellipsis: 10
|
:ellipsis: 10
|
||||||
|
|
||||||
There are thousands of them, so we've truncated the output above, but you
|
There are thousands of them, so we've truncated the output above, but you
|
||||||
can find a `full list here <https://packages.spack.io>`_.
|
can find a :ref:`full list here <package-list>`.
|
||||||
Packages are listed by name in alphabetical order.
|
Packages are listed by name in alphabetical order.
|
||||||
A pattern to match with no wildcards, ``*`` or ``?``,
|
A pattern to match with no wildcards, ``*`` or ``?``,
|
||||||
will be treated as though it started and ended with
|
will be treated as though it started and ended with
|
||||||
@@ -85,7 +85,7 @@ All packages whose names or descriptions contain documentation:
|
|||||||
To get more information on a particular package from `spack list`, use
|
To get more information on a particular package from `spack list`, use
|
||||||
`spack info`. Just supply the name of a package:
|
`spack info`. Just supply the name of a package:
|
||||||
|
|
||||||
.. command-output:: spack info --all mpich
|
.. command-output:: spack info mpich
|
||||||
|
|
||||||
Most of the information is self-explanatory. The *safe versions* are
|
Most of the information is self-explanatory. The *safe versions* are
|
||||||
versions that Spack knows the checksum for, and it will use the
|
versions that Spack knows the checksum for, and it will use the
|
||||||
@@ -864,7 +864,7 @@ There are several different ways to use Spack packages once you have
|
|||||||
installed them. As you've seen, spack packages are installed into long
|
installed them. As you've seen, spack packages are installed into long
|
||||||
paths with hashes, and you need a way to get them into your path. The
|
paths with hashes, and you need a way to get them into your path. The
|
||||||
easiest way is to use :ref:`spack load <cmd-spack-load>`, which is
|
easiest way is to use :ref:`spack load <cmd-spack-load>`, which is
|
||||||
described in this section.
|
described in the next section.
|
||||||
|
|
||||||
Some more advanced ways to use Spack packages include:
|
Some more advanced ways to use Spack packages include:
|
||||||
|
|
||||||
@@ -896,8 +896,8 @@ your path:
|
|||||||
$ which mpicc
|
$ which mpicc
|
||||||
~/spack/opt/linux-debian7-x86_64/gcc@4.4.7/mpich@3.0.4/bin/mpicc
|
~/spack/opt/linux-debian7-x86_64/gcc@4.4.7/mpich@3.0.4/bin/mpicc
|
||||||
|
|
||||||
These commands will add appropriate directories to your ``PATH``
|
These commands will add appropriate directories to your ``PATH``,
|
||||||
and ``MANPATH`` according to the
|
``MANPATH``, ``CPATH``, and ``LD_LIBRARY_PATH`` according to the
|
||||||
:ref:`prefix inspections <customize-env-modifications>` defined in your
|
:ref:`prefix inspections <customize-env-modifications>` defined in your
|
||||||
modules configuration.
|
modules configuration.
|
||||||
When you no longer want to use a package, you can type unload or
|
When you no longer want to use a package, you can type unload or
|
||||||
@@ -942,7 +942,7 @@ first ``libelf`` above, you would run:
|
|||||||
|
|
||||||
$ spack load /qmm4kso
|
$ spack load /qmm4kso
|
||||||
|
|
||||||
To see which packages that you have loaded to your environment you would
|
To see which packages that you have loaded to your enviornment you would
|
||||||
use ``spack find --loaded``.
|
use ``spack find --loaded``.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
@@ -958,86 +958,7 @@ use ``spack find --loaded``.
|
|||||||
You can also use ``spack load --list`` to get the same output, but it
|
You can also use ``spack load --list`` to get the same output, but it
|
||||||
does not have the full set of query options that ``spack find`` offers.
|
does not have the full set of query options that ``spack find`` offers.
|
||||||
|
|
||||||
We'll learn more about Spack's spec syntax in :ref:`a later section <sec-specs>`.
|
We'll learn more about Spack's spec syntax in the next section.
|
||||||
|
|
||||||
|
|
||||||
.. _extensions:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
Python packages and virtual environments
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
Spack can install a large number of Python packages. Their names are
|
|
||||||
typically prefixed with ``py-``. Installing and using them is no
|
|
||||||
different from any other package:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack install py-numpy
|
|
||||||
$ spack load py-numpy
|
|
||||||
$ python3
|
|
||||||
>>> import numpy
|
|
||||||
|
|
||||||
The ``spack load`` command sets the ``PATH`` variable so that the right Python
|
|
||||||
executable is used, and makes sure that ``numpy`` and its dependencies can be
|
|
||||||
located in the ``PYTHONPATH``.
|
|
||||||
|
|
||||||
Spack is different from other Python package managers in that it installs
|
|
||||||
every package into its *own* prefix. This is in contrast to ``pip``, which
|
|
||||||
installs all packages into the same prefix, be it in a virtual environment
|
|
||||||
or not.
|
|
||||||
|
|
||||||
For many users, **virtual environments** are more convenient than repeated
|
|
||||||
``spack load`` commands, particularly when working with multiple Python
|
|
||||||
packages. Fortunately Spack supports environments itself, which together
|
|
||||||
with a view are no different from Python virtual environments.
|
|
||||||
|
|
||||||
The recommended way of working with Python extensions such as ``py-numpy``
|
|
||||||
is through :ref:`Environments <environments>`. The following example creates
|
|
||||||
a Spack environment with ``numpy`` in the current working directory. It also
|
|
||||||
puts a filesystem view in ``./view``, which is a more traditional combined
|
|
||||||
prefix for all packages in the environment.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack env create --with-view view --dir .
|
|
||||||
$ spack -e . add py-numpy
|
|
||||||
$ spack -e . concretize
|
|
||||||
$ spack -e . install
|
|
||||||
|
|
||||||
Now you can activate the environment and start using the packages:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack env activate .
|
|
||||||
$ python3
|
|
||||||
>>> import numpy
|
|
||||||
|
|
||||||
The environment view is also a virtual environment, which is useful if you are
|
|
||||||
sharing the environment with others who are unfamiliar with Spack. They can
|
|
||||||
either use the Python executable directly:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ ./view/bin/python3
|
|
||||||
>>> import numpy
|
|
||||||
|
|
||||||
or use the activation script:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ source ./view/bin/activate
|
|
||||||
$ python3
|
|
||||||
>>> import numpy
|
|
||||||
|
|
||||||
In general, there should not be much difference between ``spack env activate``
|
|
||||||
and using the virtual environment. The main advantage of ``spack env activate``
|
|
||||||
is that it knows about more packages than just Python packages, and it may set
|
|
||||||
additional runtime variables that are not covered by the virtual environment
|
|
||||||
activation script.
|
|
||||||
|
|
||||||
See :ref:`environments` for a more in-depth description of Spack
|
|
||||||
environments and customizations to views.
|
|
||||||
|
|
||||||
|
|
||||||
.. _sec-specs:
|
.. _sec-specs:
|
||||||
@@ -1077,15 +998,11 @@ More formally, a spec consists of the following pieces:
|
|||||||
* ``%`` Optional compiler specifier, with an optional compiler version
|
* ``%`` Optional compiler specifier, with an optional compiler version
|
||||||
(``gcc`` or ``gcc@4.7.3``)
|
(``gcc`` or ``gcc@4.7.3``)
|
||||||
* ``+`` or ``-`` or ``~`` Optional variant specifiers (``+debug``,
|
* ``+`` or ``-`` or ``~`` Optional variant specifiers (``+debug``,
|
||||||
``-qt``, or ``~qt``) for boolean variants. Use ``++`` or ``--`` or
|
``-qt``, or ``~qt``) for boolean variants
|
||||||
``~~`` to propagate variants through the dependencies (``++debug``,
|
|
||||||
``--qt``, or ``~~qt``).
|
|
||||||
* ``name=<value>`` Optional variant specifiers that are not restricted to
|
* ``name=<value>`` Optional variant specifiers that are not restricted to
|
||||||
boolean variants. Use ``name==<value>`` to propagate variant through the
|
boolean variants
|
||||||
dependencies.
|
|
||||||
* ``name=<value>`` Optional compiler flag specifiers. Valid flag names are
|
* ``name=<value>`` Optional compiler flag specifiers. Valid flag names are
|
||||||
``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``.
|
``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``.
|
||||||
Use ``name==<value>`` to propagate compiler flags through the dependencies.
|
|
||||||
* ``target=<value> os=<value>`` Optional architecture specifier
|
* ``target=<value> os=<value>`` Optional architecture specifier
|
||||||
(``target=haswell os=CNL10``)
|
(``target=haswell os=CNL10``)
|
||||||
* ``^`` Dependency specs (``^callpath@1.1``)
|
* ``^`` Dependency specs (``^callpath@1.1``)
|
||||||
@@ -1174,93 +1091,28 @@ unspecified version, but packages can depend on other packages with
|
|||||||
could depend on ``mpich@1.2:`` if it can only build with version
|
could depend on ``mpich@1.2:`` if it can only build with version
|
||||||
``1.2`` or higher of ``mpich``.
|
``1.2`` or higher of ``mpich``.
|
||||||
|
|
||||||
.. note:: Windows Spec Syntax Caveats
|
|
||||||
Windows has a few idiosyncrasies when it comes to the Spack spec syntax and the use of certain shells
|
|
||||||
Spack's spec dependency syntax uses the carat (``^``) character, however this is an escape string in CMD
|
|
||||||
so it must be escaped with an additional carat (i.e. ``^^``).
|
|
||||||
CMD also will attempt to interpret strings with ``=`` characters in them. Any spec including this symbol
|
|
||||||
must double quote the string.
|
|
||||||
|
|
||||||
Note: All of these issues are unique to CMD, they can be avoided by using Powershell.
|
|
||||||
|
|
||||||
For more context on these caveats see the related issues: `carat <https://github.com/spack/spack/issues/42833>`_ and `equals <https://github.com/spack/spack/issues/43348>`_
|
|
||||||
|
|
||||||
Below are more details about the specifiers that you can add to specs.
|
Below are more details about the specifiers that you can add to specs.
|
||||||
|
|
||||||
.. _version-specifier:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^
|
||||||
Version specifier
|
Version specifier
|
||||||
^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
A version specifier ``pkg@<specifier>`` comes after a package name
|
A version specifier comes somewhere after a package name and starts
|
||||||
and starts with ``@``. It can be something abstract that matches
|
with ``@``. It can be a single version, e.g. ``@1.0``, ``@3``, or
|
||||||
multiple known versions, or a specific version. During concretization,
|
``@1.2a7``. Or, it can be a range of versions, such as ``@1.0:1.5``
|
||||||
Spack will pick the optimal version within the spec's constraints
|
(all versions between ``1.0`` and ``1.5``, inclusive). Version ranges
|
||||||
according to policies set for the particular Spack installation.
|
can be open, e.g. ``:3`` means any version up to and including ``3``.
|
||||||
|
This would include ``3.4`` and ``3.4.2``. ``4.2:`` means any version
|
||||||
|
above and including ``4.2``. Finally, a version specifier can be a
|
||||||
|
set of arbitrary versions, such as ``@1.0,1.5,1.7`` (``1.0``, ``1.5``,
|
||||||
|
or ``1.7``). When you supply such a specifier to ``spack install``,
|
||||||
|
it constrains the set of versions that Spack will install.
|
||||||
|
|
||||||
The version specifier can be *a specific version*, such as ``@=1.0.0`` or
|
If the version spec is not provided, then Spack will choose one
|
||||||
``@=1.2a7``. Or, it can be *a range of versions*, such as ``@1.0:1.5``.
|
according to policies set for the particular spack installation. If
|
||||||
Version ranges are inclusive, so this example includes both ``1.0``
|
the spec is ambiguous, i.e. it could match multiple versions, Spack
|
||||||
and any ``1.5.x`` version. Version ranges can be unbounded, e.g. ``@:3``
|
will choose a version within the spec's constraints according to
|
||||||
means any version up to and including ``3``. This would include ``3.4``
|
policies set for the particular Spack installation.
|
||||||
and ``3.4.2``. Similarly, ``@4.2:`` means any version above and including
|
|
||||||
``4.2``. As a short-hand, ``@3`` is equivalent to the range ``@3:3`` and
|
|
||||||
includes any version with major version ``3``.
|
|
||||||
|
|
||||||
Versions are ordered lexicograpically by its components. For more details
|
|
||||||
on the order, see :ref:`the packaging guide <version-comparison>`.
|
|
||||||
|
|
||||||
Notice that you can distinguish between the specific version ``@=3.2`` and
|
|
||||||
the range ``@3.2``. This is useful for packages that follow a versioning
|
|
||||||
scheme that omits the zero patch version number: ``3.2``, ``3.2.1``,
|
|
||||||
``3.2.2``, etc. In general it is preferable to use the range syntax
|
|
||||||
``@3.2``, since ranges also match versions with one-off suffixes, such as
|
|
||||||
``3.2-custom``.
|
|
||||||
|
|
||||||
A version specifier can also be a list of ranges and specific versions,
|
|
||||||
separated by commas. For example, ``@1.0:1.5,=1.7.1`` matches any version
|
|
||||||
in the range ``1.0:1.5`` and the specific version ``1.7.1``.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^
|
|
||||||
Git versions
|
|
||||||
^^^^^^^^^^^^
|
|
||||||
|
|
||||||
For packages with a ``git`` attribute, ``git`` references
|
|
||||||
may be specified instead of a numerical version i.e. branches, tags
|
|
||||||
and commits. Spack will stage and build based off the ``git``
|
|
||||||
reference provided. Acceptable syntaxes for this are:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
# commit hashes
|
|
||||||
foo@abcdef1234abcdef1234abcdef1234abcdef1234 # 40 character hashes are automatically treated as git commits
|
|
||||||
foo@git.abcdef1234abcdef1234abcdef1234abcdef1234
|
|
||||||
|
|
||||||
# branches and tags
|
|
||||||
foo@git.develop # use the develop branch
|
|
||||||
foo@git.0.19 # use the 0.19 tag
|
|
||||||
|
|
||||||
Spack always needs to associate a Spack version with the git reference,
|
|
||||||
which is used for version comparison. This Spack version is heuristically
|
|
||||||
taken from the closest valid git tag among ancestors of the git ref.
|
|
||||||
|
|
||||||
Once a Spack version is associated with a git ref, it always printed with
|
|
||||||
the git ref. For example, if the commit ``@git.abcdefg`` is tagged
|
|
||||||
``0.19``, then the spec will be shown as ``@git.abcdefg=0.19``.
|
|
||||||
|
|
||||||
If the git ref is not exactly a tag, then the distance to the nearest tag
|
|
||||||
is also part of the resolved version. ``@git.abcdefg=0.19.git.8`` means
|
|
||||||
that the commit is 8 commits away from the ``0.19`` tag.
|
|
||||||
|
|
||||||
In cases where Spack cannot resolve a sensible version from a git ref,
|
|
||||||
users can specify the Spack version to use for the git ref. This is done
|
|
||||||
by appending ``=`` and the Spack version to the git ref. For example:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
foo@git.my_ref=3.2 # use the my_ref tag or branch, but treat it as version 3.2 for version comparisons
|
|
||||||
foo@git.abcdef1234abcdef1234abcdef1234abcdef1234=develop # use the given commit, but treat it as develop for version comparisons
|
|
||||||
|
|
||||||
Details about how versions are compared and how Spack determines if
|
Details about how versions are compared and how Spack determines if
|
||||||
one version is less than another are discussed in the developer guide.
|
one version is less than another are discussed in the developer guide.
|
||||||
@@ -1341,27 +1193,6 @@ variants using the backwards compatibility syntax and uses only ``~``
|
|||||||
for disabled boolean variants. The ``-`` and spaces on the command
|
for disabled boolean variants. The ``-`` and spaces on the command
|
||||||
line are provided for convenience and legibility.
|
line are provided for convenience and legibility.
|
||||||
|
|
||||||
Spack allows variants to propagate their value to the package's
|
|
||||||
dependency by using ``++``, ``--``, and ``~~`` for boolean variants.
|
|
||||||
For example, for a ``debug`` variant:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
mpileaks ++debug # enabled debug will be propagated to dependencies
|
|
||||||
mpileaks +debug # only mpileaks will have debug enabled
|
|
||||||
|
|
||||||
To propagate the value of non-boolean variants Spack uses ``name==value``.
|
|
||||||
For example, for the ``stackstart`` variant:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
mpileaks stackstart==4 # variant will be propagated to dependencies
|
|
||||||
mpileaks stackstart=4 # only mpileaks will have this variant value
|
|
||||||
|
|
||||||
Spack also allows variants to be propagated from a package that does
|
|
||||||
not have that variant.
|
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
Compiler Flags
|
Compiler Flags
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
@@ -1369,15 +1200,10 @@ Compiler Flags
|
|||||||
Compiler flags are specified using the same syntax as non-boolean variants,
|
Compiler flags are specified using the same syntax as non-boolean variants,
|
||||||
but fulfill a different purpose. While the function of a variant is set by
|
but fulfill a different purpose. While the function of a variant is set by
|
||||||
the package, compiler flags are used by the compiler wrappers to inject
|
the package, compiler flags are used by the compiler wrappers to inject
|
||||||
flags into the compile line of the build. Additionally, compiler flags can
|
flags into the compile line of the build. Additionally, compiler flags are
|
||||||
be inherited by dependencies by using ``==``.
|
inherited by dependencies. ``spack install libdwarf cppflags="-g"`` will
|
||||||
``spack install libdwarf cppflags=="-g"`` will install both libdwarf and
|
install both libdwarf and libelf with the ``-g`` flag injected into their
|
||||||
libelf with the ``-g`` flag injected into their compile line.
|
compile line.
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
versions of spack prior to 0.19.0 will propagate compiler flags using
|
|
||||||
the ``=`` syntax.
|
|
||||||
|
|
||||||
Notice that the value of the compiler flags must be quoted if it
|
Notice that the value of the compiler flags must be quoted if it
|
||||||
contains any spaces. Any of ``cppflags=-O3``, ``cppflags="-O3"``,
|
contains any spaces. Any of ``cppflags=-O3``, ``cppflags="-O3"``,
|
||||||
@@ -1447,12 +1273,22 @@ the reserved keywords ``platform``, ``os`` and ``target``:
|
|||||||
$ spack install libelf os=ubuntu18.04
|
$ spack install libelf os=ubuntu18.04
|
||||||
$ spack install libelf target=broadwell
|
$ spack install libelf target=broadwell
|
||||||
|
|
||||||
|
or together by using the reserved keyword ``arch``:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack install libelf arch=cray-CNL10-haswell
|
||||||
|
|
||||||
Normally users don't have to bother specifying the architecture if they
|
Normally users don't have to bother specifying the architecture if they
|
||||||
are installing software for their current host, as in that case the
|
are installing software for their current host, as in that case the
|
||||||
values will be detected automatically. If you need fine-grained control
|
values will be detected automatically. If you need fine-grained control
|
||||||
over which packages use which targets (or over *all* packages' default
|
over which packages use which targets (or over *all* packages' default
|
||||||
target), see :ref:`package-preferences`.
|
target), see :ref:`package-preferences`.
|
||||||
|
|
||||||
|
.. admonition:: Cray machines
|
||||||
|
|
||||||
|
The situation is a little bit different for Cray machines and a detailed
|
||||||
|
explanation on how the architecture can be set on them can be found at :ref:`cray-support`
|
||||||
|
|
||||||
.. _support-for-microarchitectures:
|
.. _support-for-microarchitectures:
|
||||||
|
|
||||||
@@ -1569,7 +1405,7 @@ built.
|
|||||||
You can see what virtual packages a particular package provides by
|
You can see what virtual packages a particular package provides by
|
||||||
getting info on it:
|
getting info on it:
|
||||||
|
|
||||||
.. command-output:: spack info --virtuals mpich
|
.. command-output:: spack info mpich
|
||||||
|
|
||||||
Spack is unique in that its virtual packages can be versioned, just
|
Spack is unique in that its virtual packages can be versioned, just
|
||||||
like regular packages. A particular version of a package may provide
|
like regular packages. A particular version of a package may provide
|
||||||
@@ -1616,30 +1452,6 @@ any MPI implementation will do. If another package depends on
|
|||||||
error. Likewise, if you try to plug in some package that doesn't
|
error. Likewise, if you try to plug in some package that doesn't
|
||||||
provide MPI, Spack will raise an error.
|
provide MPI, Spack will raise an error.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
Explicit binding of virtual dependencies
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
There are packages that provide more than just one virtual dependency. When interacting with them, users
|
|
||||||
might want to utilize just a subset of what they could provide, and use other providers for virtuals they
|
|
||||||
need.
|
|
||||||
|
|
||||||
It is possible to be more explicit and tell Spack which dependency should provide which virtual, using a
|
|
||||||
special syntax:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack spec strumpack ^[virtuals=mpi] intel-parallel-studio+mkl ^[virtuals=lapack] openblas
|
|
||||||
|
|
||||||
Concretizing the spec above produces the following DAG:
|
|
||||||
|
|
||||||
.. figure:: images/strumpack_virtuals.svg
|
|
||||||
:scale: 60 %
|
|
||||||
:align: center
|
|
||||||
|
|
||||||
where ``intel-parallel-studio`` *could* provide ``mpi``, ``lapack``, and ``blas`` but is used only for the former. The ``lapack``
|
|
||||||
and ``blas`` dependencies are satisfied by ``openblas``.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Specifying Specs by Hash
|
Specifying Specs by Hash
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -1788,6 +1600,247 @@ check only local packages (as opposed to those used transparently from
|
|||||||
``upstream`` spack instances) and the ``-j,--json`` option to output
|
``upstream`` spack instances) and the ``-j,--json`` option to output
|
||||||
machine-readable json data for any errors.
|
machine-readable json data for any errors.
|
||||||
|
|
||||||
|
|
||||||
|
.. _extensions:
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
Extensions & Python support
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Spack's installation model assumes that each package will live in its
|
||||||
|
own install prefix. However, certain packages are typically installed
|
||||||
|
*within* the directory hierarchy of other packages. For example,
|
||||||
|
`Python <https://www.python.org>`_ packages are typically installed in the
|
||||||
|
``$prefix/lib/python-2.7/site-packages`` directory.
|
||||||
|
|
||||||
|
Spack has support for this type of installation as well. In Spack,
|
||||||
|
a package that can live inside the prefix of another package is called
|
||||||
|
an *extension*. Suppose you have Python installed like so:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack find python
|
||||||
|
==> 1 installed packages.
|
||||||
|
-- linux-debian7-x86_64 / gcc@4.4.7 --------------------------------
|
||||||
|
python@2.7.8
|
||||||
|
|
||||||
|
.. _cmd-spack-extensions:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
``spack extensions``
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
You can find extensions for your Python installation like this:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack extensions python
|
||||||
|
==> python@2.7.8%gcc@4.4.7 arch=linux-debian7-x86_64-703c7a96
|
||||||
|
==> 36 extensions:
|
||||||
|
geos py-ipython py-pexpect py-pyside py-sip
|
||||||
|
py-basemap py-libxml2 py-pil py-pytz py-six
|
||||||
|
py-biopython py-mako py-pmw py-rpy2 py-sympy
|
||||||
|
py-cython py-matplotlib py-pychecker py-scientificpython py-virtualenv
|
||||||
|
py-dateutil py-mpi4py py-pygments py-scikit-learn
|
||||||
|
py-epydoc py-mx py-pylint py-scipy
|
||||||
|
py-gnuplot py-nose py-pyparsing py-setuptools
|
||||||
|
py-h5py py-numpy py-pyqt py-shiboken
|
||||||
|
|
||||||
|
==> 12 installed:
|
||||||
|
-- linux-debian7-x86_64 / gcc@4.4.7 --------------------------------
|
||||||
|
py-dateutil@2.4.0 py-nose@1.3.4 py-pyside@1.2.2
|
||||||
|
py-dateutil@2.4.0 py-numpy@1.9.1 py-pytz@2014.10
|
||||||
|
py-ipython@2.3.1 py-pygments@2.0.1 py-setuptools@11.3.1
|
||||||
|
py-matplotlib@1.4.2 py-pyparsing@2.0.3 py-six@1.9.0
|
||||||
|
|
||||||
|
==> None activated.
|
||||||
|
|
||||||
|
The extensions are a subset of what's returned by ``spack list``, and
|
||||||
|
they are packages like any other. They are installed into their own
|
||||||
|
prefixes, and you can see this with ``spack find --paths``:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack find --paths py-numpy
|
||||||
|
==> 1 installed packages.
|
||||||
|
-- linux-debian7-x86_64 / gcc@4.4.7 --------------------------------
|
||||||
|
py-numpy@1.9.1 ~/spack/opt/linux-debian7-x86_64/gcc@4.4.7/py-numpy@1.9.1-66733244
|
||||||
|
|
||||||
|
However, even though this package is installed, you cannot use it
|
||||||
|
directly when you run ``python``:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack load python
|
||||||
|
$ python
|
||||||
|
Python 2.7.8 (default, Feb 17 2015, 01:35:25)
|
||||||
|
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
|
||||||
|
Type "help", "copyright", "credits" or "license" for more information.
|
||||||
|
>>> import numpy
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<stdin>", line 1, in <module>
|
||||||
|
ImportError: No module named numpy
|
||||||
|
>>>
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
Using Extensions
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
There are four ways to get ``numpy`` working in Python. The first is
|
||||||
|
to use :ref:`shell-support`. You can simply ``load`` the extension,
|
||||||
|
and it will be added to the ``PYTHONPATH`` in your current shell:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack load python
|
||||||
|
$ spack load py-numpy
|
||||||
|
|
||||||
|
Now ``import numpy`` will succeed for as long as you keep your current
|
||||||
|
session open.
|
||||||
|
The loaded packages can be checked using ``spack find --loaded``
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Loading Extensions via Modules
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Instead of using Spack's environment modification capabilities through
|
||||||
|
the ``spack load`` command, you can load numpy through your
|
||||||
|
environment modules (using ``environment-modules`` or ``lmod``). This
|
||||||
|
will also add the extension to the ``PYTHONPATH`` in your current
|
||||||
|
shell.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ module load <name of numpy module>
|
||||||
|
|
||||||
|
If you do not know the name of the specific numpy module you wish to
|
||||||
|
load, you can use the ``spack module tcl|lmod loads`` command to get
|
||||||
|
the name of the module from the Spack spec.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Activating Extensions in a View
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Another way to use extensions is to create a view, which merges the
|
||||||
|
python installation along with the extensions into a single prefix.
|
||||||
|
See :ref:`configuring_environment_views` for a more in-depth description
|
||||||
|
of views.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Activating Extensions Globally
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
As an alternative to creating a merged prefix with Python and its extensions,
|
||||||
|
and prior to support for views, Spack has provided a means to install the
|
||||||
|
extension into the Spack installation prefix for the extendee. This has
|
||||||
|
typically been useful since extendable packages typically search their own
|
||||||
|
installation path for addons by default.
|
||||||
|
|
||||||
|
Global activations are performed with the ``spack activate`` command:
|
||||||
|
|
||||||
|
.. _cmd-spack-activate:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
``spack activate``
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack activate py-numpy
|
||||||
|
==> Activated extension py-setuptools@11.3.1%gcc@4.4.7 arch=linux-debian7-x86_64-3c74eb69 for python@2.7.8%gcc@4.4.7.
|
||||||
|
==> Activated extension py-nose@1.3.4%gcc@4.4.7 arch=linux-debian7-x86_64-5f70f816 for python@2.7.8%gcc@4.4.7.
|
||||||
|
==> Activated extension py-numpy@1.9.1%gcc@4.4.7 arch=linux-debian7-x86_64-66733244 for python@2.7.8%gcc@4.4.7.
|
||||||
|
|
||||||
|
Several things have happened here. The user requested that
|
||||||
|
``py-numpy`` be activated in the ``python`` installation it was built
|
||||||
|
with. Spack knows that ``py-numpy`` depends on ``py-nose`` and
|
||||||
|
``py-setuptools``, so it activated those packages first. Finally,
|
||||||
|
once all dependencies were activated in the ``python`` installation,
|
||||||
|
``py-numpy`` was activated as well.
|
||||||
|
|
||||||
|
If we run ``spack extensions`` again, we now see the three new
|
||||||
|
packages listed as activated:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack extensions python
|
||||||
|
==> python@2.7.8%gcc@4.4.7 arch=linux-debian7-x86_64-703c7a96
|
||||||
|
==> 36 extensions:
|
||||||
|
geos py-ipython py-pexpect py-pyside py-sip
|
||||||
|
py-basemap py-libxml2 py-pil py-pytz py-six
|
||||||
|
py-biopython py-mako py-pmw py-rpy2 py-sympy
|
||||||
|
py-cython py-matplotlib py-pychecker py-scientificpython py-virtualenv
|
||||||
|
py-dateutil py-mpi4py py-pygments py-scikit-learn
|
||||||
|
py-epydoc py-mx py-pylint py-scipy
|
||||||
|
py-gnuplot py-nose py-pyparsing py-setuptools
|
||||||
|
py-h5py py-numpy py-pyqt py-shiboken
|
||||||
|
|
||||||
|
==> 12 installed:
|
||||||
|
-- linux-debian7-x86_64 / gcc@4.4.7 --------------------------------
|
||||||
|
py-dateutil@2.4.0 py-nose@1.3.4 py-pyside@1.2.2
|
||||||
|
py-dateutil@2.4.0 py-numpy@1.9.1 py-pytz@2014.10
|
||||||
|
py-ipython@2.3.1 py-pygments@2.0.1 py-setuptools@11.3.1
|
||||||
|
py-matplotlib@1.4.2 py-pyparsing@2.0.3 py-six@1.9.0
|
||||||
|
|
||||||
|
==> 3 currently activated:
|
||||||
|
-- linux-debian7-x86_64 / gcc@4.4.7 --------------------------------
|
||||||
|
py-nose@1.3.4 py-numpy@1.9.1 py-setuptools@11.3.1
|
||||||
|
|
||||||
|
Now, when a user runs python, ``numpy`` will be available for import
|
||||||
|
*without* the user having to explicitly load it. ``python@2.7.8`` now
|
||||||
|
acts like a system Python installation with ``numpy`` installed inside
|
||||||
|
of it.
|
||||||
|
|
||||||
|
Spack accomplishes this by symbolically linking the *entire* prefix of
|
||||||
|
the ``py-numpy`` package into the prefix of the ``python`` package. To the
|
||||||
|
python interpreter, it looks like ``numpy`` is installed in the
|
||||||
|
``site-packages`` directory.
|
||||||
|
|
||||||
|
The only limitation of global activation is that you can only have a *single*
|
||||||
|
version of an extension activated at a time. This is because multiple
|
||||||
|
versions of the same extension would conflict if symbolically linked
|
||||||
|
into the same prefix. Users who want a different version of a package
|
||||||
|
can still get it by using environment modules or views, but they will have to
|
||||||
|
explicitly load their preferred version.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
``spack activate --force``
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
If, for some reason, you want to activate a package *without* its
|
||||||
|
dependencies, you can use ``spack activate --force``:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack activate --force py-numpy
|
||||||
|
==> Activated extension py-numpy@1.9.1%gcc@4.4.7 arch=linux-debian7-x86_64-66733244 for python@2.7.8%gcc@4.4.7.
|
||||||
|
|
||||||
|
.. _cmd-spack-deactivate:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
``spack deactivate``
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
We've seen how activating an extension can be used to set up a default
|
||||||
|
version of a Python module. Obviously, you may want to change that at
|
||||||
|
some point. ``spack deactivate`` is the command for this. There are
|
||||||
|
several variants:
|
||||||
|
|
||||||
|
* ``spack deactivate <extension>`` will deactivate a single
|
||||||
|
extension. If another activated extension depends on this one,
|
||||||
|
Spack will warn you and exit with an error.
|
||||||
|
* ``spack deactivate --force <extension>`` deactivates an extension
|
||||||
|
regardless of packages that depend on it.
|
||||||
|
* ``spack deactivate --all <extension>`` deactivates an extension and
|
||||||
|
all of its dependencies. Use ``--force`` to disregard dependents.
|
||||||
|
* ``spack deactivate --all <extendee>`` deactivates *all* activated
|
||||||
|
extensions of a package. For example, to deactivate *all* python
|
||||||
|
extensions, use:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack deactivate --all python
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
Filesystem requirements
|
Filesystem requirements
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -12,47 +13,49 @@ Some sites may encourage users to set up their own test environments
|
|||||||
before carrying out central installations, or some users may prefer to set
|
before carrying out central installations, or some users may prefer to set
|
||||||
up these environments on their own motivation. To reduce the load of
|
up these environments on their own motivation. To reduce the load of
|
||||||
recompiling otherwise identical package specs in different installations,
|
recompiling otherwise identical package specs in different installations,
|
||||||
installed packages can be put into build cache tarballs, pushed to
|
installed packages can be put into build cache tarballs, uploaded to
|
||||||
your Spack mirror and then downloaded and installed by others.
|
your Spack mirror and then downloaded and installed by others.
|
||||||
|
|
||||||
Whenever a mirror provides prebuilt packages, Spack will take these packages
|
|
||||||
into account during concretization and installation, making ``spack install``
|
|
||||||
significantly faster.
|
|
||||||
|
|
||||||
|
--------------------------
|
||||||
|
Creating build cache files
|
||||||
|
--------------------------
|
||||||
|
|
||||||
.. note::
|
A compressed tarball of an installed package is created. Tarballs are created
|
||||||
|
for all of its link and run dependency packages as well. Compressed tarballs are
|
||||||
We use the terms "build cache" and "mirror" often interchangeably. Mirrors
|
signed with gpg and signature and tarball and put in a ``.spack`` file. Optionally,
|
||||||
are used during installation both for sources and prebuilt packages. Build
|
the rpaths (and ids and deps on macOS) can be changed to paths relative to
|
||||||
caches refer to mirrors that provide prebuilt packages.
|
the Spack install tree before the tarball is created.
|
||||||
|
|
||||||
|
|
||||||
----------------------
|
|
||||||
Creating a build cache
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Build caches are created via:
|
Build caches are created via:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack buildcache push <path/url/mirror name> <spec>
|
$ spack buildcache create <spec>
|
||||||
|
|
||||||
This command takes the locally installed spec and its dependencies, and
|
|
||||||
creates tarballs of their install prefixes. It also generates metadata files,
|
|
||||||
signed with GPG. These tarballs and metadata files are then pushed to the
|
|
||||||
provided binary cache, which can be a local directory or a remote URL.
|
|
||||||
|
|
||||||
Here is an example where a build cache is created in a local directory named
|
If you wanted to create a build cache in a local directory, you would provide
|
||||||
"spack-cache", to which we push the "ninja" spec:
|
the ``-d`` argument to target that directory, again also specifying the spec.
|
||||||
|
Here is an example creating a local directory, "spack-cache" and creating
|
||||||
|
build cache files for the "ninja" spec:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack buildcache push ./spack-cache ninja
|
$ mkdir -p ./spack-cache
|
||||||
==> Pushing binary packages to file:///home/spackuser/spack/spack-cache/build_cache
|
$ spack buildcache create -d ./spack-cache ninja
|
||||||
|
==> Buildcache files will be output to file:///home/spackuser/spack/spack-cache/build_cache
|
||||||
|
gpgconf: socketdir is '/run/user/1000/gnupg'
|
||||||
|
gpg: using "E6DF6A8BD43208E4D6F392F23777740B7DBD643D" as default secret key for signing
|
||||||
|
|
||||||
Note that ``ninja`` must be installed locally for this to work.
|
Note that the targeted spec must already be installed. Once you have a build cache,
|
||||||
|
you can add it as a mirror, discussed next.
|
||||||
|
|
||||||
Once you have a build cache, you can add it as a mirror, discussed next.
|
.. warning::
|
||||||
|
|
||||||
|
Spack improved the format used for binary caches in v0.18. The entire v0.18 series
|
||||||
|
will be able to verify and install binary caches both in the new and in the old format.
|
||||||
|
Support for using the old format is expected to end in v0.19, so we advise users to
|
||||||
|
recreate relevant buildcaches using Spack v0.18 or higher.
|
||||||
|
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
Finding or installing build cache files
|
Finding or installing build cache files
|
||||||
@@ -63,10 +66,10 @@ with:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack mirror add <name> <url or path>
|
$ spack mirror add <name> <url>
|
||||||
|
|
||||||
|
|
||||||
Both web URLs and local paths on the filesystem can be specified. In the previous
|
Note that the url can be a web url _or_ a local filesystem location. In the previous
|
||||||
example, you might add the directory "spack-cache" and call it ``mymirror``:
|
example, you might add the directory "spack-cache" and call it ``mymirror``:
|
||||||
|
|
||||||
|
|
||||||
@@ -91,7 +94,7 @@ this new build cache as follows:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack buildcache update-index ./spack-cache
|
$ spack buildcache update-index -d spack-cache/
|
||||||
|
|
||||||
Now you can use list:
|
Now you can use list:
|
||||||
|
|
||||||
@@ -102,38 +105,46 @@ Now you can use list:
|
|||||||
-- linux-ubuntu20.04-skylake / gcc@9.3.0 ------------------------
|
-- linux-ubuntu20.04-skylake / gcc@9.3.0 ------------------------
|
||||||
ninja@1.10.2
|
ninja@1.10.2
|
||||||
|
|
||||||
With ``mymirror`` configured and an index available, Spack will automatically
|
|
||||||
use it during concretization and installation. That means that you can expect
|
Great! So now let's say you have a different spack installation, or perhaps just
|
||||||
``spack install ninja`` to fetch prebuilt packages from the mirror. Let's
|
a different environment for the same one, and you want to install a package from
|
||||||
verify by re-installing ninja:
|
that build cache. Let's first uninstall the actual library "ninja" to see if we can
|
||||||
|
re-install it from the cache.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack uninstall ninja
|
$ spack uninstall ninja
|
||||||
$ spack install ninja
|
|
||||||
==> Installing ninja-1.11.1-yxferyhmrjkosgta5ei6b4lqf6bxbscz
|
|
||||||
==> Fetching file:///home/spackuser/spack/spack-cache/build_cache/linux-ubuntu20.04-skylake-gcc-9.3.0-ninja-1.10.2-yxferyhmrjkosgta5ei6b4lqf6bxbscz.spec.json.sig
|
|
||||||
gpg: Signature made Do 12 Jan 2023 16:01:04 CET
|
|
||||||
gpg: using RSA key 61B82B2B2350E171BD17A1744E3A689061D57BF6
|
|
||||||
gpg: Good signature from "example (GPG created for Spack) <example@example.com>" [ultimate]
|
|
||||||
==> Fetching file:///home/spackuser/spack/spack-cache/build_cache/linux-ubuntu20.04-skylake/gcc-9.3.0/ninja-1.10.2/linux-ubuntu20.04-skylake-gcc-9.3.0-ninja-1.10.2-yxferyhmrjkosgta5ei6b4lqf6bxbscz.spack
|
|
||||||
==> Extracting ninja-1.10.2-yxferyhmrjkosgta5ei6b4lqf6bxbscz from binary cache
|
|
||||||
==> ninja: Successfully installed ninja-1.11.1-yxferyhmrjkosgta5ei6b4lqf6bxbscz
|
|
||||||
Search: 0.00s. Fetch: 0.17s. Install: 0.12s. Total: 0.29s
|
|
||||||
[+] /home/harmen/spack/opt/spack/linux-ubuntu20.04-skylake/gcc-9.3.0/ninja-1.11.1-yxferyhmrjkosgta5ei6b4lqf6bxbscz
|
|
||||||
|
|
||||||
|
|
||||||
It worked! You've just completed a full example of creating a build cache with
|
And now reinstall from the buildcache
|
||||||
a spec of interest, adding it as a mirror, updating its index, listing the contents,
|
|
||||||
and finally, installing from it.
|
|
||||||
|
|
||||||
By default Spack falls back to building from sources when the mirror is not available
|
|
||||||
or when the package is simply not already available. To force Spack to only install
|
|
||||||
prebuilt packages, you can use
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack install --use-buildcache only <package>
|
$ spack buildcache install ninja
|
||||||
|
==> buildcache spec(s) matching ninja
|
||||||
|
==> Fetching file:///home/spackuser/spack/spack-cache/build_cache/linux-ubuntu20.04-skylake/gcc-9.3.0/ninja-1.10.2/linux-ubuntu20.04-skylake-gcc-9.3.0-ninja-1.10.2-i4e5luour7jxdpc3bkiykd4imke3mkym.spack
|
||||||
|
####################################################################################################################################### 100.0%
|
||||||
|
==> Installing buildcache for spec ninja@1.10.2%gcc@9.3.0 arch=linux-ubuntu20.04-skylake
|
||||||
|
gpgconf: socketdir is '/run/user/1000/gnupg'
|
||||||
|
gpg: Signature made Tue 23 Mar 2021 10:16:29 PM MDT
|
||||||
|
gpg: using RSA key E6DF6A8BD43208E4D6F392F23777740B7DBD643D
|
||||||
|
gpg: Good signature from "spackuser (GPG created for Spack) <spackuser@noreply.users.github.com>" [ultimate]
|
||||||
|
|
||||||
|
|
||||||
|
It worked! You've just completed a full example of creating a build cache with
|
||||||
|
a spec of interest, adding it as a mirror, updating it's index, listing the contents,
|
||||||
|
and finally, installing from it.
|
||||||
|
|
||||||
|
|
||||||
|
Note that the above command is intended to install a particular package to a
|
||||||
|
build cache you have created, and not to install a package from a build cache.
|
||||||
|
For the latter, once a mirror is added, by default when you do ``spack install`` the ``--use-cache``
|
||||||
|
flag is set, and you will install a package from a build cache if it is available.
|
||||||
|
If you want to always use the cache, you can do:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack install --cache-only <package>
|
||||||
|
|
||||||
For example, to combine all of the commands above to add the E4S build cache
|
For example, to combine all of the commands above to add the E4S build cache
|
||||||
and then install from it exclusively, you would do:
|
and then install from it exclusively, you would do:
|
||||||
@@ -142,7 +153,7 @@ and then install from it exclusively, you would do:
|
|||||||
|
|
||||||
$ spack mirror add E4S https://cache.e4s.io
|
$ spack mirror add E4S https://cache.e4s.io
|
||||||
$ spack buildcache keys --install --trust
|
$ spack buildcache keys --install --trust
|
||||||
$ spack install --use-buildcache only <package>
|
$ spack install --cache-only <package>
|
||||||
|
|
||||||
We use ``--install`` and ``--trust`` to say that we are installing keys to our
|
We use ``--install`` and ``--trust`` to say that we are installing keys to our
|
||||||
keyring, and trusting all downloaded keys.
|
keyring, and trusting all downloaded keys.
|
||||||
@@ -152,186 +163,18 @@ keyring, and trusting all downloaded keys.
|
|||||||
List of popular build caches
|
List of popular build caches
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
* `Extreme-scale Scientific Software Stack (E4S) <https://e4s-project.github.io/>`_: `build cache <https://oaciss.uoregon.edu/e4s/inventory.html>`_'
|
* `Extreme-scale Scientific Software Stack (E4S) <https://e4s-project.github.io/>`_: `build cache <https://oaciss.uoregon.edu/e4s/inventory.html>`_
|
||||||
|
|
||||||
-------------------
|
|
||||||
Build cache signing
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
By default, Spack will add a cryptographic signature to each package pushed to
|
|
||||||
a build cache, and verifies the signature when installing from a build cache.
|
|
||||||
|
|
||||||
Keys for signing can be managed with the :ref:`spack gpg <cmd-spack-gpg>` command,
|
|
||||||
as well as ``spack buildcache keys`` as mentioned above.
|
|
||||||
|
|
||||||
You can disable signing when pushing with ``spack buildcache push --unsigned``,
|
|
||||||
and disable verification when installing from any build cache with
|
|
||||||
``spack install --no-check-signature``.
|
|
||||||
|
|
||||||
Alternatively, signing and verification can be enabled or disabled on a per build cache
|
|
||||||
basis:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack mirror add --signed <name> <url> # enable signing and verification
|
|
||||||
$ spack mirror add --unsigned <name> <url> # disable signing and verification
|
|
||||||
|
|
||||||
$ spack mirror set --signed <name> # enable signing and verification for an existing mirror
|
|
||||||
$ spack mirror set --unsigned <name> # disable signing and verification for an existing mirror
|
|
||||||
|
|
||||||
Or you can directly edit the ``mirrors.yaml`` configuration file:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
mirrors:
|
|
||||||
<name>:
|
|
||||||
url: <url>
|
|
||||||
signed: false # disable signing and verification
|
|
||||||
|
|
||||||
See also :ref:`mirrors`.
|
|
||||||
|
|
||||||
----------
|
----------
|
||||||
Relocation
|
Relocation
|
||||||
----------
|
----------
|
||||||
|
|
||||||
When using buildcaches across different machines, it is likely that the install
|
Initial build and later installation do not necessarily happen at the same
|
||||||
root will be different from the one used to build the binaries.
|
location. Spack provides a relocation capability and corrects for RPATHs and
|
||||||
|
non-relocatable scripts. However, many packages compile paths into binary
|
||||||
To address this issue, Spack automatically relocates all paths encoded in binaries
|
artifacts directly. In such cases, the build instructions of this package would
|
||||||
and scripts to their new location upon install.
|
need to be adjusted for better re-locatability.
|
||||||
|
|
||||||
Note that there are some cases where this is not possible: if binaries are built in
|
|
||||||
a relatively short path, and then installed to a longer path, there may not be enough
|
|
||||||
space in the binary to encode the new path. In this case, Spack will fail to install
|
|
||||||
the package from the build cache, and a source build is required.
|
|
||||||
|
|
||||||
To reduce the likelihood of this happening, it is highly recommended to add padding to
|
|
||||||
the install root during the build, as specified in the :ref:`config <config-yaml>`
|
|
||||||
section of the configuration:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
config:
|
|
||||||
install_tree:
|
|
||||||
root: /opt/spack
|
|
||||||
padded_length: 128
|
|
||||||
|
|
||||||
|
|
||||||
.. _binary_caches_oci:
|
|
||||||
|
|
||||||
---------------------------------
|
|
||||||
Automatic push to a build cache
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Sometimes it is convenient to push packages to a build cache as soon as they are installed. Spack can do this by setting autopush flag when adding a mirror:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack mirror add --autopush <name> <url or path>
|
|
||||||
|
|
||||||
Or the autopush flag can be set for an existing mirror:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack mirror set --autopush <name> # enable automatic push for an existing mirror
|
|
||||||
$ spack mirror set --no-autopush <name> # disable automatic push for an existing mirror
|
|
||||||
|
|
||||||
Then after installing a package it is automatically pushed to all mirrors with ``autopush: true``. The command
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack install <package>
|
|
||||||
|
|
||||||
will have the same effect as
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack install <package>
|
|
||||||
$ spack buildcache push <cache> <package> # for all caches with autopush: true
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
Packages are automatically pushed to a build cache only if they are built from source.
|
|
||||||
|
|
||||||
-----------------------------------------
|
|
||||||
OCI / Docker V2 registries as build cache
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
Spack can also use OCI or Docker V2 registries such as Dockerhub, Quay.io,
|
|
||||||
Github Packages, GitLab Container Registry, JFrog Artifactory, and others
|
|
||||||
as build caches. This is a convenient way to share binaries using public
|
|
||||||
infrastructure, or to cache Spack built binaries in Github Actions and
|
|
||||||
GitLab CI.
|
|
||||||
|
|
||||||
To get started, configure an OCI mirror using ``oci://`` as the scheme,
|
|
||||||
and optionally specify variables that hold the username and password (or
|
|
||||||
personal access token) for the registry:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack mirror add --oci-username-variable REGISTRY_USER \
|
|
||||||
--oci-password-variable REGISTRY_TOKEN \
|
|
||||||
my_registry oci://example.com/my_image
|
|
||||||
|
|
||||||
Spack follows the naming conventions of Docker, with Dockerhub as the default
|
|
||||||
registry. To use Dockerhub, you can omit the registry domain:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack mirror add ... my_registry oci://username/my_image
|
|
||||||
|
|
||||||
From here, you can use the mirror as any other build cache:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ export REGISTRY_USER=...
|
|
||||||
$ export REGISTRY_TOKEN=...
|
|
||||||
$ spack buildcache push my_registry <specs...> # push to the registry
|
|
||||||
$ spack install <specs...> # or install from the registry
|
|
||||||
|
|
||||||
A unique feature of buildcaches on top of OCI registries is that it's incredibly
|
|
||||||
easy to generate get a runnable container image with the binaries installed. This
|
|
||||||
is a great way to make applications available to users without requiring them to
|
|
||||||
install Spack -- all you need is Docker, Podman or any other OCI-compatible container
|
|
||||||
runtime.
|
|
||||||
|
|
||||||
To produce container images, all you need to do is add the ``--base-image`` flag
|
|
||||||
when pushing to the build cache:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack buildcache push --base-image ubuntu:20.04 my_registry ninja
|
|
||||||
Pushed to example.com/my_image:ninja-1.11.1-yxferyhmrjkosgta5ei6b4lqf6bxbscz.spack
|
|
||||||
|
|
||||||
$ docker run -it example.com/my_image:ninja-1.11.1-yxferyhmrjkosgta5ei6b4lqf6bxbscz.spack
|
|
||||||
root@e4c2b6f6b3f4:/# ninja --version
|
|
||||||
1.11.1
|
|
||||||
|
|
||||||
If ``--base-image`` is not specified, distroless images are produced. In practice,
|
|
||||||
you won't be able to run these as containers, since they don't come with libc and
|
|
||||||
other system dependencies. However, they are still compatible with tools like
|
|
||||||
``skopeo``, ``podman``, and ``docker`` for pulling and pushing.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
The docker ``overlayfs2`` storage driver is limited to 128 layers, above which a
|
|
||||||
``max depth exceeded`` error may be produced when pulling the image. There
|
|
||||||
are `alternative drivers <https://docs.docker.com/storage/storagedriver/>`_.
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
Spack build cache for GitHub Actions
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
To significantly speed up Spack in GitHub Actions, binaries can be cached in
|
|
||||||
GitHub Packages. This service is an OCI registry that can be linked to a GitHub
|
|
||||||
repository.
|
|
||||||
|
|
||||||
Spack offers a public build cache for GitHub Actions with a set of common packages,
|
|
||||||
which lets you get started quickly. See the following resources for more information:
|
|
||||||
|
|
||||||
* `spack/setup-spack <https://github.com/spack/setup-spack>`_ for setting up Spack in GitHub
|
|
||||||
Actions
|
|
||||||
* `spack/github-actions-buildcache <https://github.com/spack/github-actions-buildcache>`_ for
|
|
||||||
more details on the public build cache
|
|
||||||
|
|
||||||
.. _cmd-spack-buildcache:
|
.. _cmd-spack-buildcache:
|
||||||
|
|
||||||
@@ -340,7 +183,7 @@ which lets you get started quickly. See the following resources for more informa
|
|||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
``spack buildcache push``
|
``spack buildcache create``
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Create tarball of installed Spack package and all dependencies.
|
Create tarball of installed Spack package and all dependencies.
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -14,13 +15,15 @@ is an entire command dedicated to the management of every aspect of bootstrappin
|
|||||||
|
|
||||||
.. command-output:: spack bootstrap --help
|
.. command-output:: spack bootstrap --help
|
||||||
|
|
||||||
Spack is configured to bootstrap its dependencies lazily by default; i.e. the first time they are needed and
|
The first thing to know to understand bootstrapping in Spack is that each of
|
||||||
can't be found. You can readily check if any prerequisite for using Spack is missing by running:
|
Spack's dependencies is bootstrapped lazily; i.e. the first time it is needed and
|
||||||
|
can't be found. You can readily check if any prerequisite for using Spack
|
||||||
|
is missing by running:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
% spack bootstrap status
|
% spack bootstrap status
|
||||||
Spack v0.19.0 - python@3.8
|
Spack v0.17.1 - python@3.8
|
||||||
|
|
||||||
[FAIL] Core Functionalities
|
[FAIL] Core Functionalities
|
||||||
[B] MISSING "clingo": required to concretize specs
|
[B] MISSING "clingo": required to concretize specs
|
||||||
@@ -31,14 +34,9 @@ can't be found. You can readily check if any prerequisite for using Spack is mis
|
|||||||
|
|
||||||
Spack will take care of bootstrapping any missing dependency marked as [B]. Dependencies marked as [-] are instead required to be found on the system.
|
Spack will take care of bootstrapping any missing dependency marked as [B]. Dependencies marked as [-] are instead required to be found on the system.
|
||||||
|
|
||||||
% echo $?
|
|
||||||
1
|
|
||||||
|
|
||||||
In the case of the output shown above Spack detected that both ``clingo`` and ``gnupg``
|
In the case of the output shown above Spack detected that both ``clingo`` and ``gnupg``
|
||||||
are missing and it's giving detailed information on why they are needed and whether
|
are missing and it's giving detailed information on why they are needed and whether
|
||||||
they can be bootstrapped. The return code of this command summarizes the results, if any
|
they can be bootstrapped. Running a command that concretize a spec, like:
|
||||||
dependencies are missing the return code is ``1``, otherwise ``0``. Running a command that
|
|
||||||
concretizes a spec, like:
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -48,22 +46,7 @@ concretizes a spec, like:
|
|||||||
==> Installing "clingo-bootstrap@spack%apple-clang@12.0.0~docs~ipo+python build_type=Release arch=darwin-catalina-x86_64" from a buildcache
|
==> Installing "clingo-bootstrap@spack%apple-clang@12.0.0~docs~ipo+python build_type=Release arch=darwin-catalina-x86_64" from a buildcache
|
||||||
[ ... ]
|
[ ... ]
|
||||||
|
|
||||||
automatically triggers the bootstrapping of clingo from pre-built binaries as expected.
|
triggers the bootstrapping of clingo from pre-built binaries as expected.
|
||||||
|
|
||||||
Users can also bootstrap all the dependencies needed by Spack in a single command, which
|
|
||||||
might be useful to setup containers or other similar environments:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack bootstrap now
|
|
||||||
==> Bootstrapping clingo from pre-built binaries
|
|
||||||
==> Fetching https://mirror.spack.io/bootstrap/github-actions/v0.3/build_cache/linux-centos7-x86_64-gcc-10.2.1-clingo-bootstrap-spack-shqedxgvjnhiwdcdrvjhbd73jaevv7wt.spec.json
|
|
||||||
==> Fetching https://mirror.spack.io/bootstrap/github-actions/v0.3/build_cache/linux-centos7-x86_64/gcc-10.2.1/clingo-bootstrap-spack/linux-centos7-x86_64-gcc-10.2.1-clingo-bootstrap-spack-shqedxgvjnhiwdcdrvjhbd73jaevv7wt.spack
|
|
||||||
==> Installing "clingo-bootstrap@spack%gcc@10.2.1~docs~ipo+python+static_libstdcpp build_type=Release arch=linux-centos7-x86_64" from a buildcache
|
|
||||||
==> Bootstrapping patchelf from pre-built binaries
|
|
||||||
==> Fetching https://mirror.spack.io/bootstrap/github-actions/v0.3/build_cache/linux-centos7-x86_64-gcc-10.2.1-patchelf-0.15.0-htk62k7efo2z22kh6kmhaselru7bfkuc.spec.json
|
|
||||||
==> Fetching https://mirror.spack.io/bootstrap/github-actions/v0.3/build_cache/linux-centos7-x86_64/gcc-10.2.1/patchelf-0.15.0/linux-centos7-x86_64-gcc-10.2.1-patchelf-0.15.0-htk62k7efo2z22kh6kmhaselru7bfkuc.spack
|
|
||||||
==> Installing "patchelf@0.15.0%gcc@10.2.1 ldflags="-static-libstdc++ -static-libgcc" arch=linux-centos7-x86_64" from a buildcache
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
The Bootstrapping store
|
The Bootstrapping store
|
||||||
@@ -86,7 +69,7 @@ You can check what is installed in the bootstrapping store at any time using:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
% spack -b find
|
% spack find -b
|
||||||
==> Showing internal bootstrap store at "/Users/spack/.spack/bootstrap/store"
|
==> Showing internal bootstrap store at "/Users/spack/.spack/bootstrap/store"
|
||||||
==> 11 installed packages
|
==> 11 installed packages
|
||||||
-- darwin-catalina-x86_64 / apple-clang@12.0.0 ------------------
|
-- darwin-catalina-x86_64 / apple-clang@12.0.0 ------------------
|
||||||
@@ -100,7 +83,7 @@ In case it is needed you can remove all the software in the current bootstrappin
|
|||||||
% spack clean -b
|
% spack clean -b
|
||||||
==> Removing bootstrapped software and configuration in "/Users/spack/.spack/bootstrap"
|
==> Removing bootstrapped software and configuration in "/Users/spack/.spack/bootstrap"
|
||||||
|
|
||||||
% spack -b find
|
% spack find -b
|
||||||
==> Showing internal bootstrap store at "/Users/spack/.spack/bootstrap/store"
|
==> Showing internal bootstrap store at "/Users/spack/.spack/bootstrap/store"
|
||||||
==> 0 installed packages
|
==> 0 installed packages
|
||||||
|
|
||||||
@@ -124,19 +107,19 @@ If need be, you can disable bootstrapping altogether by running:
|
|||||||
|
|
||||||
in which case it's your responsibility to ensure Spack runs in an
|
in which case it's your responsibility to ensure Spack runs in an
|
||||||
environment where all its prerequisites are installed. You can
|
environment where all its prerequisites are installed. You can
|
||||||
also configure Spack to skip certain bootstrapping methods by disabling
|
also configure Spack to skip certain bootstrapping methods by *untrusting*
|
||||||
them specifically:
|
them. For instance:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
% spack bootstrap disable github-actions
|
% spack bootstrap untrust github-actions
|
||||||
==> "github-actions" is now disabled and will not be used for bootstrapping
|
==> "github-actions" is now untrusted and will not be used for bootstrapping
|
||||||
|
|
||||||
tells Spack to skip trying to bootstrap from binaries. To add the "github-actions" method back you can:
|
tells Spack to skip trying to bootstrap from binaries. To add the "github-actions" method back you can:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
% spack bootstrap enable github-actions
|
% spack bootstrap trust github-actions
|
||||||
|
|
||||||
There is also an option to reset the bootstrapping configuration to Spack's defaults:
|
There is also an option to reset the bootstrapping configuration to Spack's defaults:
|
||||||
|
|
||||||
|
@@ -1,116 +1,255 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
.. _build-settings:
|
||||||
|
|
||||||
|
================================
|
||||||
|
Package Settings (packages.yaml)
|
||||||
|
================================
|
||||||
|
|
||||||
|
Spack allows you to customize how your software is built through the
|
||||||
|
``packages.yaml`` file. Using it, you can make Spack prefer particular
|
||||||
|
implementations of virtual dependencies (e.g., MPI or BLAS/LAPACK),
|
||||||
|
or you can make it prefer to build with particular compilers. You can
|
||||||
|
also tell Spack to use *external* software installations already
|
||||||
|
present on your system.
|
||||||
|
|
||||||
|
At a high level, the ``packages.yaml`` file is structured like this:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
package1:
|
||||||
|
# settings for package1
|
||||||
|
package2:
|
||||||
|
# settings for package2
|
||||||
|
# ...
|
||||||
|
all:
|
||||||
|
# settings that apply to all packages.
|
||||||
|
|
||||||
|
So you can either set build preferences specifically for *one* package,
|
||||||
|
or you can specify that certain settings should apply to *all* packages.
|
||||||
|
The types of settings you can customize are described in detail below.
|
||||||
|
|
||||||
|
Spack's build defaults are in the default
|
||||||
|
``etc/spack/defaults/packages.yaml`` file. You can override them in
|
||||||
|
``~/.spack/packages.yaml`` or ``etc/spack/packages.yaml``. For more
|
||||||
|
details on how this works, see :ref:`configuration-scopes`.
|
||||||
|
|
||||||
|
.. _sec-external-packages:
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
External Packages
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Spack can be configured to use externally-installed
|
||||||
|
packages rather than building its own packages. This may be desirable
|
||||||
|
if machines ship with system packages, such as a customized MPI
|
||||||
|
that should be used instead of Spack building its own MPI.
|
||||||
|
|
||||||
|
External packages are configured through the ``packages.yaml`` file found
|
||||||
|
in a Spack installation's ``etc/spack/`` or a user's ``~/.spack/``
|
||||||
|
directory. Here's an example of an external configuration:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
openmpi:
|
||||||
|
externals:
|
||||||
|
- spec: "openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64"
|
||||||
|
prefix: /opt/openmpi-1.4.3
|
||||||
|
- spec: "openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64+debug"
|
||||||
|
prefix: /opt/openmpi-1.4.3-debug
|
||||||
|
- spec: "openmpi@1.6.5%intel@10.1 arch=linux-debian7-x86_64"
|
||||||
|
prefix: /opt/openmpi-1.6.5-intel
|
||||||
|
|
||||||
|
This example lists three installations of OpenMPI, one built with GCC,
|
||||||
|
one built with GCC and debug information, and another built with Intel.
|
||||||
|
If Spack is asked to build a package that uses one of these MPIs as a
|
||||||
|
dependency, it will use the pre-installed OpenMPI in
|
||||||
|
the given directory. Note that the specified path is the top-level
|
||||||
|
install prefix, not the ``bin`` subdirectory.
|
||||||
|
|
||||||
|
``packages.yaml`` can also be used to specify modules to load instead
|
||||||
|
of the installation prefixes. The following example says that module
|
||||||
|
``CMake/3.7.2`` provides cmake version 3.7.2.
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
cmake:
|
||||||
|
externals:
|
||||||
|
- spec: cmake@3.7.2
|
||||||
|
modules:
|
||||||
|
- CMake/3.7.2
|
||||||
|
|
||||||
|
Each ``packages.yaml`` begins with a ``packages:`` attribute, followed
|
||||||
|
by a list of package names. To specify externals, add an ``externals:``
|
||||||
|
attribute under the package name, which lists externals.
|
||||||
|
Each external should specify a ``spec:`` string that should be as
|
||||||
|
well-defined as reasonably possible. If a
|
||||||
|
package lacks a spec component, such as missing a compiler or
|
||||||
|
package version, then Spack will guess the missing component based
|
||||||
|
on its most-favored packages, and it may guess incorrectly.
|
||||||
|
|
||||||
|
Each package version and compiler listed in an external should
|
||||||
|
have entries in Spack's packages and compiler configuration, even
|
||||||
|
though the package and compiler may not ever be built.
|
||||||
|
|
||||||
|
The packages configuration can tell Spack to use an external location
|
||||||
|
for certain package versions, but it does not restrict Spack to using
|
||||||
|
external packages. In the above example, since newer versions of OpenMPI
|
||||||
|
are available, Spack will choose to start building and linking with the
|
||||||
|
latest version rather than continue using the pre-installed OpenMPI versions.
|
||||||
|
|
||||||
|
To prevent this, the ``packages.yaml`` configuration also allows packages
|
||||||
|
to be flagged as non-buildable. The previous example could be modified to
|
||||||
|
be:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
openmpi:
|
||||||
|
externals:
|
||||||
|
- spec: "openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64"
|
||||||
|
prefix: /opt/openmpi-1.4.3
|
||||||
|
- spec: "openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64+debug"
|
||||||
|
prefix: /opt/openmpi-1.4.3-debug
|
||||||
|
- spec: "openmpi@1.6.5%intel@10.1 arch=linux-debian7-x86_64"
|
||||||
|
prefix: /opt/openmpi-1.6.5-intel
|
||||||
|
buildable: False
|
||||||
|
|
||||||
|
The addition of the ``buildable`` flag tells Spack that it should never build
|
||||||
|
its own version of OpenMPI, and it will instead always rely on a pre-built
|
||||||
|
OpenMPI. Similar to ``paths``, ``buildable`` is specified as a property under
|
||||||
|
a package name.
|
||||||
|
|
||||||
|
If an external module is specified as not buildable, then Spack will load the
|
||||||
|
external module into the build environment which can be used for linking.
|
||||||
|
|
||||||
|
The ``buildable`` does not need to be paired with external packages.
|
||||||
|
It could also be used alone to forbid packages that may be
|
||||||
|
buggy or otherwise undesirable.
|
||||||
|
|
||||||
|
Virtual packages in Spack can also be specified as not buildable, and
|
||||||
|
external implementations can be provided. In the example above,
|
||||||
|
OpenMPI is configured as not buildable, but Spack will often prefer
|
||||||
|
other MPI implementations over the externally available OpenMPI. Spack
|
||||||
|
can be configured with every MPI provider not buildable individually,
|
||||||
|
but more conveniently:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
mpi:
|
||||||
|
buildable: False
|
||||||
|
openmpi:
|
||||||
|
externals:
|
||||||
|
- spec: "openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64"
|
||||||
|
prefix: /opt/openmpi-1.4.3
|
||||||
|
- spec: "openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64+debug"
|
||||||
|
prefix: /opt/openmpi-1.4.3-debug
|
||||||
|
- spec: "openmpi@1.6.5%intel@10.1 arch=linux-debian7-x86_64"
|
||||||
|
prefix: /opt/openmpi-1.6.5-intel
|
||||||
|
|
||||||
|
Implementations can also be listed immediately under the virtual they provide:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
mpi:
|
||||||
|
buildable: False
|
||||||
|
openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64: /opt/openmpi-1.4.3
|
||||||
|
openmpi@1.4.3%gcc@4.4.7 arch=linux-debian7-x86_64+debug: /opt/openmpi-1.4.3-debug
|
||||||
|
openmpi@1.6.5%intel@10.1 arch=linux-debian7-x86_64: /opt/openmpi-1.6.5-intel
|
||||||
|
mpich@3.3 %clang@9.0.0 arch=linux-debian7-x86_64: /opt/mpich-3.3-intel
|
||||||
|
|
||||||
|
Spack can then use any of the listed external implementations of MPI
|
||||||
|
to satisfy a dependency, and will choose depending on the compiler and
|
||||||
|
architecture.
|
||||||
|
|
||||||
|
.. _cmd-spack-external-find:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Automatically Find External Packages
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
You can run the :ref:`spack external find <spack-external-find>` command
|
||||||
|
to search for system-provided packages and add them to ``packages.yaml``.
|
||||||
|
After running this command your ``packages.yaml`` may include new entries:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
cmake:
|
||||||
|
externals:
|
||||||
|
- spec: cmake@3.17.2
|
||||||
|
prefix: /usr
|
||||||
|
|
||||||
|
Generally this is useful for detecting a small set of commonly-used packages;
|
||||||
|
for now this is generally limited to finding build-only dependencies.
|
||||||
|
Specific limitations include:
|
||||||
|
|
||||||
|
* Packages are not discoverable by default: For a package to be
|
||||||
|
discoverable with ``spack external find``, it needs to add special
|
||||||
|
logic. See :ref:`here <make-package-findable>` for more details.
|
||||||
|
* The current implementation only collects and examines executable files,
|
||||||
|
so it is typically only useful for build/run dependencies (in some cases
|
||||||
|
if a library package also provides an executable, it may be possible to
|
||||||
|
extract a meaningful Spec by running the executable - for example the
|
||||||
|
compiler wrappers in MPI implementations).
|
||||||
|
* The logic does not search through module files, it can only detect
|
||||||
|
packages with executables defined in ``PATH``; you can help Spack locate
|
||||||
|
externals which use module files by loading any associated modules for
|
||||||
|
packages that you want Spack to know about before running
|
||||||
|
``spack external find``.
|
||||||
|
* Spack does not overwrite existing entries in the package configuration:
|
||||||
|
If there is an external defined for a spec at any configuration scope,
|
||||||
|
then Spack will not add a new external entry (``spack config blame packages``
|
||||||
|
can help locate all external entries).
|
||||||
|
|
||||||
.. _concretizer-options:
|
.. _concretizer-options:
|
||||||
|
|
||||||
==========================================
|
----------------------
|
||||||
Concretization Settings (concretizer.yaml)
|
Concretizer options
|
||||||
==========================================
|
----------------------
|
||||||
|
|
||||||
The ``concretizer.yaml`` configuration file allows to customize aspects of the
|
``packages.yaml`` gives the concretizer preferences for specific packages,
|
||||||
algorithm used to select the dependencies you install. The default configuration
|
but you can also use ``concretizer.yaml`` to customize aspects of the
|
||||||
is the following:
|
algorithm it uses to select the dependencies you install:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/etc/spack/defaults/concretizer.yaml
|
.. literalinclude:: _spack_root/etc/spack/defaults/concretizer.yaml
|
||||||
:language: yaml
|
:language: yaml
|
||||||
|
|
||||||
--------------------------------
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Reuse already installed packages
|
Reuse already installed packages
|
||||||
--------------------------------
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The ``reuse`` attribute controls how aggressively Spack reuses binary packages during concretization. The
|
The ``reuse`` attribute controls whether Spack will prefer to use installed packages (``true``), or
|
||||||
attribute can either be a single value, or an object for more complex configurations.
|
whether it will do a "fresh" installation and prefer the latest settings from
|
||||||
|
``package.py`` files and ``packages.yaml`` (``false``).
|
||||||
In the former case ("single value") it allows Spack to:
|
You can use:
|
||||||
|
|
||||||
1. Reuse installed packages and buildcaches for all the specs to be concretized, when ``true``
|
|
||||||
2. Reuse installed packages and buildcaches only for the dependencies of the root specs, when ``dependencies``
|
|
||||||
3. Disregard reusing installed packages and buildcaches, when ``false``
|
|
||||||
|
|
||||||
In case a finer control over which specs are reused is needed, then the value of this attribute can be
|
|
||||||
an object, with the following keys:
|
|
||||||
|
|
||||||
1. ``roots``: if ``true`` root specs are reused, if ``false`` only dependencies of root specs are reused
|
|
||||||
2. ``from``: list of sources from which reused specs are taken
|
|
||||||
|
|
||||||
Each source in ``from`` is itself an object:
|
|
||||||
|
|
||||||
.. list-table:: Attributes for a source or reusable specs
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
* - Attribute name
|
|
||||||
- Description
|
|
||||||
* - type (mandatory, string)
|
|
||||||
- Can be ``local``, ``buildcache``, or ``external``
|
|
||||||
* - include (optional, list of specs)
|
|
||||||
- If present, reusable specs must match at least one of the constraint in the list
|
|
||||||
* - exclude (optional, list of specs)
|
|
||||||
- If present, reusable specs must not match any of the constraint in the list.
|
|
||||||
|
|
||||||
For instance, the following configuration:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
concretizer:
|
|
||||||
reuse:
|
|
||||||
roots: true
|
|
||||||
from:
|
|
||||||
- type: local
|
|
||||||
include:
|
|
||||||
- "%gcc"
|
|
||||||
- "%clang"
|
|
||||||
|
|
||||||
tells the concretizer to reuse all specs compiled with either ``gcc`` or ``clang``, that are installed
|
|
||||||
in the local store. Any spec from remote buildcaches is disregarded.
|
|
||||||
|
|
||||||
To reduce the boilerplate in configuration files, default values for the ``include`` and
|
|
||||||
``exclude`` options can be pushed up one level:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
concretizer:
|
|
||||||
reuse:
|
|
||||||
roots: true
|
|
||||||
include:
|
|
||||||
- "%gcc"
|
|
||||||
from:
|
|
||||||
- type: local
|
|
||||||
- type: buildcache
|
|
||||||
- type: local
|
|
||||||
include:
|
|
||||||
- "foo %oneapi"
|
|
||||||
|
|
||||||
In the example above we reuse all specs compiled with ``gcc`` from the local store
|
|
||||||
and remote buildcaches, and we also reuse ``foo %oneapi``. Note that the last source of
|
|
||||||
specs override the default ``include`` attribute.
|
|
||||||
|
|
||||||
For one-off concretizations, the are command line arguments for each of the simple "single value"
|
|
||||||
configurations. This means a user can:
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
% spack install --reuse <spec>
|
% spack install --reuse <spec>
|
||||||
|
|
||||||
to enable reuse for a single installation, or:
|
to enable reuse for a single installation, and you can use:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
spack install --fresh <spec>
|
spack install --fresh <spec>
|
||||||
|
|
||||||
to do a fresh install if ``reuse`` is enabled by default.
|
to do a fresh install if ``reuse`` is enabled by default.
|
||||||
|
``reuse: true`` is the default.
|
||||||
|
|
||||||
.. seealso::
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
FAQ: :ref:`Why does Spack pick particular versions and variants? <faq-concretizer-precedence>`
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
Selection of the target microarchitectures
|
Selection of the target microarchitectures
|
||||||
------------------------------------------
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The options under the ``targets`` attribute control which targets are considered during a solve.
|
The options under the ``targets`` attribute control which targets are considered during a solve.
|
||||||
Currently the options in this section are only configurable from the ``concretizer.yaml`` file
|
Currently the options in this section are only configurable from the ``concretization.yaml`` file
|
||||||
and there are no corresponding command line arguments to enable them for a single solve.
|
and there are no corresponding command line arguments to enable them for a single solve.
|
||||||
|
|
||||||
The ``granularity`` option can take two possible values: ``microarchitectures`` and ``generic``.
|
The ``granularity`` option can take two possible values: ``microarchitectures`` and ``generic``.
|
||||||
@@ -140,131 +279,112 @@ microarchitectures considered during the solve are constrained to be compatible
|
|||||||
host Spack is currently running on. For instance, if this option is set to ``true``, a
|
host Spack is currently running on. For instance, if this option is set to ``true``, a
|
||||||
user cannot concretize for ``target=icelake`` while running on an Haswell node.
|
user cannot concretize for ``target=icelake`` while running on an Haswell node.
|
||||||
|
|
||||||
---------------
|
.. _package-preferences:
|
||||||
Duplicate nodes
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The ``duplicates`` attribute controls whether the DAG can contain multiple configurations of
|
-------------------
|
||||||
the same package. This is mainly relevant for build dependencies, which may have their version
|
Package Preferences
|
||||||
pinned by some nodes, and thus be required at different versions by different nodes in the same
|
-------------------
|
||||||
DAG.
|
|
||||||
|
|
||||||
The ``strategy`` option controls how the solver deals with duplicates. If the value is ``none``,
|
Spack can be configured to prefer certain compilers, package
|
||||||
then a single configuration per package is allowed in the DAG. This means, for instance, that only
|
versions, dependencies, and variants during concretization.
|
||||||
a single ``cmake`` or a single ``py-setuptools`` version is allowed. The result would be a slightly
|
The preferred configuration can be controlled via the
|
||||||
faster concretization, at the expense of making a few specs unsolvable.
|
``~/.spack/packages.yaml`` file for user configurations, or the
|
||||||
|
``etc/spack/packages.yaml`` site configuration.
|
||||||
|
|
||||||
If the value is ``minimal`` Spack will allow packages tagged as ``build-tools`` to have duplicates.
|
Here's an example ``packages.yaml`` file that sets preferred packages:
|
||||||
This allows, for instance, to concretize specs whose nodes require different, and incompatible, ranges
|
|
||||||
of some build tool. For instance, in the figure below the latest `py-shapely` requires a newer `py-setuptools`,
|
|
||||||
while `py-numpy` still needs an older version:
|
|
||||||
|
|
||||||
.. figure:: images/shapely_duplicates.svg
|
|
||||||
:scale: 70 %
|
|
||||||
:align: center
|
|
||||||
|
|
||||||
Up to Spack v0.20 ``duplicates:strategy:none`` was the default (and only) behavior. From Spack v0.21 the
|
|
||||||
default behavior is ``duplicates:strategy:minimal``.
|
|
||||||
|
|
||||||
--------
|
|
||||||
Splicing
|
|
||||||
--------
|
|
||||||
|
|
||||||
The ``splice`` key covers config attributes for splicing specs in the solver.
|
|
||||||
|
|
||||||
"Splicing" is a method for replacing a dependency with another spec
|
|
||||||
that provides the same package or virtual. There are two types of
|
|
||||||
splices, referring to different behaviors for shared dependencies
|
|
||||||
between the root spec and the new spec replacing a dependency:
|
|
||||||
"transitive" and "intransitive". A "transitive" splice is one that
|
|
||||||
resolves all conflicts by taking the dependency from the new node. An
|
|
||||||
"intransitive" splice is one that resolves all conflicts by taking the
|
|
||||||
dependency from the original root. From a theory perspective, hybrid
|
|
||||||
splices are possible but are not modeled by Spack.
|
|
||||||
|
|
||||||
All spliced specs retain a ``build_spec`` attribute that points to the
|
|
||||||
original Spec before any splice occurred. The ``build_spec`` for a
|
|
||||||
non-spliced spec is itself.
|
|
||||||
|
|
||||||
The figure below shows examples of transitive and intransitive splices:
|
|
||||||
|
|
||||||
.. figure:: images/splices.png
|
|
||||||
:align: center
|
|
||||||
|
|
||||||
The concretizer can be configured to explicitly splice particular
|
|
||||||
replacements for a target spec. Splicing will allow the user to make
|
|
||||||
use of generically built public binary caches, while swapping in
|
|
||||||
highly optimized local builds for performance critical components
|
|
||||||
and/or components that interact closely with the specific hardware
|
|
||||||
details of the system. The most prominent candidate for splicing is
|
|
||||||
MPI providers. MPI packages have relatively well-understood ABI
|
|
||||||
characteristics, and most High Performance Computing facilities deploy
|
|
||||||
highly optimized MPI packages tailored to their particular
|
|
||||||
hardware. The following config block configures Spack to replace
|
|
||||||
whatever MPI provider each spec was concretized to use with the
|
|
||||||
particular package of ``mpich`` with the hash that begins ``abcdef``.
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
concretizer:
|
packages:
|
||||||
splice:
|
opencv:
|
||||||
explicit:
|
compiler: [gcc@4.9]
|
||||||
- target: mpi
|
variants: +debug
|
||||||
replacement: mpich/abcdef
|
gperftools:
|
||||||
transitive: false
|
version: [2.2, 2.4, 2.3]
|
||||||
|
all:
|
||||||
|
compiler: [gcc@4.4.7, 'gcc@4.6:', intel, clang, pgi]
|
||||||
|
target: [sandybridge]
|
||||||
|
providers:
|
||||||
|
mpi: [mvapich2, mpich, openmpi]
|
||||||
|
|
||||||
.. warning::
|
At a high level, this example is specifying how packages should be
|
||||||
|
concretized. The opencv package should prefer using GCC 4.9 and
|
||||||
|
be built with debug options. The gperftools package should prefer version
|
||||||
|
2.2 over 2.4. Every package on the system should prefer mvapich2 for
|
||||||
|
its MPI and GCC 4.4.7 (except for opencv, which overrides this by preferring GCC 4.9).
|
||||||
|
These options are used to fill in implicit defaults. Any of them can be overwritten
|
||||||
|
on the command line if explicitly requested.
|
||||||
|
|
||||||
When configuring an explicit splice, you as the user take on the
|
Each ``packages.yaml`` file begins with the string ``packages:`` and
|
||||||
responsibility for ensuring ABI compatibility between the specs
|
package names are specified on the next level. The special string ``all``
|
||||||
matched by the target and the replacement you provide. If they are
|
applies settings to *all* packages. Underneath each package name is one
|
||||||
not compatible, Spack will not warn you and your application will
|
or more components: ``compiler``, ``variants``, ``version``,
|
||||||
fail to run.
|
``providers``, and ``target``. Each component has an ordered list of
|
||||||
|
spec ``constraints``, with earlier entries in the list being preferred
|
||||||
|
over later entries.
|
||||||
|
|
||||||
The ``target`` field of an explicit splice can be any abstract
|
Sometimes a package installation may have constraints that forbid
|
||||||
spec. The ``replacement`` field must be a spec that includes the hash
|
the first concretization rule, in which case Spack will use the first
|
||||||
of a concrete spec, and the replacement must either be the same
|
legal concretization rule. Going back to the example, if a user
|
||||||
package as the target, provide the virtual that is the target, or
|
requests gperftools 2.3 or later, then Spack will install version 2.4
|
||||||
provide a virtual that the target provides. The ``transitive`` field
|
as the 2.4 version of gperftools is preferred over 2.3.
|
||||||
is optional -- by default, splices will be transitive.
|
|
||||||
|
|
||||||
.. note::
|
An explicit concretization rule in the preferred section will always
|
||||||
|
take preference over unlisted concretizations. In the above example,
|
||||||
|
xlc isn't listed in the compiler list. Every listed compiler from
|
||||||
|
gcc to pgi will thus be preferred over the xlc compiler.
|
||||||
|
|
||||||
With explicit splices configured, it is possible for Spack to
|
The syntax for the ``provider`` section differs slightly from other
|
||||||
concretize to a spec that does not satisfy the input. For example,
|
concretization rules. A provider lists a value that packages may
|
||||||
with the config above ``hdf5 ^mvapich2`` will concretize to user
|
``depend_on`` (e.g, MPI) and a list of rules for fulfilling that
|
||||||
``mpich/abcdef`` instead of ``mvapich2`` as the MPI provider. Spack
|
dependency.
|
||||||
will warn the user in this case, but will not fail the
|
|
||||||
concretization.
|
|
||||||
|
|
||||||
.. _automatic_splicing:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^
|
.. _package_permissions:
|
||||||
Automatic Splicing
|
|
||||||
^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
The Spack solver can be configured to do automatic splicing for
|
-------------------
|
||||||
ABI-compatible packages. Automatic splices are enabled in the concretizer
|
Package Permissions
|
||||||
config section
|
-------------------
|
||||||
|
|
||||||
|
Spack can be configured to assign permissions to the files installed
|
||||||
|
by a package.
|
||||||
|
|
||||||
|
In the ``packages.yaml`` file under ``permissions``, the attributes
|
||||||
|
``read``, ``write``, and ``group`` control the package
|
||||||
|
permissions. These attributes can be set per-package, or for all
|
||||||
|
packages under ``all``. If permissions are set under ``all`` and for a
|
||||||
|
specific package, the package-specific settings take precedence.
|
||||||
|
|
||||||
|
The ``read`` and ``write`` attributes take one of ``user``, ``group``,
|
||||||
|
and ``world``.
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
concretizer:
|
packages:
|
||||||
splice:
|
all:
|
||||||
automatic: True
|
permissions:
|
||||||
|
write: group
|
||||||
|
group: spack
|
||||||
|
my_app:
|
||||||
|
permissions:
|
||||||
|
read: group
|
||||||
|
group: my_team
|
||||||
|
|
||||||
Packages can include ABI-compatibility information using the
|
The permissions settings describe the broadest level of access to
|
||||||
``can_splice`` directive. See :ref:`the packaging
|
installations of the specified packages. The execute permissions of
|
||||||
guide<abi_compatibility>` for instructions on specifying ABI
|
the file are set to the same level as read permissions for those files
|
||||||
compatibility using the ``can_splice`` directive.
|
that are executable. The default setting for ``read`` is ``world``,
|
||||||
|
and for ``write`` is ``user``. In the example above, installations of
|
||||||
|
``my_app`` will be installed with user and group permissions but no
|
||||||
|
world permissions, and owned by the group ``my_team``. All other
|
||||||
|
packages will be installed with user and group write privileges, and
|
||||||
|
world read privileges. Those packages will be owned by the group
|
||||||
|
``spack``.
|
||||||
|
|
||||||
.. note::
|
The ``group`` attribute assigns a Unix-style group to a package. All
|
||||||
|
files installed by the package will be owned by the assigned group,
|
||||||
The ``can_splice`` directive is experimental and may be changed in
|
and the sticky group bit will be set on the install prefix and all
|
||||||
future versions.
|
directories inside the install prefix. This will ensure that even
|
||||||
|
manually placed files within the install prefix are owned by the
|
||||||
When automatic splicing is enabled, the concretizer will combine any
|
assigned group. If no group is assigned, Spack will allow the OS
|
||||||
number of ABI-compatible specs if possible to reuse installed packages
|
default behavior to go as expected.
|
||||||
and packages available from binary caches. The end result of these
|
|
||||||
specs is equivalent to a series of transitive/intransitive splices,
|
|
||||||
but the series may be non-obvious.
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -61,11 +62,11 @@ on these ideas for each distinct build system that Spack supports:
|
|||||||
|
|
||||||
build_systems/bundlepackage
|
build_systems/bundlepackage
|
||||||
build_systems/cudapackage
|
build_systems/cudapackage
|
||||||
build_systems/custompackage
|
|
||||||
build_systems/inteloneapipackage
|
build_systems/inteloneapipackage
|
||||||
build_systems/intelpackage
|
build_systems/intelpackage
|
||||||
build_systems/rocmpackage
|
build_systems/rocmpackage
|
||||||
build_systems/sourceforgepackage
|
build_systems/custompackage
|
||||||
|
build_systems/multiplepackage
|
||||||
|
|
||||||
For reference, the :py:mod:`Build System API docs <spack.build_systems>`
|
For reference, the :py:mod:`Build System API docs <spack.build_systems>`
|
||||||
provide a list of build systems and methods/attributes that can be
|
provide a list of build systems and methods/attributes that can be
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _autotoolspackage:
|
.. _autotoolspackage:
|
||||||
|
|
||||||
---------
|
----------------
|
||||||
Autotools
|
AutotoolsPackage
|
||||||
---------
|
----------------
|
||||||
|
|
||||||
Autotools is a GNU build system that provides a build-script generator.
|
Autotools is a GNU build system that provides a build-script generator.
|
||||||
By running the platform-independent ``./configure`` script that comes
|
By running the platform-independent ``./configure`` script that comes
|
||||||
@@ -16,7 +17,7 @@ with the package, you can generate a platform-dependent Makefile.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``AutotoolsBuilder`` and ``AutotoolsPackage`` base classes come with the following phases:
|
The ``AutotoolsPackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``autoreconf`` - generate the configure script
|
#. ``autoreconf`` - generate the configure script
|
||||||
#. ``configure`` - generate the Makefiles
|
#. ``configure`` - generate the Makefiles
|
||||||
@@ -126,9 +127,9 @@ check out a commit from the ``master`` branch, you would want to add:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("autoconf", type="build", when="@master")
|
depends_on('autoconf', type='build', when='@master')
|
||||||
depends_on("automake", type="build", when="@master")
|
depends_on('automake', type='build', when='@master')
|
||||||
depends_on("libtool", type="build", when="@master")
|
depends_on('libtool', type='build', when='@master')
|
||||||
|
|
||||||
It is typically redundant to list the ``m4`` macro processor package as a
|
It is typically redundant to list the ``m4`` macro processor package as a
|
||||||
dependency, since ``autoconf`` already depends on it.
|
dependency, since ``autoconf`` already depends on it.
|
||||||
@@ -144,16 +145,7 @@ example, the ``bash`` shell is used to run the ``autogen.sh`` script.
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def autoreconf(self, spec, prefix):
|
def autoreconf(self, spec, prefix):
|
||||||
which("bash")("autogen.sh")
|
which('bash')('autogen.sh')
|
||||||
|
|
||||||
If the ``package.py`` has build instructions in a separate
|
|
||||||
:ref:`builder class <multiple_build_systems>`, the signature for a phase changes slightly:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
class AutotoolsBuilder(AutotoolsBuilder):
|
|
||||||
def autoreconf(self, pkg, spec, prefix):
|
|
||||||
which("bash")("autogen.sh")
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""
|
||||||
patching configure or Makefile.in files
|
patching configure or Makefile.in files
|
||||||
@@ -194,9 +186,9 @@ To opt out of this feature, use the following setting:
|
|||||||
To enable it conditionally on different architectures, define a property and
|
To enable it conditionally on different architectures, define a property and
|
||||||
make the package depend on ``gnuconfig`` as a build dependency:
|
make the package depend on ``gnuconfig`` as a build dependency:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block
|
||||||
|
|
||||||
depends_on("gnuconfig", when="@1.0:")
|
depends_on('gnuconfig', when='@1.0:')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def patch_config_files(self):
|
def patch_config_files(self):
|
||||||
@@ -238,7 +230,7 @@ version, this can be done like so:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def force_autoreconf(self):
|
def force_autoreconf(self):
|
||||||
return self.version == Version("1.2.3")
|
return self.version == Version('1.2.3')
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Finding configure flags
|
Finding configure flags
|
||||||
@@ -286,22 +278,13 @@ function like so:
|
|||||||
def configure_args(self):
|
def configure_args(self):
|
||||||
args = []
|
args = []
|
||||||
|
|
||||||
if self.spec.satisfies("+mpi"):
|
if '+mpi' in self.spec:
|
||||||
args.append("--enable-mpi")
|
args.append('--enable-mpi')
|
||||||
else:
|
else:
|
||||||
args.append("--disable-mpi")
|
args.append('--disable-mpi')
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
|
||||||
Alternatively, you can use the :ref:`enable_or_disable <autotools_enable_or_disable>` helper:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def configure_args(self):
|
|
||||||
return [self.enable_or_disable("mpi")]
|
|
||||||
|
|
||||||
|
|
||||||
Note that we are explicitly disabling MPI support if it is not
|
Note that we are explicitly disabling MPI support if it is not
|
||||||
requested. This is important, as many Autotools packages will enable
|
requested. This is important, as many Autotools packages will enable
|
||||||
options by default if the dependencies are found, and disable them
|
options by default if the dependencies are found, and disable them
|
||||||
@@ -312,11 +295,9 @@ and `here <https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Automagic_depe
|
|||||||
for a rationale as to why these so-called "automagic" dependencies
|
for a rationale as to why these so-called "automagic" dependencies
|
||||||
are a problem.
|
are a problem.
|
||||||
|
|
||||||
.. note::
|
By default, Autotools installs packages to ``/usr``. We don't want this,
|
||||||
|
so Spack automatically adds ``--prefix=/path/to/installation/prefix``
|
||||||
By default, Autotools installs packages to ``/usr``. We don't want this,
|
to your list of ``configure_args``. You don't need to add this yourself.
|
||||||
so Spack automatically adds ``--prefix=/path/to/installation/prefix``
|
|
||||||
to your list of ``configure_args``. You don't need to add this yourself.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
Helper functions
|
Helper functions
|
||||||
@@ -327,8 +308,6 @@ You may have noticed that most of the Autotools flags are of the form
|
|||||||
``--without-baz``. Since these flags are so common, Spack provides a
|
``--without-baz``. Since these flags are so common, Spack provides a
|
||||||
couple of helper functions to make your life easier.
|
couple of helper functions to make your life easier.
|
||||||
|
|
||||||
.. _autotools_enable_or_disable:
|
|
||||||
|
|
||||||
"""""""""""""""""
|
"""""""""""""""""
|
||||||
enable_or_disable
|
enable_or_disable
|
||||||
"""""""""""""""""
|
"""""""""""""""""
|
||||||
@@ -340,11 +319,11 @@ typically used to enable or disable some feature within the package.
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant(
|
variant(
|
||||||
"memchecker",
|
'memchecker',
|
||||||
default=False,
|
default=False,
|
||||||
description="Memchecker support for debugging [degrades performance]"
|
description='Memchecker support for debugging [degrades performance]'
|
||||||
)
|
)
|
||||||
config_args.extend(self.enable_or_disable("memchecker"))
|
config_args.extend(self.enable_or_disable('memchecker'))
|
||||||
|
|
||||||
In this example, specifying the variant ``+memchecker`` will generate
|
In this example, specifying the variant ``+memchecker`` will generate
|
||||||
the following configuration options:
|
the following configuration options:
|
||||||
@@ -364,15 +343,15 @@ the ``with_or_without`` method.
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant(
|
variant(
|
||||||
"schedulers",
|
'schedulers',
|
||||||
values=disjoint_sets(
|
values=disjoint_sets(
|
||||||
("auto",), ("alps", "lsf", "tm", "slurm", "sge", "loadleveler")
|
('auto',), ('alps', 'lsf', 'tm', 'slurm', 'sge', 'loadleveler')
|
||||||
).with_non_feature_values("auto", "none"),
|
).with_non_feature_values('auto', 'none'),
|
||||||
description="List of schedulers for which support is enabled; "
|
description="List of schedulers for which support is enabled; "
|
||||||
"'auto' lets openmpi determine",
|
"'auto' lets openmpi determine",
|
||||||
)
|
)
|
||||||
if not spec.satisfies("schedulers=auto"):
|
if 'schedulers=auto' not in spec:
|
||||||
config_args.extend(self.with_or_without("schedulers"))
|
config_args.extend(self.with_or_without('schedulers'))
|
||||||
|
|
||||||
In this example, specifying the variant ``schedulers=slurm,sge`` will
|
In this example, specifying the variant ``schedulers=slurm,sge`` will
|
||||||
generate the following configuration options:
|
generate the following configuration options:
|
||||||
@@ -397,16 +376,16 @@ generated, using the ``activation_value`` argument to
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant(
|
variant(
|
||||||
"fabrics",
|
'fabrics',
|
||||||
values=disjoint_sets(
|
values=disjoint_sets(
|
||||||
("auto",), ("psm", "psm2", "verbs", "mxm", "ucx", "libfabric")
|
('auto',), ('psm', 'psm2', 'verbs', 'mxm', 'ucx', 'libfabric')
|
||||||
).with_non_feature_values("auto", "none"),
|
).with_non_feature_values('auto', 'none'),
|
||||||
description="List of fabrics that are enabled; "
|
description="List of fabrics that are enabled; "
|
||||||
"'auto' lets openmpi determine",
|
"'auto' lets openmpi determine",
|
||||||
)
|
)
|
||||||
if not spec.satisfies("fabrics=auto"):
|
if 'fabrics=auto' not in spec:
|
||||||
config_args.extend(self.with_or_without("fabrics",
|
config_args.extend(self.with_or_without('fabrics',
|
||||||
activation_value="prefix"))
|
activation_value='prefix'))
|
||||||
|
|
||||||
``activation_value`` accepts a callable that generates the configure
|
``activation_value`` accepts a callable that generates the configure
|
||||||
parameter value given the variant value; but the special value
|
parameter value given the variant value; but the special value
|
||||||
@@ -430,16 +409,16 @@ When Spack variants and configure flags do not correspond one-to-one, the
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant("debug_tools", default=False)
|
variant('debug_tools', default=False)
|
||||||
config_args += self.enable_or_disable("debug-tools", variant="debug_tools")
|
config_args += self.enable_or_disable('debug-tools', variant='debug_tools')
|
||||||
|
|
||||||
Or when one variant controls multiple flags:
|
Or when one variant controls multiple flags:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant("debug_tools", default=False)
|
variant('debug_tools', default=False)
|
||||||
config_args += self.with_or_without("memchecker", variant="debug_tools")
|
config_args += self.with_or_without('memchecker', variant='debug_tools')
|
||||||
config_args += self.with_or_without("profiler", variant="debug_tools")
|
config_args += self.with_or_without('profiler', variant='debug_tools')
|
||||||
|
|
||||||
|
|
||||||
""""""""""""""""""""
|
""""""""""""""""""""
|
||||||
@@ -453,8 +432,8 @@ For example:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant("profiler", when="@2.0:")
|
variant('profiler', when='@2.0:')
|
||||||
config_args += self.with_or_without("profiler")
|
config_args += self.with_or_without('profiler')
|
||||||
|
|
||||||
will neither add ``--with-profiler`` nor ``--without-profiler`` when the version is
|
will neither add ``--with-profiler`` nor ``--without-profiler`` when the version is
|
||||||
below ``2.0``.
|
below ``2.0``.
|
||||||
@@ -473,10 +452,10 @@ the variant values require atypical behavior.
|
|||||||
def with_or_without_verbs(self, activated):
|
def with_or_without_verbs(self, activated):
|
||||||
# Up through version 1.6, this option was named --with-openib.
|
# Up through version 1.6, this option was named --with-openib.
|
||||||
# In version 1.7, it was renamed to be --with-verbs.
|
# In version 1.7, it was renamed to be --with-verbs.
|
||||||
opt = "verbs" if self.spec.satisfies("@1.7:") else "openib"
|
opt = 'verbs' if self.spec.satisfies('@1.7:') else 'openib'
|
||||||
if not activated:
|
if not activated:
|
||||||
return f"--without-{opt}"
|
return '--without-{0}'.format(opt)
|
||||||
return f"--with-{opt}={self.spec['rdma-core'].prefix}"
|
return '--with-{0}={1}'.format(opt, self.spec['rdma-core'].prefix)
|
||||||
|
|
||||||
Defining ``with_or_without_verbs`` overrides the behavior of a
|
Defining ``with_or_without_verbs`` overrides the behavior of a
|
||||||
``fabrics=verbs`` variant, changing the configure-time option to
|
``fabrics=verbs`` variant, changing the configure-time option to
|
||||||
@@ -500,7 +479,7 @@ do this like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
configure_directory = "src"
|
configure_directory = 'src'
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Building out of source
|
Building out of source
|
||||||
@@ -512,7 +491,7 @@ This can be done using the ``build_directory`` variable:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_directory = "spack-build"
|
build_directory = 'spack-build'
|
||||||
|
|
||||||
By default, Spack will build the package in the same directory that
|
By default, Spack will build the package in the same directory that
|
||||||
contains the ``configure`` script
|
contains the ``configure`` script
|
||||||
@@ -535,8 +514,8 @@ library or build the documentation, you can add these like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_targets = ["all", "docs"]
|
build_targets = ['all', 'docs']
|
||||||
install_targets = ["install", "docs"]
|
install_targets = ['install', 'docs']
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
Testing
|
Testing
|
||||||
|
@@ -1,39 +1,17 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _bundlepackage:
|
.. _bundlepackage:
|
||||||
|
|
||||||
------
|
-------------
|
||||||
Bundle
|
BundlePackage
|
||||||
------
|
-------------
|
||||||
|
|
||||||
``BundlePackage`` represents a set of packages that are expected to work
|
``BundlePackage`` represents a set of packages that are expected to work well
|
||||||
well together, such as a collection of commonly used software libraries.
|
together, such as a collection of commonly used software libraries. The
|
||||||
The associated software is specified as dependencies.
|
associated software is specified as bundle dependencies.
|
||||||
|
|
||||||
If it makes sense, variants, conflicts, and requirements can be added to
|
|
||||||
the package. :ref:`Variants <variants>` ensure that common build options
|
|
||||||
are consistent across the packages supporting them. :ref:`Conflicts
|
|
||||||
and requirements <packaging_conflicts>` prevent attempts to build with known
|
|
||||||
bugs or limitations.
|
|
||||||
|
|
||||||
For example, if ``MyBundlePackage`` is known to only build on ``linux``,
|
|
||||||
it could use the ``require`` directive as follows:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
require("platform=linux", msg="MyBundlePackage only builds on linux")
|
|
||||||
|
|
||||||
Spack has a number of built-in bundle packages, such as:
|
|
||||||
|
|
||||||
* `AmdAocl <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/amd-aocl/package.py>`_
|
|
||||||
* `EcpProxyApps <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/ecp-proxy-apps/package.py>`_
|
|
||||||
* `Libc <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/libc/package.py>`_
|
|
||||||
* `Xsdk <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/xsdk/package.py>`_
|
|
||||||
|
|
||||||
where ``Xsdk`` also inherits from ``CudaPackage`` and ``RocmPackage`` and
|
|
||||||
``Libc`` is a virtual bundle package for the C standard library.
|
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^
|
^^^^^^^^
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _cachedcmakepackage:
|
.. _cachedcmakepackage:
|
||||||
|
|
||||||
-----------
|
------------------
|
||||||
CachedCMake
|
CachedCMakePackage
|
||||||
-----------
|
------------------
|
||||||
|
|
||||||
The CachedCMakePackage base class is used for CMake-based workflows
|
The CachedCMakePackage base class is used for CMake-based workflows
|
||||||
that create a CMake cache file prior to running ``cmake``. This is
|
that create a CMake cache file prior to running ``cmake``. This is
|
||||||
@@ -86,7 +87,7 @@ A typical usage of these methods may look something like this:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def initconfig_mpi_entries(self):
|
def initconfig_mpi_entries(self)
|
||||||
# Get existing MPI configurations
|
# Get existing MPI configurations
|
||||||
entries = super(self, Foo).initconfig_mpi_entries()
|
entries = super(self, Foo).initconfig_mpi_entries()
|
||||||
|
|
||||||
@@ -94,25 +95,25 @@ A typical usage of these methods may look something like this:
|
|||||||
# This spec has an MPI variant, and we need to enable MPI when it is on.
|
# This spec has an MPI variant, and we need to enable MPI when it is on.
|
||||||
# This hypothetical package controls MPI with the ``FOO_MPI`` option to
|
# This hypothetical package controls MPI with the ``FOO_MPI`` option to
|
||||||
# cmake.
|
# cmake.
|
||||||
if self.spec.satisfies("+mpi"):
|
if '+mpi' in self.spec:
|
||||||
entries.append(cmake_cache_option("FOO_MPI", True, "enable mpi"))
|
entries.append(cmake_cache_option('FOO_MPI', True, "enable mpi"))
|
||||||
else:
|
else:
|
||||||
entries.append(cmake_cache_option("FOO_MPI", False, "disable mpi"))
|
entries.append(cmake_cache_option('FOO_MPI', False, "disable mpi"))
|
||||||
|
|
||||||
def initconfig_package_entries(self):
|
def initconfig_package_entries(self):
|
||||||
# Package specific options
|
# Package specific options
|
||||||
entries = []
|
entries = []
|
||||||
|
|
||||||
entries.append("#Entries for build options")
|
entries.append('#Entries for build options')
|
||||||
|
|
||||||
bar_on = self.spec.satisfies("+bar")
|
bar_on = '+bar' in self.spec
|
||||||
entries.append(cmake_cache_option("FOO_BAR", bar_on, "toggle bar"))
|
entries.append(cmake_cache_option('FOO_BAR', bar_on, 'toggle bar'))
|
||||||
|
|
||||||
entries.append("#Entries for dependencies")
|
entries.append('#Entries for dependencies')
|
||||||
|
|
||||||
if self.spec["blas"].name == "baz": # baz is our blas provider
|
if self.spec['blas'].name == 'baz': # baz is our blas provider
|
||||||
entries.append(cmake_cache_string("FOO_BLAS", "baz", "Use baz"))
|
entries.append(cmake_cache_string('FOO_BLAS', 'baz', 'Use baz'))
|
||||||
entries.append(cmake_cache_path("BAZ_PREFIX", self.spec["baz"].prefix))
|
entries.append(cmake_cache_path('BAZ_PREFIX', self.spec['baz'].prefix))
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
External documentation
|
External documentation
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _cmakepackage:
|
.. _cmakepackage:
|
||||||
|
|
||||||
-----
|
------------
|
||||||
CMake
|
CMakePackage
|
||||||
-----
|
------------
|
||||||
|
|
||||||
Like Autotools, CMake is a widely-used build-script generator. Designed
|
Like Autotools, CMake is a widely-used build-script generator. Designed
|
||||||
by Kitware, CMake is the most popular build system for new C, C++, and
|
by Kitware, CMake is the most popular build system for new C, C++, and
|
||||||
@@ -20,7 +21,7 @@ whereas Autotools is Unix-only.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``CMakeBuilder`` and ``CMakePackage`` base classes come with the following phases:
|
The ``CMakePackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``cmake`` - generate the Makefile
|
#. ``cmake`` - generate the Makefile
|
||||||
#. ``build`` - build the package
|
#. ``build`` - build the package
|
||||||
@@ -81,7 +82,7 @@ class already contains:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("cmake", type="build")
|
depends_on('cmake', type='build')
|
||||||
|
|
||||||
|
|
||||||
If you need to specify a particular version requirement, you can
|
If you need to specify a particular version requirement, you can
|
||||||
@@ -89,7 +90,7 @@ override this in your package:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("cmake@2.8.12:", type="build")
|
depends_on('cmake@2.8.12:', type='build')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -129,17 +130,17 @@ Adding flags to cmake
|
|||||||
To add additional flags to the ``cmake`` call, simply override the
|
To add additional flags to the ``cmake`` call, simply override the
|
||||||
``cmake_args`` function. The following example defines values for the flags
|
``cmake_args`` function. The following example defines values for the flags
|
||||||
``WHATEVER``, ``ENABLE_BROKEN_FEATURE``, ``DETECT_HDF5``, and ``THREADS`` with
|
``WHATEVER``, ``ENABLE_BROKEN_FEATURE``, ``DETECT_HDF5``, and ``THREADS`` with
|
||||||
and without the :meth:`~spack.build_systems.cmake.CMakeBuilder.define` and
|
and without the :meth:`~spack.build_systems.cmake.CMakePackage.define` and
|
||||||
:meth:`~spack.build_systems.cmake.CMakeBuilder.define_from_variant` helper functions:
|
:meth:`~spack.build_systems.cmake.CMakePackage.define_from_variant` helper functions:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def cmake_args(self):
|
def cmake_args(self):
|
||||||
args = [
|
args = [
|
||||||
"-DWHATEVER:STRING=somevalue",
|
'-DWHATEVER:STRING=somevalue',
|
||||||
self.define("ENABLE_BROKEN_FEATURE", False),
|
self.define('ENABLE_BROKEN_FEATURE', False),
|
||||||
self.define_from_variant("DETECT_HDF5", "hdf5"),
|
self.define_from_variant('DETECT_HDF5', 'hdf5'),
|
||||||
self.define_from_variant("THREADS"), # True if +threads
|
self.define_from_variant('THREADS'), # True if +threads
|
||||||
]
|
]
|
||||||
|
|
||||||
return args
|
return args
|
||||||
@@ -150,10 +151,10 @@ and CMake simply ignores the empty command line argument. For example the follow
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant("example", default=True, when="@2.0:")
|
variant('example', default=True, when='@2.0:')
|
||||||
|
|
||||||
def cmake_args(self):
|
def cmake_args(self):
|
||||||
return [self.define_from_variant("EXAMPLE", "example")]
|
return [self.define_from_variant('EXAMPLE', 'example')]
|
||||||
|
|
||||||
will generate ``'cmake' '-DEXAMPLE=ON' ...`` when `@2.0: +example` is met, but will
|
will generate ``'cmake' '-DEXAMPLE=ON' ...`` when `@2.0: +example` is met, but will
|
||||||
result in ``'cmake' '' ...`` when the spec version is below ``2.0``.
|
result in ``'cmake' '' ...`` when the spec version is below ``2.0``.
|
||||||
@@ -192,9 +193,9 @@ a variant to control this:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant("build_type", default="RelWithDebInfo",
|
variant('build_type', default='RelWithDebInfo',
|
||||||
description="CMake build type",
|
description='CMake build type',
|
||||||
values=("Debug", "Release", "RelWithDebInfo", "MinSizeRel"))
|
values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel'))
|
||||||
|
|
||||||
However, not every CMake package accepts all four of these options.
|
However, not every CMake package accepts all four of these options.
|
||||||
Grep the ``CMakeLists.txt`` file to see if the default values are
|
Grep the ``CMakeLists.txt`` file to see if the default values are
|
||||||
@@ -204,9 +205,9 @@ package overrides the default variant with:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
variant("build_type", default="DebugRelease",
|
variant('build_type', default='DebugRelease',
|
||||||
description="The build type to build",
|
description='The build type to build',
|
||||||
values=("Debug", "Release", "DebugRelease"))
|
values=('Debug', 'Release', 'DebugRelease'))
|
||||||
|
|
||||||
For more information on ``CMAKE_BUILD_TYPE``, see:
|
For more information on ``CMAKE_BUILD_TYPE``, see:
|
||||||
https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
|
https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
|
||||||
@@ -249,7 +250,7 @@ generator is Ninja. To switch to the Ninja generator, simply add:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
generator("ninja")
|
generator = 'Ninja'
|
||||||
|
|
||||||
|
|
||||||
``CMakePackage`` defaults to "Unix Makefiles". If you switch to the
|
``CMakePackage`` defaults to "Unix Makefiles". If you switch to the
|
||||||
@@ -257,7 +258,7 @@ Ninja generator, make sure to add:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("ninja", type="build")
|
depends_on('ninja', type='build')
|
||||||
|
|
||||||
to the package as well. Aside from that, you shouldn't need to do
|
to the package as well. Aside from that, you shouldn't need to do
|
||||||
anything else. Spack will automatically detect that you are using
|
anything else. Spack will automatically detect that you are using
|
||||||
@@ -287,7 +288,7 @@ like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
root_cmakelists_dir = "src"
|
root_cmakelists_dir = 'src'
|
||||||
|
|
||||||
|
|
||||||
Note that this path is relative to the root of the extracted tarball,
|
Note that this path is relative to the root of the extracted tarball,
|
||||||
@@ -303,7 +304,7 @@ different sub-directory, simply override ``build_directory`` like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_directory = "my-build"
|
build_directory = 'my-build'
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Build and install targets
|
Build and install targets
|
||||||
@@ -323,8 +324,8 @@ library or build the documentation, you can add these like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_targets = ["all", "docs"]
|
build_targets = ['all', 'docs']
|
||||||
install_targets = ["install", "docs"]
|
install_targets = ['install', 'docs']
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
Testing
|
Testing
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _cudapackage:
|
.. _cudapackage:
|
||||||
|
|
||||||
----
|
-----------
|
||||||
Cuda
|
CudaPackage
|
||||||
----
|
-----------
|
||||||
|
|
||||||
Different from other packages, ``CudaPackage`` does not represent a build system.
|
Different from other packages, ``CudaPackage`` does not represent a build system.
|
||||||
Instead its goal is to simplify and unify usage of ``CUDA`` in other packages by providing a `mixin-class <https://en.wikipedia.org/wiki/Mixin>`_.
|
Instead its goal is to simplify and unify usage of ``CUDA`` in other packages by providing a `mixin-class <https://en.wikipedia.org/wiki/Mixin>`_.
|
||||||
@@ -27,15 +28,12 @@ This package provides the following variants:
|
|||||||
|
|
||||||
* **cuda_arch**
|
* **cuda_arch**
|
||||||
|
|
||||||
This variant supports the optional specification of one or multiple architectures.
|
This variant supports the optional specification of the architecture.
|
||||||
Valid values are maintained in the ``cuda_arch_values`` property and
|
Valid values are maintained in the ``cuda_arch_values`` property and
|
||||||
are the numeric character equivalent of the compute capability version
|
are the numeric character equivalent of the compute capability version
|
||||||
(e.g., '10' for version 1.0). Each provided value affects associated
|
(e.g., '10' for version 1.0). Each provided value affects associated
|
||||||
``CUDA`` dependencies and compiler conflicts.
|
``CUDA`` dependencies and compiler conflicts.
|
||||||
|
|
||||||
The variant builds both PTX code for the _virtual_ architecture
|
|
||||||
(e.g. ``compute_10``) and binary code for the _real_ architecture (e.g. ``sm_10``).
|
|
||||||
|
|
||||||
GPUs and their compute capability versions are listed at
|
GPUs and their compute capability versions are listed at
|
||||||
https://developer.nvidia.com/cuda-gpus .
|
https://developer.nvidia.com/cuda-gpus .
|
||||||
|
|
||||||
@@ -53,8 +51,8 @@ to terminate such build attempts with a suitable message:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
conflicts("cuda_arch=none", when="+cuda",
|
conflicts('cuda_arch=none', when='+cuda',
|
||||||
msg="CUDA architecture is required")
|
msg='CUDA architecture is required')
|
||||||
|
|
||||||
Similarly, if your software does not support all versions of the property,
|
Similarly, if your software does not support all versions of the property,
|
||||||
you could add ``conflicts`` to your package for those versions. For example,
|
you could add ``conflicts`` to your package for those versions. For example,
|
||||||
@@ -65,13 +63,13 @@ custom message should a user attempt such a build:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
unsupported_cuda_archs = [
|
unsupported_cuda_archs = [
|
||||||
"10", "11", "12", "13",
|
'10', '11', '12', '13',
|
||||||
"20", "21",
|
'20', '21',
|
||||||
"30", "32", "35", "37"
|
'30', '32', '35', '37'
|
||||||
]
|
]
|
||||||
for value in unsupported_cuda_archs:
|
for value in unsupported_cuda_archs:
|
||||||
conflicts(f"cuda_arch={value}", when="+cuda",
|
conflicts('cuda_arch={0}'.format(value), when='+cuda',
|
||||||
msg=f"CUDA architecture {value} is not supported")
|
msg='CUDA architecture {0} is not supported'.format(value))
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
Methods
|
Methods
|
||||||
@@ -106,16 +104,16 @@ class of your package. For example, you can add it to your
|
|||||||
spec = self.spec
|
spec = self.spec
|
||||||
args = []
|
args = []
|
||||||
...
|
...
|
||||||
if spec.satisfies("+cuda"):
|
if '+cuda' in spec:
|
||||||
# Set up the cuda macros needed by the build
|
# Set up the cuda macros needed by the build
|
||||||
args.append("-DWITH_CUDA=ON")
|
args.append('-DWITH_CUDA=ON')
|
||||||
cuda_arch_list = spec.variants["cuda_arch"].value
|
cuda_arch_list = spec.variants['cuda_arch'].value
|
||||||
cuda_arch = cuda_arch_list[0]
|
cuda_arch = cuda_arch_list[0]
|
||||||
if cuda_arch != "none":
|
if cuda_arch != 'none':
|
||||||
args.append(f"-DCUDA_FLAGS=-arch=sm_{cuda_arch}")
|
args.append('-DCUDA_FLAGS=-arch=sm_{0}'.format(cuda_arch))
|
||||||
else:
|
else:
|
||||||
# Ensure build with cuda is disabled
|
# Ensure build with cuda is disabled
|
||||||
args.append("-DWITH_CUDA=OFF")
|
args.append('-DWITH_CUDA=OFF')
|
||||||
...
|
...
|
||||||
return args
|
return args
|
||||||
|
|
||||||
@@ -124,7 +122,7 @@ You will need to customize options as needed for your build.
|
|||||||
|
|
||||||
This example also illustrates how to check for the ``cuda`` variant using
|
This example also illustrates how to check for the ``cuda`` variant using
|
||||||
``self.spec`` and how to retrieve the ``cuda_arch`` variant's value, which
|
``self.spec`` and how to retrieve the ``cuda_arch`` variant's value, which
|
||||||
is a list, using ``self.spec.variants["cuda_arch"].value``.
|
is a list, using ``self.spec.variants['cuda_arch'].value``.
|
||||||
|
|
||||||
With over 70 packages using ``CudaPackage`` as of January 2021 there are
|
With over 70 packages using ``CudaPackage`` as of January 2021 there are
|
||||||
lots of examples to choose from to get more ideas for using this package.
|
lots of examples to choose from to get more ideas for using this package.
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -56,13 +57,13 @@ If you look at the ``perl`` package, you'll see:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
phases = ["configure", "build", "install"]
|
phases = ['configure', 'build', 'install']
|
||||||
|
|
||||||
Similarly, ``cmake`` defines:
|
Similarly, ``cmake`` defines:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
phases = ["bootstrap", "build", "install"]
|
phases = ['bootstrap', 'build', 'install']
|
||||||
|
|
||||||
If we look at the ``cmake`` example, this tells Spack's ``PackageBase``
|
If we look at the ``cmake`` example, this tells Spack's ``PackageBase``
|
||||||
class to run the ``bootstrap``, ``build``, and ``install`` functions
|
class to run the ``bootstrap``, ``build``, and ``install`` functions
|
||||||
@@ -77,7 +78,7 @@ If we look at ``perl``, we see that it defines a ``configure`` method:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def configure(self, spec, prefix):
|
def configure(self, spec, prefix):
|
||||||
configure = Executable("./Configure")
|
configure = Executable('./Configure')
|
||||||
configure(*self.configure_args())
|
configure(*self.configure_args())
|
||||||
|
|
||||||
There is also a corresponding ``configure_args`` function that handles
|
There is also a corresponding ``configure_args`` function that handles
|
||||||
@@ -91,7 +92,7 @@ phases are pretty simple:
|
|||||||
make()
|
make()
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
make("install")
|
make('install')
|
||||||
|
|
||||||
The ``cmake`` package looks very similar, but with a ``bootstrap``
|
The ``cmake`` package looks very similar, but with a ``bootstrap``
|
||||||
function instead of ``configure``:
|
function instead of ``configure``:
|
||||||
@@ -99,14 +100,14 @@ function instead of ``configure``:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def bootstrap(self, spec, prefix):
|
def bootstrap(self, spec, prefix):
|
||||||
bootstrap = Executable("./bootstrap")
|
bootstrap = Executable('./bootstrap')
|
||||||
bootstrap(*self.bootstrap_args())
|
bootstrap(*self.bootstrap_args())
|
||||||
|
|
||||||
def build(self, spec, prefix):
|
def build(self, spec, prefix):
|
||||||
make()
|
make()
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
make("install")
|
make('install')
|
||||||
|
|
||||||
Again, there is a ``boostrap_args`` function that determines the
|
Again, there is a ``boostrap_args`` function that determines the
|
||||||
correct bootstrap flags to use.
|
correct bootstrap flags to use.
|
||||||
@@ -127,21 +128,16 @@ before or after a particular phase. For example, in ``perl``, we see:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@run_after("install")
|
@run_after('install')
|
||||||
def install_cpanm(self):
|
def install_cpanm(self):
|
||||||
spec = self.spec
|
spec = self.spec
|
||||||
maker = make
|
|
||||||
cpan_dir = join_path("cpanm", "cpanm")
|
if '+cpanm' in spec:
|
||||||
if sys.platform == "win32":
|
with working_dir(join_path('cpanm', 'cpanm')):
|
||||||
maker = nmake
|
perl = spec['perl'].command
|
||||||
cpan_dir = join_path(self.stage.source_path, cpan_dir)
|
perl('Makefile.PL')
|
||||||
cpan_dir = windows_sfn(cpan_dir)
|
make()
|
||||||
if "+cpanm" in spec:
|
make('install')
|
||||||
with working_dir(cpan_dir):
|
|
||||||
perl = spec["perl"].command
|
|
||||||
perl("Makefile.PL")
|
|
||||||
maker()
|
|
||||||
maker("install")
|
|
||||||
|
|
||||||
This extra step automatically installs ``cpanm`` in addition to the
|
This extra step automatically installs ``cpanm`` in addition to the
|
||||||
base Perl installation.
|
base Perl installation.
|
||||||
@@ -178,16 +174,10 @@ In the ``perl`` package, we can see:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@run_after("build")
|
@run_after('build')
|
||||||
@on_package_attributes(run_tests=True)
|
@on_package_attributes(run_tests=True)
|
||||||
def build_test(self):
|
def test(self):
|
||||||
if sys.platform == "win32":
|
make('test')
|
||||||
win32_dir = os.path.join(self.stage.source_path, "win32")
|
|
||||||
win32_dir = windows_sfn(win32_dir)
|
|
||||||
with working_dir(win32_dir):
|
|
||||||
nmake("test", ignore_quotes=True)
|
|
||||||
else:
|
|
||||||
make("test")
|
|
||||||
|
|
||||||
As you can guess, this runs ``make test`` *after* building the package,
|
As you can guess, this runs ``make test`` *after* building the package,
|
||||||
if and only if testing is requested. Again, this is not specific to
|
if and only if testing is requested. Again, this is not specific to
|
||||||
@@ -199,7 +189,7 @@ custom build systems, it can be added to existing build systems as well.
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@run_after("install")
|
@run_after('install')
|
||||||
@on_package_attributes(run_tests=True)
|
@on_package_attributes(run_tests=True)
|
||||||
|
|
||||||
works as expected. However, if you reverse the ordering:
|
works as expected. However, if you reverse the ordering:
|
||||||
@@ -207,7 +197,7 @@ custom build systems, it can be added to existing build systems as well.
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@on_package_attributes(run_tests=True)
|
@on_package_attributes(run_tests=True)
|
||||||
@run_after("install")
|
@run_after('install')
|
||||||
|
|
||||||
the tests will always be run regardless of whether or not
|
the tests will always be run regardless of whether or not
|
||||||
``--test=root`` is requested. See https://github.com/spack/spack/issues/3833
|
``--test=root`` is requested. See https://github.com/spack/spack/issues/3833
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _inteloneapipackage:
|
.. _inteloneapipackage:
|
||||||
|
|
||||||
|
|
||||||
===========
|
====================
|
||||||
IntelOneapi
|
IntelOneapiPackage
|
||||||
===========
|
====================
|
||||||
|
|
||||||
|
|
||||||
.. contents::
|
.. contents::
|
||||||
@@ -24,14 +25,14 @@ use Spack to build packages with the tools.
|
|||||||
The Spack Python class ``IntelOneapiPackage`` is a base class that is
|
The Spack Python class ``IntelOneapiPackage`` is a base class that is
|
||||||
used by ``IntelOneapiCompilers``, ``IntelOneapiMkl``,
|
used by ``IntelOneapiCompilers``, ``IntelOneapiMkl``,
|
||||||
``IntelOneapiTbb`` and other classes to implement the oneAPI
|
``IntelOneapiTbb`` and other classes to implement the oneAPI
|
||||||
packages. Search for ``oneAPI`` at `packages.spack.io <https://packages.spack.io>`_ for the full
|
packages. See the :ref:`package-list` for the full list of available
|
||||||
list of available oneAPI packages, or use::
|
oneAPI packages or use::
|
||||||
|
|
||||||
spack list -d oneAPI
|
spack list -d oneAPI
|
||||||
|
|
||||||
For more information on a specific package, do::
|
For more information on a specific package, do::
|
||||||
|
|
||||||
spack info --all <package-name>
|
spack info <package-name>
|
||||||
|
|
||||||
Intel no longer releases new versions of Parallel Studio, which can be
|
Intel no longer releases new versions of Parallel Studio, which can be
|
||||||
used in Spack via the :ref:`intelpackage`. All of its components can
|
used in Spack via the :ref:`intelpackage`. All of its components can
|
||||||
@@ -52,24 +53,18 @@ Install the oneAPI compilers::
|
|||||||
|
|
||||||
Add the compilers to your ``compilers.yaml`` so spack can use them::
|
Add the compilers to your ``compilers.yaml`` so spack can use them::
|
||||||
|
|
||||||
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/bin
|
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/linux/bin/intel64
|
||||||
|
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/linux/bin
|
||||||
|
|
||||||
Verify that the compilers are available::
|
Verify that the compilers are available::
|
||||||
|
|
||||||
spack compiler list
|
spack compiler list
|
||||||
|
|
||||||
Note that 2024 and later releases do not include ``icc``. Before 2024,
|
|
||||||
the package layout was different::
|
|
||||||
|
|
||||||
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/linux/bin/intel64
|
|
||||||
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/linux/bin
|
|
||||||
|
|
||||||
The ``intel-oneapi-compilers`` package includes 2 families of
|
The ``intel-oneapi-compilers`` package includes 2 families of
|
||||||
compilers:
|
compilers:
|
||||||
|
|
||||||
* ``intel``: ``icc``, ``icpc``, ``ifort``. Intel's *classic*
|
* ``intel``: ``icc``, ``icpc``, ``ifort``. Intel's *classic*
|
||||||
compilers. 2024 and later releases contain ``ifort``, but not
|
compilers.
|
||||||
``icc`` and ``icpc``.
|
|
||||||
* ``oneapi``: ``icx``, ``icpx``, ``ifx``. Intel's new generation of
|
* ``oneapi``: ``icx``, ``icpx``, ``ifx``. Intel's new generation of
|
||||||
compilers based on LLVM.
|
compilers based on LLVM.
|
||||||
|
|
||||||
@@ -81,55 +76,6 @@ To build with with ``icx``, do ::
|
|||||||
|
|
||||||
spack install patchelf%oneapi
|
spack install patchelf%oneapi
|
||||||
|
|
||||||
|
|
||||||
Using oneAPI Spack environment
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
In this example, we build lammps with ``icx`` using Spack environment for oneAPI packages created by Intel. The
|
|
||||||
compilers are installed with Spack like in example above.
|
|
||||||
|
|
||||||
Install the oneAPI compilers::
|
|
||||||
|
|
||||||
spack install intel-oneapi-compilers
|
|
||||||
|
|
||||||
Add the compilers to your ``compilers.yaml`` so Spack can use them::
|
|
||||||
|
|
||||||
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/bin
|
|
||||||
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/bin
|
|
||||||
|
|
||||||
Verify that the compilers are available::
|
|
||||||
|
|
||||||
spack compiler list
|
|
||||||
|
|
||||||
Clone `spack-configs <https://github.com/spack/spack-configs>`_ repo and activate Intel oneAPI CPU environment::
|
|
||||||
|
|
||||||
git clone https://github.com/spack/spack-configs
|
|
||||||
spack env activate spack-configs/INTEL/CPU
|
|
||||||
spack concretize -f
|
|
||||||
|
|
||||||
`Intel oneAPI CPU environment <https://github.com/spack/spack-configs/blob/main/INTEL/CPU/spack.yaml>`_ contains applications tested and validated by Intel, this list is constantly extended. And currently it supports:
|
|
||||||
|
|
||||||
- `Devito <https://www.devitoproject.org/>`_
|
|
||||||
- `GROMACS <https://www.gromacs.org/>`_
|
|
||||||
- `HPCG <https://www.hpcg-benchmark.org/>`_
|
|
||||||
- `HPL <https://netlib.org/benchmark/hpl/>`_
|
|
||||||
- `LAMMPS <https://www.lammps.org/#gsc.tab=0>`_
|
|
||||||
- `OpenFOAM <https://www.openfoam.com/>`_
|
|
||||||
- `Quantum Espresso <https://www.quantum-espresso.org/>`_
|
|
||||||
- `STREAM <https://www.cs.virginia.edu/stream/>`_
|
|
||||||
- `WRF <https://github.com/wrf-model/WRF>`_
|
|
||||||
|
|
||||||
To build lammps with oneAPI compiler from this environment just run::
|
|
||||||
|
|
||||||
spack install lammps
|
|
||||||
|
|
||||||
Compiled binaries can be find using::
|
|
||||||
|
|
||||||
spack cd -i lammps
|
|
||||||
|
|
||||||
You can do the same for all other applications from this environment.
|
|
||||||
|
|
||||||
|
|
||||||
Using oneAPI MPI to Satisfy a Virtual Dependence
|
Using oneAPI MPI to Satisfy a Virtual Dependence
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
|
|
||||||
@@ -138,8 +84,8 @@ build ``hdf5`` with Intel oneAPI MPI do::
|
|||||||
|
|
||||||
spack install hdf5 +mpi ^intel-oneapi-mpi
|
spack install hdf5 +mpi ^intel-oneapi-mpi
|
||||||
|
|
||||||
Using Externally Installed oneAPI Tools
|
Using an Externally Installed oneAPI
|
||||||
=======================================
|
====================================
|
||||||
|
|
||||||
Spack can also use oneAPI tools that are manually installed with
|
Spack can also use oneAPI tools that are manually installed with
|
||||||
`Intel Installers`_. The procedures for configuring Spack to use
|
`Intel Installers`_. The procedures for configuring Spack to use
|
||||||
@@ -151,7 +97,8 @@ Compilers
|
|||||||
To use the compilers, add some information about the installation to
|
To use the compilers, add some information about the installation to
|
||||||
``compilers.yaml``. For most users, it is sufficient to do::
|
``compilers.yaml``. For most users, it is sufficient to do::
|
||||||
|
|
||||||
spack compiler add /opt/intel/oneapi/compiler/latest/bin
|
spack compiler add /opt/intel/oneapi/compiler/latest/linux/bin/intel64
|
||||||
|
spack compiler add /opt/intel/oneapi/compiler/latest/linux/bin
|
||||||
|
|
||||||
Adapt the paths above if you did not install the tools in the default
|
Adapt the paths above if you did not install the tools in the default
|
||||||
location. After adding the compilers, using them is the same
|
location. After adding the compilers, using them is the same
|
||||||
@@ -160,16 +107,10 @@ Another option is to manually add the configuration to
|
|||||||
``compilers.yaml`` as described in :ref:`Compiler configuration
|
``compilers.yaml`` as described in :ref:`Compiler configuration
|
||||||
<compiler-config>`.
|
<compiler-config>`.
|
||||||
|
|
||||||
Before 2024, the directory structure was different::
|
|
||||||
|
|
||||||
spack compiler add /opt/intel/oneapi/compiler/latest/linux/bin/intel64
|
|
||||||
spack compiler add /opt/intel/oneapi/compiler/latest/linux/bin
|
|
||||||
|
|
||||||
|
|
||||||
Libraries
|
Libraries
|
||||||
---------
|
---------
|
||||||
|
|
||||||
If you want Spack to use oneMKL that you have installed without Spack in
|
If you want Spack to use MKL that you have installed without Spack in
|
||||||
the default location, then add the following to
|
the default location, then add the following to
|
||||||
``~/.spack/packages.yaml``, adjusting the version as appropriate::
|
``~/.spack/packages.yaml``, adjusting the version as appropriate::
|
||||||
|
|
||||||
@@ -183,7 +124,7 @@ Using oneAPI Tools Installed by Spack
|
|||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
Spack can be a convenient way to install and configure compilers and
|
Spack can be a convenient way to install and configure compilers and
|
||||||
libraries, even if you do not intend to build a Spack package. If you
|
libaries, even if you do not intend to build a Spack package. If you
|
||||||
want to build a Makefile project using Spack-installed oneAPI compilers,
|
want to build a Makefile project using Spack-installed oneAPI compilers,
|
||||||
then use spack to configure your environment::
|
then use spack to configure your environment::
|
||||||
|
|
||||||
@@ -198,7 +139,7 @@ You can also use Spack-installed libraries. For example::
|
|||||||
spack load intel-oneapi-mkl
|
spack load intel-oneapi-mkl
|
||||||
|
|
||||||
Will update your environment CPATH, LIBRARY_PATH, and other
|
Will update your environment CPATH, LIBRARY_PATH, and other
|
||||||
environment variables for building an application with oneMKL.
|
environment variables for building an application with MKL.
|
||||||
|
|
||||||
More information
|
More information
|
||||||
================
|
================
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _intelpackage:
|
.. _intelpackage:
|
||||||
|
|
||||||
-----
|
------------
|
||||||
Intel
|
IntelPackage
|
||||||
-----
|
------------
|
||||||
|
|
||||||
.. contents::
|
.. contents::
|
||||||
|
|
||||||
@@ -14,9 +15,6 @@ Intel
|
|||||||
Intel packages in Spack
|
Intel packages in Spack
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
This is an earlier version of Intel software development tools and has
|
|
||||||
now been replaced by Intel oneAPI Toolkits.
|
|
||||||
|
|
||||||
Spack can install and use several software development products offered by Intel.
|
Spack can install and use several software development products offered by Intel.
|
||||||
Some of these are available under no-cost terms, others require a paid license.
|
Some of these are available under no-cost terms, others require a paid license.
|
||||||
All share the same basic steps for configuration, installation, and, where
|
All share the same basic steps for configuration, installation, and, where
|
||||||
@@ -89,7 +87,7 @@ and optimizers do require a paid license. In Spack, they are packaged as:
|
|||||||
TODO: Confirm and possible change(!) the scope of MPI components (runtime
|
TODO: Confirm and possible change(!) the scope of MPI components (runtime
|
||||||
vs. devel) in current (and previous?) *cluster/professional/composer*
|
vs. devel) in current (and previous?) *cluster/professional/composer*
|
||||||
editions, i.e., presence in downloads, possibly subject to license
|
editions, i.e., presence in downloads, possibly subject to license
|
||||||
coverage(!); see `discussion in PR #4300
|
coverage(!); see `disussion in PR #4300
|
||||||
<https://github.com/spack/spack/pull/4300#issuecomment-305582898>`_. [NB:
|
<https://github.com/spack/spack/pull/4300#issuecomment-305582898>`_. [NB:
|
||||||
An "mpi" subdirectory is not indicative of the full MPI SDK being present
|
An "mpi" subdirectory is not indicative of the full MPI SDK being present
|
||||||
(i.e., ``mpicc``, ..., and header files). The directory may just as well
|
(i.e., ``mpicc``, ..., and header files). The directory may just as well
|
||||||
@@ -391,12 +389,12 @@ See section
|
|||||||
:ref:`Configuration Scopes <configuration-scopes>`
|
:ref:`Configuration Scopes <configuration-scopes>`
|
||||||
for an explanation about the different files
|
for an explanation about the different files
|
||||||
and section
|
and section
|
||||||
:ref:`Build customization <packages-config>`
|
:ref:`Build customization <build-settings>`
|
||||||
for specifics and examples for ``packages.yaml`` files.
|
for specifics and examples for ``packages.yaml`` files.
|
||||||
|
|
||||||
.. If your system administrator did not provide modules for pre-installed Intel
|
.. If your system administrator did not provide modules for pre-installed Intel
|
||||||
tools, you could do well to ask for them, because installing multiple copies
|
tools, you could do well to ask for them, because installing multiple copies
|
||||||
of the Intel tools, as is won't to happen once Spack is in the picture, is
|
of the Intel tools, as is wont to happen once Spack is in the picture, is
|
||||||
bound to stretch disk space and patience thin. If you *are* the system
|
bound to stretch disk space and patience thin. If you *are* the system
|
||||||
administrator and are still new to modules, then perhaps it's best to follow
|
administrator and are still new to modules, then perhaps it's best to follow
|
||||||
the `next section <Installing Intel tools within Spack_>`_ and install the tools
|
the `next section <Installing Intel tools within Spack_>`_ and install the tools
|
||||||
@@ -652,7 +650,7 @@ follow `the next section <intel-install-libs_>`_ instead.
|
|||||||
* If you specified a custom variant (for example ``+vtune``) you may want to add this as your
|
* If you specified a custom variant (for example ``+vtune``) you may want to add this as your
|
||||||
preferred variant in the packages configuration for the ``intel-parallel-studio`` package
|
preferred variant in the packages configuration for the ``intel-parallel-studio`` package
|
||||||
as described in :ref:`package-preferences`. Otherwise you will have to specify
|
as described in :ref:`package-preferences`. Otherwise you will have to specify
|
||||||
the variant every time ``intel-parallel-studio`` is being used as ``mkl``, ``fftw`` or ``mpi``
|
the variant everytime ``intel-parallel-studio`` is being used as ``mkl``, ``fftw`` or ``mpi``
|
||||||
implementation to avoid pulling in a different variant.
|
implementation to avoid pulling in a different variant.
|
||||||
|
|
||||||
* To set the Intel compilers for default use in Spack, instead of the usual ``%gcc``,
|
* To set the Intel compilers for default use in Spack, instead of the usual ``%gcc``,
|
||||||
@@ -933,9 +931,9 @@ a *virtual* ``mkl`` package is declared in Spack.
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
# Examples for absolute and conditional dependencies:
|
# Examples for absolute and conditional dependencies:
|
||||||
depends_on("mkl")
|
depends_on('mkl')
|
||||||
depends_on("mkl", when="+mkl")
|
depends_on('mkl', when='+mkl')
|
||||||
depends_on("mkl", when="fftw=mkl")
|
depends_on('mkl', when='fftw=mkl')
|
||||||
|
|
||||||
The ``MKLROOT`` environment variable (part of the documented API) will be set
|
The ``MKLROOT`` environment variable (part of the documented API) will be set
|
||||||
during all stages of client package installation, and is available to both
|
during all stages of client package installation, and is available to both
|
||||||
@@ -971,8 +969,8 @@ a *virtual* ``mkl`` package is declared in Spack.
|
|||||||
def configure_args(self):
|
def configure_args(self):
|
||||||
args = []
|
args = []
|
||||||
...
|
...
|
||||||
args.append("--with-blas=%s" % self.spec["blas"].libs.ld_flags)
|
args.append('--with-blas=%s' % self.spec['blas'].libs.ld_flags)
|
||||||
args.append("--with-lapack=%s" % self.spec["lapack"].libs.ld_flags)
|
args.append('--with-lapack=%s' % self.spec['lapack'].libs.ld_flags)
|
||||||
...
|
...
|
||||||
|
|
||||||
.. tip::
|
.. tip::
|
||||||
@@ -988,13 +986,13 @@ a *virtual* ``mkl`` package is declared in Spack.
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
self.spec["blas"].headers.include_flags
|
self.spec['blas'].headers.include_flags
|
||||||
|
|
||||||
and to generate linker options (``-L<dir> -llibname ...``), use the same as above,
|
and to generate linker options (``-L<dir> -llibname ...``), use the same as above,
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
self.spec["blas"].libs.ld_flags
|
self.spec['blas'].libs.ld_flags
|
||||||
|
|
||||||
See
|
See
|
||||||
:ref:`MakefilePackage <makefilepackage>`
|
:ref:`MakefilePackage <makefilepackage>`
|
||||||
|
@@ -1,14 +1,15 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _luapackage:
|
.. _luapackage:
|
||||||
|
|
||||||
---
|
------------
|
||||||
Lua
|
LuaPackage
|
||||||
---
|
------------
|
||||||
|
|
||||||
The ``Lua`` build-system is a helper for the common case of Lua packages that provide
|
LuaPackage is a helper for the common case of Lua packages that provide
|
||||||
a rockspec file. This is not meant to take a rock archive, but to build
|
a rockspec file. This is not meant to take a rock archive, but to build
|
||||||
a source archive or repository that provides a rockspec, which should cover
|
a source archive or repository that provides a rockspec, which should cover
|
||||||
most lua packages. In the case a Lua package builds by Make rather than
|
most lua packages. In the case a Lua package builds by Make rather than
|
||||||
@@ -18,7 +19,7 @@ luarocks, prefer MakefilePackage.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``LuaBuilder`` and `LuaPackage`` base classes come with the following phases:
|
The ``LuaPackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``unpack`` - if using a rock, unpacks the rock and moves into the source directory
|
#. ``unpack`` - if using a rock, unpacks the rock and moves into the source directory
|
||||||
#. ``preprocess`` - adjust sources or rockspec to fix build
|
#. ``preprocess`` - adjust sources or rockspec to fix build
|
||||||
@@ -87,7 +88,7 @@ override the ``luarocks_args`` method like so:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def luarocks_args(self):
|
def luarocks_args(self):
|
||||||
return ["flag1", "flag2"]
|
return ['flag1', 'flag2']
|
||||||
|
|
||||||
One common use of this is to override warnings or flags for newer compilers, as in:
|
One common use of this is to override warnings or flags for newer compilers, as in:
|
||||||
|
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _makefilepackage:
|
.. _makefilepackage:
|
||||||
|
|
||||||
--------
|
---------------
|
||||||
Makefile
|
MakefilePackage
|
||||||
--------
|
---------------
|
||||||
|
|
||||||
The most primitive build system a package can use is a plain Makefile.
|
The most primitive build system a package can use is a plain Makefile.
|
||||||
Makefiles are simple to write for small projects, but they usually
|
Makefiles are simple to write for small projects, but they usually
|
||||||
@@ -17,7 +18,7 @@ variables.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``MakefileBuilder`` and ``MakefilePackage`` base classes come with 3 phases:
|
The ``MakefilePackage`` base class comes with 3 phases:
|
||||||
|
|
||||||
#. ``edit`` - edit the Makefile
|
#. ``edit`` - edit the Makefile
|
||||||
#. ``build`` - build the project
|
#. ``build`` - build the project
|
||||||
@@ -58,7 +59,7 @@ using GNU Make, you should add a dependency on ``gmake``:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("gmake", type="build")
|
depends_on('gmake', type='build')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -87,13 +88,13 @@ command-line. However, Makefiles that use ``?=`` for assignment honor
|
|||||||
environment variables. Since Spack already sets ``CC``, ``CXX``, ``F77``,
|
environment variables. Since Spack already sets ``CC``, ``CXX``, ``F77``,
|
||||||
and ``FC``, you won't need to worry about setting these variables. If
|
and ``FC``, you won't need to worry about setting these variables. If
|
||||||
there are any other variables you need to set, you can do this in the
|
there are any other variables you need to set, you can do this in the
|
||||||
``setup_build_environment`` method:
|
``edit`` method:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def setup_build_environment(self, env):
|
def edit(self, spec, prefix):
|
||||||
env.set("PREFIX", prefix)
|
env['PREFIX'] = prefix
|
||||||
env.set("BLASLIB", spec["blas"].libs.ld_flags)
|
env['BLASLIB'] = spec['blas'].libs.ld_flags
|
||||||
|
|
||||||
|
|
||||||
`cbench <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cbench/package.py>`_
|
`cbench <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cbench/package.py>`_
|
||||||
@@ -112,7 +113,7 @@ you can do this like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_targets = ["CC=cc"]
|
build_targets = ['CC=cc']
|
||||||
|
|
||||||
|
|
||||||
If you do need access to the spec, you can create a property like so:
|
If you do need access to the spec, you can create a property like so:
|
||||||
@@ -124,8 +125,8 @@ If you do need access to the spec, you can create a property like so:
|
|||||||
spec = self.spec
|
spec = self.spec
|
||||||
|
|
||||||
return [
|
return [
|
||||||
"CC=cc",
|
'CC=cc',
|
||||||
f"BLASLIB={spec['blas'].libs.ld_flags}",
|
'BLASLIB={0}'.format(spec['blas'].libs.ld_flags),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -139,17 +140,17 @@ Edit Makefile
|
|||||||
Some Makefiles are just plain stubborn and will ignore command-line
|
Some Makefiles are just plain stubborn and will ignore command-line
|
||||||
variables. The only way to ensure that these packages build correctly
|
variables. The only way to ensure that these packages build correctly
|
||||||
is to directly edit the Makefile. Spack provides a ``FileFilter`` class
|
is to directly edit the Makefile. Spack provides a ``FileFilter`` class
|
||||||
and a ``filter`` method to help with this. For example:
|
and a ``filter_file`` method to help with this. For example:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def edit(self, spec, prefix):
|
def edit(self, spec, prefix):
|
||||||
makefile = FileFilter("Makefile")
|
makefile = FileFilter('Makefile')
|
||||||
|
|
||||||
makefile.filter(r"^\s*CC\s*=.*", f"CC = {spack_cc}")
|
makefile.filter(r'^\s*CC\s*=.*', 'CC = ' + spack_cc)
|
||||||
makefile.filter(r"^\s*CXX\s*=.*", f"CXX = {spack_cxx}")
|
makefile.filter(r'^\s*CXX\s*=.*', 'CXX = ' + spack_cxx)
|
||||||
makefile.filter(r"^\s*F77\s*=.*", f"F77 = {spack_f77}")
|
makefile.filter(r'^\s*F77\s*=.*', 'F77 = ' + spack_f77)
|
||||||
makefile.filter(r"^\s*FC\s*=.*", f"FC = {spack_fc}")
|
makefile.filter(r'^\s*FC\s*=.*', 'FC = ' + spack_fc)
|
||||||
|
|
||||||
|
|
||||||
`stream <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/stream/package.py>`_
|
`stream <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/stream/package.py>`_
|
||||||
@@ -180,16 +181,16 @@ well for storing variables:
|
|||||||
|
|
||||||
def edit(self, spec, prefix):
|
def edit(self, spec, prefix):
|
||||||
config = {
|
config = {
|
||||||
"CC": "cc",
|
'CC': 'cc',
|
||||||
"MAKE": "make",
|
'MAKE': 'make',
|
||||||
}
|
}
|
||||||
|
|
||||||
if spec.satisfies("+blas"):
|
if '+blas' in spec:
|
||||||
config["BLAS_LIBS"] = spec["blas"].libs.joined()
|
config['BLAS_LIBS'] = spec['blas'].libs.joined()
|
||||||
|
|
||||||
with open("make.inc", "w") as inc:
|
with open('make.inc', 'w') as inc:
|
||||||
for key in config:
|
for key in config:
|
||||||
inc.write(f"{key} = {config[key]}\n")
|
inc.write('{0} = {1}\n'.format(key, config[key]))
|
||||||
|
|
||||||
|
|
||||||
`elk <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/elk/package.py>`_
|
`elk <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/elk/package.py>`_
|
||||||
@@ -203,14 +204,14 @@ them in a list:
|
|||||||
|
|
||||||
def edit(self, spec, prefix):
|
def edit(self, spec, prefix):
|
||||||
config = [
|
config = [
|
||||||
f"INSTALL_DIR = {prefix}",
|
'INSTALL_DIR = {0}'.format(prefix),
|
||||||
"INCLUDE_DIR = $(INSTALL_DIR)/include",
|
'INCLUDE_DIR = $(INSTALL_DIR)/include',
|
||||||
"LIBRARY_DIR = $(INSTALL_DIR)/lib",
|
'LIBRARY_DIR = $(INSTALL_DIR)/lib',
|
||||||
]
|
]
|
||||||
|
|
||||||
with open("make.inc", "w") as inc:
|
with open('make.inc', 'w') as inc:
|
||||||
for var in config:
|
for var in config:
|
||||||
inc.write(f"{var}\n")
|
inc.write('{0}\n'.format(var))
|
||||||
|
|
||||||
|
|
||||||
`hpl <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/hpl/package.py>`_
|
`hpl <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/hpl/package.py>`_
|
||||||
@@ -283,7 +284,7 @@ can tell Spack where to locate it like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_directory = "src"
|
build_directory = 'src'
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -298,8 +299,8 @@ install the package:
|
|||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
mkdir(prefix.bin)
|
mkdir(prefix.bin)
|
||||||
install("foo", prefix.bin)
|
install('foo', prefix.bin)
|
||||||
install_tree("lib", prefix.lib)
|
install_tree('lib', prefix.lib)
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _mavenpackage:
|
.. _mavenpackage:
|
||||||
|
|
||||||
-----
|
------------
|
||||||
Maven
|
MavenPackage
|
||||||
-----
|
------------
|
||||||
|
|
||||||
Apache Maven is a general-purpose build system that does not rely
|
Apache Maven is a general-purpose build system that does not rely
|
||||||
on Makefiles to build software. It is designed for building and
|
on Makefiles to build software. It is designed for building and
|
||||||
@@ -16,7 +17,7 @@ managing and Java-based project.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``MavenBuilder`` and ``MavenPackage`` base classes come with the following phases:
|
The ``MavenPackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``build`` - compile code and package into a JAR file
|
#. ``build`` - compile code and package into a JAR file
|
||||||
#. ``install`` - copy to installation prefix
|
#. ``install`` - copy to installation prefix
|
||||||
@@ -47,8 +48,8 @@ class automatically adds the following dependencies:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("java", type=("build", "run"))
|
depends_on('java', type=('build', 'run'))
|
||||||
depends_on("maven", type="build")
|
depends_on('maven', type='build')
|
||||||
|
|
||||||
|
|
||||||
In the ``pom.xml`` file, you may see sections like:
|
In the ``pom.xml`` file, you may see sections like:
|
||||||
@@ -71,8 +72,8 @@ should add:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("java@7:", type="build")
|
depends_on('java@7:', type='build')
|
||||||
depends_on("maven@3.5.4:", type="build")
|
depends_on('maven@3.5.4:', type='build')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -87,9 +88,9 @@ the build phase. For example:
|
|||||||
|
|
||||||
def build_args(self):
|
def build_args(self):
|
||||||
return [
|
return [
|
||||||
"-Pdist,native",
|
'-Pdist,native',
|
||||||
"-Dtar",
|
'-Dtar',
|
||||||
"-Dmaven.javadoc.skip=true"
|
'-Dmaven.javadoc.skip=true'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _mesonpackage:
|
.. _mesonpackage:
|
||||||
|
|
||||||
-----
|
------------
|
||||||
Meson
|
MesonPackage
|
||||||
-----
|
------------
|
||||||
|
|
||||||
Much like Autotools and CMake, Meson is a build system. But it is
|
Much like Autotools and CMake, Meson is a build system. But it is
|
||||||
meant to be both fast and as user friendly as possible. GNOME's goal
|
meant to be both fast and as user friendly as possible. GNOME's goal
|
||||||
@@ -16,7 +17,7 @@ is to port modules to use the Meson build system.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``MesonBuilder`` and ``MesonPackage`` base classes come with the following phases:
|
The ``MesonPackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``meson`` - generate ninja files
|
#. ``meson`` - generate ninja files
|
||||||
#. ``build`` - build the project
|
#. ``build`` - build the project
|
||||||
@@ -85,8 +86,8 @@ the ``MesonPackage`` base class already contains:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("meson", type="build")
|
depends_on('meson', type='build')
|
||||||
depends_on("ninja", type="build")
|
depends_on('ninja', type='build')
|
||||||
|
|
||||||
|
|
||||||
If you need to specify a particular version requirement, you can
|
If you need to specify a particular version requirement, you can
|
||||||
@@ -94,8 +95,8 @@ override this in your package:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("meson@0.43.0:", type="build")
|
depends_on('meson@0.43.0:', type='build')
|
||||||
depends_on("ninja", type="build")
|
depends_on('ninja', type='build')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -120,7 +121,7 @@ override the ``meson_args`` method like so:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def meson_args(self):
|
def meson_args(self):
|
||||||
return ["--warnlevel=3"]
|
return ['--warnlevel=3']
|
||||||
|
|
||||||
|
|
||||||
This method can be used to pass flags as well as variables.
|
This method can be used to pass flags as well as variables.
|
||||||
|
350
lib/spack/docs/build_systems/multiplepackage.rst
Normal file
350
lib/spack/docs/build_systems/multiplepackage.rst
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
.. _multiplepackage:
|
||||||
|
|
||||||
|
----------------------
|
||||||
|
Multiple Build Systems
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Quite frequently, a package will change build systems from one version to the
|
||||||
|
next. For example, a small project that once used a single Makefile to build
|
||||||
|
may now require Autotools to handle the increased number of files that need to
|
||||||
|
be compiled. Or, a package that once used Autotools may switch to CMake for
|
||||||
|
Windows support. In this case, it becomes a bit more challenging to write a
|
||||||
|
single build recipe for this package in Spack.
|
||||||
|
|
||||||
|
There are several ways that this can be handled in Spack:
|
||||||
|
|
||||||
|
#. Subclass the new build system, and override phases as needed (preferred)
|
||||||
|
#. Subclass ``Package`` and implement ``install`` as needed
|
||||||
|
#. Create separate ``*-cmake``, ``*-autotools``, etc. packages for each build system
|
||||||
|
#. Rename the old package to ``*-legacy`` and create a new package
|
||||||
|
#. Move the old package to a ``legacy`` repository and create a new package
|
||||||
|
#. Drop older versions that only support the older build system
|
||||||
|
|
||||||
|
Of these options, 1 is preferred, and will be demonstrated in this
|
||||||
|
documentation. Options 3-5 have issues with concretization, so shouldn't be
|
||||||
|
used. Options 4-5 also don't support more than two build systems. Option 6 only
|
||||||
|
works if the old versions are no longer needed. Option 1 is preferred over 2
|
||||||
|
because it makes it easier to drop the old build system entirely.
|
||||||
|
|
||||||
|
The exact syntax of the package depends on which build systems you need to
|
||||||
|
support. Below are a couple of common examples.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Makefile -> Autotools
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Let's say we have the following package:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Foo(MakefilePackage):
|
||||||
|
version("1.2.0", sha256="...")
|
||||||
|
|
||||||
|
def edit(self, spec, prefix):
|
||||||
|
filter_file("CC=", "CC=" + spack_cc, "Makefile")
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
install_tree(".", prefix)
|
||||||
|
|
||||||
|
|
||||||
|
The package subclasses from :ref:`makefilepackage`, which has three phases:
|
||||||
|
|
||||||
|
#. ``edit`` (does nothing by default)
|
||||||
|
#. ``build`` (runs ``make`` by default)
|
||||||
|
#. ``install`` (runs ``make install`` by default)
|
||||||
|
|
||||||
|
In this case, the ``install`` phase needed to be overridden because the
|
||||||
|
Makefile did not have an install target. We also modify the Makefile to use
|
||||||
|
Spack's compiler wrappers. The default ``build`` phase is not changed.
|
||||||
|
|
||||||
|
Starting with version 1.3.0, we want to use Autotools to build instead.
|
||||||
|
:ref:`autotoolspackage` has four phases:
|
||||||
|
|
||||||
|
#. ``autoreconf`` (does not if a configure script already exists)
|
||||||
|
#. ``configure`` (runs ``./configure --prefix=...`` by default)
|
||||||
|
#. ``build`` (runs ``make`` by default)
|
||||||
|
#. ``install`` (runs ``make install`` by default)
|
||||||
|
|
||||||
|
If the only version we need to support is 1.3.0, the package would look as
|
||||||
|
simple as:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Foo(AutotoolsPackage):
|
||||||
|
version("1.3.0", sha256="...")
|
||||||
|
|
||||||
|
def configure_args(self):
|
||||||
|
return ["--enable-shared"]
|
||||||
|
|
||||||
|
|
||||||
|
In this case, we use the default methods for each phase and only override
|
||||||
|
``configure_args`` to specify additional flags to pass to ``./configure``.
|
||||||
|
|
||||||
|
If we wanted to write a single package that supports both versions 1.2.0 and
|
||||||
|
1.3.0, it would look something like:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Foo(AutotoolsPackage):
|
||||||
|
version("1.3.0", sha256="...")
|
||||||
|
version("1.2.0", sha256="...", deprecated=True)
|
||||||
|
|
||||||
|
def configure_args(self):
|
||||||
|
return ["--enable-shared"]
|
||||||
|
|
||||||
|
# Remove the following once version 1.2.0 is dropped
|
||||||
|
@when("@:1.2")
|
||||||
|
def patch(self):
|
||||||
|
filter_file("CC=", "CC=" + spack_cc, "Makefile")
|
||||||
|
|
||||||
|
@when("@:1.2")
|
||||||
|
def autoreconf(self, spec, prefix):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@when("@:1.2")
|
||||||
|
def configure(self, spec, prefix):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@when("@:1.2")
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
install_tree(".", prefix)
|
||||||
|
|
||||||
|
|
||||||
|
There are a few interesting things to note here:
|
||||||
|
|
||||||
|
* We added ``deprecated=True`` to version 1.2.0. This signifies that version
|
||||||
|
1.2.0 is deprecated and shouldn't be used. However, if a user still relies
|
||||||
|
on version 1.2.0, it's still there and builds just fine.
|
||||||
|
* We moved the contents of the ``edit`` phase to the ``patch`` function. Since
|
||||||
|
``AutotoolsPackage`` doesn't have an ``edit`` phase, the only way for this
|
||||||
|
step to be executed is to move it to the ``patch`` function, which always
|
||||||
|
gets run.
|
||||||
|
* The ``autoreconf`` and ``configure`` phases become no-ops. Since the old
|
||||||
|
Makefile-based build system doesn't use these, we ignore these phases when
|
||||||
|
building ``foo@1.2.0``.
|
||||||
|
* The ``@when`` decorator is used to override these phases only for older
|
||||||
|
versions. The default methods are used for ``foo@1.3:``.
|
||||||
|
|
||||||
|
Once a new Spack release comes out, version 1.2.0 and everything below the
|
||||||
|
comment can be safely deleted. The result is the same as if we had written a
|
||||||
|
package for version 1.3.0 from scratch.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
Autotools -> CMake
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Let's say we have the following package:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Bar(AutotoolsPackage):
|
||||||
|
version("1.2.0", sha256="...")
|
||||||
|
|
||||||
|
def configure_args(self):
|
||||||
|
return ["--enable-shared"]
|
||||||
|
|
||||||
|
|
||||||
|
The package subclasses from :ref:`autotoolspackage`, which has four phases:
|
||||||
|
|
||||||
|
#. ``autoreconf`` (does not if a configure script already exists)
|
||||||
|
#. ``configure`` (runs ``./configure --prefix=...`` by default)
|
||||||
|
#. ``build`` (runs ``make`` by default)
|
||||||
|
#. ``install`` (runs ``make install`` by default)
|
||||||
|
|
||||||
|
In this case, we use the default methods for each phase and only override
|
||||||
|
``configure_args`` to specify additional flags to pass to ``./configure``.
|
||||||
|
|
||||||
|
Starting with version 1.3.0, we want to use CMake to build instead.
|
||||||
|
:ref:`cmakepackage` has three phases:
|
||||||
|
|
||||||
|
#. ``cmake`` (runs ``cmake ...`` by default)
|
||||||
|
#. ``build`` (runs ``make`` by default)
|
||||||
|
#. ``install`` (runs ``make install`` by default)
|
||||||
|
|
||||||
|
If the only version we need to support is 1.3.0, the package would look as
|
||||||
|
simple as:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Bar(CMakePackage):
|
||||||
|
version("1.3.0", sha256="...")
|
||||||
|
|
||||||
|
def cmake_args(self):
|
||||||
|
return [self.define("BUILD_SHARED_LIBS", True)]
|
||||||
|
|
||||||
|
|
||||||
|
In this case, we use the default methods for each phase and only override
|
||||||
|
``cmake_args`` to specify additional flags to pass to ``cmake``.
|
||||||
|
|
||||||
|
If we wanted to write a single package that supports both versions 1.2.0 and
|
||||||
|
1.3.0, it would look something like:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Bar(CMakePackage):
|
||||||
|
version("1.3.0", sha256="...")
|
||||||
|
version("1.2.0", sha256="...", deprecated=True)
|
||||||
|
|
||||||
|
def cmake_args(self):
|
||||||
|
return [self.define("BUILD_SHARED_LIBS", True)]
|
||||||
|
|
||||||
|
# Remove the following once version 1.2.0 is dropped
|
||||||
|
def configure_args(self):
|
||||||
|
return ["--enable-shared"]
|
||||||
|
|
||||||
|
@when("@:1.2")
|
||||||
|
def cmake(self, spec, prefix):
|
||||||
|
configure("--prefix=" + prefix, *self.configure_args())
|
||||||
|
|
||||||
|
|
||||||
|
There are a few interesting things to note here:
|
||||||
|
|
||||||
|
* We added ``deprecated=True`` to version 1.2.0. This signifies that version
|
||||||
|
1.2.0 is deprecated and shouldn't be used. However, if a user still relies
|
||||||
|
on version 1.2.0, it's still there and builds just fine.
|
||||||
|
* Since CMake and Autotools are so similar, we only need to override the
|
||||||
|
``cmake`` phase, we can use the default ``build`` and ``install`` phases.
|
||||||
|
* We override ``cmake`` to run ``./configure`` for older versions.
|
||||||
|
``configure_args`` remains the same.
|
||||||
|
* The ``@when`` decorator is used to override these phases only for older
|
||||||
|
versions. The default methods are used for ``bar@1.3:``.
|
||||||
|
|
||||||
|
Once a new Spack release comes out, version 1.2.0 and everything below the
|
||||||
|
comment can be safely deleted. The result is the same as if we had written a
|
||||||
|
package for version 1.3.0 from scratch.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Multiple build systems for the same version
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
During the transition from one build system to another, developers often
|
||||||
|
support multiple build systems at the same time. Spack can only use a single
|
||||||
|
build system for a single version. To decide which build system to use for a
|
||||||
|
particular version, take the following things into account:
|
||||||
|
|
||||||
|
1. If the developers explicitly state that one build system is preferred over
|
||||||
|
another, use that one.
|
||||||
|
2. If one build system is considered "experimental" while another is considered
|
||||||
|
"stable", use the stable build system.
|
||||||
|
3. Otherwise, use the newer build system.
|
||||||
|
|
||||||
|
The developer preference for which build system to use can change over time as
|
||||||
|
a newer build system becomes stable/recommended.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Dropping support for old build systems
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When older versions of a package don't support a newer build system, it can be
|
||||||
|
tempting to simply delete them from a package. This significantly reduces
|
||||||
|
package complexity and makes the build recipe much easier to maintain. However,
|
||||||
|
other packages or Spack users may rely on these older versions. The recommended
|
||||||
|
approach is to first support both build systems (as demonstrated above),
|
||||||
|
:ref:`deprecate <deprecate>` versions that rely on the old build system, and
|
||||||
|
remove those versions and any phases that needed to be overridden in the next
|
||||||
|
Spack release.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Three or more build systems
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
In rare cases, a package may change build systems multiple times. For example,
|
||||||
|
a package may start with Makefiles, then switch to Autotools, then switch to
|
||||||
|
CMake. The same logic used above can be extended to any number of build systems.
|
||||||
|
For example:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class Baz(CMakePackage):
|
||||||
|
version("1.4.0", sha256="...") # CMake
|
||||||
|
version("1.3.0", sha256="...") # Autotools
|
||||||
|
version("1.2.0", sha256="...") # Makefile
|
||||||
|
|
||||||
|
def cmake_args(self):
|
||||||
|
return [self.define("BUILD_SHARED_LIBS", True)]
|
||||||
|
|
||||||
|
# Remove the following once version 1.3.0 is dropped
|
||||||
|
def configure_args(self):
|
||||||
|
return ["--enable-shared"]
|
||||||
|
|
||||||
|
@when("@1.3")
|
||||||
|
def cmake(self, spec, prefix):
|
||||||
|
configure("--prefix=" + prefix, *self.configure_args())
|
||||||
|
|
||||||
|
# Remove the following once version 1.2.0 is dropped
|
||||||
|
@when("@:1.2")
|
||||||
|
def patch(self):
|
||||||
|
filter_file("CC=", "CC=" + spack_cc, "Makefile")
|
||||||
|
|
||||||
|
@when("@:1.2")
|
||||||
|
def cmake(self, spec, prefix):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@when("@:1.2")
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
install_tree(".", prefix)
|
||||||
|
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
Additional examples
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When writing new packages, it often helps to see examples of existing packages.
|
||||||
|
Here is an incomplete list of existing Spack packages that have changed build
|
||||||
|
systems before:
|
||||||
|
|
||||||
|
================ ===================== ================
|
||||||
|
Package Previous Build System New Build System
|
||||||
|
================ ===================== ================
|
||||||
|
amber custom CMake
|
||||||
|
arpack-ng Autotools CMake
|
||||||
|
atk Autotools Meson
|
||||||
|
blast None Autotools
|
||||||
|
dyninst Autotools CMake
|
||||||
|
evtgen Autotools CMake
|
||||||
|
fish Autotools CMake
|
||||||
|
gdk-pixbuf Autotools Meson
|
||||||
|
glib Autotools Meson
|
||||||
|
glog Autotools CMake
|
||||||
|
gmt Autotools CMake
|
||||||
|
gtkplus Autotools Meson
|
||||||
|
hpl Makefile Autotools
|
||||||
|
interproscan Perl Maven
|
||||||
|
jasper Autotools CMake
|
||||||
|
kahip SCons CMake
|
||||||
|
kokkos Makefile CMake
|
||||||
|
kokkos-kernels Makefile CMake
|
||||||
|
leveldb Makefile CMake
|
||||||
|
libdrm Autotools Meson
|
||||||
|
libjpeg-turbo Autotools CMake
|
||||||
|
mesa Autotools Meson
|
||||||
|
metis None CMake
|
||||||
|
mpifileutils Autotools CMake
|
||||||
|
muparser Autotools CMake
|
||||||
|
mxnet Makefile CMake
|
||||||
|
nest Autotools CMake
|
||||||
|
neuron Autotools CMake
|
||||||
|
nsimd CMake nsconfig
|
||||||
|
opennurbs Makefile CMake
|
||||||
|
optional-lite None CMake
|
||||||
|
plasma Makefile CMake
|
||||||
|
preseq Makefile Autotools
|
||||||
|
protobuf Autotools CMake
|
||||||
|
py-pygobject Autotools Python
|
||||||
|
singularity Autotools Makefile
|
||||||
|
span-lite None CMake
|
||||||
|
ssht Makefile CMake
|
||||||
|
string-view-lite None CMake
|
||||||
|
superlu Makefile CMake
|
||||||
|
superlu-dist Makefile CMake
|
||||||
|
uncrustify Autotools CMake
|
||||||
|
================ ===================== ================
|
||||||
|
|
||||||
|
Packages that support multiple build systems can be a bit confusing to write.
|
||||||
|
Don't hesitate to open an issue or draft pull request and ask for advice from
|
||||||
|
other Spack developers!
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _octavepackage:
|
.. _octavepackage:
|
||||||
|
|
||||||
------
|
-------------
|
||||||
Octave
|
OctavePackage
|
||||||
------
|
-------------
|
||||||
|
|
||||||
Octave has its own build system for installing packages.
|
Octave has its own build system for installing packages.
|
||||||
|
|
||||||
@@ -14,7 +15,7 @@ Octave has its own build system for installing packages.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``OctaveBuilder`` and ``OctavePackage`` base classes have a single phase:
|
The ``OctavePackage`` base class has a single phase:
|
||||||
|
|
||||||
#. ``install`` - install the package
|
#. ``install`` - install the package
|
||||||
|
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _perlpackage:
|
.. _perlpackage:
|
||||||
|
|
||||||
----
|
-----------
|
||||||
Perl
|
PerlPackage
|
||||||
----
|
-----------
|
||||||
|
|
||||||
Much like Octave, Perl has its own language-specific
|
Much like Octave, Perl has its own language-specific
|
||||||
build system.
|
build system.
|
||||||
@@ -15,7 +16,7 @@ build system.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``PerlBuilder`` and ``PerlPackage`` base classes come with 3 phases that can be overridden:
|
The ``PerlPackage`` base class comes with 3 phases that can be overridden:
|
||||||
|
|
||||||
#. ``configure`` - configure the package
|
#. ``configure`` - configure the package
|
||||||
#. ``build`` - build the package
|
#. ``build`` - build the package
|
||||||
@@ -117,7 +118,7 @@ so ``PerlPackage`` contains:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
extends("perl")
|
extends('perl')
|
||||||
|
|
||||||
|
|
||||||
If your package requires a specific version of Perl, you should
|
If your package requires a specific version of Perl, you should
|
||||||
@@ -131,14 +132,14 @@ properly. If your package uses ``Makefile.PL`` to build, add:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("perl-extutils-makemaker", type="build")
|
depends_on('perl-extutils-makemaker', type='build')
|
||||||
|
|
||||||
|
|
||||||
If your package uses ``Build.PL`` to build, add:
|
If your package uses ``Build.PL`` to build, add:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("perl-module-build", type="build")
|
depends_on('perl-module-build', type='build')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^
|
||||||
@@ -164,80 +165,14 @@ arguments to ``Makefile.PL`` or ``Build.PL`` by overriding
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def configure_args(self):
|
def configure_args(self):
|
||||||
expat = self.spec["expat"].prefix
|
expat = self.spec['expat'].prefix
|
||||||
|
|
||||||
return [
|
return [
|
||||||
"EXPATLIBPATH={0}".format(expat.lib),
|
'EXPATLIBPATH={0}'.format(expat.lib),
|
||||||
"EXPATINCPATH={0}".format(expat.include),
|
'EXPATINCPATH={0}'.format(expat.include),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^
|
|
||||||
Testing
|
|
||||||
^^^^^^^
|
|
||||||
|
|
||||||
``PerlPackage`` provides a simple stand-alone test of the successfully
|
|
||||||
installed package to confirm that installed perl module(s) can be used.
|
|
||||||
These tests can be performed any time after the installation using
|
|
||||||
``spack -v test run``. (For more information on the command, see
|
|
||||||
:ref:`cmd-spack-test-run`.)
|
|
||||||
|
|
||||||
The base class automatically detects perl modules based on the presence
|
|
||||||
of ``*.pm`` files under the package's library directory. For example,
|
|
||||||
the files under ``perl-bignum``'s perl library are:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ find . -name "*.pm"
|
|
||||||
./bigfloat.pm
|
|
||||||
./bigrat.pm
|
|
||||||
./Math/BigFloat/Trace.pm
|
|
||||||
./Math/BigInt/Trace.pm
|
|
||||||
./Math/BigRat/Trace.pm
|
|
||||||
./bigint.pm
|
|
||||||
./bignum.pm
|
|
||||||
|
|
||||||
|
|
||||||
which results in the package having the ``use_modules`` property containing:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
use_modules = [
|
|
||||||
"bigfloat",
|
|
||||||
"bigrat",
|
|
||||||
"Math::BigFloat::Trace",
|
|
||||||
"Math::BigInt::Trace",
|
|
||||||
"Math::BigRat::Trace",
|
|
||||||
"bigint",
|
|
||||||
"bignum",
|
|
||||||
]
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
This list can often be used to catch missing dependencies.
|
|
||||||
|
|
||||||
If the list is somehow wrong, you can provide the names of the modules
|
|
||||||
yourself by overriding ``use_modules`` like so:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
use_modules = ["bigfloat", "bigrat", "bigint", "bignum"]
|
|
||||||
|
|
||||||
If you only want a subset of the automatically detected modules to be
|
|
||||||
tested, you could instead define the ``skip_modules`` property on the
|
|
||||||
package. So, instead of overriding ``use_modules`` as shown above, you
|
|
||||||
could define the following:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
skip_modules = [
|
|
||||||
"Math::BigFloat::Trace",
|
|
||||||
"Math::BigInt::Trace",
|
|
||||||
"Math::BigRat::Trace",
|
|
||||||
]
|
|
||||||
|
|
||||||
for the same use tests.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
Alternatives to Spack
|
Alternatives to Spack
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _pythonpackage:
|
.. _pythonpackage:
|
||||||
|
|
||||||
------
|
-------------
|
||||||
Python
|
PythonPackage
|
||||||
------
|
-------------
|
||||||
|
|
||||||
Python packages and modules have their own special build system. This
|
Python packages and modules have their own special build system. This
|
||||||
documentation covers everything you'll need to know in order to write
|
documentation covers everything you'll need to know in order to write
|
||||||
@@ -47,11 +48,8 @@ important to understand.
|
|||||||
**build backend**
|
**build backend**
|
||||||
Libraries used to define how to build a wheel. Examples
|
Libraries used to define how to build a wheel. Examples
|
||||||
include `setuptools <https://setuptools.pypa.io/>`__,
|
include `setuptools <https://setuptools.pypa.io/>`__,
|
||||||
`flit <https://flit.pypa.io/>`_,
|
`flit <https://flit.readthedocs.io/>`_, and
|
||||||
`poetry <https://python-poetry.org/>`_,
|
`poetry <https://python-poetry.org/>`_.
|
||||||
`hatchling <https://hatch.pypa.io/latest/>`_,
|
|
||||||
`meson <https://meson-python.readthedocs.io/>`_, and
|
|
||||||
`pdm <https://pdm.fming.dev/latest/>`_.
|
|
||||||
|
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
Downloading
|
Downloading
|
||||||
@@ -151,16 +149,16 @@ set. Once set, ``pypi`` will be used to define the ``homepage``,
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
homepage = "https://pypi.org/project/setuptools/"
|
homepage = 'https://pypi.org/project/setuptools/'
|
||||||
url = "https://pypi.org/packages/source/s/setuptools/setuptools-49.2.0.zip"
|
url = 'https://pypi.org/packages/source/s/setuptools/setuptools-49.2.0.zip'
|
||||||
list_url = "https://pypi.org/simple/setuptools/"
|
list_url = 'https://pypi.org/simple/setuptools/'
|
||||||
|
|
||||||
|
|
||||||
is equivalent to:
|
is equivalent to:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
pypi = "setuptools/setuptools-49.2.0.zip"
|
pypi = 'setuptools/setuptools-49.2.0.zip'
|
||||||
|
|
||||||
|
|
||||||
If a package has a different homepage listed on PyPI, you can
|
If a package has a different homepage listed on PyPI, you can
|
||||||
@@ -175,9 +173,9 @@ package. The "Project description" tab may also contain a longer
|
|||||||
description of the package. Either of these can be used to populate
|
description of the package. Either of these can be used to populate
|
||||||
the package docstring.
|
the package docstring.
|
||||||
|
|
||||||
^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
Dependencies
|
Build backend
|
||||||
^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
Once you've determined the basic metadata for a package, the next
|
Once you've determined the basic metadata for a package, the next
|
||||||
step is to determine the build backend. ``PythonPackage`` uses
|
step is to determine the build backend. ``PythonPackage`` uses
|
||||||
@@ -207,7 +205,7 @@ dependencies to your package:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("py-setuptools@42:", type="build")
|
depends_on('py-setuptools@42:', type='build')
|
||||||
|
|
||||||
|
|
||||||
Note that ``py-wheel`` is already listed as a build dependency in the
|
Note that ``py-wheel`` is already listed as a build dependency in the
|
||||||
@@ -215,33 +213,12 @@ Note that ``py-wheel`` is already listed as a build dependency in the
|
|||||||
need to specify a specific version requirement or change the
|
need to specify a specific version requirement or change the
|
||||||
dependency type.
|
dependency type.
|
||||||
|
|
||||||
See `PEP 517 <https://www.python.org/dev/peps/pep-0517/>`__ and
|
See `PEP 517 <https://www.python.org/dev/peps/pep-0517/>`_ and
|
||||||
`PEP 518 <https://www.python.org/dev/peps/pep-0518/>`_ for more
|
`PEP 518 <https://www.python.org/dev/peps/pep-0518/>`_ for more
|
||||||
information on the design of ``pyproject.toml``.
|
information on the design of ``pyproject.toml``.
|
||||||
|
|
||||||
Depending on which build backend a project uses, there are various
|
Depending on which build backend a project uses, there are various
|
||||||
places that run-time dependencies can be listed. Most modern build
|
places that run-time dependencies can be listed.
|
||||||
backends support listing dependencies directly in ``pyproject.toml``.
|
|
||||||
Look for dependencies under the following keys:
|
|
||||||
|
|
||||||
* ``requires-python`` under ``[project]``
|
|
||||||
|
|
||||||
This specifies the version of Python that is required
|
|
||||||
|
|
||||||
* ``dependencies`` under ``[project]``
|
|
||||||
|
|
||||||
These packages are required for building and installation. You can
|
|
||||||
add them with ``type=("build", "run")``.
|
|
||||||
|
|
||||||
* ``[project.optional-dependencies]``
|
|
||||||
|
|
||||||
This section includes keys with lists of optional dependencies
|
|
||||||
needed to enable those features. You should add a variant that
|
|
||||||
optionally adds these dependencies. This variant should be ``False``
|
|
||||||
by default.
|
|
||||||
|
|
||||||
Some build backends may have additional locations where dependencies
|
|
||||||
can be found.
|
|
||||||
|
|
||||||
"""""""""
|
"""""""""
|
||||||
distutils
|
distutils
|
||||||
@@ -267,9 +244,9 @@ If the ``pyproject.toml`` lists ``setuptools.build_meta`` as a
|
|||||||
``build-backend``, or if the package has a ``setup.py`` that imports
|
``build-backend``, or if the package has a ``setup.py`` that imports
|
||||||
``setuptools``, or if the package has a ``setup.cfg`` file, then it
|
``setuptools``, or if the package has a ``setup.cfg`` file, then it
|
||||||
uses setuptools to build. Setuptools is a replacement for the
|
uses setuptools to build. Setuptools is a replacement for the
|
||||||
distutils library, and has almost the exact same API. In addition to
|
distutils library, and has almost the exact same API. Dependencies
|
||||||
``pyproject.toml``, dependencies can be listed in the ``setup.py`` or
|
can be listed in the ``setup.py`` or ``setup.cfg`` file. Look for the
|
||||||
``setup.cfg`` file. Look for the following arguments:
|
following arguments:
|
||||||
|
|
||||||
* ``python_requires``
|
* ``python_requires``
|
||||||
|
|
||||||
@@ -278,12 +255,12 @@ distutils library, and has almost the exact same API. In addition to
|
|||||||
* ``setup_requires``
|
* ``setup_requires``
|
||||||
|
|
||||||
These packages are usually only needed at build-time, so you can
|
These packages are usually only needed at build-time, so you can
|
||||||
add them with ``type="build"``.
|
add them with ``type='build'``.
|
||||||
|
|
||||||
* ``install_requires``
|
* ``install_requires``
|
||||||
|
|
||||||
These packages are required for building and installation. You can
|
These packages are required for building and installation. You can
|
||||||
add them with ``type=("build", "run")``.
|
add them with ``type=('build', 'run')``.
|
||||||
|
|
||||||
* ``extras_require``
|
* ``extras_require``
|
||||||
|
|
||||||
@@ -295,7 +272,7 @@ distutils library, and has almost the exact same API. In addition to
|
|||||||
|
|
||||||
These are packages that are required to run the unit tests for the
|
These are packages that are required to run the unit tests for the
|
||||||
package. These dependencies can be specified using the
|
package. These dependencies can be specified using the
|
||||||
``type="test"`` dependency type. However, the PyPI tarballs rarely
|
``type='test'`` dependency type. However, the PyPI tarballs rarely
|
||||||
contain unit tests, so there is usually no reason to add these.
|
contain unit tests, so there is usually no reason to add these.
|
||||||
|
|
||||||
See https://setuptools.pypa.io/en/latest/userguide/dependency_management.html
|
See https://setuptools.pypa.io/en/latest/userguide/dependency_management.html
|
||||||
@@ -314,22 +291,25 @@ listed directly in the ``pyproject.toml`` file. Older versions of
|
|||||||
flit used to store this info in a ``flit.ini`` file, so check for
|
flit used to store this info in a ``flit.ini`` file, so check for
|
||||||
this too.
|
this too.
|
||||||
|
|
||||||
In addition to the default ``pyproject.toml`` keys listed above,
|
Either of these files may contain keys like:
|
||||||
older versions of flit may use the following keys:
|
|
||||||
|
|
||||||
* ``requires`` under ``[tool.flit.metadata]``
|
* ``requires-python``
|
||||||
|
|
||||||
|
This specifies the version of Python that is required
|
||||||
|
|
||||||
|
* ``dependencies`` or ``requires``
|
||||||
|
|
||||||
These packages are required for building and installation. You can
|
These packages are required for building and installation. You can
|
||||||
add them with ``type=("build", "run")``.
|
add them with ``type=('build', 'run')``.
|
||||||
|
|
||||||
* ``[tool.flit.metadata.requires-extra]``
|
* ``project.optional-dependencies`` or ``requires-extra``
|
||||||
|
|
||||||
This section includes keys with lists of optional dependencies
|
This section includes keys with lists of optional dependencies
|
||||||
needed to enable those features. You should add a variant that
|
needed to enable those features. You should add a variant that
|
||||||
optionally adds these dependencies. This variant should be False
|
optionally adds these dependencies. This variant should be False
|
||||||
by default.
|
by default.
|
||||||
|
|
||||||
See https://flit.pypa.io/en/latest/pyproject_toml.html for
|
See https://flit.readthedocs.io/en/latest/pyproject_toml.html for
|
||||||
more information.
|
more information.
|
||||||
|
|
||||||
""""""
|
""""""
|
||||||
@@ -346,38 +326,6 @@ for specifying the version requirements. Note that ``~=`` works
|
|||||||
differently in poetry than in setuptools and flit for versions that
|
differently in poetry than in setuptools and flit for versions that
|
||||||
start with a zero.
|
start with a zero.
|
||||||
|
|
||||||
"""""""""
|
|
||||||
hatchling
|
|
||||||
"""""""""
|
|
||||||
|
|
||||||
If the ``pyproject.toml`` lists ``hatchling.build`` as the
|
|
||||||
``build-backend``, it uses the hatchling build system. Hatchling
|
|
||||||
uses the default ``pyproject.toml`` keys to list dependencies.
|
|
||||||
|
|
||||||
See https://hatch.pypa.io/latest/config/dependency/ for more
|
|
||||||
information.
|
|
||||||
|
|
||||||
"""""
|
|
||||||
meson
|
|
||||||
"""""
|
|
||||||
|
|
||||||
If the ``pyproject.toml`` lists ``mesonpy`` as the ``build-backend``,
|
|
||||||
it uses the meson build system. Meson uses the default
|
|
||||||
``pyproject.toml`` keys to list dependencies.
|
|
||||||
|
|
||||||
See https://meson-python.readthedocs.io/en/latest/tutorials/introduction.html
|
|
||||||
for more information.
|
|
||||||
|
|
||||||
"""
|
|
||||||
pdm
|
|
||||||
"""
|
|
||||||
|
|
||||||
If the ``pyproject.toml`` lists ``pdm.pep517.api`` as the ``build-backend``,
|
|
||||||
it uses the PDM build system. PDM uses the default ``pyproject.toml``
|
|
||||||
keys to list dependencies.
|
|
||||||
|
|
||||||
See https://pdm.fming.dev/latest/ for more information.
|
|
||||||
|
|
||||||
""""""
|
""""""
|
||||||
wheels
|
wheels
|
||||||
""""""
|
""""""
|
||||||
@@ -422,34 +370,6 @@ packages. However, the installation instructions for a package may
|
|||||||
suggest passing certain flags to the ``setup.py`` call. The
|
suggest passing certain flags to the ``setup.py`` call. The
|
||||||
``PythonPackage`` class has two techniques for doing this.
|
``PythonPackage`` class has two techniques for doing this.
|
||||||
|
|
||||||
"""""""""""""""
|
|
||||||
Config settings
|
|
||||||
"""""""""""""""
|
|
||||||
|
|
||||||
These settings are passed to
|
|
||||||
`PEP 517 <https://peps.python.org/pep-0517/>`__ build backends.
|
|
||||||
For example, ``py-scipy`` package allows you to specify the name of
|
|
||||||
the BLAS/LAPACK library you want pkg-config to search for:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
depends_on("py-pip@22.1:", type="build")
|
|
||||||
|
|
||||||
def config_settings(self, spec, prefix):
|
|
||||||
return {
|
|
||||||
"blas": spec["blas"].libs.names[0],
|
|
||||||
"lapack": spec["lapack"].libs.names[0],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
This flag only works for packages that define a ``build-backend``
|
|
||||||
in ``pyproject.toml``. Also, it is only supported by pip 22.1+,
|
|
||||||
which requires Python 3.7+. For packages that still support Python
|
|
||||||
3.6 and older, ``install_options`` should be used instead.
|
|
||||||
|
|
||||||
|
|
||||||
""""""""""""""
|
""""""""""""""
|
||||||
Global options
|
Global options
|
||||||
""""""""""""""
|
""""""""""""""
|
||||||
@@ -462,23 +382,13 @@ has an optional dependency on ``libyaml`` that can be enabled like so:
|
|||||||
|
|
||||||
def global_options(self, spec, prefix):
|
def global_options(self, spec, prefix):
|
||||||
options = []
|
options = []
|
||||||
if spec.satisfies("+libyaml"):
|
if '+libyaml' in spec:
|
||||||
options.append("--with-libyaml")
|
options.append('--with-libyaml')
|
||||||
else:
|
else:
|
||||||
options.append("--without-libyaml")
|
options.append('--without-libyaml')
|
||||||
return options
|
return options
|
||||||
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
Direct invocation of ``setup.py`` is
|
|
||||||
`deprecated <https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html>`_.
|
|
||||||
This flag forces pip to use a deprecated installation procedure.
|
|
||||||
It should only be used in packages that don't define a
|
|
||||||
``build-backend`` in ``pyproject.toml`` or packages that still
|
|
||||||
support Python 3.6 and older.
|
|
||||||
|
|
||||||
|
|
||||||
"""""""""""""""
|
"""""""""""""""
|
||||||
Install options
|
Install options
|
||||||
"""""""""""""""
|
"""""""""""""""
|
||||||
@@ -491,24 +401,14 @@ allows you to specify the directories to search for ``libyaml``:
|
|||||||
|
|
||||||
def install_options(self, spec, prefix):
|
def install_options(self, spec, prefix):
|
||||||
options = []
|
options = []
|
||||||
if spec.satisfies("+libyaml"):
|
if '+libyaml' in spec:
|
||||||
options.extend([
|
options.extend([
|
||||||
spec["libyaml"].libs.search_flags,
|
spec['libyaml'].libs.search_flags,
|
||||||
spec["libyaml"].headers.include_flags,
|
spec['libyaml'].headers.include_flags,
|
||||||
])
|
])
|
||||||
return options
|
return options
|
||||||
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
Direct invocation of ``setup.py`` is
|
|
||||||
`deprecated <https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html>`_.
|
|
||||||
This flag forces pip to use a deprecated installation procedure.
|
|
||||||
It should only be used in packages that don't define a
|
|
||||||
``build-backend`` in ``pyproject.toml`` or packages that still
|
|
||||||
support Python 3.6 and older.
|
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
Testing
|
Testing
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
@@ -555,7 +455,7 @@ detected are wrong, you can provide the names yourself by overriding
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
import_modules = ["six"]
|
import_modules = ['six']
|
||||||
|
|
||||||
|
|
||||||
Sometimes the list of module names to import depends on how the
|
Sometimes the list of module names to import depends on how the
|
||||||
@@ -570,9 +470,9 @@ This can be expressed like so:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def import_modules(self):
|
def import_modules(self):
|
||||||
modules = ["yaml"]
|
modules = ['yaml']
|
||||||
if self.spec.satisfies("+libyaml"):
|
if '+libyaml' in self.spec:
|
||||||
modules.append("yaml.cyaml")
|
modules.append('yaml.cyaml')
|
||||||
return modules
|
return modules
|
||||||
|
|
||||||
|
|
||||||
@@ -581,19 +481,6 @@ libraries. Make sure not to add modules/packages containing the word
|
|||||||
"test", as these likely won't end up in the installation directory,
|
"test", as these likely won't end up in the installation directory,
|
||||||
or may require test dependencies like pytest to be installed.
|
or may require test dependencies like pytest to be installed.
|
||||||
|
|
||||||
Instead of defining the ``import_modules`` explicitly, only the subset
|
|
||||||
of module names to be skipped can be defined by using ``skip_modules``.
|
|
||||||
If a defined module has submodules, they are skipped as well, e.g.,
|
|
||||||
in case the ``plotting`` modules should be excluded from the
|
|
||||||
automatically detected ``import_modules`` ``["nilearn", "nilearn.surface",
|
|
||||||
"nilearn.plotting", "nilearn.plotting.data"]`` set:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
skip_modules = ["nilearn.plotting"]
|
|
||||||
|
|
||||||
This will set ``import_modules`` to ``["nilearn", "nilearn.surface"]``
|
|
||||||
|
|
||||||
Import tests can be run during the installation using ``spack install
|
Import tests can be run during the installation using ``spack install
|
||||||
--test=root`` or at any time after the installation using
|
--test=root`` or at any time after the installation using
|
||||||
``spack test run``.
|
``spack test run``.
|
||||||
@@ -611,11 +498,11 @@ after the ``install`` phase:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@run_after("install")
|
@run_after('install')
|
||||||
@on_package_attributes(run_tests=True)
|
@on_package_attributes(run_tests=True)
|
||||||
def install_test(self):
|
def install_test(self):
|
||||||
with working_dir("spack-test", create=True):
|
with working_dir('spack-test', create=True):
|
||||||
python("-c", "import numpy; numpy.test('full', verbose=2)")
|
python('-c', 'import numpy; numpy.test("full", verbose=2)')
|
||||||
|
|
||||||
|
|
||||||
when testing is enabled during the installation (i.e., ``spack install
|
when testing is enabled during the installation (i.e., ``spack install
|
||||||
@@ -637,7 +524,7 @@ provides Python bindings in a ``python`` directory, you can use:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_directory = "python"
|
build_directory = 'python'
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -717,45 +604,24 @@ command-line tool, or C/C++/Fortran program with optional Python
|
|||||||
modules? The former should be prepended with ``py-``, while the
|
modules? The former should be prepended with ``py-``, while the
|
||||||
latter should not.
|
latter should not.
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""
|
""""""""""""""""""""""
|
||||||
``extends`` vs. ``depends_on``
|
extends vs. depends_on
|
||||||
""""""""""""""""""""""""""""""
|
""""""""""""""""""""""
|
||||||
|
|
||||||
|
This is very similar to the naming dilemma above, with a slight twist.
|
||||||
As mentioned in the :ref:`Packaging Guide <packaging_extensions>`,
|
As mentioned in the :ref:`Packaging Guide <packaging_extensions>`,
|
||||||
``extends`` and ``depends_on`` are very similar, but ``extends`` ensures
|
``extends`` and ``depends_on`` are very similar, but ``extends`` adds
|
||||||
that the extension and extendee share the same prefix in views.
|
the ability to *activate* the package. Activation involves symlinking
|
||||||
This allows the user to import a Python module without
|
everything in the installation prefix of the package to the installation
|
||||||
|
prefix of Python. This allows the user to import a Python module without
|
||||||
having to add that module to ``PYTHONPATH``.
|
having to add that module to ``PYTHONPATH``.
|
||||||
|
|
||||||
Additionally, ``extends("python")`` adds a dependency on the package
|
When deciding between ``extends`` and ``depends_on``, the best rule of
|
||||||
``python-venv``. This improves isolation from the system, whether
|
thumb is to check the installation prefix. If Python libraries are
|
||||||
it's during the build or at runtime: user and system site packages
|
installed to ``<prefix>/lib/pythonX.Y/site-packages``, then you
|
||||||
cannot accidentally be used by any package that ``extends("python")``.
|
should use ``extends``. If Python libraries are installed elsewhere
|
||||||
|
or the only files that get installed reside in ``<prefix>/bin``, then
|
||||||
As a rule of thumb: if a package does not install any Python modules
|
don't use ``extends``, as symlinking the package wouldn't be useful.
|
||||||
of its own, and merely puts a Python script in the ``bin`` directory,
|
|
||||||
then there is no need for ``extends``. If the package installs modules
|
|
||||||
in the ``site-packages`` directory, it requires ``extends``.
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""
|
|
||||||
Executing ``python`` during the build
|
|
||||||
"""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
Whenever you need to execute a Python command or pass the path of the
|
|
||||||
Python interpreter to the build system, it is best to use the global
|
|
||||||
variable ``python`` directly. For example:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
@run_before("install")
|
|
||||||
def recythonize(self):
|
|
||||||
python("setup.py", "clean") # use the `python` global
|
|
||||||
|
|
||||||
As mentioned in the previous section, ``extends("python")`` adds an
|
|
||||||
automatic dependency on ``python-venv``, which is a virtual environment
|
|
||||||
that guarantees build isolation. The ``python`` global always refers to
|
|
||||||
the correct Python interpreter, whether the package uses ``extends("python")``
|
|
||||||
or ``depends_on("python")``.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
Alternatives to Spack
|
Alternatives to Spack
|
||||||
@@ -798,8 +664,5 @@ For more information on build and installation frontend tools, see:
|
|||||||
For more information on build backend tools, see:
|
For more information on build backend tools, see:
|
||||||
|
|
||||||
* setuptools: https://setuptools.pypa.io/
|
* setuptools: https://setuptools.pypa.io/
|
||||||
* flit: https://flit.pypa.io/
|
* flit: https://flit.readthedocs.io/
|
||||||
* poetry: https://python-poetry.org/
|
* poetry: https://python-poetry.org/
|
||||||
* hatchling: https://hatch.pypa.io/latest/
|
|
||||||
* meson: https://meson-python.readthedocs.io/
|
|
||||||
* pdm: https://pdm.fming.dev/latest/
|
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _qmakepackage:
|
.. _qmakepackage:
|
||||||
|
|
||||||
-----
|
------------
|
||||||
QMake
|
QMakePackage
|
||||||
-----
|
------------
|
||||||
|
|
||||||
Much like Autotools and CMake, QMake is a build-script generator
|
Much like Autotools and CMake, QMake is a build-script generator
|
||||||
designed by the developers of Qt. In its simplest form, Spack's
|
designed by the developers of Qt. In its simplest form, Spack's
|
||||||
@@ -24,19 +25,11 @@ QMake does not appear to have a standardized way of specifying
|
|||||||
the installation directory, so you may have to set environment
|
the installation directory, so you may have to set environment
|
||||||
variables or edit ``*.pro`` files to get things working properly.
|
variables or edit ``*.pro`` files to get things working properly.
|
||||||
|
|
||||||
QMake packages will depend on the virtual ``qmake`` package which
|
|
||||||
is provided by multiple versions of Qt: ``qt`` provides Qt up to
|
|
||||||
Qt5, and ``qt-base`` provides Qt from version Qt6 onwards. This
|
|
||||||
split was motivated by the desire to split the single Qt package
|
|
||||||
into its components to allow for more fine-grained installation.
|
|
||||||
To depend on a specific version, refer to the documentation on
|
|
||||||
:ref:`virtual-dependencies`.
|
|
||||||
|
|
||||||
^^^^^^
|
^^^^^^
|
||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``QMakeBuilder`` and ``QMakePackage`` base classes come with the following phases:
|
The ``QMakePackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``qmake`` - generate Makefiles
|
#. ``qmake`` - generate Makefiles
|
||||||
#. ``build`` - build the project
|
#. ``build`` - build the project
|
||||||
@@ -90,7 +83,7 @@ base class already contains:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("qt", type="build")
|
depends_on('qt', type='build')
|
||||||
|
|
||||||
|
|
||||||
If you want to specify a particular version requirement, or need to
|
If you want to specify a particular version requirement, or need to
|
||||||
@@ -98,7 +91,7 @@ link to the ``qt`` libraries, you can override this in your package:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("qt@5.6.0:")
|
depends_on('qt@5.6.0:')
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Passing arguments to qmake
|
Passing arguments to qmake
|
||||||
@@ -110,7 +103,7 @@ override the ``qmake_args`` method like so:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def qmake_args(self):
|
def qmake_args(self):
|
||||||
return ["-recursive"]
|
return ['-recursive']
|
||||||
|
|
||||||
|
|
||||||
This method can be used to pass flags as well as variables.
|
This method can be used to pass flags as well as variables.
|
||||||
@@ -125,7 +118,7 @@ sub-directory by adding the following to the package:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
build_directory = "src"
|
build_directory = 'src'
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _racketpackage:
|
.. _racketpackage:
|
||||||
|
|
||||||
------
|
-------------
|
||||||
Racket
|
RacketPackage
|
||||||
------
|
-------------
|
||||||
|
|
||||||
Much like Python, Racket packages and modules have their own special build system.
|
Much like Python, Racket packages and modules have their own special build system.
|
||||||
To learn more about the specifics of Racket package system, please refer to the
|
To learn more about the specifics of Racket package system, please refer to the
|
||||||
@@ -16,7 +17,7 @@ To learn more about the specifics of Racket package system, please refer to the
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``RacketBuilder`` and ``RacketPackage`` base classes provides an ``install`` phase that
|
The ``RacketPackage`` base class provides an ``install`` phase that
|
||||||
can be overridden, corresponding to the use of:
|
can be overridden, corresponding to the use of:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _rocmpackage:
|
.. _rocmpackage:
|
||||||
|
|
||||||
----
|
-----------
|
||||||
ROCm
|
ROCmPackage
|
||||||
----
|
-----------
|
||||||
|
|
||||||
The ``ROCmPackage`` is not a build system but a helper package. Like ``CudaPackage``,
|
The ``ROCmPackage`` is not a build system but a helper package. Like ``CudaPackage``,
|
||||||
it provides standard variants, dependencies, and conflicts to facilitate building
|
it provides standard variants, dependencies, and conflicts to facilitate building
|
||||||
@@ -80,27 +81,28 @@ class of your package. For example, you can add it to your
|
|||||||
class MyRocmPackage(CMakePackage, ROCmPackage):
|
class MyRocmPackage(CMakePackage, ROCmPackage):
|
||||||
...
|
...
|
||||||
# Ensure +rocm and amdgpu_targets are passed to dependencies
|
# Ensure +rocm and amdgpu_targets are passed to dependencies
|
||||||
depends_on("mydeppackage", when="+rocm")
|
depends_on('mydeppackage', when='+rocm')
|
||||||
for val in ROCmPackage.amdgpu_targets:
|
for val in ROCmPackage.amdgpu_targets:
|
||||||
depends_on(f"mydeppackage amdgpu_target={val}",
|
depends_on('mydeppackage amdgpu_target={0}'.format(val),
|
||||||
when=f"amdgpu_target={val}")
|
when='amdgpu_target={0}'.format(val))
|
||||||
...
|
...
|
||||||
|
|
||||||
def cmake_args(self):
|
def cmake_args(self):
|
||||||
spec = self.spec
|
spec = self.spec
|
||||||
args = []
|
args = []
|
||||||
...
|
...
|
||||||
if spec.satisfies("+rocm"):
|
if '+rocm' in spec:
|
||||||
# Set up the hip macros needed by the build
|
# Set up the hip macros needed by the build
|
||||||
args.extend([
|
args.extend([
|
||||||
"-DENABLE_HIP=ON",
|
'-DENABLE_HIP=ON',
|
||||||
f"-DHIP_ROOT_DIR={spec['hip'].prefix}"])
|
'-DHIP_ROOT_DIR={0}'.format(spec['hip'].prefix)])
|
||||||
rocm_archs = spec.variants["amdgpu_target"].value
|
rocm_archs = spec.variants['amdgpu_target'].value
|
||||||
if "none" not in rocm_archs:
|
if 'none' not in rocm_archs:
|
||||||
args.append(f"-DHIP_HIPCC_FLAGS=--amdgpu-target={','.join(rocm_archs}")
|
args.append('-DHIP_HIPCC_FLAGS=--amdgpu-target={0}'
|
||||||
|
.format(",".join(rocm_archs)))
|
||||||
else:
|
else:
|
||||||
# Ensure build with hip is disabled
|
# Ensure build with hip is disabled
|
||||||
args.append("-DENABLE_HIP=OFF")
|
args.append('-DENABLE_HIP=OFF')
|
||||||
...
|
...
|
||||||
return args
|
return args
|
||||||
...
|
...
|
||||||
@@ -112,7 +114,7 @@ build.
|
|||||||
|
|
||||||
This example also illustrates how to check for the ``rocm`` variant using
|
This example also illustrates how to check for the ``rocm`` variant using
|
||||||
``self.spec`` and how to retrieve the ``amdgpu_target`` variant's value
|
``self.spec`` and how to retrieve the ``amdgpu_target`` variant's value
|
||||||
using ``self.spec.variants["amdgpu_target"].value``.
|
using ``self.spec.variants['amdgpu_target'].value``.
|
||||||
|
|
||||||
All five packages using ``ROCmPackage`` as of January 2021 also use the
|
All five packages using ``ROCmPackage`` as of January 2021 also use the
|
||||||
:ref:`CudaPackage <cudapackage>`. So it is worth looking at those packages
|
:ref:`CudaPackage <cudapackage>`. So it is worth looking at those packages
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _rpackage:
|
.. _rpackage:
|
||||||
|
|
||||||
--
|
--------
|
||||||
R
|
RPackage
|
||||||
--
|
--------
|
||||||
|
|
||||||
Like Python, R has its own built-in build system.
|
Like Python, R has its own built-in build system.
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ new Spack packages for.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``RBuilder`` and ``RPackage`` base classes have a single phase:
|
The ``RPackage`` base class has a single phase:
|
||||||
|
|
||||||
#. ``install`` - install the package
|
#. ``install`` - install the package
|
||||||
|
|
||||||
@@ -162,28 +163,28 @@ attributes that can be used to set ``homepage``, ``url``, ``list_url``, and
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
cran = "caret"
|
cran = 'caret'
|
||||||
|
|
||||||
is equivalent to:
|
is equivalent to:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
homepage = "https://cloud.r-project.org/package=caret"
|
homepage = 'https://cloud.r-project.org/package=caret'
|
||||||
url = "https://cloud.r-project.org/src/contrib/caret_6.0-86.tar.gz"
|
url = 'https://cloud.r-project.org/src/contrib/caret_6.0-86.tar.gz'
|
||||||
list_url = "https://cloud.r-project.org/src/contrib/Archive/caret"
|
list_url = 'https://cloud.r-project.org/src/contrib/Archive/caret'
|
||||||
|
|
||||||
Likewise, the following ``bioc`` attribute:
|
Likewise, the following ``bioc`` attribute:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
bioc = "BiocVersion"
|
bioc = 'BiocVersion'
|
||||||
|
|
||||||
is equivalent to:
|
is equivalent to:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
homepage = "https://bioconductor.org/packages/BiocVersion/"
|
homepage = 'https://bioconductor.org/packages/BiocVersion/'
|
||||||
git = "https://git.bioconductor.org/packages/BiocVersion"
|
git = 'https://git.bioconductor.org/packages/BiocVersion'
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -192,14 +193,14 @@ Build system dependencies
|
|||||||
|
|
||||||
As an extension of the R ecosystem, your package will obviously depend
|
As an extension of the R ecosystem, your package will obviously depend
|
||||||
on R to build and run. Normally, we would use ``depends_on`` to express
|
on R to build and run. Normally, we would use ``depends_on`` to express
|
||||||
this, but for R packages, we use ``extends``. This implies a special
|
this, but for R packages, we use ``extends``. ``extends`` is similar to
|
||||||
dependency on R, which is used to set environment variables such as
|
``depends_on``, but adds an additional feature: the ability to "activate"
|
||||||
``R_LIBS`` uniformly. Since every R package needs this, the ``RPackage``
|
the package by symlinking it to the R installation directory. Since
|
||||||
base class contains:
|
every R package needs this, the ``RPackage`` base class contains:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
extends("r")
|
extends('r')
|
||||||
|
|
||||||
|
|
||||||
Take a close look at the homepage for ``caret``. If you look at the
|
Take a close look at the homepage for ``caret``. If you look at the
|
||||||
@@ -208,7 +209,7 @@ You should add this to your package like so:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("r@3.2.0:", type=("build", "run"))
|
depends_on('r@3.2.0:', type=('build', 'run'))
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
@@ -226,7 +227,7 @@ and list all of their dependencies in the following sections:
|
|||||||
* LinkingTo
|
* LinkingTo
|
||||||
|
|
||||||
As far as Spack is concerned, all 3 of these dependency types
|
As far as Spack is concerned, all 3 of these dependency types
|
||||||
correspond to ``type=("build", "run")``, so you don't have to worry
|
correspond to ``type=('build', 'run')``, so you don't have to worry
|
||||||
about the details. If you are curious what they mean,
|
about the details. If you are curious what they mean,
|
||||||
https://github.com/spack/spack/issues/2951 has a pretty good summary:
|
https://github.com/spack/spack/issues/2951 has a pretty good summary:
|
||||||
|
|
||||||
@@ -329,7 +330,7 @@ the dependency:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("r-lattice@0.20:", type=("build", "run"))
|
depends_on('r-lattice@0.20:', type=('build', 'run'))
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
@@ -360,20 +361,20 @@ like so:
|
|||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def configure_args(self):
|
def configure_args(self):
|
||||||
mpi_name = self.spec["mpi"].name
|
mpi_name = self.spec['mpi'].name
|
||||||
|
|
||||||
# The type of MPI. Supported values are:
|
# The type of MPI. Supported values are:
|
||||||
# OPENMPI, LAM, MPICH, MPICH2, or CRAY
|
# OPENMPI, LAM, MPICH, MPICH2, or CRAY
|
||||||
if mpi_name == "openmpi":
|
if mpi_name == 'openmpi':
|
||||||
Rmpi_type = "OPENMPI"
|
Rmpi_type = 'OPENMPI'
|
||||||
elif mpi_name == "mpich":
|
elif mpi_name == 'mpich':
|
||||||
Rmpi_type = "MPICH2"
|
Rmpi_type = 'MPICH2'
|
||||||
else:
|
else:
|
||||||
raise InstallError("Unsupported MPI type")
|
raise InstallError('Unsupported MPI type')
|
||||||
|
|
||||||
return [
|
return [
|
||||||
"--with-Rmpi-type={0}".format(Rmpi_type),
|
'--with-Rmpi-type={0}'.format(Rmpi_type),
|
||||||
"--with-mpi={0}".format(spec["mpi"].prefix),
|
'--with-mpi={0}'.format(spec['mpi'].prefix),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _rubypackage:
|
.. _rubypackage:
|
||||||
|
|
||||||
----
|
-----------
|
||||||
Ruby
|
RubyPackage
|
||||||
----
|
-----------
|
||||||
|
|
||||||
Like Perl, Python, and R, Ruby has its own build system for
|
Like Perl, Python, and R, Ruby has its own build system for
|
||||||
installing Ruby gems.
|
installing Ruby gems.
|
||||||
@@ -15,7 +16,7 @@ installing Ruby gems.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``RubyBuilder`` and ``RubyPackage`` base classes provide the following phases that
|
The ``RubyPackage`` base class provides the following phases that
|
||||||
can be overridden:
|
can be overridden:
|
||||||
|
|
||||||
#. ``build`` - build everything needed to install
|
#. ``build`` - build everything needed to install
|
||||||
@@ -83,8 +84,8 @@ The ``*.gemspec`` file may contain something like:
|
|||||||
|
|
||||||
.. code-block:: ruby
|
.. code-block:: ruby
|
||||||
|
|
||||||
summary = "An implementation of the AsciiDoc text processor and publishing toolchain"
|
summary = 'An implementation of the AsciiDoc text processor and publishing toolchain'
|
||||||
description = "A fast, open source text processor and publishing toolchain for converting AsciiDoc content to HTML 5, DocBook 5, and other formats."
|
description = 'A fast, open source text processor and publishing toolchain for converting AsciiDoc content to HTML 5, DocBook 5, and other formats.'
|
||||||
|
|
||||||
|
|
||||||
Either of these can be used for the description of the Spack package.
|
Either of these can be used for the description of the Spack package.
|
||||||
@@ -97,7 +98,7 @@ The ``*.gemspec`` file may contain something like:
|
|||||||
|
|
||||||
.. code-block:: ruby
|
.. code-block:: ruby
|
||||||
|
|
||||||
homepage = "https://asciidoctor.org"
|
homepage = 'https://asciidoctor.org'
|
||||||
|
|
||||||
|
|
||||||
This should be used as the official homepage of the Spack package.
|
This should be used as the official homepage of the Spack package.
|
||||||
@@ -111,21 +112,21 @@ the base class contains:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
extends("ruby")
|
extends('ruby')
|
||||||
|
|
||||||
|
|
||||||
The ``*.gemspec`` file may contain something like:
|
The ``*.gemspec`` file may contain something like:
|
||||||
|
|
||||||
.. code-block:: ruby
|
.. code-block:: ruby
|
||||||
|
|
||||||
required_ruby_version = ">= 2.3.0"
|
required_ruby_version = '>= 2.3.0'
|
||||||
|
|
||||||
|
|
||||||
This can be added to the Spack package using:
|
This can be added to the Spack package using:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("ruby@2.3.0:", type=("build", "run"))
|
depends_on('ruby@2.3.0:', type=('build', 'run'))
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _sconspackage:
|
.. _sconspackage:
|
||||||
|
|
||||||
-----
|
------------
|
||||||
SCons
|
SConsPackage
|
||||||
-----
|
------------
|
||||||
|
|
||||||
SCons is a general-purpose build system that does not rely on
|
SCons is a general-purpose build system that does not rely on
|
||||||
Makefiles to build software. SCons is written in Python, and handles
|
Makefiles to build software. SCons is written in Python, and handles
|
||||||
@@ -41,22 +42,22 @@ As previously mentioned, SCons allows developers to add subcommands like
|
|||||||
$ scons install
|
$ scons install
|
||||||
|
|
||||||
|
|
||||||
To facilitate this, the ``SConsBuilder`` and ``SconsPackage`` base classes provide the
|
To facilitate this, the ``SConsPackage`` base class provides the
|
||||||
following phases:
|
following phases:
|
||||||
|
|
||||||
#. ``build`` - build the package
|
#. ``build`` - build the package
|
||||||
#. ``install`` - install the package
|
#. ``install`` - install the package
|
||||||
|
|
||||||
Package developers often add unit tests that can be invoked with
|
Package developers often add unit tests that can be invoked with
|
||||||
``scons test`` or ``scons check``. Spack provides a ``build_test`` method
|
``scons test`` or ``scons check``. Spack provides a ``test`` method
|
||||||
to handle this. Since we don't know which one the package developer
|
to handle this. Since we don't know which one the package developer
|
||||||
chose, the ``build_test`` method does nothing by default, but can be easily
|
chose, the ``test`` method does nothing by default, but can be easily
|
||||||
overridden like so:
|
overridden like so:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def build_test(self):
|
def test(self):
|
||||||
scons("check")
|
scons('check')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
@@ -87,7 +88,7 @@ base class already contains:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("scons", type="build")
|
depends_on('scons', type='build')
|
||||||
|
|
||||||
|
|
||||||
If you want to specify a particular version requirement, you can override
|
If you want to specify a particular version requirement, you can override
|
||||||
@@ -95,7 +96,7 @@ this in your package:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("scons@2.3.0:", type="build")
|
depends_on('scons@2.3.0:', type='build')
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -237,14 +238,14 @@ the package build phase. This is done by overriding ``build_args`` like so:
|
|||||||
|
|
||||||
def build_args(self, spec, prefix):
|
def build_args(self, spec, prefix):
|
||||||
args = [
|
args = [
|
||||||
f"PREFIX={prefix}",
|
'PREFIX={0}'.format(prefix),
|
||||||
f"ZLIB={spec['zlib'].prefix}",
|
'ZLIB={0}'.format(spec['zlib'].prefix),
|
||||||
]
|
]
|
||||||
|
|
||||||
if spec.satisfies("+debug"):
|
if '+debug' in spec:
|
||||||
args.append("DEBUG=yes")
|
args.append('DEBUG=yes')
|
||||||
else:
|
else:
|
||||||
args.append("DEBUG=no")
|
args.append('DEBUG=no')
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
@@ -274,8 +275,8 @@ environment variables. For example, cantera has the following option:
|
|||||||
* env_vars: [ string ]
|
* env_vars: [ string ]
|
||||||
Environment variables to propagate through to SCons. Either the
|
Environment variables to propagate through to SCons. Either the
|
||||||
string "all" or a comma separated list of variable names, e.g.
|
string "all" or a comma separated list of variable names, e.g.
|
||||||
"LD_LIBRARY_PATH,HOME".
|
'LD_LIBRARY_PATH,HOME'.
|
||||||
- default: "LD_LIBRARY_PATH,PYTHONPATH"
|
- default: 'LD_LIBRARY_PATH,PYTHONPATH'
|
||||||
|
|
||||||
|
|
||||||
In the case of cantera, using ``env_vars=all`` allows us to use
|
In the case of cantera, using ``env_vars=all`` allows us to use
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _sippackage:
|
.. _sippackage:
|
||||||
|
|
||||||
---
|
----------
|
||||||
SIP
|
SIPPackage
|
||||||
---
|
----------
|
||||||
|
|
||||||
SIP is a tool that makes it very easy to create Python bindings for C and C++
|
SIP is a tool that makes it very easy to create Python bindings for C and C++
|
||||||
libraries. It was originally developed to create PyQt, the Python bindings for
|
libraries. It was originally developed to create PyQt, the Python bindings for
|
||||||
@@ -21,7 +22,7 @@ provides support functions to the automatically generated code.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``SIPBuilder`` and ``SIPPackage`` base classes come with the following phases:
|
The ``SIPPackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``configure`` - configure the package
|
#. ``configure`` - configure the package
|
||||||
#. ``build`` - build the package
|
#. ``build`` - build the package
|
||||||
@@ -31,7 +32,7 @@ By default, these phases run:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ sip-build --verbose --target-dir ...
|
$ python configure.py --bindir ... --destdir ...
|
||||||
$ make
|
$ make
|
||||||
$ make install
|
$ make install
|
||||||
|
|
||||||
@@ -40,30 +41,30 @@ By default, these phases run:
|
|||||||
Important files
|
Important files
|
||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Each SIP package comes with a custom configuration file written in Python.
|
Each SIP package comes with a custom ``configure.py`` build script,
|
||||||
For newer packages, this is called ``project.py``, while in older packages,
|
written in Python. This script contains instructions to build the project.
|
||||||
it may be called ``configure.py``. This script contains instructions to build
|
|
||||||
the project.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Build system dependencies
|
Build system dependencies
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
``SIPPackage`` requires several dependencies. Python and SIP are needed at build-time
|
``SIPPackage`` requires several dependencies. Python is needed to run
|
||||||
to run the aforementioned configure script. Python is also needed at run-time to
|
the ``configure.py`` build script, and to run the resulting Python
|
||||||
actually use the installed Python library. And as we are building Python bindings
|
libraries. Qt is needed to provide the ``qmake`` command. SIP is also
|
||||||
for C/C++ libraries, Python is also needed as a link dependency. All of these
|
needed to build the package. All of these dependencies are automatically
|
||||||
dependencies are automatically added via the base class.
|
added via the base class
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
extends("python", type=("build", "link", "run"))
|
extends('python')
|
||||||
depends_on("py-sip", type="build")
|
|
||||||
|
|
||||||
|
depends_on('qt', type='build')
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
depends_on('py-sip', type='build')
|
||||||
Passing arguments to ``sip-build``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Passing arguments to ``configure.py``
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Each phase comes with a ``<phase_args>`` function that can be used to pass
|
Each phase comes with a ``<phase_args>`` function that can be used to pass
|
||||||
arguments to that particular phase. For example, if you need to pass
|
arguments to that particular phase. For example, if you need to pass
|
||||||
@@ -71,11 +72,11 @@ arguments to the configure phase, you can use:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def configure_args(self):
|
def configure_args(self, spec, prefix):
|
||||||
return ["--no-python-dbus"]
|
return ['--no-python-dbus']
|
||||||
|
|
||||||
|
|
||||||
A list of valid options can be found by running ``sip-build --help``.
|
A list of valid options can be found by running ``python configure.py --help``.
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
Testing
|
Testing
|
||||||
@@ -123,7 +124,7 @@ are wrong, you can provide the names yourself by overriding
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
import_modules = ["PyQt5"]
|
import_modules = ['PyQt5']
|
||||||
|
|
||||||
|
|
||||||
These tests often catch missing dependencies and non-RPATHed
|
These tests often catch missing dependencies and non-RPATHed
|
||||||
|
@@ -1,54 +0,0 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
|
|
||||||
.. _sourceforgepackage:
|
|
||||||
|
|
||||||
-----------
|
|
||||||
Sourceforge
|
|
||||||
-----------
|
|
||||||
|
|
||||||
``SourceforgePackage`` is a
|
|
||||||
`mixin-class <https://en.wikipedia.org/wiki/Mixin>`_. It automatically
|
|
||||||
sets the URL based on a list of Sourceforge mirrors listed in
|
|
||||||
`sourceforge_mirror_path`, which defaults to a half dozen known mirrors.
|
|
||||||
Refer to the package source
|
|
||||||
(`<https://github.com/spack/spack/blob/develop/lib/spack/spack/build_systems/sourceforge.py>`__) for the current list of mirrors used by Spack.
|
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^
|
|
||||||
Methods
|
|
||||||
^^^^^^^
|
|
||||||
|
|
||||||
This package provides a method for populating mirror URLs.
|
|
||||||
|
|
||||||
**urls**
|
|
||||||
|
|
||||||
This method returns a list of possible URLs for package source.
|
|
||||||
It is decorated with `property` so its results are treated as
|
|
||||||
a package attribute.
|
|
||||||
|
|
||||||
Refer to
|
|
||||||
`<https://spack.readthedocs.io/en/latest/packaging_guide.html#mirrors-of-the-main-url>`__
|
|
||||||
for information on how Spack uses the `urls` attribute during
|
|
||||||
fetching.
|
|
||||||
|
|
||||||
^^^^^
|
|
||||||
Usage
|
|
||||||
^^^^^
|
|
||||||
|
|
||||||
This helper package can be added to your package by adding it as a base
|
|
||||||
class of your package and defining the relative location of an archive
|
|
||||||
file for one version of your software.
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
:emphasize-lines: 1,3
|
|
||||||
|
|
||||||
class MyPackage(AutotoolsPackage, SourceforgePackage):
|
|
||||||
...
|
|
||||||
sourceforge_mirror_path = "my-package/mypackage.1.0.0.tar.gz"
|
|
||||||
...
|
|
||||||
|
|
||||||
Over 40 packages are using ``SourceforcePackage`` this mix-in as of
|
|
||||||
July 2022 so there are multiple packages to choose from if you want
|
|
||||||
to see a real example.
|
|
@@ -1,12 +1,13 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. _wafpackage:
|
.. _wafpackage:
|
||||||
|
|
||||||
---
|
----------
|
||||||
Waf
|
WafPackage
|
||||||
---
|
----------
|
||||||
|
|
||||||
Like SCons, Waf is a general-purpose build system that does not rely
|
Like SCons, Waf is a general-purpose build system that does not rely
|
||||||
on Makefiles to build software.
|
on Makefiles to build software.
|
||||||
@@ -15,7 +16,7 @@ on Makefiles to build software.
|
|||||||
Phases
|
Phases
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
The ``WafBuilder`` and ``WafPackage`` base classes come with the following phases:
|
The ``WafPackage`` base class comes with the following phases:
|
||||||
|
|
||||||
#. ``configure`` - configure the project
|
#. ``configure`` - configure the project
|
||||||
#. ``build`` - build the project
|
#. ``build`` - build the project
|
||||||
@@ -57,13 +58,15 @@ Testing
|
|||||||
``WafPackage`` also provides ``test`` and ``installtest`` methods,
|
``WafPackage`` also provides ``test`` and ``installtest`` methods,
|
||||||
which are run after the ``build`` and ``install`` phases, respectively.
|
which are run after the ``build`` and ``install`` phases, respectively.
|
||||||
By default, these phases do nothing, but you can override them to
|
By default, these phases do nothing, but you can override them to
|
||||||
run package-specific unit tests.
|
run package-specific unit tests. For example, the
|
||||||
|
`py-py2cairo <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/py-py2cairo/package.py>`_
|
||||||
|
package uses:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def installtest(self):
|
def installtest(self):
|
||||||
with working_dir("test"):
|
with working_dir('test'):
|
||||||
pytest = which("py.test")
|
pytest = which('py.test')
|
||||||
pytest()
|
pytest()
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +95,7 @@ the following dependency automatically:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
depends_on("python@2.5:", type="build")
|
depends_on('python@2.5:', type='build')
|
||||||
|
|
||||||
|
|
||||||
Waf only supports Python 2.5 and up.
|
Waf only supports Python 2.5 and up.
|
||||||
@@ -112,7 +115,7 @@ phase, you can use:
|
|||||||
args = []
|
args = []
|
||||||
|
|
||||||
if self.run_tests:
|
if self.run_tests:
|
||||||
args.append("--test")
|
args.append('--test')
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
@@ -1,17 +1,17 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
.. chain:
|
.. chain:
|
||||||
|
|
||||||
=============================================
|
============================
|
||||||
Chaining Spack Installations (upstreams.yaml)
|
Chaining Spack Installations
|
||||||
=============================================
|
============================
|
||||||
|
|
||||||
You can point your Spack installation to another installation to use any
|
You can point your Spack installation to another installation to use any
|
||||||
packages that are installed there. To register the other Spack instance,
|
packages that are installed there. To register the other Spack instance,
|
||||||
you can add it as an entry to ``upstreams.yaml`` at any of the
|
you can add it as an entry to ``upstreams.yaml``:
|
||||||
:ref:`configuration-scopes`:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
@@ -22,8 +22,7 @@ you can add it as an entry to ``upstreams.yaml`` at any of the
|
|||||||
install_tree: /path/to/another/spack/opt/spack
|
install_tree: /path/to/another/spack/opt/spack
|
||||||
|
|
||||||
``install_tree`` must point to the ``opt/spack`` directory inside of the
|
``install_tree`` must point to the ``opt/spack`` directory inside of the
|
||||||
Spack base directory, or the location of the ``install_tree`` defined
|
Spack base directory.
|
||||||
in :ref:`config.yaml <config-yaml>`.
|
|
||||||
|
|
||||||
Once the upstream Spack instance has been added, ``spack find`` will
|
Once the upstream Spack instance has been added, ``spack find`` will
|
||||||
automatically check the upstream instance when querying installed packages,
|
automatically check the upstream instance when querying installed packages,
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -31,33 +32,37 @@
|
|||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
link_name = os.path.abspath("_spack_root")
|
sys.path.insert(0, os.path.abspath('_spack_root/lib/spack/external'))
|
||||||
if not os.path.exists(link_name):
|
sys.path.insert(0, os.path.abspath('_spack_root/lib/spack/external/pytest-fallback'))
|
||||||
os.symlink(os.path.abspath("../../.."), link_name, target_is_directory=True)
|
|
||||||
sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external"))
|
if sys.version_info[0] < 3:
|
||||||
sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external/_vendoring"))
|
sys.path.insert(
|
||||||
sys.path.append(os.path.abspath("_spack_root/lib/spack/"))
|
0, os.path.abspath('_spack_root/lib/spack/external/yaml/lib'))
|
||||||
|
else:
|
||||||
|
sys.path.insert(
|
||||||
|
0, os.path.abspath('_spack_root/lib/spack/external/yaml/lib3'))
|
||||||
|
|
||||||
|
sys.path.append(os.path.abspath('_spack_root/lib/spack/'))
|
||||||
|
|
||||||
# Add the Spack bin directory to the path so that we can use its output in docs.
|
# Add the Spack bin directory to the path so that we can use its output in docs.
|
||||||
os.environ["SPACK_ROOT"] = os.path.abspath("_spack_root")
|
os.environ['SPACK_ROOT'] = os.path.abspath('_spack_root')
|
||||||
os.environ["PATH"] += "%s%s" % (os.pathsep, os.path.abspath("_spack_root/bin"))
|
os.environ['PATH'] += "%s%s" % (os.pathsep, os.path.abspath('_spack_root/bin'))
|
||||||
|
|
||||||
# Set an environment variable so that colify will print output like it would to
|
# Set an environment variable so that colify will print output like it would to
|
||||||
# a terminal.
|
# a terminal.
|
||||||
os.environ["COLIFY_SIZE"] = "25x120"
|
os.environ['COLIFY_SIZE'] = '25x120'
|
||||||
os.environ["COLUMNS"] = "120"
|
os.environ['COLUMNS'] = '120'
|
||||||
|
|
||||||
|
# Generate full package list if needed
|
||||||
|
subprocess.call([
|
||||||
|
'spack', 'list', '--format=html', '--update=package_list.html'])
|
||||||
|
|
||||||
# Generate a command index if an update is needed
|
# Generate a command index if an update is needed
|
||||||
subprocess.call(
|
subprocess.call([
|
||||||
[
|
'spack', 'commands',
|
||||||
"spack",
|
'--format=rst',
|
||||||
"commands",
|
'--header=command_index.in',
|
||||||
"--format=rst",
|
'--update=command_index.rst'] + glob('*rst'))
|
||||||
"--header=command_index.in",
|
|
||||||
"--update=command_index.rst",
|
|
||||||
]
|
|
||||||
+ glob("*rst")
|
|
||||||
)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Run sphinx-apidoc
|
# Run sphinx-apidoc
|
||||||
@@ -67,34 +72,25 @@
|
|||||||
# Without this, the API Docs will never actually update
|
# Without this, the API Docs will never actually update
|
||||||
#
|
#
|
||||||
apidoc_args = [
|
apidoc_args = [
|
||||||
"--force", # Overwrite existing files
|
'--force', # Overwrite existing files
|
||||||
"--no-toc", # Don't create a table of contents file
|
'--no-toc', # Don't create a table of contents file
|
||||||
"--output-dir=.", # Directory to place all output
|
'--output-dir=.', # Directory to place all output
|
||||||
"--module-first", # emit module docs before submodule docs
|
|
||||||
]
|
]
|
||||||
sphinx_apidoc(
|
sphinx_apidoc(apidoc_args + ['_spack_root/lib/spack/spack'])
|
||||||
apidoc_args
|
sphinx_apidoc(apidoc_args + ['_spack_root/lib/spack/llnl'])
|
||||||
+ [
|
|
||||||
"_spack_root/lib/spack/spack",
|
|
||||||
"_spack_root/lib/spack/spack/test/*.py",
|
|
||||||
"_spack_root/lib/spack/spack/test/cmd/*.py",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
sphinx_apidoc(apidoc_args + ["_spack_root/lib/spack/llnl"])
|
|
||||||
|
|
||||||
# Enable todo items
|
# Enable todo items
|
||||||
todo_include_todos = True
|
todo_include_todos = True
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Disable duplicate cross-reference warnings.
|
# Disable duplicate cross-reference warnings.
|
||||||
#
|
#
|
||||||
class PatchedPythonDomain(PythonDomain):
|
class PatchedPythonDomain(PythonDomain):
|
||||||
def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
|
def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
|
||||||
if "refspecific" in node:
|
if 'refspecific' in node:
|
||||||
del node["refspecific"]
|
del node['refspecific']
|
||||||
return super().resolve_xref(env, fromdocname, builder, typ, target, node, contnode)
|
return super(PatchedPythonDomain, self).resolve_xref(
|
||||||
|
env, fromdocname, builder, typ, target, node, contnode)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Disable tabs to space expansion in code blocks
|
# Disable tabs to space expansion in code blocks
|
||||||
@@ -107,57 +103,51 @@ def parse(self, inputstring, document):
|
|||||||
inputstring = StringList(lines, document.current_source)
|
inputstring = StringList(lines, document.current_source)
|
||||||
super().parse(inputstring, document)
|
super().parse(inputstring, document)
|
||||||
|
|
||||||
|
|
||||||
def setup(sphinx):
|
def setup(sphinx):
|
||||||
sphinx.add_domain(PatchedPythonDomain, override=True)
|
sphinx.add_domain(PatchedPythonDomain, override=True)
|
||||||
sphinx.add_source_parser(NoTabExpansionRSTParser, override=True)
|
sphinx.add_source_parser(NoTabExpansionRSTParser, override=True)
|
||||||
|
|
||||||
|
|
||||||
# -- General configuration -----------------------------------------------------
|
# -- General configuration -----------------------------------------------------
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
needs_sphinx = "3.4"
|
needs_sphinx = '3.4'
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
extensions = [
|
extensions = [
|
||||||
"sphinx.ext.autodoc",
|
'sphinx.ext.autodoc',
|
||||||
"sphinx.ext.graphviz",
|
'sphinx.ext.graphviz',
|
||||||
"sphinx.ext.intersphinx",
|
'sphinx.ext.intersphinx',
|
||||||
"sphinx.ext.napoleon",
|
'sphinx.ext.napoleon',
|
||||||
"sphinx.ext.todo",
|
'sphinx.ext.todo',
|
||||||
"sphinx.ext.viewcode",
|
'sphinx.ext.viewcode',
|
||||||
"sphinx_design",
|
'sphinxcontrib.programoutput',
|
||||||
"sphinxcontrib.programoutput",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Set default graphviz options
|
# Set default graphviz options
|
||||||
graphviz_dot_args = [
|
graphviz_dot_args = [
|
||||||
"-Grankdir=LR",
|
'-Grankdir=LR', '-Gbgcolor=transparent',
|
||||||
"-Gbgcolor=transparent",
|
'-Nshape=box', '-Nfontname=monaco', '-Nfontsize=10']
|
||||||
"-Nshape=box",
|
|
||||||
"-Nfontname=monaco",
|
|
||||||
"-Nfontsize=10",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Get nice vector graphics
|
# Get nice vector graphics
|
||||||
graphviz_output_format = "svg"
|
graphviz_output_format = "svg"
|
||||||
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
templates_path = ["_templates"]
|
templates_path = ['_templates']
|
||||||
|
|
||||||
# The suffix of source filenames.
|
# The suffix of source filenames.
|
||||||
source_suffix = ".rst"
|
source_suffix = '.rst'
|
||||||
|
|
||||||
# The encoding of source files.
|
# The encoding of source files.
|
||||||
source_encoding = "utf-8-sig"
|
source_encoding = 'utf-8-sig'
|
||||||
|
|
||||||
# The master toctree document.
|
# The master toctree document.
|
||||||
master_doc = "index"
|
master_doc = 'index'
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = "Spack"
|
project = u'Spack'
|
||||||
copyright = "2013-2023, Lawrence Livermore National Laboratory."
|
copyright = u'2013-2021, Lawrence Livermore National Laboratory.'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
@@ -166,16 +156,16 @@ def setup(sphinx):
|
|||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
import spack
|
import spack
|
||||||
|
|
||||||
version = ".".join(str(s) for s in spack.spack_version_info[:2])
|
version = '.'.join(str(s) for s in spack.spack_version_info[:2])
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = spack.spack_version
|
release = spack.spack_version
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
# language = None
|
#language = None
|
||||||
|
|
||||||
# Places to look for .po/.mo files for doc translations
|
# Places to look for .po/.mo files for doc translations
|
||||||
# locale_dirs = []
|
#locale_dirs = []
|
||||||
|
|
||||||
# Sphinx gettext settings
|
# Sphinx gettext settings
|
||||||
gettext_compact = True
|
gettext_compact = True
|
||||||
@@ -183,191 +173,201 @@ def setup(sphinx):
|
|||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
# non-false value, then it is used:
|
# non-false value, then it is used:
|
||||||
# today = ''
|
#today = ''
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
# today_fmt = '%B %d, %Y'
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
# List of patterns, relative to source directory, that match files and
|
||||||
# directories to ignore when looking for source files.
|
# directories to ignore when looking for source files.
|
||||||
exclude_patterns = ["_build", "_spack_root", ".spack-env"]
|
exclude_patterns = ['_build', '_spack_root', '.spack-env']
|
||||||
|
|
||||||
nitpicky = True
|
nitpicky = True
|
||||||
nitpick_ignore = [
|
nitpick_ignore = [
|
||||||
# Python classes that intersphinx is unable to resolve
|
# Python classes that intersphinx is unable to resolve
|
||||||
("py:class", "argparse.HelpFormatter"),
|
('py:class', 'argparse.HelpFormatter'),
|
||||||
("py:class", "contextlib.contextmanager"),
|
('py:class', 'contextlib.contextmanager'),
|
||||||
("py:class", "module"),
|
('py:class', 'module'),
|
||||||
("py:class", "_io.BufferedReader"),
|
('py:class', '_io.BufferedReader'),
|
||||||
("py:class", "_io.BytesIO"),
|
('py:class', 'unittest.case.TestCase'),
|
||||||
("py:class", "unittest.case.TestCase"),
|
('py:class', '_frozen_importlib_external.SourceFileLoader'),
|
||||||
("py:class", "_frozen_importlib_external.SourceFileLoader"),
|
|
||||||
("py:class", "clingo.Control"),
|
|
||||||
("py:class", "six.moves.urllib.parse.ParseResult"),
|
|
||||||
("py:class", "TextIO"),
|
|
||||||
("py:class", "hashlib._Hash"),
|
|
||||||
("py:class", "concurrent.futures._base.Executor"),
|
|
||||||
# Spack classes that are private and we don't want to expose
|
# Spack classes that are private and we don't want to expose
|
||||||
("py:class", "spack.provider_index._IndexBase"),
|
('py:class', 'spack.provider_index._IndexBase'),
|
||||||
("py:class", "spack.repo._PrependFileLoader"),
|
('py:class', 'spack.repo._PrependFileLoader'),
|
||||||
("py:class", "spack.build_systems._checks.BuilderWithDefaults"),
|
|
||||||
# Spack classes that intersphinx is unable to resolve
|
|
||||||
("py:class", "spack.version.StandardVersion"),
|
|
||||||
("py:class", "spack.spec.DependencySpec"),
|
|
||||||
("py:class", "spack.spec.ArchSpec"),
|
|
||||||
("py:class", "spack.spec.InstallStatus"),
|
|
||||||
("py:class", "spack.spec.SpecfileReaderBase"),
|
|
||||||
("py:class", "spack.install_test.Pb"),
|
|
||||||
("py:class", "spack.filesystem_view.SimpleFilesystemView"),
|
|
||||||
("py:class", "spack.traverse.EdgeAndDepth"),
|
|
||||||
("py:class", "archspec.cpu.microarchitecture.Microarchitecture"),
|
|
||||||
("py:class", "spack.compiler.CompilerCache"),
|
|
||||||
# TypeVar that is not handled correctly
|
|
||||||
("py:class", "llnl.util.lang.T"),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
# default_role = None
|
#default_role = None
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
# add_function_parentheses = True
|
#add_function_parentheses = True
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
# If true, the current module name will be prepended to all description
|
||||||
# unit titles (such as .. function::).
|
# unit titles (such as .. function::).
|
||||||
# add_module_names = True
|
#add_module_names = True
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
# output. They are ignored by default.
|
# output. They are ignored by default.
|
||||||
# show_authors = False
|
#show_authors = False
|
||||||
sys.path.append("./_pygments")
|
|
||||||
pygments_style = "style.SpackStyle"
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
# We use our own extension of the default style with a few modifications
|
||||||
|
from pygments.style import Style
|
||||||
|
from pygments.styles.default import DefaultStyle
|
||||||
|
from pygments.token import Comment, Generic, Text
|
||||||
|
|
||||||
|
|
||||||
|
class SpackStyle(DefaultStyle):
|
||||||
|
styles = DefaultStyle.styles.copy()
|
||||||
|
background_color = "#f4f4f8"
|
||||||
|
styles[Generic.Output] = "#355"
|
||||||
|
styles[Generic.Prompt] = "bold #346ec9"
|
||||||
|
|
||||||
|
import pkg_resources
|
||||||
|
|
||||||
|
dist = pkg_resources.Distribution(__file__)
|
||||||
|
sys.path.append('.') # make 'conf' module findable
|
||||||
|
ep = pkg_resources.EntryPoint.parse('spack = conf:SpackStyle', dist=dist)
|
||||||
|
dist._ep_map = {'pygments.styles': {'plugin1': ep}}
|
||||||
|
pkg_resources.working_set.add(dist)
|
||||||
|
|
||||||
|
pygments_style = 'spack'
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
# A list of ignored prefixes for module index sorting.
|
||||||
# modindex_common_prefix = []
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ---------------------------------------------------
|
# -- Options for HTML output ---------------------------------------------------
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
html_theme = "sphinx_rtd_theme"
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
# further. For a list of options available for each theme, see the
|
# further. For a list of options available for each theme, see the
|
||||||
# documentation.
|
# documentation.
|
||||||
html_theme_options = {"logo_only": True}
|
html_theme_options = { 'logo_only' : True }
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
# html_theme_path = ["_themes"]
|
# html_theme_path = ["_themes"]
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
# "<project> v<release> documentation".
|
# "<project> v<release> documentation".
|
||||||
# html_title = None
|
#html_title = None
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
# html_short_title = None
|
#html_short_title = None
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
# of the sidebar.
|
# of the sidebar.
|
||||||
html_logo = "_spack_root/share/spack/logo/spack-logo-white-text.svg"
|
html_logo = '_spack_root/share/spack/logo/spack-logo-white-text.svg'
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
# pixels large.
|
# pixels large.
|
||||||
html_favicon = "_spack_root/share/spack/logo/favicon.ico"
|
html_favicon = '_spack_root/share/spack/logo/favicon.ico'
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
html_static_path = ["_static"]
|
html_static_path = ['_static']
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
# using the given strftime format.
|
# using the given strftime format.
|
||||||
html_last_updated_fmt = "%b %d, %Y"
|
html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
# typographically correct entities.
|
# typographically correct entities.
|
||||||
# html_use_smartypants = True
|
#html_use_smartypants = True
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
# Custom sidebar templates, maps document names to template names.
|
||||||
# html_sidebars = {}
|
#html_sidebars = {}
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
# template names.
|
# template names.
|
||||||
# html_additional_pages = {}
|
#html_additional_pages = {}
|
||||||
|
|
||||||
# If false, no module index is generated.
|
# If false, no module index is generated.
|
||||||
# html_domain_indices = True
|
#html_domain_indices = True
|
||||||
|
|
||||||
# If false, no index is generated.
|
# If false, no index is generated.
|
||||||
# html_use_index = True
|
#html_use_index = True
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
# If true, the index is split into individual pages for each letter.
|
||||||
# html_split_index = False
|
#html_split_index = False
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
# If true, links to the reST sources are added to the pages.
|
||||||
# html_show_sourcelink = True
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
# html_show_sphinx = False
|
#html_show_sphinx = False
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||||
# html_show_copyright = True
|
#html_show_copyright = True
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
# base URL from which the finished HTML is served.
|
# base URL from which the finished HTML is served.
|
||||||
# html_use_opensearch = ''
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
# html_file_suffix = None
|
#html_file_suffix = None
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = "Spackdoc"
|
htmlhelp_basename = 'Spackdoc'
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output --------------------------------------------------
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
|
|
||||||
latex_elements = {
|
latex_elements = {
|
||||||
# The paper size ('letterpaper' or 'a4paper').
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
# 'papersize': 'letterpaper',
|
#'papersize': 'letterpaper',
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
|
||||||
# 'pointsize': '10pt',
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
# Additional stuff for the LaTeX preamble.
|
#'pointsize': '10pt',
|
||||||
# 'preamble': '',
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#'preamble': '',
|
||||||
}
|
}
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
latex_documents = [("index", "Spack.tex", "Spack Documentation", "Todd Gamblin", "manual")]
|
latex_documents = [
|
||||||
|
('index', 'Spack.tex', u'Spack Documentation',
|
||||||
|
u'Todd Gamblin', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
# the title page.
|
# the title page.
|
||||||
# latex_logo = None
|
#latex_logo = None
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
# not chapters.
|
# not chapters.
|
||||||
# latex_use_parts = False
|
#latex_use_parts = False
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
# If true, show page references after internal links.
|
||||||
# latex_show_pagerefs = False
|
#latex_show_pagerefs = False
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
# If true, show URL addresses after external links.
|
||||||
# latex_show_urls = False
|
#latex_show_urls = False
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
# Documents to append as an appendix to all manuals.
|
||||||
# latex_appendices = []
|
#latex_appendices = []
|
||||||
|
|
||||||
# If false, no module index is generated.
|
# If false, no module index is generated.
|
||||||
# latex_domain_indices = True
|
#latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output --------------------------------------------
|
# -- Options for manual page output --------------------------------------------
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [("index", "spack", "Spack Documentation", ["Todd Gamblin"], 1)]
|
man_pages = [
|
||||||
|
('index', 'spack', u'Spack Documentation',
|
||||||
|
[u'Todd Gamblin'], 1)
|
||||||
|
]
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
# If true, show URL addresses after external links.
|
||||||
# man_show_urls = False
|
#man_show_urls = False
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output ------------------------------------------------
|
# -- Options for Texinfo output ------------------------------------------------
|
||||||
@@ -376,28 +376,24 @@ def setup(sphinx):
|
|||||||
# (source start file, target name, title, author,
|
# (source start file, target name, title, author,
|
||||||
# dir menu entry, description, category)
|
# dir menu entry, description, category)
|
||||||
texinfo_documents = [
|
texinfo_documents = [
|
||||||
(
|
('index', 'Spack', u'Spack Documentation',
|
||||||
"index",
|
u'Todd Gamblin', 'Spack', 'One line description of project.',
|
||||||
"Spack",
|
'Miscellaneous'),
|
||||||
"Spack Documentation",
|
|
||||||
"Todd Gamblin",
|
|
||||||
"Spack",
|
|
||||||
"One line description of project.",
|
|
||||||
"Miscellaneous",
|
|
||||||
)
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
# Documents to append as an appendix to all manuals.
|
||||||
# texinfo_appendices = []
|
#texinfo_appendices = []
|
||||||
|
|
||||||
# If false, no module index is generated.
|
# If false, no module index is generated.
|
||||||
# texinfo_domain_indices = True
|
#texinfo_domain_indices = True
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||||
# texinfo_show_urls = 'footnote'
|
#texinfo_show_urls = 'footnote'
|
||||||
|
|
||||||
|
|
||||||
# -- Extension configuration -------------------------------------------------
|
# -- Extension configuration -------------------------------------------------
|
||||||
|
|
||||||
# sphinx.ext.intersphinx
|
# sphinx.ext.intersphinx
|
||||||
intersphinx_mapping = {"python": ("https://docs.python.org/3", None)}
|
intersphinx_mapping = {
|
||||||
|
"python": ("https://docs.python.org/3", None),
|
||||||
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -18,30 +19,21 @@ see the default settings by looking at
|
|||||||
These settings can be overridden in ``etc/spack/config.yaml`` or
|
These settings can be overridden in ``etc/spack/config.yaml`` or
|
||||||
``~/.spack/config.yaml``. See :ref:`configuration-scopes` for details.
|
``~/.spack/config.yaml``. See :ref:`configuration-scopes` for details.
|
||||||
|
|
||||||
---------------------
|
--------------------
|
||||||
``install_tree:root``
|
``install_tree``
|
||||||
---------------------
|
--------------------
|
||||||
|
|
||||||
The location where Spack will install packages and their dependencies.
|
The location where Spack will install packages and their dependencies.
|
||||||
Default is ``$spack/opt/spack``.
|
Default is ``$spack/opt/spack``.
|
||||||
|
|
||||||
---------------
|
---------------------------------------------------
|
||||||
``projections``
|
``install_hash_length`` and ``install_path_scheme``
|
||||||
---------------
|
---------------------------------------------------
|
||||||
|
|
||||||
.. warning::
|
The default Spack installation path can be very long and can create problems
|
||||||
|
for scripts with hardcoded shebangs. Additionally, when using the Intel
|
||||||
Modifying projections of the install tree is strongly discouraged.
|
compiler, and if there is also a long list of dependencies, the compiler may
|
||||||
|
segfault. If you see the following:
|
||||||
By default Spack installs all packages into a unique directory relative to the install
|
|
||||||
tree root with the following layout:
|
|
||||||
|
|
||||||
.. code-block::
|
|
||||||
|
|
||||||
{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}
|
|
||||||
|
|
||||||
In very rare cases, it may be necessary to reduce the length of this path. For example,
|
|
||||||
very old versions of the Intel compiler are known to segfault when input paths are too long:
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -49,25 +41,36 @@ very old versions of the Intel compiler are known to segfault when input paths a
|
|||||||
** Segmentation violation signal raised. **
|
** Segmentation violation signal raised. **
|
||||||
Access violation or stack overflow. Please contact Intel Support for assistance.
|
Access violation or stack overflow. Please contact Intel Support for assistance.
|
||||||
|
|
||||||
Another case is Python and R packages with many runtime dependencies, which can result
|
it may be because variables containing dependency specs may be too long. There
|
||||||
in very large ``PYTHONPATH`` and ``R_LIBS`` environment variables. This can cause the
|
are two parameters to help with long path names. Firstly, the
|
||||||
``execve`` system call to fail with ``E2BIG``, preventing processes from starting.
|
``install_hash_length`` parameter can set the length of the hash in the
|
||||||
|
installation path from 1 to 32. The default path uses the full 32 characters.
|
||||||
|
|
||||||
For this reason, Spack allows users to modify the installation layout through custom
|
Secondly, it is also possible to modify the entire installation
|
||||||
projections. For example
|
scheme. By default Spack uses
|
||||||
|
``{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}``
|
||||||
|
where the tokens that are available for use in this directive are the
|
||||||
|
same as those understood by the :meth:`~spack.spec.Spec.format`
|
||||||
|
method. Using this parameter it is possible to use a different package
|
||||||
|
layout or reduce the depth of the installation paths. For example
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
config:
|
config:
|
||||||
install_tree:
|
install_path_scheme: '{name}/{version}/{hash:7}'
|
||||||
root: $spack/opt/spack
|
|
||||||
projections:
|
|
||||||
all: "{name}/{version}/{hash:16}"
|
|
||||||
|
|
||||||
would install packages into sub-directories using only the package name, version and a
|
would install packages into sub-directories using only the package
|
||||||
hash length of 16 characters.
|
name, version and a hash length of 7 characters.
|
||||||
|
|
||||||
Notice that reducing the hash length increases the likelihood of hash collisions.
|
When using either parameter to set the hash length it only affects the
|
||||||
|
representation of the hash in the installation directory. You
|
||||||
|
should be aware that the smaller the hash length the more likely
|
||||||
|
naming conflicts will occur. These parameters are independent of those
|
||||||
|
used to configure module names.
|
||||||
|
|
||||||
|
.. warning:: Modifying the installation hash length or path scheme after
|
||||||
|
packages have been installed will prevent Spack from being
|
||||||
|
able to find the old installation directories.
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
``build_stage``
|
``build_stage``
|
||||||
@@ -142,25 +145,6 @@ hosts when making ``ssl`` connections. Set to ``false`` to disable, and
|
|||||||
tools like ``curl`` will use their ``--insecure`` options. Disabling
|
tools like ``curl`` will use their ``--insecure`` options. Disabling
|
||||||
this can expose you to attacks. Use at your own risk.
|
this can expose you to attacks. Use at your own risk.
|
||||||
|
|
||||||
--------------------
|
|
||||||
``ssl_certs``
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Path to custom certificats for SSL verification. The value can be a
|
|
||||||
filesytem path, or an environment variable that expands to an absolute file path.
|
|
||||||
The default value is set to the environment variable ``SSL_CERT_FILE``
|
|
||||||
to use the same syntax used by many other applications that automatically
|
|
||||||
detect custom certificates.
|
|
||||||
When ``url_fetch_method:curl`` the ``config:ssl_certs`` should resolve to
|
|
||||||
a single file. Spack will then set the environment variable ``CURL_CA_BUNDLE``
|
|
||||||
in the subprocess calling ``curl``.
|
|
||||||
If ``url_fetch_method:urllib`` then files and directories are supported i.e.
|
|
||||||
``config:ssl_certs:$SSL_CERT_FILE`` or ``config:ssl_certs:$SSL_CERT_DIR``
|
|
||||||
will work.
|
|
||||||
In all cases the expanded path must be absolute for Spack to use the certificates.
|
|
||||||
Certificates relative to an environment can be created by prepending the path variable
|
|
||||||
with the Spack configuration variable``$env``.
|
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
``checksum``
|
``checksum``
|
||||||
--------------------
|
--------------------
|
||||||
@@ -238,11 +222,11 @@ and location. (See the *Configuration settings* section of ``man
|
|||||||
ccache`` to learn more about the default settings and how to change
|
ccache`` to learn more about the default settings and how to change
|
||||||
them). Please note that we currently disable ccache's ``hash_dir``
|
them). Please note that we currently disable ccache's ``hash_dir``
|
||||||
feature to avoid an issue with the stage directory (see
|
feature to avoid an issue with the stage directory (see
|
||||||
https://github.com/spack/spack/pull/3761#issuecomment-294352232).
|
https://github.com/LLNL/spack/pull/3761#issuecomment-294352232).
|
||||||
|
|
||||||
-----------------------
|
------------------
|
||||||
``shared_linking:type``
|
``shared_linking``
|
||||||
-----------------------
|
------------------
|
||||||
|
|
||||||
Control whether Spack embeds ``RPATH`` or ``RUNPATH`` attributes in ELF binaries
|
Control whether Spack embeds ``RPATH`` or ``RUNPATH`` attributes in ELF binaries
|
||||||
so that they can find their dependencies. Has no effect on macOS.
|
so that they can find their dependencies. Has no effect on macOS.
|
||||||
@@ -261,76 +245,15 @@ the loading object.
|
|||||||
|
|
||||||
DO NOT MIX the two options within the same install tree.
|
DO NOT MIX the two options within the same install tree.
|
||||||
|
|
||||||
-----------------------
|
|
||||||
``shared_linking:bind``
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
This is an *experimental option* that controls whether Spack embeds absolute paths
|
|
||||||
to needed shared libraries in ELF executables and shared libraries on Linux. Setting
|
|
||||||
this option to ``true`` has two advantages:
|
|
||||||
|
|
||||||
1. **Improved startup time**: when running an executable, the dynamic loader does not
|
|
||||||
have to perform a search for needed libraries, they are loaded directly.
|
|
||||||
2. **Reliability**: libraries loaded at runtime are those that were linked to. This
|
|
||||||
minimizes the risk of accidentally picking up system libraries.
|
|
||||||
|
|
||||||
In the current implementation, Spack sets the soname (shared object name) of
|
|
||||||
libraries to their install path upon installation. This has two implications:
|
|
||||||
|
|
||||||
1. binding does not apply to libraries installed *before* the option was enabled;
|
|
||||||
2. toggling the option off does *not* prevent binding of libraries installed when
|
|
||||||
the option was still enabled.
|
|
||||||
|
|
||||||
It is also worth noting that:
|
|
||||||
|
|
||||||
1. Applications relying on ``dlopen(3)`` will continue to work, even when they open
|
|
||||||
a library by name. This is because ``RPATH``\s are retained in binaries also
|
|
||||||
when ``bind`` is enabled.
|
|
||||||
2. ``LD_PRELOAD`` continues to work for the typical use case of overriding
|
|
||||||
symbols, such as preloading a library with a more efficient ``malloc``.
|
|
||||||
However, the preloaded library will be loaded *additionally to*, instead of
|
|
||||||
*in place of* another library with the same name --- this can be problematic
|
|
||||||
in very rare cases where libraries rely on a particular ``init`` or ``fini``
|
|
||||||
order.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
In some cases packages provide *stub libraries* that only contain an interface
|
|
||||||
for linking, but lack an implementation for runtime. An example of this is
|
|
||||||
``libcuda.so``, provided by the CUDA toolkit; it can be used to link against,
|
|
||||||
but the library needed at runtime is the one installed with the CUDA driver.
|
|
||||||
To avoid binding those libraries, they can be marked as non-bindable using
|
|
||||||
a property in the package:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
class Example(Package):
|
|
||||||
non_bindable_shared_objects = ["libinterface.so"]
|
|
||||||
|
|
||||||
----------------------
|
----------------------
|
||||||
``install_status``
|
``terminal_title``
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
When set to ``true``, Spack will show information about its current progress
|
By setting this option to ``true``, Spack will update the terminal's title to
|
||||||
as well as the current and total package numbers. Progress is shown both
|
provide information about its current progress as well as the current and
|
||||||
in the terminal title and inline. Setting it to ``false`` will not show any
|
total package numbers.
|
||||||
progress information.
|
|
||||||
|
|
||||||
To work properly, this requires your terminal to reset its title after
|
To work properly, this requires your terminal to reset its title after
|
||||||
Spack has finished its work, otherwise Spack's status information will
|
Spack has finished its work, otherwise Spack's status information will
|
||||||
remain in the terminal's title indefinitely. Most terminals should already
|
remain in the terminal's title indefinitely. Most terminals should already
|
||||||
be set up this way and clear Spack's status information.
|
be set up this way and clear Spack's status information.
|
||||||
|
|
||||||
-----------
|
|
||||||
``aliases``
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Aliases can be used to define new Spack commands. They can be either shortcuts
|
|
||||||
for longer commands or include specific arguments for convenience. For instance,
|
|
||||||
if users want to use ``spack install``'s ``-v`` argument all the time, they can
|
|
||||||
create a new alias called ``inst`` that will always call ``install -v``:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
aliases:
|
|
||||||
inst: install -v
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -16,12 +17,11 @@ case you want to skip directly to specific docs:
|
|||||||
* :ref:`config.yaml <config-yaml>`
|
* :ref:`config.yaml <config-yaml>`
|
||||||
* :ref:`mirrors.yaml <mirrors>`
|
* :ref:`mirrors.yaml <mirrors>`
|
||||||
* :ref:`modules.yaml <modules>`
|
* :ref:`modules.yaml <modules>`
|
||||||
* :ref:`packages.yaml <packages-config>`
|
* :ref:`packages.yaml <build-settings>`
|
||||||
* :ref:`repos.yaml <repositories>`
|
* :ref:`repos.yaml <repositories>`
|
||||||
|
|
||||||
You can also add any of these as inline configuration in the YAML
|
You can also add any of these as inline configuration in ``spack.yaml``
|
||||||
manifest file (``spack.yaml``) describing an :ref:`environment
|
in an :ref:`environment <environment-configuration>`.
|
||||||
<environment-configuration>`.
|
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
YAML Format
|
YAML Format
|
||||||
@@ -72,12 +72,9 @@ are six configuration scopes. From lowest to highest:
|
|||||||
Spack instance per project) or for site-wide settings on a multi-user
|
Spack instance per project) or for site-wide settings on a multi-user
|
||||||
machine (e.g., for a common Spack instance).
|
machine (e.g., for a common Spack instance).
|
||||||
|
|
||||||
#. **plugin**: Read from a Python project's entry points. Settings here affect
|
|
||||||
all instances of Spack running with the same Python installation. This scope takes higher precedence than site, system, and default scopes.
|
|
||||||
|
|
||||||
#. **user**: Stored in the home directory: ``~/.spack/``. These settings
|
#. **user**: Stored in the home directory: ``~/.spack/``. These settings
|
||||||
affect all instances of Spack and take higher precedence than site,
|
affect all instances of Spack and take higher precedence than site,
|
||||||
system, plugin, or defaults scopes.
|
system, or defaults scopes.
|
||||||
|
|
||||||
#. **custom**: Stored in a custom directory specified by ``--config-scope``.
|
#. **custom**: Stored in a custom directory specified by ``--config-scope``.
|
||||||
If multiple scopes are listed on the command line, they are ordered
|
If multiple scopes are listed on the command line, they are ordered
|
||||||
@@ -198,45 +195,6 @@ with MPICH. You can create different configuration scopes for use with
|
|||||||
mpi: [mpich]
|
mpi: [mpich]
|
||||||
|
|
||||||
|
|
||||||
.. _plugin-scopes:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
Plugin scopes
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
Python version >= 3.8 is required to enable plugin configuration.
|
|
||||||
|
|
||||||
Spack can be made aware of configuration scopes that are installed as part of a python package. To do so, register a function that returns the scope's path to the ``"spack.config"`` entry point. Consider the Python package ``my_package`` that includes Spack configurations:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
my-package/
|
|
||||||
├── src
|
|
||||||
│ ├── my_package
|
|
||||||
│ │ ├── __init__.py
|
|
||||||
│ │ └── spack/
|
|
||||||
│ │ │ └── config.yaml
|
|
||||||
└── pyproject.toml
|
|
||||||
|
|
||||||
adding the following to ``my_package``'s ``pyproject.toml`` will make ``my_package``'s ``spack/`` configurations visible to Spack when ``my_package`` is installed:
|
|
||||||
|
|
||||||
.. code-block:: toml
|
|
||||||
|
|
||||||
[project.entry_points."spack.config"]
|
|
||||||
my_package = "my_package:get_config_path"
|
|
||||||
|
|
||||||
The function ``my_package.get_extension_path`` in ``my_package/__init__.py`` might look like
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
import importlib.resources
|
|
||||||
|
|
||||||
def get_config_path():
|
|
||||||
dirname = importlib.resources.files("my_package").joinpath("spack")
|
|
||||||
if dirname.exists():
|
|
||||||
return str(dirname)
|
|
||||||
|
|
||||||
.. _platform-scopes:
|
.. _platform-scopes:
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
@@ -269,9 +227,6 @@ You can get the name to use for ``<platform>`` by running ``spack arch
|
|||||||
--platform``. The system config scope has a ``<platform>`` section for
|
--platform``. The system config scope has a ``<platform>`` section for
|
||||||
sites at which ``/etc`` is mounted on multiple heterogeneous machines.
|
sites at which ``/etc`` is mounted on multiple heterogeneous machines.
|
||||||
|
|
||||||
|
|
||||||
.. _config-scope-precedence:
|
|
||||||
|
|
||||||
----------------
|
----------------
|
||||||
Scope Precedence
|
Scope Precedence
|
||||||
----------------
|
----------------
|
||||||
@@ -280,17 +235,10 @@ When spack queries for configuration parameters, it searches in
|
|||||||
higher-precedence scopes first. So, settings in a higher-precedence file
|
higher-precedence scopes first. So, settings in a higher-precedence file
|
||||||
can override those with the same key in a lower-precedence one. For
|
can override those with the same key in a lower-precedence one. For
|
||||||
list-valued settings, Spack *prepends* higher-precedence settings to
|
list-valued settings, Spack *prepends* higher-precedence settings to
|
||||||
lower-precedence settings. Completely ignoring lower-precedence configuration
|
lower-precedence settings. Completely ignoring higher-level configuration
|
||||||
options is supported with the ``::`` notation for keys (see
|
options is supported with the ``::`` notation for keys (see
|
||||||
:ref:`config-overrides` below).
|
:ref:`config-overrides` below).
|
||||||
|
|
||||||
There are also special notations for string concatenation and precendense override:
|
|
||||||
|
|
||||||
* ``+:`` will force *prepending* strings or lists. For lists, this is the default behavior.
|
|
||||||
* ``-:`` works similarly, but for *appending* values.
|
|
||||||
|
|
||||||
:ref:`config-prepend-append`
|
|
||||||
|
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
Simple keys
|
Simple keys
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
@@ -331,47 +279,6 @@ command:
|
|||||||
- ~/.spack/stage
|
- ~/.spack/stage
|
||||||
|
|
||||||
|
|
||||||
.. _config-prepend-append:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
|
||||||
String Concatenation
|
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
Above, the user ``config.yaml`` *completely* overrides specific settings in the
|
|
||||||
default ``config.yaml``. Sometimes, it is useful to add a suffix/prefix
|
|
||||||
to a path or name. To do this, you can use the ``-:`` notation for *append*
|
|
||||||
string concatenation at the end of a key in a configuration file. For example:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
:emphasize-lines: 1
|
|
||||||
:caption: ~/.spack/config.yaml
|
|
||||||
|
|
||||||
config:
|
|
||||||
install_tree-: /my/custom/suffix/
|
|
||||||
|
|
||||||
Spack will then append to the lower-precedence configuration under the
|
|
||||||
``install_tree-:`` section:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack config get config
|
|
||||||
config:
|
|
||||||
install_tree: /some/other/directory/my/custom/suffix
|
|
||||||
build_stage:
|
|
||||||
- $tempdir/$user/spack-stage
|
|
||||||
- ~/.spack/stage
|
|
||||||
|
|
||||||
|
|
||||||
Similarly, ``+:`` can be used to *prepend* to a path or name:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
:emphasize-lines: 1
|
|
||||||
:caption: ~/.spack/config.yaml
|
|
||||||
|
|
||||||
config:
|
|
||||||
install_tree+: /my/custom/suffix/
|
|
||||||
|
|
||||||
|
|
||||||
.. _config-overrides:
|
.. _config-overrides:
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -487,7 +394,7 @@ are indicated at the start of the path with ``~`` or ``~user``.
|
|||||||
Spack-specific variables
|
Spack-specific variables
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Spack understands over a dozen special variables. These are:
|
Spack understands several special variables. These are:
|
||||||
|
|
||||||
* ``$env``: name of the currently active :ref:`environment <environments>`
|
* ``$env``: name of the currently active :ref:`environment <environments>`
|
||||||
* ``$spack``: path to the prefix of this Spack installation
|
* ``$spack``: path to the prefix of this Spack installation
|
||||||
@@ -498,20 +405,6 @@ Spack understands over a dozen special variables. These are:
|
|||||||
* ``$user``: name of the current user
|
* ``$user``: name of the current user
|
||||||
* ``$user_cache_path``: user cache directory (``~/.spack`` unless
|
* ``$user_cache_path``: user cache directory (``~/.spack`` unless
|
||||||
:ref:`overridden <local-config-overrides>`)
|
:ref:`overridden <local-config-overrides>`)
|
||||||
* ``$architecture``: the architecture triple of the current host, as
|
|
||||||
detected by Spack.
|
|
||||||
* ``$arch``: alias for ``$architecture``.
|
|
||||||
* ``$platform``: the platform of the current host, as detected by Spack.
|
|
||||||
* ``$operating_system``: the operating system of the current host, as
|
|
||||||
detected by the ``distro`` python module.
|
|
||||||
* ``$os``: alias for ``$operating_system``.
|
|
||||||
* ``$target``: the ISA target for the current host, as detected by
|
|
||||||
ArchSpec. E.g. ``skylake`` or ``neoverse-n1``.
|
|
||||||
* ``$target_family``. The target family for the current host, as
|
|
||||||
detected by ArchSpec. E.g. ``x86_64`` or ``aarch64``.
|
|
||||||
* ``$date``: the current date in the format YYYY-MM-DD
|
|
||||||
* ``$spack_short_version``: the Spack version truncated to the first components.
|
|
||||||
|
|
||||||
|
|
||||||
Note that, as with shell variables, you can write these as ``$varname``
|
Note that, as with shell variables, you can write these as ``$varname``
|
||||||
or with braces to distinguish the variable from surrounding characters:
|
or with braces to distinguish the variable from surrounding characters:
|
||||||
@@ -656,7 +549,7 @@ down the problem:
|
|||||||
|
|
||||||
You can see above that the ``build_jobs`` and ``debug`` settings are
|
You can see above that the ``build_jobs`` and ``debug`` settings are
|
||||||
built in and are not overridden by a configuration file. The
|
built in and are not overridden by a configuration file. The
|
||||||
``verify_ssl`` setting comes from the ``--insecure`` option on the
|
``verify_ssl`` setting comes from the ``--insceure`` option on the
|
||||||
command line. ``dirty`` and ``install_tree`` come from the custom
|
command line. ``dirty`` and ``install_tree`` come from the custom
|
||||||
scopes ``./my-scope`` and ``./my-scope-2``, and all other configuration
|
scopes ``./my-scope`` and ``./my-scope-2``, and all other configuration
|
||||||
options come from the default configuration files that ship with Spack.
|
options come from the default configuration files that ship with Spack.
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -8,98 +9,24 @@
|
|||||||
Container Images
|
Container Images
|
||||||
================
|
================
|
||||||
|
|
||||||
Spack :ref:`environments` can easily be turned into container images. This page
|
Spack :ref:`environments` are a great tool to create container images, but
|
||||||
outlines two ways in which this can be done:
|
preparing one that is suitable for production requires some more boilerplate
|
||||||
|
than just:
|
||||||
1. By installing the environment on the host system, and copying the installations
|
|
||||||
into the container image. This approach does not require any tools like Docker
|
|
||||||
or Singularity to be installed.
|
|
||||||
2. By generating a Docker or Singularity recipe that can be used to build the
|
|
||||||
container image. In this approach, Spack builds the software inside the
|
|
||||||
container runtime, not on the host system.
|
|
||||||
|
|
||||||
The first approach is easiest if you already have an installed environment,
|
|
||||||
the second approach gives more control over the container image.
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
From existing installations
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
If you already have a Spack environment installed on your system, you can
|
|
||||||
share the binaries as an OCI compatible container image. To get started you
|
|
||||||
just have to configure and OCI registry and run ``spack buildcache push``.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# Create and install an environment in the current directory
|
|
||||||
spack env create -d .
|
|
||||||
spack -e . add pkg-a pkg-b
|
|
||||||
spack -e . install
|
|
||||||
|
|
||||||
# Configure the registry
|
|
||||||
spack -e . mirror add --oci-username-variable REGISTRY_USER \
|
|
||||||
--oci-password-variable REGISTRY_TOKEN \
|
|
||||||
container-registry oci://example.com/name/image
|
|
||||||
|
|
||||||
# Push the image (do set REGISTRY_USER and REGISTRY_TOKEN)
|
|
||||||
spack -e . buildcache push --update-index --base-image ubuntu:22.04 --tag my_env container-registry
|
|
||||||
|
|
||||||
The resulting container image can then be run as follows:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ docker run -it example.com/name/image:my_env
|
|
||||||
|
|
||||||
The image generated by Spack consists of the specified base image with each package from the
|
|
||||||
environment as a separate layer on top. The image is minimal by construction, it only contains the
|
|
||||||
environment roots and its runtime dependencies.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
When using registries like GHCR and Docker Hub, the ``--oci-password`` flag is not
|
|
||||||
the password for your account, but a personal access token you need to generate separately.
|
|
||||||
|
|
||||||
The specified ``--base-image`` should have a libc that is compatible with the host system.
|
|
||||||
For example if your host system is Ubuntu 20.04, you can use ``ubuntu:20.04``, ``ubuntu:22.04``
|
|
||||||
or newer: the libc in the container image must be at least the version of the host system,
|
|
||||||
assuming ABI compatibility. It is also perfectly fine to use a completely different
|
|
||||||
Linux distribution as long as the libc is compatible.
|
|
||||||
|
|
||||||
For convenience, Spack also turns the OCI registry into a :ref:`build cache <binary_caches_oci>`,
|
|
||||||
so that future ``spack install`` of the environment will simply pull the binaries from the
|
|
||||||
registry instead of doing source builds. The flag ``--update-index`` is needed to make Spack
|
|
||||||
take the build cache into account when concretizing.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
When generating container images in CI, the approach above is recommended when CI jobs
|
|
||||||
already run in a sandboxed environment. You can simply use ``spack`` directly
|
|
||||||
in the CI job and push the resulting image to a registry. Subsequent CI jobs should
|
|
||||||
run faster because Spack can install from the same registry instead of rebuilding from
|
|
||||||
sources.
|
|
||||||
|
|
||||||
---------------------------------------------
|
|
||||||
Generating recipes for Docker and Singularity
|
|
||||||
---------------------------------------------
|
|
||||||
|
|
||||||
Apart from copying existing installations into container images, Spack can also
|
|
||||||
generate recipes for container images. This is useful if you want to run Spack
|
|
||||||
itself in a sandboxed environment instead of on the host system.
|
|
||||||
|
|
||||||
Since recipes need a little bit more boilerplate than
|
|
||||||
|
|
||||||
.. code-block:: docker
|
.. code-block:: docker
|
||||||
|
|
||||||
COPY spack.yaml /environment
|
COPY spack.yaml /environment
|
||||||
RUN spack -e /environment install
|
RUN spack -e /environment install
|
||||||
|
|
||||||
Spack provides a command to generate customizable recipes for container images. Customizations
|
Additional actions may be needed to minimize the size of the
|
||||||
include minimizing the size of the image, installing packages in the base image using the system
|
container, or to update the system software that is installed in the base
|
||||||
package manager, and setting up a proper entrypoint to run the image.
|
image, or to set up a proper entrypoint to run the image. These tasks are
|
||||||
|
usually both necessary and repetitive, so Spack comes with a command
|
||||||
|
to generate recipes for container images starting from a ``spack.yaml``.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
--------------------
|
||||||
A Quick Introduction
|
A Quick Introduction
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
--------------------
|
||||||
|
|
||||||
Consider having a Spack environment like the following:
|
Consider having a Spack environment like the following:
|
||||||
|
|
||||||
@@ -110,8 +37,8 @@ Consider having a Spack environment like the following:
|
|||||||
- gromacs+mpi
|
- gromacs+mpi
|
||||||
- mpich
|
- mpich
|
||||||
|
|
||||||
Producing a ``Dockerfile`` from it is as simple as changing directories to
|
Producing a ``Dockerfile`` from it is as simple as moving to the directory
|
||||||
where the ``spack.yaml`` file is stored and running the following command:
|
where the ``spack.yaml`` file is stored and giving the following command:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -132,7 +59,7 @@ other techniques to minimize the size of the final image:
|
|||||||
&& echo " specs:" \
|
&& echo " specs:" \
|
||||||
&& echo " - gromacs+mpi" \
|
&& echo " - gromacs+mpi" \
|
||||||
&& echo " - mpich" \
|
&& echo " - mpich" \
|
||||||
&& echo " concretizer:" \
|
&& echo " concretizer: together" \
|
||||||
&& echo " unify: true" \
|
&& echo " unify: true" \
|
||||||
&& echo " config:" \
|
&& echo " config:" \
|
||||||
&& echo " install_tree: /opt/software" \
|
&& echo " install_tree: /opt/software" \
|
||||||
@@ -177,15 +104,14 @@ configuration are discussed in details in the sections below.
|
|||||||
|
|
||||||
.. _container_spack_images:
|
.. _container_spack_images:
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
--------------------------
|
||||||
Spack Images on Docker Hub
|
Spack Images on Docker Hub
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
--------------------------
|
||||||
|
|
||||||
Docker images with Spack preinstalled and ready to be used are
|
Docker images with Spack preinstalled and ready to be used are
|
||||||
built when a release is tagged, or nightly on ``develop``. The images
|
built on `Docker Hub <https://hub.docker.com/u/spack>`_
|
||||||
are then pushed both to `Docker Hub <https://hub.docker.com/u/spack>`_
|
at every push to ``develop`` or to a release branch. The OS that
|
||||||
and to `GitHub Container Registry <https://github.com/orgs/spack/packages?repo_name=spack>`_.
|
are currently supported are summarized in the table below:
|
||||||
The OS that are currently supported are summarized in the table below:
|
|
||||||
|
|
||||||
.. _containers-supported-os:
|
.. _containers-supported-os:
|
||||||
|
|
||||||
@@ -195,48 +121,22 @@ The OS that are currently supported are summarized in the table below:
|
|||||||
* - Operating System
|
* - Operating System
|
||||||
- Base Image
|
- Base Image
|
||||||
- Spack Image
|
- Spack Image
|
||||||
* - Ubuntu 20.04
|
* - Ubuntu 16.04
|
||||||
- ``ubuntu:20.04``
|
- ``ubuntu:16.04``
|
||||||
- ``spack/ubuntu-focal``
|
- ``spack/ubuntu-xenial``
|
||||||
* - Ubuntu 22.04
|
* - Ubuntu 18.04
|
||||||
- ``ubuntu:22.04``
|
- ``ubuntu:18.04``
|
||||||
- ``spack/ubuntu-jammy``
|
- ``spack/ubuntu-bionic``
|
||||||
* - Ubuntu 24.04
|
* - CentOS 7
|
||||||
- ``ubuntu:24.04``
|
- ``centos:7``
|
||||||
- ``spack/ubuntu-noble``
|
- ``spack/centos7``
|
||||||
* - CentOS Stream9
|
|
||||||
- ``quay.io/centos/centos:stream9``
|
|
||||||
- ``spack/centos-stream9``
|
|
||||||
* - openSUSE Leap
|
* - openSUSE Leap
|
||||||
- ``opensuse/leap``
|
- ``opensuse/leap``
|
||||||
- ``spack/leap15``
|
- ``spack/leap15``
|
||||||
* - Amazon Linux 2
|
|
||||||
- ``amazonlinux:2``
|
|
||||||
- ``spack/amazon-linux``
|
|
||||||
* - AlmaLinux 8
|
|
||||||
- ``almalinux:8``
|
|
||||||
- ``spack/almalinux8``
|
|
||||||
* - AlmaLinux 9
|
|
||||||
- ``almalinux:9``
|
|
||||||
- ``spack/almalinux9``
|
|
||||||
* - Rocky Linux 8
|
|
||||||
- ``rockylinux:8``
|
|
||||||
- ``spack/rockylinux8``
|
|
||||||
* - Rocky Linux 9
|
|
||||||
- ``rockylinux:9``
|
|
||||||
- ``spack/rockylinux9``
|
|
||||||
* - Fedora Linux 39
|
|
||||||
- ``fedora:39``
|
|
||||||
- ``spack/fedora39``
|
|
||||||
* - Fedora Linux 40
|
|
||||||
- ``fedora:40``
|
|
||||||
- ``spack/fedora40``
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All the images are tagged with the corresponding release of Spack:
|
All the images are tagged with the corresponding release of Spack:
|
||||||
|
|
||||||
.. image:: images/ghcr_spack.png
|
.. image:: dockerhub_spack.png
|
||||||
|
|
||||||
with the exception of the ``latest`` tag that points to the HEAD
|
with the exception of the ``latest`` tag that points to the HEAD
|
||||||
of the ``develop`` branch. These images are available for anyone
|
of the ``develop`` branch. These images are available for anyone
|
||||||
@@ -246,9 +146,9 @@ by Spack use them as default base images for their ``build`` stage,
|
|||||||
even though handles to use custom base images provided by users are
|
even though handles to use custom base images provided by users are
|
||||||
available to accommodate complex use cases.
|
available to accommodate complex use cases.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
---------------------------------
|
||||||
Configuring the Container Recipe
|
Creating Images From Environments
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
---------------------------------
|
||||||
|
|
||||||
Any Spack Environment can be used for the automatic generation of container
|
Any Spack Environment can be used for the automatic generation of container
|
||||||
recipes. Sensible defaults are provided for things like the base image or the
|
recipes. Sensible defaults are provided for things like the base image or the
|
||||||
@@ -282,25 +182,31 @@ under the ``container`` attribute of environments:
|
|||||||
final:
|
final:
|
||||||
- libgomp
|
- libgomp
|
||||||
|
|
||||||
|
# Extra instructions
|
||||||
|
extra_instructions:
|
||||||
|
final: |
|
||||||
|
RUN echo 'export PS1="\[$(tput bold)\]\[$(tput setaf 1)\][gromacs]\[$(tput setaf 2)\]\u\[$(tput sgr0)\]:\w $ "' >> ~/.bashrc
|
||||||
|
|
||||||
# Labels for the image
|
# Labels for the image
|
||||||
labels:
|
labels:
|
||||||
app: "gromacs"
|
app: "gromacs"
|
||||||
mpi: "mpich"
|
mpi: "mpich"
|
||||||
|
|
||||||
A detailed description of the options available can be found in the :ref:`container_config_options` section.
|
A detailed description of the options available can be found in the
|
||||||
|
:ref:`container_config_options` section.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~
|
-------------------
|
||||||
Setting Base Images
|
Setting Base Images
|
||||||
~~~~~~~~~~~~~~~~~~~
|
-------------------
|
||||||
|
|
||||||
The ``images`` subsection is used to select both the image where
|
The ``images`` subsection is used to select both the image where
|
||||||
Spack builds the software and the image where the built software
|
Spack builds the software and the image where the built software
|
||||||
is installed. This attribute can be set in different ways and
|
is installed. This attribute can be set in different ways and
|
||||||
which one to use depends on the use case at hand.
|
which one to use depends on the use case at hand.
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Use Official Spack Images From Dockerhub
|
Use Official Spack Images From Dockerhub
|
||||||
""""""""""""""""""""""""""""""""""""""""
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
To generate a recipe that uses an official Docker image from the
|
To generate a recipe that uses an official Docker image from the
|
||||||
Spack organization to build the software and the corresponding official OS image
|
Spack organization to build the software and the corresponding official OS image
|
||||||
@@ -505,9 +411,9 @@ responsibility to ensure that:
|
|||||||
Therefore we don't recommend its use in cases that can be otherwise
|
Therefore we don't recommend its use in cases that can be otherwise
|
||||||
covered by the simplified mode shown first.
|
covered by the simplified mode shown first.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
----------------------------
|
||||||
Singularity Definition Files
|
Singularity Definition Files
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
----------------------------
|
||||||
|
|
||||||
In addition to producing recipes in ``Dockerfile`` format Spack can produce
|
In addition to producing recipes in ``Dockerfile`` format Spack can produce
|
||||||
Singularity Definition Files by just changing the value of the ``format``
|
Singularity Definition Files by just changing the value of the ``format``
|
||||||
@@ -528,132 +434,11 @@ attribute:
|
|||||||
The minimum version of Singularity required to build a SIF (Singularity Image Format)
|
The minimum version of Singularity required to build a SIF (Singularity Image Format)
|
||||||
image from the recipes generated by Spack is ``3.5.3``.
|
image from the recipes generated by Spack is ``3.5.3``.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
Extending the Jinja2 Templates
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The Dockerfile and the Singularity definition file that Spack can generate are based on
|
|
||||||
a few Jinja2 templates that are rendered according to the environment being containerized.
|
|
||||||
Even though Spack allows a great deal of customization by just setting appropriate values for
|
|
||||||
the configuration options, sometimes that is not enough.
|
|
||||||
|
|
||||||
In those cases, a user can directly extend the template that Spack uses to render the image
|
|
||||||
to e.g. set additional environment variables or perform specific operations either before or
|
|
||||||
after a given stage of the build. Let's consider as an example the following structure:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ tree /opt/environment
|
|
||||||
/opt/environment
|
|
||||||
├── data
|
|
||||||
│ └── data.csv
|
|
||||||
├── spack.yaml
|
|
||||||
├── data
|
|
||||||
└── templates
|
|
||||||
└── container
|
|
||||||
└── CustomDockerfile
|
|
||||||
|
|
||||||
containing both the custom template extension and the environment manifest file. To use a custom
|
|
||||||
template, the environment must register the directory containing it, and declare its use under the
|
|
||||||
``container`` configuration:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
:emphasize-lines: 7-8,12
|
|
||||||
|
|
||||||
spack:
|
|
||||||
specs:
|
|
||||||
- hdf5~mpi
|
|
||||||
concretizer:
|
|
||||||
unify: true
|
|
||||||
config:
|
|
||||||
template_dirs:
|
|
||||||
- /opt/environment/templates
|
|
||||||
container:
|
|
||||||
format: docker
|
|
||||||
depfile: true
|
|
||||||
template: container/CustomDockerfile
|
|
||||||
|
|
||||||
The template extension can override two blocks, named ``build_stage`` and ``final_stage``, similarly to
|
|
||||||
the example below:
|
|
||||||
|
|
||||||
.. code-block::
|
|
||||||
:emphasize-lines: 3,8
|
|
||||||
|
|
||||||
{% extends "container/Dockerfile" %}
|
|
||||||
{% block build_stage %}
|
|
||||||
RUN echo "Start building"
|
|
||||||
{{ super() }}
|
|
||||||
{% endblock %}
|
|
||||||
{% block final_stage %}
|
|
||||||
{{ super() }}
|
|
||||||
COPY data /share/myapp/data
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
The Dockerfile is generated by running:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack -e /opt/environment containerize
|
|
||||||
|
|
||||||
Note that the environment must be active for spack to read the template.
|
|
||||||
The recipe that gets generated contains the two extra instruction that we added in our template extension:
|
|
||||||
|
|
||||||
.. code-block:: Dockerfile
|
|
||||||
:emphasize-lines: 4,43
|
|
||||||
|
|
||||||
# Build stage with Spack pre-installed and ready to be used
|
|
||||||
FROM spack/ubuntu-jammy:latest as builder
|
|
||||||
|
|
||||||
RUN echo "Start building"
|
|
||||||
|
|
||||||
# What we want to install and how we want to install it
|
|
||||||
# is specified in a manifest file (spack.yaml)
|
|
||||||
RUN mkdir /opt/spack-environment \
|
|
||||||
&& (echo "spack:" \
|
|
||||||
&& echo " specs:" \
|
|
||||||
&& echo " - hdf5~mpi" \
|
|
||||||
&& echo " concretizer:" \
|
|
||||||
&& echo " unify: true" \
|
|
||||||
&& echo " config:" \
|
|
||||||
&& echo " template_dirs:" \
|
|
||||||
&& echo " - /tmp/environment/templates" \
|
|
||||||
&& echo " install_tree: /opt/software" \
|
|
||||||
&& echo " view: /opt/view") > /opt/spack-environment/spack.yaml
|
|
||||||
|
|
||||||
# Install the software, remove unnecessary deps
|
|
||||||
RUN cd /opt/spack-environment && spack env activate . && spack concretize && spack env depfile -o Makefile && make -j $(nproc) && spack gc -y
|
|
||||||
|
|
||||||
# Strip all the binaries
|
|
||||||
RUN find -L /opt/view/* -type f -exec readlink -f '{}' \; | \
|
|
||||||
xargs file -i | \
|
|
||||||
grep 'charset=binary' | \
|
|
||||||
grep 'x-executable\|x-archive\|x-sharedlib' | \
|
|
||||||
awk -F: '{print $1}' | xargs strip -s
|
|
||||||
|
|
||||||
# Modifications to the environment that are necessary to run
|
|
||||||
RUN cd /opt/spack-environment && \
|
|
||||||
spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh
|
|
||||||
|
|
||||||
# Bare OS image to run the installed executables
|
|
||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
COPY --from=builder /opt/spack-environment /opt/spack-environment
|
|
||||||
COPY --from=builder /opt/software /opt/software
|
|
||||||
COPY --from=builder /opt/._view /opt/._view
|
|
||||||
COPY --from=builder /opt/view /opt/view
|
|
||||||
COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh
|
|
||||||
|
|
||||||
COPY data /share/myapp/data
|
|
||||||
|
|
||||||
ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l", "-c", "$*", "--" ]
|
|
||||||
CMD [ "/bin/bash" ]
|
|
||||||
|
|
||||||
|
|
||||||
.. _container_config_options:
|
.. _container_config_options:
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
-----------------------
|
||||||
Configuration Reference
|
Configuration Reference
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
-----------------------
|
||||||
|
|
||||||
The tables below describe all the configuration options that are currently supported
|
The tables below describe all the configuration options that are currently supported
|
||||||
to customize the generation of container recipes:
|
to customize the generation of container recipes:
|
||||||
@@ -669,10 +454,6 @@ to customize the generation of container recipes:
|
|||||||
- The format of the recipe
|
- The format of the recipe
|
||||||
- ``docker`` or ``singularity``
|
- ``docker`` or ``singularity``
|
||||||
- Yes
|
- Yes
|
||||||
* - ``depfile``
|
|
||||||
- Whether to use a depfile for installation, or not
|
|
||||||
- True or False (default)
|
|
||||||
- No
|
|
||||||
* - ``images:os``
|
* - ``images:os``
|
||||||
- Operating system used as a base for the image
|
- Operating system used as a base for the image
|
||||||
- See :ref:`containers-supported-os`
|
- See :ref:`containers-supported-os`
|
||||||
@@ -707,7 +488,7 @@ to customize the generation of container recipes:
|
|||||||
- No
|
- No
|
||||||
* - ``os_packages:command``
|
* - ``os_packages:command``
|
||||||
- Tool used to manage system packages
|
- Tool used to manage system packages
|
||||||
- ``apt``, ``yum``, ``dnf``, ``dnf_epel``, ``zypper``, ``apk``, ``yum_amazon``
|
- ``apt``, ``yum``
|
||||||
- Only with custom base images
|
- Only with custom base images
|
||||||
* - ``os_packages:update``
|
* - ``os_packages:update``
|
||||||
- Whether or not to update the list of available packages
|
- Whether or not to update the list of available packages
|
||||||
@@ -721,6 +502,14 @@ to customize the generation of container recipes:
|
|||||||
- System packages needed at run-time
|
- System packages needed at run-time
|
||||||
- Valid packages for the current OS
|
- Valid packages for the current OS
|
||||||
- No
|
- No
|
||||||
|
* - ``extra_instructions:build``
|
||||||
|
- Extra instructions (e.g. `RUN`, `COPY`, etc.) at the end of the ``build`` stage
|
||||||
|
- Anything understood by the current ``format``
|
||||||
|
- No
|
||||||
|
* - ``extra_instructions:final``
|
||||||
|
- Extra instructions (e.g. `RUN`, `COPY`, etc.) at the end of the ``final`` stage
|
||||||
|
- Anything understood by the current ``format``
|
||||||
|
- No
|
||||||
* - ``labels``
|
* - ``labels``
|
||||||
- Labels to tag the image
|
- Labels to tag the image
|
||||||
- Pairs of key-value strings
|
- Pairs of key-value strings
|
||||||
@@ -750,13 +539,13 @@ to customize the generation of container recipes:
|
|||||||
- Description string
|
- Description string
|
||||||
- No
|
- No
|
||||||
|
|
||||||
~~~~~~~~~~~~~~
|
--------------
|
||||||
Best Practices
|
Best Practices
|
||||||
~~~~~~~~~~~~~~
|
--------------
|
||||||
|
|
||||||
"""
|
^^^
|
||||||
MPI
|
MPI
|
||||||
"""
|
^^^
|
||||||
Due to the dependency on Fortran for OpenMPI, which is the spack default
|
Due to the dependency on Fortran for OpenMPI, which is the spack default
|
||||||
implementation, consider adding ``gfortran`` to the ``apt-get install`` list.
|
implementation, consider adding ``gfortran`` to the ``apt-get install`` list.
|
||||||
|
|
||||||
@@ -767,9 +556,9 @@ For execution on HPC clusters, it can be helpful to import the docker
|
|||||||
image into Singularity in order to start a program with an *external*
|
image into Singularity in order to start a program with an *external*
|
||||||
MPI. Otherwise, also add ``openssh-server`` to the ``apt-get install`` list.
|
MPI. Otherwise, also add ``openssh-server`` to the ``apt-get install`` list.
|
||||||
|
|
||||||
""""
|
^^^^
|
||||||
CUDA
|
CUDA
|
||||||
""""
|
^^^^
|
||||||
Starting from CUDA 9.0, Nvidia provides minimal CUDA images based on
|
Starting from CUDA 9.0, Nvidia provides minimal CUDA images based on
|
||||||
Ubuntu. Please see `their instructions <https://hub.docker.com/r/nvidia/cuda/>`_.
|
Ubuntu. Please see `their instructions <https://hub.docker.com/r/nvidia/cuda/>`_.
|
||||||
Avoid double-installing CUDA by adding, e.g.
|
Avoid double-installing CUDA by adding, e.g.
|
||||||
@@ -788,9 +577,9 @@ to your ``spack.yaml``.
|
|||||||
Users will either need ``nvidia-docker`` or e.g. Singularity to *execute*
|
Users will either need ``nvidia-docker`` or e.g. Singularity to *execute*
|
||||||
device kernels.
|
device kernels.
|
||||||
|
|
||||||
"""""""""""""""""""""""""
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Docker on Windows and OSX
|
Docker on Windows and OSX
|
||||||
"""""""""""""""""""""""""
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
On Mac OS and Windows, docker runs on a hypervisor that is not allocated much
|
On Mac OS and Windows, docker runs on a hypervisor that is not allocated much
|
||||||
memory by default, and some spack packages may fail to build due to lack of
|
memory by default, and some spack packages may fail to build due to lack of
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
.. Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||||
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ locally to speed up the review process.
|
|||||||
new release that is causing problems. If this is the case, please file an issue.
|
new release that is causing problems. If this is the case, please file an issue.
|
||||||
|
|
||||||
|
|
||||||
We currently test against Python 2.7 and 3.6-3.10 on both macOS and Linux and
|
We currently test against Python 2.7 and 3.5-3.9 on both macOS and Linux and
|
||||||
perform 3 types of tests:
|
perform 3 types of tests:
|
||||||
|
|
||||||
.. _cmd-spack-unit-test:
|
.. _cmd-spack-unit-test:
|
||||||
@@ -117,7 +118,7 @@ make another change, test that change, etc. We use `pytest
|
|||||||
<http://pytest.org/>`_ as our tests framework, and these types of
|
<http://pytest.org/>`_ as our tests framework, and these types of
|
||||||
arguments are just passed to the ``pytest`` command underneath. See `the
|
arguments are just passed to the ``pytest`` command underneath. See `the
|
||||||
pytest docs
|
pytest docs
|
||||||
<https://doc.pytest.org/en/latest/how-to/usage.html#specifying-which-tests-to-run>`_
|
<http://doc.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests>`_
|
||||||
for more details on test selection syntax.
|
for more details on test selection syntax.
|
||||||
|
|
||||||
``spack unit-test`` has a few special options that can help you
|
``spack unit-test`` has a few special options that can help you
|
||||||
@@ -146,7 +147,7 @@ you want to know about. For example, to see just the tests in
|
|||||||
|
|
||||||
You can also combine any of these options with a ``pytest`` keyword
|
You can also combine any of these options with a ``pytest`` keyword
|
||||||
search. See the `pytest usage docs
|
search. See the `pytest usage docs
|
||||||
<https://doc.pytest.org/en/latest/how-to/usage.html#specifying-which-tests-to-run>`_
|
<https://docs.pytest.org/en/stable/usage.html#specifying-tests-selecting-tests>`_:
|
||||||
for more details on test selection syntax. For example, to see the names of all tests that have "spec"
|
for more details on test selection syntax. For example, to see the names of all tests that have "spec"
|
||||||
or "concretize" somewhere in their names:
|
or "concretize" somewhere in their names:
|
||||||
|
|
||||||
@@ -183,7 +184,7 @@ Style Tests
|
|||||||
|
|
||||||
Spack uses `Flake8 <http://flake8.pycqa.org/en/latest/>`_ to test for
|
Spack uses `Flake8 <http://flake8.pycqa.org/en/latest/>`_ to test for
|
||||||
`PEP 8 <https://www.python.org/dev/peps/pep-0008/>`_ conformance and
|
`PEP 8 <https://www.python.org/dev/peps/pep-0008/>`_ conformance and
|
||||||
`mypy <https://mypy.readthedocs.io/en/stable/>`_ for type checking. PEP 8 is
|
`mypy <https://mypy.readthedocs.io/en/stable/>` for type checking. PEP 8 is
|
||||||
a series of style guides for Python that provide suggestions for everything
|
a series of style guides for Python that provide suggestions for everything
|
||||||
from variable naming to indentation. In order to limit the number of PRs that
|
from variable naming to indentation. In order to limit the number of PRs that
|
||||||
were mostly style changes, we decided to enforce PEP 8 conformance. Your PR
|
were mostly style changes, we decided to enforce PEP 8 conformance. Your PR
|
||||||
@@ -252,6 +253,27 @@ to update them.
|
|||||||
multiple runs of ``spack style`` just to re-compute line numbers and
|
multiple runs of ``spack style`` just to re-compute line numbers and
|
||||||
makes it much easier to fix errors directly off of the CI output.
|
makes it much easier to fix errors directly off of the CI output.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
Flake8 and ``pep8-naming`` require a number of dependencies in order
|
||||||
|
to run. If you installed ``py-flake8`` and ``py-pep8-naming``, the
|
||||||
|
easiest way to ensure the right packages are on your ``PYTHONPATH`` is
|
||||||
|
to run::
|
||||||
|
|
||||||
|
spack activate py-flake8
|
||||||
|
spack activate pep8-naming
|
||||||
|
|
||||||
|
so that all of the dependencies are symlinked to a central
|
||||||
|
location. If you see an error message like:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File: "/usr/bin/flake8", line 5, in <module>
|
||||||
|
from pkg_resources import load_entry_point
|
||||||
|
ImportError: No module named pkg_resources
|
||||||
|
|
||||||
|
that means Flake8 couldn't find setuptools in your ``PYTHONPATH``.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
Documentation Tests
|
Documentation Tests
|
||||||
@@ -287,9 +309,13 @@ All of these can be installed with Spack, e.g.
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack load py-sphinx py-sphinx-rtd-theme py-sphinxcontrib-programoutput
|
$ spack activate py-sphinx
|
||||||
|
$ spack activate py-sphinx-rtd-theme
|
||||||
|
$ spack activate py-sphinxcontrib-programoutput
|
||||||
|
|
||||||
so that all of the dependencies are added to PYTHONPATH. If you see an error message
|
so that all of the dependencies are symlinked into that Python's
|
||||||
|
tree. Alternatively, you could arrange for their library
|
||||||
|
directories to be added to PYTHONPATH. If you see an error message
|
||||||
like:
|
like:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
@@ -309,220 +335,53 @@ Once all of the dependencies are installed, you can try building the documentati
|
|||||||
$ make clean
|
$ make clean
|
||||||
$ make
|
$ make
|
||||||
|
|
||||||
If you see any warning or error messages, you will have to correct those before your PR
|
If you see any warning or error messages, you will have to correct those before
|
||||||
is accepted. If you are editing the documentation, you should be running the
|
your PR is accepted.
|
||||||
documentation tests to make sure there are no errors. Documentation changes can result
|
|
||||||
in some obfuscated warning messages. If you don't understand what they mean, feel free
|
|
||||||
to ask when you submit your PR.
|
|
||||||
|
|
||||||
.. _spack-builders-and-pipelines:
|
If you are editing the documentation, you should obviously be running the
|
||||||
|
documentation tests. But even if you are simply adding a new package, your
|
||||||
|
changes could cause the documentation tests to fail:
|
||||||
|
|
||||||
^^^^^^^^^
|
.. code-block:: console
|
||||||
GitLab CI
|
|
||||||
^^^^^^^^^
|
|
||||||
|
|
||||||
""""""""""""""""""
|
package_list.rst:8745: WARNING: Block quote ends without a blank line; unexpected unindent.
|
||||||
Build Cache Stacks
|
|
||||||
""""""""""""""""""
|
|
||||||
|
|
||||||
Spack welcomes the contribution of software stacks of interest to the community. These
|
At first, this error message will mean nothing to you, since you didn't edit
|
||||||
stacks are used to test package recipes and generate publicly available build caches.
|
that file. Until you look at line 8745 of the file in question:
|
||||||
Spack uses GitLab CI for managing the orchestration of build jobs.
|
|
||||||
|
|
||||||
GitLab Entry Point
|
.. code-block:: rst
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Add stack entrypoint to the ``share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml``. There
|
Description:
|
||||||
are two stages required for each new stack, the generation stage and the build stage.
|
NetCDF is a set of software libraries and self-describing, machine-
|
||||||
|
independent data formats that support the creation, access, and sharing
|
||||||
|
of array-oriented scientific data.
|
||||||
|
|
||||||
The generate stage is defined using the job template ``.generate`` configured with
|
Our documentation includes :ref:`a list of all Spack packages <package-list>`.
|
||||||
environment variables defining the name of the stack in ``SPACK_CI_STACK_NAME`` and the
|
If you add a new package, its docstring is added to this page. The problem in
|
||||||
platform (``SPACK_TARGET_PLATFORM``) and architecture (``SPACK_TARGET_ARCH``) configuration,
|
this case was that the docstring looked like:
|
||||||
and the tags associated with the class of runners to build on.
|
|
||||||
|
|
||||||
.. note::
|
.. code-block:: python
|
||||||
|
|
||||||
The ``SPACK_CI_STACK_NAME`` must match the name of the directory containing the
|
class Netcdf(Package):
|
||||||
stacks ``spack.yaml``.
|
"""
|
||||||
|
NetCDF is a set of software libraries and self-describing,
|
||||||
|
machine-independent data formats that support the creation,
|
||||||
|
access, and sharing of array-oriented scientific data.
|
||||||
|
"""
|
||||||
|
|
||||||
|
Docstrings cannot start with a newline character, or else Sphinx will complain.
|
||||||
|
Instead, they should look like:
|
||||||
|
|
||||||
.. note::
|
.. code-block:: python
|
||||||
|
|
||||||
The platform and architecture variables are specified in order to select the
|
class Netcdf(Package):
|
||||||
correct configurations from the generic configurations used in Spack CI. The
|
"""NetCDF is a set of software libraries and self-describing,
|
||||||
configurations currently available are:
|
machine-independent data formats that support the creation,
|
||||||
|
access, and sharing of array-oriented scientific data."""
|
||||||
|
|
||||||
* ``.cray_rhel_zen4``
|
Documentation changes can result in much more obfuscated warning messages.
|
||||||
* ``.cray_sles_zen4``
|
If you don't understand what they mean, feel free to ask when you submit
|
||||||
* ``.darwin_aarch64``
|
your PR.
|
||||||
* ``.darwin_x86_64``
|
|
||||||
* ``.linux_aarch64``
|
|
||||||
* ``.linux_icelake``
|
|
||||||
* ``.linux_neoverse_n1``
|
|
||||||
* ``.linux_neoverse_v1``
|
|
||||||
* ``.linux_neoverse_v2``
|
|
||||||
* ``.linux_power``
|
|
||||||
* ``.linux_skylake``
|
|
||||||
* ``.linux_x86_64``
|
|
||||||
* ``.linux_x86_64_v4``
|
|
||||||
|
|
||||||
New configurations can be added to accommodate new platforms and architectures.
|
|
||||||
|
|
||||||
|
|
||||||
The build stage is defined as a trigger job that consumes the GitLab CI pipeline generated in
|
|
||||||
the generate stage for this stack. Build stage jobs use the ``.build`` job template which
|
|
||||||
handles the basic configuration.
|
|
||||||
|
|
||||||
An example entry point for a new stack called ``my-super-cool-stack``
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
.my-super-cool-stack:
|
|
||||||
extends: [ ".linux_x86_64_v3" ]
|
|
||||||
variables:
|
|
||||||
SPACK_CI_STACK_NAME: my-super-cool-stack
|
|
||||||
tags: [ "all", "tags", "your", "job", "needs"]
|
|
||||||
|
|
||||||
my-super-cool-stack-generate:
|
|
||||||
extends: [ ".generate", ".my-super-cool-stack" ]
|
|
||||||
image: my-super-cool-stack-image:0.0.1
|
|
||||||
|
|
||||||
my-super-cool-stack-build:
|
|
||||||
extends: [ ".build", ".my-super-cool-stack" ]
|
|
||||||
trigger:
|
|
||||||
include:
|
|
||||||
- artifact: jobs_scratch_dir/cloud-ci-pipeline.yml
|
|
||||||
job: my-super-cool-stack-generate
|
|
||||||
strategy: depend
|
|
||||||
needs:
|
|
||||||
- artifacts: True
|
|
||||||
job: my-super-cool-stack-generate
|
|
||||||
|
|
||||||
|
|
||||||
Stack Configuration
|
|
||||||
~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The stack configuration is a spack environment file with two additional sections added.
|
|
||||||
Stack configurations should be located in ``share/spack/gitlab/cloud_pipelines/stacks/<stack_name>/spack.yaml``.
|
|
||||||
|
|
||||||
The ``ci`` section is generally used to define stack specific mappings such as image or tags.
|
|
||||||
For more information on what can go into the ``ci`` section refer to the docs on pipelines.
|
|
||||||
|
|
||||||
The ``cdash`` section is used for defining where to upload the results of builds. Spack configures
|
|
||||||
most of the details for posting pipeline results to
|
|
||||||
`cdash.spack.io <https://cdash.spack.io/index.php?project=Spack+Testing>`_. The only
|
|
||||||
requirement in the stack configuration is to define a ``build-group`` that is unique,
|
|
||||||
this is usually the long name of the stack.
|
|
||||||
|
|
||||||
An example stack that builds ``zlib``.
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
spack:
|
|
||||||
view: false
|
|
||||||
packages:
|
|
||||||
all:
|
|
||||||
require: ["%gcc", "target=x86_64_v3"]
|
|
||||||
specs:
|
|
||||||
- zlib
|
|
||||||
|
|
||||||
ci:
|
|
||||||
pipeline-gen
|
|
||||||
- build-job:
|
|
||||||
image: my-super-cool-stack-image:0.0.1
|
|
||||||
|
|
||||||
cdash:
|
|
||||||
build-group: My Super Cool Stack
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
The ``image`` used in the ``*-generate`` job must match exactly the ``image`` used in the ``build-job``.
|
|
||||||
When the images do not match the build job may fail.
|
|
||||||
|
|
||||||
|
|
||||||
"""""""""""""""""""
|
|
||||||
Registering Runners
|
|
||||||
"""""""""""""""""""
|
|
||||||
|
|
||||||
Contributing computational resources to Spack's CI build farm is one way to help expand the
|
|
||||||
capabilities and offerings of the public Spack build caches. Currently, Spack utilizes linux runners
|
|
||||||
from AWS, Google, and the University of Oregon (UO).
|
|
||||||
|
|
||||||
Runners require three key peices:
|
|
||||||
* Runner Registration Token
|
|
||||||
* Accurate tags
|
|
||||||
* OIDC Authentication script
|
|
||||||
* GPG keys
|
|
||||||
|
|
||||||
|
|
||||||
Minimum GitLab Runner Version: ``16.1.0``
|
|
||||||
`Intallation instructions <https://docs.gitlab.com/runner/install/>`_
|
|
||||||
|
|
||||||
Registration Token
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The first step to contribute new runners is to open an issue in the `spack infrastructure <https://github.com/spack/spack-infrastructure/issues/new?assignees=&labels=runner-registration&projects=&template=runner_registration.yml>`_
|
|
||||||
project. This will be reported to the spack infrastructure team who will guide users through the process
|
|
||||||
of registering new runners for Spack CI.
|
|
||||||
|
|
||||||
The information needed to register a runner is the motivation for the new resources, a semi-detailed description of
|
|
||||||
the runner, and finallly the point of contact for maintaining the software on the runner.
|
|
||||||
|
|
||||||
The point of contact will then work with the infrastruture team to obtain runner registration token(s) for interacting with
|
|
||||||
with Spack's GitLab instance. Once the runner is active, this point of contact will also be responsible for updating the
|
|
||||||
GitLab runner software to keep pace with Spack's Gitlab.
|
|
||||||
|
|
||||||
Tagging
|
|
||||||
~~~~~~~
|
|
||||||
|
|
||||||
In the initial stages of runner registration it is important to **exclude** the special tag ``spack``. This will prevent
|
|
||||||
the new runner(s) from being picked up for production CI jobs while it is configured and evaluated. Once it is determined
|
|
||||||
that the runner is ready for production use the ``spack`` tag will be added.
|
|
||||||
|
|
||||||
Because gitlab has no concept of tag exclustion, runners that provide specialized resource also require specialized tags.
|
|
||||||
For example, a basic CPU only x86_64 runner may have a tag ``x86_64`` associated with it. However, a runner containing an
|
|
||||||
CUDA capable GPU may have the tag ``x86_64-cuda`` to denote that it should only be used for packages that will benefit from
|
|
||||||
a CUDA capable resource.
|
|
||||||
|
|
||||||
OIDC
|
|
||||||
~~~~
|
|
||||||
|
|
||||||
Spack runners use OIDC authentication for connecting to the appropriate AWS bucket
|
|
||||||
which is used for coordinating the communication of binaries between build jobs. In
|
|
||||||
order to configure OIDC authentication, Spack CI runners use a python script with minimal
|
|
||||||
dependencies. This script can be configured for runners as seen here using the ``pre_build_script``.
|
|
||||||
|
|
||||||
.. code-block:: toml
|
|
||||||
|
|
||||||
[[runners]]
|
|
||||||
pre_build_script = """
|
|
||||||
echo 'Executing Spack pre-build setup script'
|
|
||||||
|
|
||||||
for cmd in "${PY3:-}" python3 python; do
|
|
||||||
if command -v > /dev/null "$cmd"; then
|
|
||||||
export PY3="$(command -v "$cmd")"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -z "${PY3:-}" ]; then
|
|
||||||
echo "Unable to find python3 executable"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
$PY3 -c "import urllib.request;urllib.request.urlretrieve('https://raw.githubusercontent.com/spack/spack-infrastructure/main/scripts/gitlab_runner_pre_build/pre_build.py', 'pre_build.py')"
|
|
||||||
$PY3 pre_build.py > envvars
|
|
||||||
|
|
||||||
. ./envvars
|
|
||||||
rm -f envvars
|
|
||||||
unset GITLAB_OIDC_TOKEN
|
|
||||||
"""
|
|
||||||
|
|
||||||
GPG Keys
|
|
||||||
~~~~~~~~
|
|
||||||
|
|
||||||
Runners that may be utilized for ``protected`` CI require the registration of an intermediate signing key that
|
|
||||||
can be used to sign packages. For more information on package signing read :ref:`key_architecture`.
|
|
||||||
|
|
||||||
--------
|
--------
|
||||||
Coverage
|
Coverage
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user