Compare commits
5 Commits
packages/c
...
features/r
Author | SHA1 | Date | |
---|---|---|---|
![]() |
89b4d2a33e | ||
![]() |
546e5a9a54 | ||
![]() |
401c183de9 | ||
![]() |
b757500d9e | ||
![]() |
2b759cf853 |
2
.flake8
2
.flake8
@@ -28,7 +28,7 @@ max-line-length = 99
|
|||||||
# - F821: undefined name `name`
|
# - F821: undefined name `name`
|
||||||
#
|
#
|
||||||
per-file-ignores =
|
per-file-ignores =
|
||||||
var/spack/*/package.py:F403,F405,F821
|
var/spack/repos/*/package.py:F403,F405,F821
|
||||||
*-ci-package.py:F403,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.
|
||||||
|
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1,3 +1,4 @@
|
|||||||
*.py diff=python
|
*.py diff=python
|
||||||
|
*.lp linguist-language=Prolog
|
||||||
lib/spack/external/* linguist-vendored
|
lib/spack/external/* linguist-vendored
|
||||||
*.bat text eol=crlf
|
*.bat text eol=crlf
|
1
.github/workflows/audit.yaml
vendored
1
.github/workflows/audit.yaml
vendored
@@ -59,6 +59,7 @@ jobs:
|
|||||||
- name: Package audits (without coverage)
|
- name: Package audits (without coverage)
|
||||||
if: ${{ runner.os == 'Windows' }}
|
if: ${{ runner.os == 'Windows' }}
|
||||||
run: |
|
run: |
|
||||||
|
. share/spack/setup-env.sh
|
||||||
spack -d audit packages
|
spack -d audit packages
|
||||||
./share/spack/qa/validate_last_exit.ps1
|
./share/spack/qa/validate_last_exit.ps1
|
||||||
spack -d audit configs
|
spack -d audit configs
|
||||||
|
2
.github/workflows/bootstrap.yml
vendored
2
.github/workflows/bootstrap.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
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 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 gawk
|
cmake bison bison-devel libstdc++-static
|
||||||
- name: Setup OpenSUSE
|
- name: Setup OpenSUSE
|
||||||
if: ${{ matrix.image == 'opensuse/leap:latest' }}
|
if: ${{ matrix.image == 'opensuse/leap:latest' }}
|
||||||
run: |
|
run: |
|
||||||
|
39
.github/workflows/ci.yaml
vendored
39
.github/workflows/ci.yaml
vendored
@@ -9,7 +9,6 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- develop
|
- develop
|
||||||
- releases/**
|
- releases/**
|
||||||
merge_group:
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ci-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
group: ci-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
||||||
@@ -26,33 +25,29 @@ jobs:
|
|||||||
packages: ${{ steps.filter.outputs.packages }}
|
packages: ${{ steps.filter.outputs.packages }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
if: ${{ github.event_name == 'push' || github.event_name == 'merge_group' }}
|
if: ${{ github.event_name == 'push' }}
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
# For pull requests it's not necessary to checkout the code
|
# For pull requests it's not necessary to checkout the code
|
||||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
|
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
|
||||||
id: filter
|
id: filter
|
||||||
with:
|
with:
|
||||||
# For merge group events, compare against the target branch (main)
|
|
||||||
base: ${{ github.event_name == 'merge_group' && github.event.merge_group.base_ref || '' }}
|
|
||||||
# For merge group events, use the merge group head ref
|
|
||||||
ref: ${{ github.event_name == 'merge_group' && github.event.merge_group.head_sha || github.ref }}
|
|
||||||
# See https://github.com/dorny/paths-filter/issues/56 for the syntax used below
|
# See https://github.com/dorny/paths-filter/issues/56 for the syntax used below
|
||||||
# Don't run if we only modified packages in the
|
# Don't run if we only modified packages in the
|
||||||
# built-in repository or documentation
|
# built-in repository or documentation
|
||||||
filters: |
|
filters: |
|
||||||
bootstrap:
|
bootstrap:
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/clingo-bootstrap/**'
|
- 'var/spack/repos/builtin/packages/clingo-bootstrap/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/clingo/**'
|
- 'var/spack/repos/builtin/packages/clingo/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/python/**'
|
- 'var/spack/repos/builtin/packages/python/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/re2c/**'
|
- 'var/spack/repos/builtin/packages/re2c/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/gnupg/**'
|
- 'var/spack/repos/builtin/packages/gnupg/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/libassuan/**'
|
- 'var/spack/repos/builtin/packages/libassuan/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/libgcrypt/**'
|
- 'var/spack/repos/builtin/packages/libgcrypt/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/libgpg-error/**'
|
- 'var/spack/repos/builtin/packages/libgpg-error/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/libksba/**'
|
- 'var/spack/repos/builtin/packages/libksba/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/npth/**'
|
- 'var/spack/repos/builtin/packages/npth/**'
|
||||||
- 'var/spack/repos/spack_repo/builtin/packages/pinentry/**'
|
- 'var/spack/repos/builtin/packages/pinentry/**'
|
||||||
- 'lib/spack/**'
|
- 'lib/spack/**'
|
||||||
- 'share/spack/**'
|
- 'share/spack/**'
|
||||||
- '.github/workflows/bootstrap.yml'
|
- '.github/workflows/bootstrap.yml'
|
||||||
@@ -81,11 +76,10 @@ jobs:
|
|||||||
|
|
||||||
prechecks:
|
prechecks:
|
||||||
needs: [ changes ]
|
needs: [ changes ]
|
||||||
uses: ./.github/workflows/prechecks.yml
|
uses: ./.github/workflows/valid-style.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
with_coverage: ${{ needs.changes.outputs.core }}
|
with_coverage: ${{ needs.changes.outputs.core }}
|
||||||
with_packages: ${{ needs.changes.outputs.packages }}
|
|
||||||
|
|
||||||
import-check:
|
import-check:
|
||||||
needs: [ changes ]
|
needs: [ changes ]
|
||||||
@@ -99,7 +93,7 @@ jobs:
|
|||||||
- name: Success
|
- name: Success
|
||||||
run: |
|
run: |
|
||||||
if [ "${{ needs.prechecks.result }}" == "failure" ] || [ "${{ needs.prechecks.result }}" == "canceled" ]; then
|
if [ "${{ needs.prechecks.result }}" == "failure" ] || [ "${{ needs.prechecks.result }}" == "canceled" ]; then
|
||||||
echo "Unit tests failed."
|
echo "Unit tests failed."
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
exit 0
|
exit 0
|
||||||
@@ -107,7 +101,6 @@ jobs:
|
|||||||
|
|
||||||
coverage:
|
coverage:
|
||||||
needs: [ unit-tests, prechecks ]
|
needs: [ unit-tests, prechecks ]
|
||||||
if: ${{ needs.changes.outputs.core }}
|
|
||||||
uses: ./.github/workflows/coverage.yml
|
uses: ./.github/workflows/coverage.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
@@ -120,10 +113,10 @@ jobs:
|
|||||||
- name: Status summary
|
- name: Status summary
|
||||||
run: |
|
run: |
|
||||||
if [ "${{ needs.unit-tests.result }}" == "failure" ] || [ "${{ needs.unit-tests.result }}" == "canceled" ]; then
|
if [ "${{ needs.unit-tests.result }}" == "failure" ] || [ "${{ needs.unit-tests.result }}" == "canceled" ]; then
|
||||||
echo "Unit tests failed."
|
echo "Unit tests failed."
|
||||||
exit 1
|
exit 1
|
||||||
elif [ "${{ needs.bootstrap.result }}" == "failure" ] || [ "${{ needs.bootstrap.result }}" == "canceled" ]; then
|
elif [ "${{ needs.bootstrap.result }}" == "failure" ] || [ "${{ needs.bootstrap.result }}" == "canceled" ]; then
|
||||||
echo "Bootstrap tests failed."
|
echo "Bootstrap tests failed."
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
exit 0
|
exit 0
|
||||||
|
2
.github/workflows/import-check.yaml
vendored
2
.github/workflows/import-check.yaml
vendored
@@ -39,7 +39,7 @@ jobs:
|
|||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
with:
|
with:
|
||||||
repository: haampie/circular-import-fighter
|
repository: haampie/circular-import-fighter
|
||||||
ref: 4cdb0bf15f04ab6b49041d5ef1bfd9644cce7f33
|
ref: e38bcd0aa46368e30648b61b7f0d8c1ca68aadff
|
||||||
path: circular-import-fighter
|
path: circular-import-fighter
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
working-directory: circular-import-fighter
|
working-directory: circular-import-fighter
|
||||||
|
108
.github/workflows/prechecks.yml
vendored
108
.github/workflows/prechecks.yml
vendored
@@ -1,108 +0,0 @@
|
|||||||
name: prechecks
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
with_coverage:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
with_packages:
|
|
||||||
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'
|
|
||||||
cache-dependency-path: '.github/workflows/requirements/style/requirements.txt'
|
|
||||||
- name: Install Python Packages
|
|
||||||
run: |
|
|
||||||
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 var/spack/test_repos
|
|
||||||
|
|
||||||
# Run style checks on the files that have been changed
|
|
||||||
style:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
||||||
with:
|
|
||||||
python-version: '3.13'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: '.github/workflows/requirements/style/requirements.txt'
|
|
||||||
- name: Install Python packages
|
|
||||||
run: |
|
|
||||||
pip install -r .github/workflows/requirements/style/requirements.txt
|
|
||||||
- name: Run style tests
|
|
||||||
run: |
|
|
||||||
bin/spack style --base HEAD^1
|
|
||||||
bin/spack license verify
|
|
||||||
pylint -j $(nproc) --disable=all --enable=unspecified-encoding --ignore-paths=lib/spack/external lib
|
|
||||||
|
|
||||||
audit:
|
|
||||||
uses: ./.github/workflows/audit.yaml
|
|
||||||
secrets: inherit
|
|
||||||
with:
|
|
||||||
with_coverage: ${{ inputs.with_coverage }}
|
|
||||||
python_version: '3.13'
|
|
||||||
|
|
||||||
verify-checksums:
|
|
||||||
# do not run if the commit message or PR description contains [skip-verify-checksums]
|
|
||||||
if: >-
|
|
||||||
${{ inputs.with_packages == 'true' &&
|
|
||||||
!contains(github.event.pull_request.body, '[skip-verify-checksums]') &&
|
|
||||||
!contains(github.event.head_commit.message, '[skip-verify-checksums]') }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
|
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
- name: Verify Added Checksums
|
|
||||||
run: |
|
|
||||||
bin/spack ci verify-versions HEAD^1 HEAD
|
|
||||||
|
|
||||||
# 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
|
|
@@ -1,8 +1,7 @@
|
|||||||
black==25.1.0
|
black==24.10.0
|
||||||
clingo==5.8.0
|
clingo==5.7.1
|
||||||
flake8==7.2.0
|
flake8==7.1.1
|
||||||
isort==6.0.1
|
isort==5.13.2
|
||||||
mypy==1.15.0
|
mypy==1.11.2
|
||||||
types-six==1.17.0.20250403
|
types-six==1.17.0.20241205
|
||||||
vermin==1.6.0
|
vermin==1.6.0
|
||||||
pylint==3.3.7
|
|
||||||
|
3
.github/workflows/unit_tests.yaml
vendored
3
.github/workflows/unit_tests.yaml
vendored
@@ -19,6 +19,9 @@ jobs:
|
|||||||
on_develop:
|
on_develop:
|
||||||
- ${{ github.ref == 'refs/heads/develop' }}
|
- ${{ github.ref == 'refs/heads/develop' }}
|
||||||
include:
|
include:
|
||||||
|
- python-version: '3.6'
|
||||||
|
os: ubuntu-20.04
|
||||||
|
on_develop: ${{ github.ref == 'refs/heads/develop' }}
|
||||||
- python-version: '3.7'
|
- python-version: '3.7'
|
||||||
os: ubuntu-22.04
|
os: ubuntu-22.04
|
||||||
on_develop: ${{ github.ref == 'refs/heads/develop' }}
|
on_develop: ${{ github.ref == 'refs/heads/develop' }}
|
||||||
|
106
.github/workflows/valid-style.yml
vendored
Normal file
106
.github/workflows/valid-style.yml
vendored
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
# 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
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -201,6 +201,7 @@ tramp
|
|||||||
|
|
||||||
# Org-mode
|
# Org-mode
|
||||||
.org-id-locations
|
.org-id-locations
|
||||||
|
*_archive
|
||||||
|
|
||||||
# flymake-mode
|
# flymake-mode
|
||||||
*_flymake.*
|
*_flymake.*
|
||||||
|
34
README.md
34
README.md
@@ -46,42 +46,18 @@ 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.
|
||||||
|
|
||||||
Installation
|
To install spack and your first package, make sure you have Python & Git.
|
||||||
----------------
|
|
||||||
|
|
||||||
To install spack, first make sure you have Python & Git.
|
|
||||||
Then:
|
Then:
|
||||||
|
|
||||||
```bash
|
$ git clone -c feature.manyFiles=true --depth=2 https://github.com/spack/spack.git
|
||||||
git clone -c feature.manyFiles=true --depth=2 https://github.com/spack/spack.git
|
$ cd spack/bin
|
||||||
```
|
$ ./spack install zlib
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>What are <code>manyFiles=true</code> and <code>--depth=2</code>?</summary>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
> `-c feature.manyFiles=true` improves git's performance on repositories with 1,000+ files.
|
> `-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.
|
> `--depth=2` prunes the git history to reduce the size of the Spack installation.
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# For bash/zsh/sh
|
|
||||||
. spack/share/spack/setup-env.sh
|
|
||||||
|
|
||||||
# For tcsh/csh
|
|
||||||
source spack/share/spack/setup-env.csh
|
|
||||||
|
|
||||||
# For fish
|
|
||||||
. spack/share/spack/setup-env.fish
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Now you're ready to install a package!
|
|
||||||
spack install zlib-ng
|
|
||||||
```
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
@@ -43,28 +43,6 @@ concretizer:
|
|||||||
# (e.g. py-setuptools, cmake etc.)
|
# (e.g. py-setuptools, cmake etc.)
|
||||||
# "full" (experimental): allows separation of the entire build-tool stack (e.g. the entire "cmake" subDAG)
|
# "full" (experimental): allows separation of the entire build-tool stack (e.g. the entire "cmake" subDAG)
|
||||||
strategy: minimal
|
strategy: minimal
|
||||||
# Maximum number of duplicates in a DAG, when using a strategy that allows duplicates. "default" is the
|
|
||||||
# number used if there isn't a more specific alternative
|
|
||||||
max_dupes:
|
|
||||||
default: 1
|
|
||||||
# Virtuals
|
|
||||||
c: 2
|
|
||||||
cxx: 2
|
|
||||||
fortran: 1
|
|
||||||
# Regular packages
|
|
||||||
cmake: 2
|
|
||||||
gmake: 2
|
|
||||||
python: 2
|
|
||||||
python-venv: 2
|
|
||||||
py-cython: 2
|
|
||||||
py-flit-core: 2
|
|
||||||
py-pip: 2
|
|
||||||
py-setuptools: 2
|
|
||||||
py-wheel: 2
|
|
||||||
xcb-proto: 2
|
|
||||||
# Compilers
|
|
||||||
gcc: 2
|
|
||||||
llvm: 2
|
|
||||||
# Option to specify compatibility between operating systems for reuse of compilers and packages
|
# 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
|
# 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
|
# it can reuse. Note this is a directional compatibility so mutual compatibility between two OS's
|
||||||
@@ -85,7 +63,3 @@ concretizer:
|
|||||||
# Setting this to false yields unreproducible results, so we advise to use that value only
|
# 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).
|
# for debugging purposes (e.g. check which constraints can help Spack concretize faster).
|
||||||
error_on_timeout: true
|
error_on_timeout: true
|
||||||
|
|
||||||
# Static analysis may reduce the concretization time by generating smaller ASP problems, in
|
|
||||||
# cases where there are requirements that prevent part of the search space to be explored.
|
|
||||||
static_analysis: false
|
|
||||||
|
@@ -19,7 +19,7 @@ config:
|
|||||||
install_tree:
|
install_tree:
|
||||||
root: $spack/opt/spack
|
root: $spack/opt/spack
|
||||||
projections:
|
projections:
|
||||||
all: "{architecture.platform}-{architecture.target}/{name}-{version}-{hash}"
|
all: "{architecture}/{compiler.name}-{compiler.version}/{name}-{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
|
||||||
@@ -90,9 +90,10 @@ config:
|
|||||||
misc_cache: $user_cache_path/cache
|
misc_cache: $user_cache_path/cache
|
||||||
|
|
||||||
|
|
||||||
# Abort downloads after this many seconds if not data is received.
|
# Timeout in seconds used for downloading sources etc. This only applies
|
||||||
# Setting this to 0 will disable the timeout.
|
# to the connection phase and can be increased for slow connections or
|
||||||
connect_timeout: 30
|
# servers. 0 means no timeout.
|
||||||
|
connect_timeout: 10
|
||||||
|
|
||||||
|
|
||||||
# If this is false, tools like curl that use SSL will not verify
|
# If this is false, tools like curl that use SSL will not verify
|
||||||
|
@@ -15,18 +15,17 @@
|
|||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
|
compiler:
|
||||||
|
- apple-clang
|
||||||
|
- clang
|
||||||
|
- gcc
|
||||||
providers:
|
providers:
|
||||||
c: [apple-clang, llvm, gcc]
|
|
||||||
cxx: [apple-clang, llvm, gcc]
|
|
||||||
elf: [libelf]
|
elf: [libelf]
|
||||||
fortran: [gcc]
|
|
||||||
fuse: [macfuse]
|
fuse: [macfuse]
|
||||||
gl: [apple-gl]
|
gl: [apple-gl]
|
||||||
glu: [apple-glu]
|
glu: [apple-glu]
|
||||||
unwind: [apple-libunwind]
|
unwind: [apple-libunwind]
|
||||||
uuid: [apple-libuuid]
|
uuid: [apple-libuuid]
|
||||||
apple-clang:
|
|
||||||
buildable: false
|
|
||||||
apple-gl:
|
apple-gl:
|
||||||
buildable: false
|
buildable: false
|
||||||
externals:
|
externals:
|
||||||
@@ -51,12 +50,3 @@ packages:
|
|||||||
# 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: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
|
||||||
c:
|
|
||||||
prefer:
|
|
||||||
- apple-clang
|
|
||||||
cxx:
|
|
||||||
prefer:
|
|
||||||
- apple-clang
|
|
||||||
fortran:
|
|
||||||
prefer:
|
|
||||||
- gcc
|
|
||||||
|
@@ -15,18 +15,19 @@
|
|||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
|
compiler: [gcc, clang, oneapi, xl, nag, fj, aocc]
|
||||||
providers:
|
providers:
|
||||||
awk: [gawk]
|
awk: [gawk]
|
||||||
armci: [armcimpi]
|
armci: [armcimpi]
|
||||||
blas: [openblas, amdblis]
|
blas: [openblas, amdblis]
|
||||||
c: [gcc, llvm, intel-oneapi-compilers]
|
c: [gcc]
|
||||||
cxx: [gcc, llvm, intel-oneapi-compilers]
|
cxx: [gcc]
|
||||||
D: [ldc]
|
D: [ldc]
|
||||||
daal: [intel-oneapi-daal]
|
daal: [intel-oneapi-daal]
|
||||||
elf: [elfutils]
|
elf: [elfutils]
|
||||||
fftw-api: [fftw, amdfftw]
|
fftw-api: [fftw, amdfftw]
|
||||||
flame: [libflame, amdlibflame]
|
flame: [libflame, amdlibflame]
|
||||||
fortran: [gcc, llvm, intel-oneapi-compilers]
|
fortran: [gcc]
|
||||||
fortran-rt: [gcc-runtime, intel-oneapi-runtime]
|
fortran-rt: [gcc-runtime, intel-oneapi-runtime]
|
||||||
fuse: [libfuse]
|
fuse: [libfuse]
|
||||||
gl: [glx, osmesa]
|
gl: [glx, osmesa]
|
||||||
@@ -72,8 +73,6 @@ packages:
|
|||||||
permissions:
|
permissions:
|
||||||
read: world
|
read: world
|
||||||
write: user
|
write: user
|
||||||
cce:
|
|
||||||
buildable: false
|
|
||||||
cray-fftw:
|
cray-fftw:
|
||||||
buildable: false
|
buildable: false
|
||||||
cray-libsci:
|
cray-libsci:
|
||||||
@@ -88,23 +87,13 @@ packages:
|
|||||||
buildable: false
|
buildable: false
|
||||||
essl:
|
essl:
|
||||||
buildable: false
|
buildable: false
|
||||||
fj:
|
|
||||||
buildable: false
|
|
||||||
fujitsu-mpi:
|
fujitsu-mpi:
|
||||||
buildable: false
|
buildable: false
|
||||||
fujitsu-ssl2:
|
fujitsu-ssl2:
|
||||||
buildable: false
|
buildable: false
|
||||||
glibc:
|
|
||||||
buildable: false
|
|
||||||
hpcx-mpi:
|
hpcx-mpi:
|
||||||
buildable: false
|
buildable: false
|
||||||
iconv:
|
|
||||||
prefer: [libiconv]
|
|
||||||
mpt:
|
mpt:
|
||||||
buildable: false
|
buildable: false
|
||||||
musl:
|
|
||||||
buildable: false
|
|
||||||
spectrum-mpi:
|
spectrum-mpi:
|
||||||
buildable: false
|
buildable: false
|
||||||
xl:
|
|
||||||
buildable: false
|
|
||||||
|
@@ -11,4 +11,4 @@
|
|||||||
# ~/.spack/repos.yaml
|
# ~/.spack/repos.yaml
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
repos:
|
repos:
|
||||||
- $spack/var/spack/repos/spack_repo/builtin
|
- $spack/var/spack/repos/builtin
|
||||||
|
@@ -15,13 +15,8 @@
|
|||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
|
compiler:
|
||||||
|
- msvc
|
||||||
providers:
|
providers:
|
||||||
c : [msvc]
|
|
||||||
cxx: [msvc]
|
|
||||||
mpi: [msmpi]
|
mpi: [msmpi]
|
||||||
gl: [wgl]
|
gl: [wgl]
|
||||||
mpi:
|
|
||||||
require:
|
|
||||||
- one_of: [msmpi]
|
|
||||||
msvc:
|
|
||||||
buildable: false
|
|
||||||
|
@@ -1291,61 +1291,55 @@ based on site policies.
|
|||||||
Variants
|
Variants
|
||||||
^^^^^^^^
|
^^^^^^^^
|
||||||
|
|
||||||
Variants are named options associated with a particular package and are
|
Variants are named options associated with a particular package. They are
|
||||||
typically used to enable or disable certain features at build time. They
|
optional, as each package must provide default values for each variant it
|
||||||
are optional, as each package must provide default values for each variant
|
makes available. Variants can be specified using
|
||||||
it makes available.
|
a flexible parameter syntax ``name=<value>``. For example,
|
||||||
|
``spack install mercury debug=True`` will install mercury built with debug
|
||||||
The names of variants available for a particular package depend on
|
flags. The names of particular variants available for a package depend on
|
||||||
what was provided by the package author. ``spack info <package>`` will
|
what was provided by the package author. ``spack info <package>`` will
|
||||||
provide information on what build variants are available.
|
provide information on what build variants are available.
|
||||||
|
|
||||||
There are different types of variants:
|
For compatibility with earlier versions, variants which happen to be
|
||||||
|
boolean in nature can be specified by a syntax that represents turning
|
||||||
|
options on and off. For example, in the previous spec we could have
|
||||||
|
supplied ``mercury +debug`` with the same effect of enabling the debug
|
||||||
|
compile time option for the libelf package.
|
||||||
|
|
||||||
1. Boolean variants. Typically used to enable or disable a feature at
|
Depending on the package a variant may have any default value. For
|
||||||
compile time. For example, a package might have a ``debug`` variant that
|
``mercury`` here, ``debug`` is ``False`` by default, and we turned it on
|
||||||
can be explicitly enabled with ``+debug`` and disabled with ``~debug``.
|
with ``debug=True`` or ``+debug``. If a variant is ``True`` by default
|
||||||
2. Single-valued variants. Often used to set defaults. For example, a package
|
you can turn it off by either adding ``-name`` or ``~name`` to the spec.
|
||||||
might have a ``compression`` variant that determines the default
|
|
||||||
compression algorithm, which users could set to ``compression=gzip`` or
|
|
||||||
``compression=zstd``.
|
|
||||||
3. Multi-valued variants. A package might have a ``fabrics`` variant that
|
|
||||||
determines which network fabrics to support. Users could set this to
|
|
||||||
``fabrics=verbs,ofi`` to enable both InfiniBand verbs and OpenFabrics
|
|
||||||
interfaces. The values are separated by commas.
|
|
||||||
|
|
||||||
The meaning of ``fabrics=verbs,ofi`` is to enable *at least* the specified
|
There are two syntaxes here because, depending on context, ``~`` and
|
||||||
fabrics, but other fabrics may be enabled as well. If the intent is to
|
``-`` may mean different things. In most shells, the following will
|
||||||
enable *only* the specified fabrics, then the ``fabrics:=verbs,ofi``
|
result in the shell performing home directory substitution:
|
||||||
syntax should be used with the ``:=`` operator.
|
|
||||||
|
|
||||||
.. note::
|
.. code-block:: sh
|
||||||
|
|
||||||
In certain shells, the the ``~`` character is expanded to the home
|
mpileaks ~debug # shell may try to substitute this!
|
||||||
directory. To avoid these issues, avoid whitespace between the package
|
mpileaks~debug # use this instead
|
||||||
name and the variant:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
If there is a user called ``debug``, the ``~`` will be incorrectly
|
||||||
|
expanded. In this situation, you would want to write ``libelf
|
||||||
|
-debug``. However, ``-`` can be ambiguous when included after a
|
||||||
|
package name without spaces:
|
||||||
|
|
||||||
mpileaks ~debug # shell may try to substitute this!
|
.. code-block:: sh
|
||||||
mpileaks~debug # use this instead
|
|
||||||
|
|
||||||
Alternatively, you can use the ``-`` character to disable a variant,
|
mpileaks-debug # wrong!
|
||||||
but be aware that this requires a space between the package name and
|
mpileaks -debug # right
|
||||||
the variant:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
Spack allows the ``-`` character to be part of package names, so the
|
||||||
|
above will be interpreted as a request for the ``mpileaks-debug``
|
||||||
|
package, not a request for ``mpileaks`` built without ``debug``
|
||||||
|
options. In this scenario, you should write ``mpileaks~debug`` to
|
||||||
|
avoid ambiguity.
|
||||||
|
|
||||||
mpileaks-debug # wrong: refers to a package named "mpileaks-debug"
|
When spack normalizes specs, it prints them out with no spaces boolean
|
||||||
mpileaks -debug # right: refers to a package named mpileaks with debug disabled
|
variants using the backwards compatibility syntax and uses only ``~``
|
||||||
|
for disabled boolean variants. The ``-`` and spaces on the command
|
||||||
As a last resort, ``debug=False`` can also be used to disable a boolean variant.
|
line are provided for convenience and legibility.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""
|
|
||||||
Variant propagation to dependencies
|
|
||||||
"""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
Spack allows variants to propagate their value to the package's
|
Spack allows variants to propagate their value to the package's
|
||||||
dependency by using ``++``, ``--``, and ``~~`` for boolean variants.
|
dependency by using ``++``, ``--``, and ``~~`` for boolean variants.
|
||||||
@@ -1415,29 +1409,27 @@ that executables will run without the need to set ``LD_LIBRARY_PATH``.
|
|||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
compilers:
|
||||||
gcc:
|
- compiler:
|
||||||
externals:
|
spec: gcc@4.9.3
|
||||||
- spec: gcc@4.9.3
|
paths:
|
||||||
prefix: /opt/gcc
|
cc: /opt/gcc/bin/gcc
|
||||||
extra_attributes:
|
c++: /opt/gcc/bin/g++
|
||||||
compilers:
|
f77: /opt/gcc/bin/gfortran
|
||||||
c: /opt/gcc/bin/gcc
|
fc: /opt/gcc/bin/gfortran
|
||||||
cxx: /opt/gcc/bin/g++
|
environment:
|
||||||
fortran: /opt/gcc/bin/gfortran
|
unset:
|
||||||
environment:
|
- BAD_VARIABLE
|
||||||
unset:
|
set:
|
||||||
- BAD_VARIABLE
|
GOOD_VARIABLE_NUM: 1
|
||||||
set:
|
GOOD_VARIABLE_STR: good
|
||||||
GOOD_VARIABLE_NUM: 1
|
prepend_path:
|
||||||
GOOD_VARIABLE_STR: good
|
PATH: /path/to/binutils
|
||||||
prepend_path:
|
append_path:
|
||||||
PATH: /path/to/binutils
|
LD_LIBRARY_PATH: /opt/gcc/lib
|
||||||
append_path:
|
extra_rpaths:
|
||||||
LD_LIBRARY_PATH: /opt/gcc/lib
|
- /path/to/some/compiler/runtime/directory
|
||||||
extra_rpaths:
|
- /path/to/some/other/compiler/runtime/directory
|
||||||
- /path/to/some/compiler/runtime/directory
|
|
||||||
- /path/to/some/other/compiler/runtime/directory
|
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -1769,24 +1761,19 @@ Verifying installations
|
|||||||
The ``spack verify`` command can be used to verify the validity of
|
The ``spack verify`` command can be used to verify the validity of
|
||||||
Spack-installed packages any time after installation.
|
Spack-installed packages any time after installation.
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
``spack verify manifest``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
At installation time, Spack creates a manifest of every file in the
|
At installation time, Spack creates a manifest of every file in the
|
||||||
installation prefix. For links, Spack tracks the mode, ownership, and
|
installation prefix. For links, Spack tracks the mode, ownership, and
|
||||||
destination. For directories, Spack tracks the mode, and
|
destination. For directories, Spack tracks the mode, and
|
||||||
ownership. For files, Spack tracks the mode, ownership, modification
|
ownership. For files, Spack tracks the mode, ownership, modification
|
||||||
time, hash, and size. The ``spack verify manifest`` command will check,
|
time, hash, and size. The Spack verify command will check, for every
|
||||||
for every file in each package, whether any of those attributes have
|
file in each package, whether any of those attributes have changed. It
|
||||||
changed. It will also check for newly added files or deleted files from
|
will also check for newly added files or deleted files from the
|
||||||
the installation prefix. Spack can either check all installed packages
|
installation prefix. Spack can either check all installed packages
|
||||||
using the `-a,--all` or accept specs listed on the command line to
|
using the `-a,--all` or accept specs listed on the command line to
|
||||||
verify.
|
verify.
|
||||||
|
|
||||||
The ``spack verify manifest`` command can also verify for individual files
|
The ``spack verify`` command can also verify for individual files that
|
||||||
that they haven't been altered since installation time. If the given file
|
they haven't been altered since installation time. If the given file
|
||||||
is not in a Spack installation prefix, Spack will report that it is
|
is not in a Spack installation prefix, Spack will report that it is
|
||||||
not owned by any package. To check individual files instead of specs,
|
not owned by any package. To check individual files instead of specs,
|
||||||
use the ``-f,--files`` option.
|
use the ``-f,--files`` option.
|
||||||
@@ -1801,22 +1788,6 @@ 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.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
``spack verify libraries``
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
The ``spack verify libraries`` command can be used to verify that packages
|
|
||||||
do not have accidental system dependencies. This command scans the install
|
|
||||||
prefixes of packages for executables and shared libraries, and resolves
|
|
||||||
their needed libraries in their RPATHs. When needed libraries cannot be
|
|
||||||
located, an error is reported. This typically indicates that a package
|
|
||||||
was linked against a system library, instead of a library provided by
|
|
||||||
a Spack package.
|
|
||||||
|
|
||||||
This verification can also be enabled as a post-install hook by setting
|
|
||||||
``config:shared_linking:missing_library_policy`` to ``error`` or ``warn``
|
|
||||||
in :ref:`config.yaml <config-yaml>`.
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
Filesystem requirements
|
Filesystem requirements
|
||||||
-----------------------
|
-----------------------
|
||||||
@@ -1916,7 +1887,7 @@ diagnostics. Issues, if found, are reported to stdout:
|
|||||||
PKG-DIRECTIVES: 1 issue found
|
PKG-DIRECTIVES: 1 issue found
|
||||||
1. lammps: wrong variant in "conflicts" directive
|
1. lammps: wrong variant in "conflicts" directive
|
||||||
the variant 'adios' does not exist
|
the variant 'adios' does not exist
|
||||||
in /home/spack/spack/var/spack/repos/spack_repo/builtin/packages/lammps/package.py
|
in /home/spack/spack/var/spack/repos/builtin/packages/lammps/package.py
|
||||||
|
|
||||||
|
|
||||||
------------
|
------------
|
||||||
|
@@ -34,6 +34,7 @@ an object, with the following keys:
|
|||||||
|
|
||||||
1. ``roots``: if ``true`` root specs are reused, if ``false`` only dependencies of root specs are reused
|
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
|
2. ``from``: list of sources from which reused specs are taken
|
||||||
|
3. ``namespaces``: list of namespaces from which to reuse specs, or the string ``"any"``.
|
||||||
|
|
||||||
Each source in ``from`` is itself an object:
|
Each source in ``from`` is itself an object:
|
||||||
|
|
||||||
@@ -56,6 +57,7 @@ For instance, the following configuration:
|
|||||||
concretizer:
|
concretizer:
|
||||||
reuse:
|
reuse:
|
||||||
roots: true
|
roots: true
|
||||||
|
namespaces: [builtin]
|
||||||
from:
|
from:
|
||||||
- type: local
|
- type: local
|
||||||
include:
|
include:
|
||||||
@@ -63,7 +65,8 @@ For instance, the following configuration:
|
|||||||
- "%clang"
|
- "%clang"
|
||||||
|
|
||||||
tells the concretizer to reuse all specs compiled with either ``gcc`` or ``clang``, that are installed
|
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.
|
in the local store. Any spec from remote buildcaches is disregarded. Any spec from a namespace other than
|
||||||
|
Spack's builtin repo is disregarded.
|
||||||
|
|
||||||
To reduce the boilerplate in configuration files, default values for the ``include`` and
|
To reduce the boilerplate in configuration files, default values for the ``include`` and
|
||||||
``exclude`` options can be pushed up one level:
|
``exclude`` options can be pushed up one level:
|
||||||
|
@@ -63,6 +63,7 @@ on these ideas for each distinct build system that Spack supports:
|
|||||||
build_systems/cudapackage
|
build_systems/cudapackage
|
||||||
build_systems/custompackage
|
build_systems/custompackage
|
||||||
build_systems/inteloneapipackage
|
build_systems/inteloneapipackage
|
||||||
|
build_systems/intelpackage
|
||||||
build_systems/rocmpackage
|
build_systems/rocmpackage
|
||||||
build_systems/sourceforgepackage
|
build_systems/sourceforgepackage
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ packages. You can quickly find examples by running:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ cd var/spack/repos/spack_repo/builtin/packages
|
$ cd var/spack/repos/builtin/packages
|
||||||
$ grep -l QMakePackage */package.py
|
$ grep -l QMakePackage */package.py
|
||||||
|
|
||||||
|
|
||||||
|
@@ -27,10 +27,10 @@ it could use the ``require`` directive as follows:
|
|||||||
|
|
||||||
Spack has a number of built-in bundle packages, such as:
|
Spack has a number of built-in bundle packages, such as:
|
||||||
|
|
||||||
* `AmdAocl <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/amd_aocl/package.py>`_
|
* `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/spack_repo/builtin/packages/ecp_proxy_apps/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/spack_repo/builtin/packages/libc/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/spack_repo/builtin/packages/xsdk/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
|
where ``Xsdk`` also inherits from ``CudaPackage`` and ``RocmPackage`` and
|
||||||
``Libc`` is a virtual bundle package for the C standard library.
|
``Libc`` is a virtual bundle package for the C standard library.
|
||||||
|
@@ -199,7 +199,7 @@ a variant to control this:
|
|||||||
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
|
||||||
missing or replaced. For example, the
|
missing or replaced. For example, the
|
||||||
`dealii <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/dealii/package.py>`_
|
`dealii <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/dealii/package.py>`_
|
||||||
package overrides the default variant with:
|
package overrides the default variant with:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
@@ -20,8 +20,8 @@ start is to look at the definitions of other build systems. This guide
|
|||||||
focuses mostly on how Spack's build systems work.
|
focuses mostly on how Spack's build systems work.
|
||||||
|
|
||||||
In this guide, we will be using the
|
In this guide, we will be using the
|
||||||
`perl <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/perl/package.py>`_ and
|
`perl <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/perl/package.py>`_ and
|
||||||
`cmake <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/cmake/package.py>`_
|
`cmake <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cmake/package.py>`_
|
||||||
packages as examples. ``perl``'s build system is a hand-written
|
packages as examples. ``perl``'s build system is a hand-written
|
||||||
``Configure`` shell script, while ``cmake`` bootstraps itself during
|
``Configure`` shell script, while ``cmake`` bootstraps itself during
|
||||||
installation. Both of these packages require custom build systems.
|
installation. Both of these packages require custom build systems.
|
||||||
|
@@ -33,6 +33,9 @@ For more information on a specific package, do::
|
|||||||
|
|
||||||
spack info --all <package-name>
|
spack info --all <package-name>
|
||||||
|
|
||||||
|
Intel no longer releases new versions of Parallel Studio, which can be
|
||||||
|
used in Spack via the :ref:`intelpackage`. All of its components can
|
||||||
|
now be found in oneAPI.
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
========
|
========
|
||||||
@@ -47,8 +50,34 @@ Install the oneAPI compilers::
|
|||||||
|
|
||||||
spack install intel-oneapi-compilers
|
spack install intel-oneapi-compilers
|
||||||
|
|
||||||
|
Add the compilers to your ``compilers.yaml`` so spack can use them::
|
||||||
|
|
||||||
To build the ``patchelf`` Spack package with ``icx``, do::
|
spack compiler add `spack location -i intel-oneapi-compilers`/compiler/latest/bin
|
||||||
|
|
||||||
|
Verify that the compilers are available::
|
||||||
|
|
||||||
|
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
|
||||||
|
compilers:
|
||||||
|
|
||||||
|
* ``intel``: ``icc``, ``icpc``, ``ifort``. Intel's *classic*
|
||||||
|
compilers. 2024 and later releases contain ``ifort``, but not
|
||||||
|
``icc`` and ``icpc``.
|
||||||
|
* ``oneapi``: ``icx``, ``icpx``, ``ifx``. Intel's new generation of
|
||||||
|
compilers based on LLVM.
|
||||||
|
|
||||||
|
To build the ``patchelf`` Spack package with ``icc``, do::
|
||||||
|
|
||||||
|
spack install patchelf%intel
|
||||||
|
|
||||||
|
To build with with ``icx``, do ::
|
||||||
|
|
||||||
spack install patchelf%oneapi
|
spack install patchelf%oneapi
|
||||||
|
|
||||||
@@ -63,6 +92,15 @@ Install the oneAPI compilers::
|
|||||||
|
|
||||||
spack install intel-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::
|
Clone `spack-configs <https://github.com/spack/spack-configs>`_ repo and activate Intel oneAPI CPU environment::
|
||||||
|
|
||||||
git clone https://github.com/spack/spack-configs
|
git clone https://github.com/spack/spack-configs
|
||||||
@@ -111,7 +149,7 @@ Compilers
|
|||||||
---------
|
---------
|
||||||
|
|
||||||
To use the compilers, add some information about the installation to
|
To use the compilers, add some information about the installation to
|
||||||
``packages.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/bin
|
||||||
|
|
||||||
@@ -119,7 +157,7 @@ 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
|
||||||
as if you had installed the ``intel-oneapi-compilers`` package.
|
as if you had installed the ``intel-oneapi-compilers`` package.
|
||||||
Another option is to manually add the configuration to
|
Another option is to manually add the configuration to
|
||||||
``packages.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::
|
Before 2024, the directory structure was different::
|
||||||
@@ -162,5 +200,15 @@ You can also use Spack-installed libraries. For example::
|
|||||||
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 oneMKL.
|
||||||
|
|
||||||
|
More information
|
||||||
|
================
|
||||||
|
|
||||||
|
This section describes basic use of oneAPI, especially if it has
|
||||||
|
changed compared to Parallel Studio. See :ref:`intelpackage` for more
|
||||||
|
information on :ref:`intel-virtual-packages`,
|
||||||
|
:ref:`intel-unrelated-packages`,
|
||||||
|
:ref:`intel-integrating-external-libraries`, and
|
||||||
|
:ref:`using-mkl-tips`.
|
||||||
|
|
||||||
|
|
||||||
.. _`Intel installers`: https://software.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-linux/top.html
|
.. _`Intel installers`: https://software.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-linux/top.html
|
||||||
|
1077
lib/spack/docs/build_systems/intelpackage.rst
Normal file
1077
lib/spack/docs/build_systems/intelpackage.rst
Normal file
File diff suppressed because it is too large
Load Diff
@@ -91,14 +91,14 @@ there are any other variables you need to set, you can do this in the
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def setup_build_environment(self, env: EnvironmentModifications) -> None:
|
def setup_build_environment(self, env):
|
||||||
env.set("PREFIX", prefix)
|
env.set("PREFIX", prefix)
|
||||||
env.set("BLASLIB", spec["blas"].libs.ld_flags)
|
env.set("BLASLIB", spec["blas"].libs.ld_flags)
|
||||||
|
|
||||||
|
|
||||||
`cbench <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/cbench/package.py>`_
|
`cbench <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cbench/package.py>`_
|
||||||
is a good example of a simple package that does this, while
|
is a good example of a simple package that does this, while
|
||||||
`esmf <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/esmf/package.py>`_
|
`esmf <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/esmf/package.py>`_
|
||||||
is a good example of a more complex package.
|
is a good example of a more complex package.
|
||||||
|
|
||||||
""""""""""""""""""""""
|
""""""""""""""""""""""
|
||||||
@@ -129,7 +129,7 @@ If you do need access to the spec, you can create a property like so:
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
`cloverleaf <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/cloverleaf/package.py>`_
|
`cloverleaf <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cloverleaf/package.py>`_
|
||||||
is a good example of a package that uses this strategy.
|
is a good example of a package that uses this strategy.
|
||||||
|
|
||||||
"""""""""""""
|
"""""""""""""
|
||||||
@@ -152,7 +152,7 @@ and a ``filter`` method to help with this. For example:
|
|||||||
makefile.filter(r"^\s*FC\s*=.*", f"FC = {spack_fc}")
|
makefile.filter(r"^\s*FC\s*=.*", f"FC = {spack_fc}")
|
||||||
|
|
||||||
|
|
||||||
`stream <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/stream/package.py>`_
|
`stream <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/stream/package.py>`_
|
||||||
is a good example of a package that involves editing a Makefile to set
|
is a good example of a package that involves editing a Makefile to set
|
||||||
the appropriate variables.
|
the appropriate variables.
|
||||||
|
|
||||||
@@ -192,7 +192,7 @@ well for storing variables:
|
|||||||
inc.write(f"{key} = {config[key]}\n")
|
inc.write(f"{key} = {config[key]}\n")
|
||||||
|
|
||||||
|
|
||||||
`elk <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/elk/package.py>`_
|
`elk <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/elk/package.py>`_
|
||||||
is a good example of a package that uses a dictionary to store
|
is a good example of a package that uses a dictionary to store
|
||||||
configuration variables.
|
configuration variables.
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ them in a list:
|
|||||||
inc.write(f"{var}\n")
|
inc.write(f"{var}\n")
|
||||||
|
|
||||||
|
|
||||||
`hpl <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/hpl/package.py>`_
|
`hpl <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/hpl/package.py>`_
|
||||||
is a good example of a package that uses a list to store
|
is a good example of a package that uses a list to store
|
||||||
configuration variables.
|
configuration variables.
|
||||||
|
|
||||||
|
@@ -12,7 +12,8 @@ The ``ROCmPackage`` is not a build system but a helper package. Like ``CudaPacka
|
|||||||
it provides standard variants, dependencies, and conflicts to facilitate building
|
it provides standard variants, dependencies, and conflicts to facilitate building
|
||||||
packages using GPUs though for AMD in this case.
|
packages using GPUs though for AMD in this case.
|
||||||
|
|
||||||
You can find the source for this package (and suggestions for setting up your ``packages.yaml`` file) at
|
You can find the source for this package (and suggestions for setting up your
|
||||||
|
``compilers.yaml`` and ``packages.yaml`` files) at
|
||||||
`<https://github.com/spack/spack/blob/develop/lib/spack/spack/build_systems/rocm.py>`__.
|
`<https://github.com/spack/spack/blob/develop/lib/spack/spack/build_systems/rocm.py>`__.
|
||||||
|
|
||||||
^^^^^^^^
|
^^^^^^^^
|
||||||
|
@@ -39,7 +39,7 @@ for "CRAN <package-name>" and you should quickly find what you want.
|
|||||||
If it isn't on CRAN, try Bioconductor, another common R repository.
|
If it isn't on CRAN, try Bioconductor, another common R repository.
|
||||||
|
|
||||||
For the purposes of this tutorial, we will be walking through
|
For the purposes of this tutorial, we will be walking through
|
||||||
`r-caret <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/r_caret/package.py>`_
|
`r-caret <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/r-caret/package.py>`_
|
||||||
as an example. If you search for "CRAN caret", you will quickly find what
|
as an example. If you search for "CRAN caret", you will quickly find what
|
||||||
you are looking for at https://cran.r-project.org/package=caret.
|
you are looking for at https://cran.r-project.org/package=caret.
|
||||||
https://cran.r-project.org is the main CRAN website. However, CRAN also
|
https://cran.r-project.org is the main CRAN website. However, CRAN also
|
||||||
@@ -337,7 +337,7 @@ Non-R dependencies
|
|||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Some packages depend on non-R libraries for linking. Check out the
|
Some packages depend on non-R libraries for linking. Check out the
|
||||||
`r-stringi <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/r_stringi/package.py>`_
|
`r-stringi <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/r-stringi/package.py>`_
|
||||||
package for an example: https://cloud.r-project.org/package=stringi.
|
package for an example: https://cloud.r-project.org/package=stringi.
|
||||||
If you search for the text "SystemRequirements", you will see:
|
If you search for the text "SystemRequirements", you will see:
|
||||||
|
|
||||||
@@ -352,7 +352,7 @@ Passing arguments to the installation
|
|||||||
|
|
||||||
Some R packages provide additional flags that can be passed to
|
Some R packages provide additional flags that can be passed to
|
||||||
``R CMD INSTALL``, often to locate non-R dependencies.
|
``R CMD INSTALL``, often to locate non-R dependencies.
|
||||||
`r-rmpi <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/r_rmpi/package.py>`_
|
`r-rmpi <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/r-rmpi/package.py>`_
|
||||||
is an example of this, and flags for linking to an MPI library. To pass
|
is an example of this, and flags for linking to an MPI library. To pass
|
||||||
these to the installation command, you can override ``configure_args``
|
these to the installation command, you can override ``configure_args``
|
||||||
like so:
|
like so:
|
||||||
|
@@ -104,10 +104,10 @@ Finding available options
|
|||||||
|
|
||||||
The first place to start when looking for a list of valid options to
|
The first place to start when looking for a list of valid options to
|
||||||
build a package is ``scons --help``. Some packages like
|
build a package is ``scons --help``. Some packages like
|
||||||
`kahip <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/kahip/package.py>`_
|
`kahip <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/kahip/package.py>`_
|
||||||
don't bother overwriting the default SCons help message, so this isn't
|
don't bother overwriting the default SCons help message, so this isn't
|
||||||
very useful, but other packages like
|
very useful, but other packages like
|
||||||
`serf <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/serf/package.py>`_
|
`serf <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/serf/package.py>`_
|
||||||
print a list of valid command-line variables:
|
print a list of valid command-line variables:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
@@ -177,7 +177,7 @@ print a list of valid command-line variables:
|
|||||||
|
|
||||||
|
|
||||||
More advanced packages like
|
More advanced packages like
|
||||||
`cantera <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/cantera/package.py>`_
|
`cantera <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cantera/package.py>`_
|
||||||
use ``scons --help`` to print a list of subcommands:
|
use ``scons --help`` to print a list of subcommands:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
@@ -223,16 +223,6 @@ def setup(sphinx):
|
|||||||
("py:class", "spack.compiler.CompilerCache"),
|
("py:class", "spack.compiler.CompilerCache"),
|
||||||
# TypeVar that is not handled correctly
|
# TypeVar that is not handled correctly
|
||||||
("py:class", "llnl.util.lang.T"),
|
("py:class", "llnl.util.lang.T"),
|
||||||
("py:class", "llnl.util.lang.KT"),
|
|
||||||
("py:class", "llnl.util.lang.VT"),
|
|
||||||
("py:class", "llnl.util.lang.K"),
|
|
||||||
("py:class", "llnl.util.lang.V"),
|
|
||||||
("py:class", "llnl.util.lang.ClassPropertyType"),
|
|
||||||
("py:obj", "llnl.util.lang.KT"),
|
|
||||||
("py:obj", "llnl.util.lang.VT"),
|
|
||||||
("py:obj", "llnl.util.lang.ClassPropertyType"),
|
|
||||||
("py:obj", "llnl.util.lang.K"),
|
|
||||||
("py:obj", "llnl.util.lang.V"),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# 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.
|
||||||
|
@@ -125,8 +125,6 @@ are stored in ``$spack/var/spack/cache``. These are stored indefinitely
|
|||||||
by default. Can be purged with :ref:`spack clean --downloads
|
by default. Can be purged with :ref:`spack clean --downloads
|
||||||
<cmd-spack-clean>`.
|
<cmd-spack-clean>`.
|
||||||
|
|
||||||
.. _Misc Cache:
|
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
``misc_cache``
|
``misc_cache``
|
||||||
--------------------
|
--------------------
|
||||||
@@ -148,16 +146,15 @@ this can expose you to attacks. Use at your own risk.
|
|||||||
``ssl_certs``
|
``ssl_certs``
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
Path to custom certificats for SSL verification. The value can be a
|
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.
|
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``
|
The default value is set to the environment variable ``SSL_CERT_FILE``
|
||||||
to use the same syntax used by many other applications that automatically
|
to use the same syntax used by many other applications that automatically
|
||||||
detect custom certificates.
|
detect custom certificates.
|
||||||
When ``url_fetch_method:curl`` the ``config:ssl_certs`` should resolve to
|
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``
|
a single file. Spack will then set the environment variable ``CURL_CA_BUNDLE``
|
||||||
in the subprocess calling ``curl``. If additional ``curl`` arguments are required,
|
in the subprocess calling ``curl``.
|
||||||
they can be set in the config, e.g. ``url_fetch_method:'curl -k -q'``.
|
If ``url_fetch_method:urllib`` then files and directories are supported i.e.
|
||||||
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``
|
``config:ssl_certs:$SSL_CERT_FILE`` or ``config:ssl_certs:$SSL_CERT_DIR``
|
||||||
will work.
|
will work.
|
||||||
In all cases the expanded path must be absolute for Spack to use the certificates.
|
In all cases the expanded path must be absolute for Spack to use the certificates.
|
||||||
@@ -337,52 +334,3 @@ create a new alias called ``inst`` that will always call ``install -v``:
|
|||||||
|
|
||||||
aliases:
|
aliases:
|
||||||
inst: install -v
|
inst: install -v
|
||||||
|
|
||||||
-------------------------------
|
|
||||||
``concretization_cache:enable``
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
When set to ``true``, Spack will utilize a cache of solver outputs from
|
|
||||||
successful concretization runs. When enabled, Spack will check the concretization
|
|
||||||
cache prior to running the solver. If a previous request to solve a given
|
|
||||||
problem is present in the cache, Spack will load the concrete specs and other
|
|
||||||
solver data from the cache rather than running the solver. Specs not previously
|
|
||||||
concretized will be added to the cache on a successful solve. The cache additionally
|
|
||||||
holds solver statistics, so commands like ``spack solve`` will still return information
|
|
||||||
about the run that produced a given solver result.
|
|
||||||
|
|
||||||
This cache is a subcache of the :ref:`Misc Cache` and as such will be cleaned when the Misc
|
|
||||||
Cache is cleaned.
|
|
||||||
|
|
||||||
When ``false`` or ommitted, all concretization requests will be performed from scatch
|
|
||||||
|
|
||||||
----------------------------
|
|
||||||
``concretization_cache:url``
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
Path to the location where Spack will root the concretization cache. Currently this only supports
|
|
||||||
paths on the local filesystem.
|
|
||||||
|
|
||||||
Default location is under the :ref:`Misc Cache` at: ``$misc_cache/concretization``
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
``concretization_cache:entry_limit``
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
Sets a limit on the number of concretization results that Spack will cache. The limit is evaluated
|
|
||||||
after each concretization run; if Spack has stored more results than the limit allows, the
|
|
||||||
oldest concretization results are pruned until 10% of the limit has been removed.
|
|
||||||
|
|
||||||
Setting this value to 0 disables the automatic pruning. It is expected users will be
|
|
||||||
responsible for maintaining this cache.
|
|
||||||
|
|
||||||
-----------------------------------
|
|
||||||
``concretization_cache:size_limit``
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
Sets a limit on the size of the concretization cache in bytes. The limit is evaluated
|
|
||||||
after each concretization run; if Spack has stored more results than the limit allows, the
|
|
||||||
oldest concretization results are pruned until 10% of the limit has been removed.
|
|
||||||
|
|
||||||
Setting this value to 0 disables the automatic pruning. It is expected users will be
|
|
||||||
responsible for maintaining this cache.
|
|
||||||
|
@@ -11,10 +11,9 @@ Configuration Files
|
|||||||
Spack has many configuration files. Here is a quick list of them, in
|
Spack has many configuration files. Here is a quick list of them, in
|
||||||
case you want to skip directly to specific docs:
|
case you want to skip directly to specific docs:
|
||||||
|
|
||||||
* :ref:`packages.yaml <compiler-config>`
|
* :ref:`compilers.yaml <compiler-config>`
|
||||||
* :ref:`concretizer.yaml <concretizer-options>`
|
* :ref:`concretizer.yaml <concretizer-options>`
|
||||||
* :ref:`config.yaml <config-yaml>`
|
* :ref:`config.yaml <config-yaml>`
|
||||||
* :ref:`include.yaml <include-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 <packages-config>`
|
||||||
@@ -46,12 +45,6 @@ Each Spack configuration file is nested under a top-level section
|
|||||||
corresponding to its name. So, ``config.yaml`` starts with ``config:``,
|
corresponding to its name. So, ``config.yaml`` starts with ``config:``,
|
||||||
``mirrors.yaml`` starts with ``mirrors:``, etc.
|
``mirrors.yaml`` starts with ``mirrors:``, etc.
|
||||||
|
|
||||||
.. tip::
|
|
||||||
|
|
||||||
Validation and autocompletion of Spack config files can be enabled in
|
|
||||||
your editor with the YAML language server. See `spack/schemas
|
|
||||||
<https://github.com/spack/schemas>`_ for more information.
|
|
||||||
|
|
||||||
.. _configuration-scopes:
|
.. _configuration-scopes:
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
@@ -101,7 +94,7 @@ are six configuration scopes. From lowest to highest:
|
|||||||
precedence over all other scopes.
|
precedence over all other scopes.
|
||||||
|
|
||||||
Each configuration directory may contain several configuration files,
|
Each configuration directory may contain several configuration files,
|
||||||
such as ``config.yaml``, ``packages.yaml``, or ``mirrors.yaml``. When
|
such as ``config.yaml``, ``compilers.yaml``, or ``mirrors.yaml``. When
|
||||||
configurations conflict, settings from higher-precedence scopes override
|
configurations conflict, settings from higher-precedence scopes override
|
||||||
lower-precedence settings.
|
lower-precedence settings.
|
||||||
|
|
||||||
|
@@ -226,9 +226,9 @@ If all is well, you'll see something like this:
|
|||||||
|
|
||||||
Modified files:
|
Modified files:
|
||||||
|
|
||||||
var/spack/repos/spack_repo/builtin/packages/hdf5/package.py
|
var/spack/repos/builtin/packages/hdf5/package.py
|
||||||
var/spack/repos/spack_repo/builtin/packages/hdf/package.py
|
var/spack/repos/builtin/packages/hdf/package.py
|
||||||
var/spack/repos/spack_repo/builtin/packages/netcdf/package.py
|
var/spack/repos/builtin/packages/netcdf/package.py
|
||||||
=======================================================
|
=======================================================
|
||||||
Flake8 checks were clean.
|
Flake8 checks were clean.
|
||||||
|
|
||||||
@@ -236,9 +236,9 @@ However, if you aren't compliant with PEP 8, flake8 will complain:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
var/spack/repos/spack_repo/builtin/packages/netcdf/package.py:26: [F401] 'os' imported but unused
|
var/spack/repos/builtin/packages/netcdf/package.py:26: [F401] 'os' imported but unused
|
||||||
var/spack/repos/spack_repo/builtin/packages/netcdf/package.py:61: [E303] too many blank lines (2)
|
var/spack/repos/builtin/packages/netcdf/package.py:61: [E303] too many blank lines (2)
|
||||||
var/spack/repos/spack_repo/builtin/packages/netcdf/package.py:106: [E501] line too long (92 > 79 characters)
|
var/spack/repos/builtin/packages/netcdf/package.py:106: [E501] line too long (92 > 79 characters)
|
||||||
Flake8 found errors.
|
Flake8 found errors.
|
||||||
|
|
||||||
Most of the error messages are straightforward, but if you don't understand what
|
Most of the error messages are straightforward, but if you don't understand what
|
||||||
@@ -280,7 +280,7 @@ All of these can be installed with Spack, e.g.
|
|||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
Sphinx has `several required dependencies <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/py-sphinx/package.py>`_.
|
Sphinx has `several required dependencies <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/py-sphinx/package.py>`_.
|
||||||
If you're using a ``python`` from Spack and you installed
|
If you're using a ``python`` from Spack and you installed
|
||||||
``py-sphinx`` and friends, you need to make them available to your
|
``py-sphinx`` and friends, you need to make them available to your
|
||||||
``python``. The easiest way to do this is to run:
|
``python``. The easiest way to do this is to run:
|
||||||
|
@@ -154,7 +154,9 @@ Package-related modules
|
|||||||
|
|
||||||
:mod:`spack.util.naming`
|
:mod:`spack.util.naming`
|
||||||
Contains functions for mapping between Spack package names,
|
Contains functions for mapping between Spack package names,
|
||||||
Python module names, and Python class names.
|
Python module names, and Python class names. Functions like
|
||||||
|
:func:`~spack.util.naming.mod_to_class` handle mapping package
|
||||||
|
module names to class names.
|
||||||
|
|
||||||
:mod:`spack.directives`
|
:mod:`spack.directives`
|
||||||
*Directives* are functions that can be called inside a package definition
|
*Directives* are functions that can be called inside a package definition
|
||||||
|
@@ -1,34 +0,0 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
|
|
||||||
.. _env-vars-yaml:
|
|
||||||
|
|
||||||
=============================================
|
|
||||||
Environment Variable Settings (env_vars.yaml)
|
|
||||||
=============================================
|
|
||||||
|
|
||||||
Spack allows you to include shell environment variable modifications
|
|
||||||
for a spack environment by including an ``env_vars.yaml``. Environment
|
|
||||||
varaibles can be modified by setting, unsetting, appending, and prepending
|
|
||||||
variables in the shell environment.
|
|
||||||
The changes to the shell environment will take effect when the spack
|
|
||||||
environment is activated.
|
|
||||||
|
|
||||||
for example,
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
env_vars:
|
|
||||||
set:
|
|
||||||
ENVAR_TO_SET_IN_ENV_LOAD: "FOO"
|
|
||||||
unset:
|
|
||||||
ENVAR_TO_UNSET_IN_ENV_LOAD:
|
|
||||||
prepend_path:
|
|
||||||
PATH_LIST: "path/to/prepend"
|
|
||||||
append_path:
|
|
||||||
PATH_LIST: "path/to/append"
|
|
||||||
remove_path:
|
|
||||||
PATH_LIST: "path/to/remove"
|
|
||||||
|
|
||||||
|
|
@@ -457,13 +457,6 @@ developed package in the environment are concretized to match the
|
|||||||
version (and other constraints) passed as the spec argument to the
|
version (and other constraints) passed as the spec argument to the
|
||||||
``spack develop`` command.
|
``spack develop`` command.
|
||||||
|
|
||||||
When working deep in the graph it is often desirable to have multiple specs marked
|
|
||||||
as ``develop`` so you don't have to restage and/or do full rebuilds each time you
|
|
||||||
call ``spack install``. The ``--recursive`` flag can be used in these scenarios
|
|
||||||
to ensure that all the dependents of the initial spec you provide are also marked
|
|
||||||
as develop specs. The ``--recursive`` flag requires a pre-concretized environment
|
|
||||||
so the graph can be traversed from the supplied spec all the way to the root specs.
|
|
||||||
|
|
||||||
For packages with ``git`` attributes, git branches, tags, and commits can
|
For packages with ``git`` attributes, git branches, tags, and commits can
|
||||||
also be used as valid concrete versions (see :ref:`version-specifier`).
|
also be used as valid concrete versions (see :ref:`version-specifier`).
|
||||||
This means that for a package ``foo``, ``spack develop foo@git.main`` will clone
|
This means that for a package ``foo``, ``spack develop foo@git.main`` will clone
|
||||||
@@ -667,56 +660,34 @@ a ``packages.yaml`` file) could contain:
|
|||||||
# ...
|
# ...
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
providers:
|
compiler: [intel]
|
||||||
mpi: [openmpi]
|
|
||||||
# ...
|
# ...
|
||||||
|
|
||||||
This configuration sets the default mpi provider to be openmpi.
|
This configuration sets the default compiler for all packages to
|
||||||
|
``intel``.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Included configurations
|
Included configurations
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Spack environments allow an ``include`` heading in their yaml schema.
|
Spack environments allow an ``include`` heading in their yaml
|
||||||
This heading pulls in external configuration files and applies them to
|
schema. This heading pulls in external configuration files and applies
|
||||||
the environment.
|
them to the environment.
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
spack:
|
spack:
|
||||||
include:
|
include:
|
||||||
- environment/relative/path/to/config.yaml
|
- relative/path/to/config.yaml
|
||||||
- path: https://github.com/path/to/raw/config/compilers.yaml
|
- https://github.com/path/to/raw/config/compilers.yaml
|
||||||
sha256: 26e871804a92cd07bb3d611b31b4156ae93d35b6a6d6e0ef3a67871fcb1d258b
|
|
||||||
- /absolute/path/to/packages.yaml
|
- /absolute/path/to/packages.yaml
|
||||||
- path: /path/to/$os/$target/environment
|
|
||||||
optional: true
|
|
||||||
- path: /path/to/os-specific/config-dir
|
|
||||||
when: os == "ventura"
|
|
||||||
|
|
||||||
Included configuration files are required *unless* they are explicitly optional
|
|
||||||
or the entry's condition evaluates to ``false``. Optional includes are specified
|
|
||||||
with the ``optional`` clause and conditional with the ``when`` clause. (See
|
|
||||||
:ref:`include-yaml` for more information on optional and conditional entries.)
|
|
||||||
|
|
||||||
Files are listed using paths to individual files or directories containing them.
|
|
||||||
Path entries may be absolute or relative to the environment or specified as
|
|
||||||
URLs. URLs to individual files must link to the **raw** form of the file's
|
|
||||||
contents (e.g., `GitHub
|
|
||||||
<https://docs.github.com/en/repositories/working-with-files/using-files/viewing-and-understanding-files#viewing-or-copying-the-raw-file-content>`_
|
|
||||||
or `GitLab
|
|
||||||
<https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository>`_) **and** include a valid sha256 for the file.
|
|
||||||
Only the ``file``, ``ftp``, ``http`` and ``https`` protocols (or schemes) are
|
|
||||||
supported. Spack-specific, environment and user path variables can be used.
|
|
||||||
(See :ref:`config-file-variables` for more information.)
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
Recursive includes are not currently processed in a breadth-first manner
|
|
||||||
so the value of a configuration option that is altered by multiple included
|
|
||||||
files may not be what you expect. This will be addressed in a future
|
|
||||||
update.
|
|
||||||
|
|
||||||
|
Environments can include files or URLs. File paths can be relative or
|
||||||
|
absolute. URLs include the path to the text for individual files or
|
||||||
|
can be the path to a directory containing configuration files.
|
||||||
|
Spack supports ``file``, ``http``, ``https`` and ``ftp`` protocols (or
|
||||||
|
schemes). Spack-specific, environment and user path variables may be
|
||||||
|
used in these paths. See :ref:`config-file-variables` for more information.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Configuration precedence
|
Configuration precedence
|
||||||
@@ -1000,28 +971,6 @@ For example, the following environment has three root packages:
|
|||||||
This allows for a much-needed reduction in redundancy between packages
|
This allows for a much-needed reduction in redundancy between packages
|
||||||
and constraints.
|
and constraints.
|
||||||
|
|
||||||
-------------------------------
|
|
||||||
Modifying Environment Variables
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
Spack Environments can modify the active shell's environment variables when activated. The environment can be
|
|
||||||
configured to set, unset, prepend, or append using ``env_vars`` configuration in the ``spack.yaml`` or through config scopes
|
|
||||||
file:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
spack:
|
|
||||||
env_vars:
|
|
||||||
set:
|
|
||||||
ENVAR_TO_SET_IN_ENV_LOAD: "FOO"
|
|
||||||
unset:
|
|
||||||
ENVAR_TO_UNSET_IN_ENV_LOAD:
|
|
||||||
prepend_path:
|
|
||||||
PATH_LIST: "path/to/prepend"
|
|
||||||
append_path:
|
|
||||||
PATH_LIST: "path/to/append"
|
|
||||||
remove_path:
|
|
||||||
PATH_LIST: "path/to/remove"
|
|
||||||
|
|
||||||
-----------------
|
-----------------
|
||||||
Environment Views
|
Environment Views
|
||||||
|
161
lib/spack/docs/example_files/spack.yaml
Normal file
161
lib/spack/docs/example_files/spack.yaml
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
spack:
|
||||||
|
definitions:
|
||||||
|
- compiler-pkgs:
|
||||||
|
- 'llvm+clang@6.0.1 os=centos7'
|
||||||
|
- 'gcc@6.5.0 os=centos7'
|
||||||
|
- 'llvm+clang@6.0.1 os=ubuntu18.04'
|
||||||
|
- 'gcc@6.5.0 os=ubuntu18.04'
|
||||||
|
- pkgs:
|
||||||
|
- readline@7.0
|
||||||
|
# - xsdk@0.4.0
|
||||||
|
- compilers:
|
||||||
|
- '%gcc@5.5.0'
|
||||||
|
- '%gcc@6.5.0'
|
||||||
|
- '%gcc@7.3.0'
|
||||||
|
- '%clang@6.0.0'
|
||||||
|
- '%clang@6.0.1'
|
||||||
|
- oses:
|
||||||
|
- os=ubuntu18.04
|
||||||
|
- os=centos7
|
||||||
|
|
||||||
|
specs:
|
||||||
|
- matrix:
|
||||||
|
- [$pkgs]
|
||||||
|
- [$compilers]
|
||||||
|
- [$oses]
|
||||||
|
exclude:
|
||||||
|
- '%gcc@7.3.0 os=centos7'
|
||||||
|
- '%gcc@5.5.0 os=ubuntu18.04'
|
||||||
|
|
||||||
|
mirrors:
|
||||||
|
cloud_gitlab: https://mirror.spack.io
|
||||||
|
|
||||||
|
compilers:
|
||||||
|
# The .gitlab-ci.yml for this project picks a Docker container which does
|
||||||
|
# not have any compilers pre-built and ready to use, so we need to fake the
|
||||||
|
# existence of those here.
|
||||||
|
- compiler:
|
||||||
|
operating_system: centos7
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: gcc@5.5.0
|
||||||
|
target: x86_64
|
||||||
|
- compiler:
|
||||||
|
operating_system: centos7
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: gcc@6.5.0
|
||||||
|
target: x86_64
|
||||||
|
- compiler:
|
||||||
|
operating_system: centos7
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: clang@6.0.0
|
||||||
|
target: x86_64
|
||||||
|
- compiler:
|
||||||
|
operating_system: centos7
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: clang@6.0.1
|
||||||
|
target: x86_64
|
||||||
|
|
||||||
|
- compiler:
|
||||||
|
operating_system: ubuntu18.04
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: clang@6.0.0
|
||||||
|
target: x86_64
|
||||||
|
- compiler:
|
||||||
|
operating_system: ubuntu18.04
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: clang@6.0.1
|
||||||
|
target: x86_64
|
||||||
|
- compiler:
|
||||||
|
operating_system: ubuntu18.04
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: gcc@6.5.0
|
||||||
|
target: x86_64
|
||||||
|
- compiler:
|
||||||
|
operating_system: ubuntu18.04
|
||||||
|
modules: []
|
||||||
|
paths:
|
||||||
|
cc: /not/used
|
||||||
|
cxx: /not/used
|
||||||
|
f77: /not/used
|
||||||
|
fc: /not/used
|
||||||
|
spec: gcc@7.3.0
|
||||||
|
target: x86_64
|
||||||
|
|
||||||
|
gitlab-ci:
|
||||||
|
bootstrap:
|
||||||
|
- name: compiler-pkgs
|
||||||
|
compiler-agnostic: true
|
||||||
|
mappings:
|
||||||
|
- # spack-cloud-ubuntu
|
||||||
|
match:
|
||||||
|
# these are specs, if *any* match the spec under consideration, this
|
||||||
|
# 'mapping' will be used to generate the CI job
|
||||||
|
- os=ubuntu18.04
|
||||||
|
runner-attributes:
|
||||||
|
# 'tags' and 'image' go directly onto the job, 'variables' will
|
||||||
|
# be added to what we already necessarily create for the job as
|
||||||
|
# a part of the CI workflow
|
||||||
|
tags:
|
||||||
|
- spack-k8s
|
||||||
|
image:
|
||||||
|
name: scottwittenburg/spack_builder_ubuntu_18.04
|
||||||
|
entrypoint: [""]
|
||||||
|
- # spack-cloud-centos
|
||||||
|
match:
|
||||||
|
# these are specs, if *any* match the spec under consideration, this
|
||||||
|
# 'mapping' will be used to generate the CI job
|
||||||
|
- 'os=centos7'
|
||||||
|
runner-attributes:
|
||||||
|
tags:
|
||||||
|
- spack-k8s
|
||||||
|
image:
|
||||||
|
name: scottwittenburg/spack_builder_centos_7
|
||||||
|
entrypoint: [""]
|
||||||
|
|
||||||
|
cdash:
|
||||||
|
build-group: Release Testing
|
||||||
|
url: http://cdash
|
||||||
|
project: Spack Testing
|
||||||
|
site: Spack Docker-Compose Workflow
|
||||||
|
|
||||||
|
repos: []
|
||||||
|
upstreams: {}
|
||||||
|
modules:
|
||||||
|
enable: []
|
||||||
|
packages: {}
|
||||||
|
config: {}
|
@@ -131,7 +131,7 @@ creates a simple python file:
|
|||||||
It doesn't take much python coding to get from there to a working
|
It doesn't take much python coding to get from there to a working
|
||||||
package:
|
package:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/libelf/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/libelf/package.py
|
||||||
:lines: 5-
|
:lines: 5-
|
||||||
|
|
||||||
Spack also provides wrapper functions around common commands like
|
Spack also provides wrapper functions around common commands like
|
||||||
|
@@ -30,7 +30,7 @@ than always choosing the latest versions or default variants.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
As a rule of thumb: requirements + constraints > strong preferences > reuse > preferences > defaults.
|
As a rule of thumb: requirements + constraints > reuse > preferences > defaults.
|
||||||
|
|
||||||
The following set of criteria (from lowest to highest precedence) explain
|
The following set of criteria (from lowest to highest precedence) explain
|
||||||
common cases where concretization output may seem surprising at first.
|
common cases where concretization output may seem surprising at first.
|
||||||
@@ -56,19 +56,7 @@ common cases where concretization output may seem surprising at first.
|
|||||||
concretizer:
|
concretizer:
|
||||||
reuse: dependencies # other options are 'true' and 'false'
|
reuse: dependencies # other options are 'true' and 'false'
|
||||||
|
|
||||||
3. :ref:`Strong preferences <package-strong-preferences>` configured in ``packages.yaml``
|
3. :ref:`Package requirements <package-requirements>` configured in ``packages.yaml``,
|
||||||
are higher priority than reuse, and can be used to strongly prefer a specific version
|
|
||||||
or variant, without erroring out if it's not possible. Strong preferences are specified
|
|
||||||
as follows:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
packages:
|
|
||||||
foo:
|
|
||||||
prefer:
|
|
||||||
- "@1.1: ~mpi"
|
|
||||||
|
|
||||||
4. :ref:`Package requirements <package-requirements>` configured in ``packages.yaml``,
|
|
||||||
and constraints from the command line as well as ``package.py`` files override all
|
and constraints from the command line as well as ``package.py`` files override all
|
||||||
of the above. Requirements are specified as follows:
|
of the above. Requirements are specified as follows:
|
||||||
|
|
||||||
@@ -78,8 +66,6 @@ common cases where concretization output may seem surprising at first.
|
|||||||
foo:
|
foo:
|
||||||
require:
|
require:
|
||||||
- "@1.2: +mpi"
|
- "@1.2: +mpi"
|
||||||
conflicts:
|
|
||||||
- "@1.4"
|
|
||||||
|
|
||||||
Requirements and constraints restrict the set of possible solutions, while reuse
|
Requirements and constraints restrict the set of possible solutions, while reuse
|
||||||
behavior and preferences influence what an optimal solution looks like.
|
behavior and preferences influence what an optimal solution looks like.
|
||||||
|
@@ -254,11 +254,12 @@ directory.
|
|||||||
Compiler configuration
|
Compiler configuration
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Spack has the ability to build packages with multiple compilers and compiler versions.
|
Spack has the ability to build packages with multiple compilers and
|
||||||
Compilers can be made available to Spack by specifying them manually in ``packages.yaml``,
|
compiler versions. Compilers can be made available to Spack by
|
||||||
or automatically by running ``spack compiler find``.
|
specifying them manually in ``compilers.yaml`` or ``packages.yaml``,
|
||||||
For convenience, Spack will automatically detect compilers the first time it needs them,
|
or automatically by running ``spack compiler find``, but for
|
||||||
if none is available.
|
convenience Spack will automatically detect compilers the first time
|
||||||
|
it needs them.
|
||||||
|
|
||||||
.. _cmd-spack-compilers:
|
.. _cmd-spack-compilers:
|
||||||
|
|
||||||
@@ -273,11 +274,16 @@ compilers`` or ``spack compiler list``:
|
|||||||
|
|
||||||
$ spack compilers
|
$ spack compilers
|
||||||
==> Available compilers
|
==> Available compilers
|
||||||
-- gcc ubuntu20.04-x86_64 ---------------------------------------
|
-- gcc ---------------------------------------------------------
|
||||||
gcc@9.4.0 gcc@8.4.0 gcc@10.5.0
|
gcc@4.9.0 gcc@4.8.0 gcc@4.7.0 gcc@4.6.2 gcc@4.4.7
|
||||||
|
gcc@4.8.2 gcc@4.7.1 gcc@4.6.3 gcc@4.6.1 gcc@4.1.2
|
||||||
-- llvm ubuntu20.04-x86_64 --------------------------------------
|
-- intel -------------------------------------------------------
|
||||||
llvm@12.0.0 llvm@11.0.0 llvm@10.0.0
|
intel@15.0.0 intel@14.0.0 intel@13.0.0 intel@12.1.0 intel@10.0
|
||||||
|
intel@14.0.3 intel@13.1.1 intel@12.1.5 intel@12.0.4 intel@9.1
|
||||||
|
intel@14.0.2 intel@13.1.0 intel@12.1.3 intel@11.1
|
||||||
|
intel@14.0.1 intel@13.0.1 intel@12.1.2 intel@10.1
|
||||||
|
-- clang -------------------------------------------------------
|
||||||
|
clang@3.4 clang@3.3 clang@3.2 clang@3.1
|
||||||
|
|
||||||
Any of these compilers can be used to build Spack packages. More on
|
Any of these compilers can be used to build Spack packages. More on
|
||||||
how this is done is in :ref:`sec-specs`.
|
how this is done is in :ref:`sec-specs`.
|
||||||
@@ -296,22 +302,16 @@ An alias for ``spack compiler find``.
|
|||||||
``spack compiler find``
|
``spack compiler find``
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
If you do not see a compiler in the list shown by:
|
Lists the compilers currently available to Spack. If you do not see
|
||||||
|
a compiler in this list, but you want to use it with Spack, you can
|
||||||
|
simply run ``spack compiler find`` with the path to where the
|
||||||
|
compiler is installed. For example:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack compiler list
|
$ spack compiler find /usr/local/tools/ic-13.0.079
|
||||||
|
==> Added 1 new compiler to ~/.spack/linux/compilers.yaml
|
||||||
but you want to use it with Spack, you can simply run ``spack compiler find`` with the
|
intel@13.0.079
|
||||||
path to where the compiler is installed. For example:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ spack compiler find /opt/intel/oneapi/compiler/2025.1/bin/
|
|
||||||
==> Added 1 new compiler to /home/user/.spack/packages.yaml
|
|
||||||
intel-oneapi-compilers@2025.1.0
|
|
||||||
==> Compilers are defined in the following files:
|
|
||||||
/home/user/.spack/packages.yaml
|
|
||||||
|
|
||||||
Or you can run ``spack compiler find`` with no arguments to force
|
Or you can run ``spack compiler find`` with no arguments to force
|
||||||
auto-detection. This is useful if you do not know where compilers are
|
auto-detection. This is useful if you do not know where compilers are
|
||||||
@@ -322,7 +322,7 @@ installed, but you know that new compilers have been added to your
|
|||||||
|
|
||||||
$ module load gcc/4.9.0
|
$ module load gcc/4.9.0
|
||||||
$ spack compiler find
|
$ spack compiler find
|
||||||
==> Added 1 new compiler to /home/user/.spack/packages.yaml
|
==> Added 1 new compiler to ~/.spack/linux/compilers.yaml
|
||||||
gcc@4.9.0
|
gcc@4.9.0
|
||||||
|
|
||||||
This loads the environment module for gcc-4.9.0 to add it to
|
This loads the environment module for gcc-4.9.0 to add it to
|
||||||
@@ -331,7 +331,7 @@ This loads the environment module for gcc-4.9.0 to add it to
|
|||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
By default, spack does not fill in the ``modules:`` field in the
|
By default, spack does not fill in the ``modules:`` field in the
|
||||||
``packages.yaml`` file. If you are using a compiler from a
|
``compilers.yaml`` file. If you are using a compiler from a
|
||||||
module, then you should add this field manually.
|
module, then you should add this field manually.
|
||||||
See the section on :ref:`compilers-requiring-modules`.
|
See the section on :ref:`compilers-requiring-modules`.
|
||||||
|
|
||||||
@@ -341,82 +341,91 @@ This loads the environment module for gcc-4.9.0 to add it to
|
|||||||
``spack compiler info``
|
``spack compiler info``
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
If you want to see additional information on some specific compilers, you can run ``spack compiler info`` on it:
|
If you want to see specifics on a particular compiler, you can run
|
||||||
|
``spack compiler info`` on it:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack compiler info gcc
|
$ spack compiler info intel@15
|
||||||
gcc@=8.4.0 languages='c,c++,fortran' arch=linux-ubuntu20.04-x86_64:
|
intel@15.0.0:
|
||||||
prefix: /usr
|
paths:
|
||||||
compilers:
|
cc = /usr/local/bin/icc-15.0.090
|
||||||
c: /usr/bin/gcc-8
|
cxx = /usr/local/bin/icpc-15.0.090
|
||||||
cxx: /usr/bin/g++-8
|
f77 = /usr/local/bin/ifort-15.0.090
|
||||||
fortran: /usr/bin/gfortran-8
|
fc = /usr/local/bin/ifort-15.0.090
|
||||||
|
modules = []
|
||||||
|
operating_system = centos6
|
||||||
|
...
|
||||||
|
|
||||||
gcc@=9.4.0 languages='c,c++,fortran' arch=linux-ubuntu20.04-x86_64:
|
This shows which C, C++, and Fortran compilers were detected by Spack.
|
||||||
prefix: /usr
|
Notice also that we didn't have to be too specific about the
|
||||||
compilers:
|
version. We just said ``intel@15``, and information about the only
|
||||||
c: /usr/bin/gcc
|
matching Intel compiler was displayed.
|
||||||
cxx: /usr/bin/g++
|
|
||||||
fortran: /usr/bin/gfortran
|
|
||||||
|
|
||||||
gcc@=10.5.0 languages='c,c++,fortran' arch=linux-ubuntu20.04-x86_64:
|
|
||||||
prefix: /usr
|
|
||||||
compilers:
|
|
||||||
c: /usr/bin/gcc-10
|
|
||||||
cxx: /usr/bin/g++-10
|
|
||||||
fortran: /usr/bin/gfortran-10
|
|
||||||
|
|
||||||
This shows the details of the compilers that were detected by Spack.
|
|
||||||
Notice also that we didn't have to be too specific about the version. We just said ``gcc``, and we got information
|
|
||||||
about all the matching compilers.
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Manual compiler configuration
|
Manual compiler configuration
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
If auto-detection fails, you can manually configure a compiler by editing your ``~/.spack/packages.yaml`` file.
|
If auto-detection fails, you can manually configure a compiler by
|
||||||
You can do this by running ``spack config edit packages``, which will open the file in
|
editing your ``~/.spack/<platform>/compilers.yaml`` file. You can do this by running
|
||||||
|
``spack config edit compilers``, which will open the file in
|
||||||
:ref:`your favorite editor <controlling-the-editor>`.
|
:ref:`your favorite editor <controlling-the-editor>`.
|
||||||
|
|
||||||
Each compiler has an "external" entry in the file with some ``extra_attributes``:
|
Each compiler configuration in the file looks like this:
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
compilers:
|
||||||
gcc:
|
- compiler:
|
||||||
externals:
|
modules: []
|
||||||
- spec: gcc@10.5.0 languages='c,c++,fortran'
|
operating_system: centos6
|
||||||
prefix: /usr
|
paths:
|
||||||
extra_attributes:
|
cc: /usr/local/bin/icc-15.0.024-beta
|
||||||
compilers:
|
cxx: /usr/local/bin/icpc-15.0.024-beta
|
||||||
c: /usr/bin/gcc-10
|
f77: /usr/local/bin/ifort-15.0.024-beta
|
||||||
cxx: /usr/bin/g++-10
|
fc: /usr/local/bin/ifort-15.0.024-beta
|
||||||
fortran: /usr/bin/gfortran-10
|
spec: intel@15.0.0
|
||||||
|
|
||||||
The compiler executables are listed under ``extra_attributes:compilers``, and are keyed by language.
|
For compilers that do not support Fortran (like ``clang``), put
|
||||||
Once you save the file, the configured compilers will show up in the list displayed by ``spack compilers``.
|
``None`` for ``f77`` and ``fc``:
|
||||||
|
|
||||||
You can also add compiler flags to manually configured compilers. These flags should be specified in the
|
.. code-block:: yaml
|
||||||
``flags`` section of the compiler specification. The valid flags are ``cflags``, ``cxxflags``, ``fflags``,
|
|
||||||
|
compilers:
|
||||||
|
- compiler:
|
||||||
|
modules: []
|
||||||
|
operating_system: centos6
|
||||||
|
paths:
|
||||||
|
cc: /usr/bin/clang
|
||||||
|
cxx: /usr/bin/clang++
|
||||||
|
f77: None
|
||||||
|
fc: None
|
||||||
|
spec: clang@3.3svn
|
||||||
|
|
||||||
|
Once you save the file, the configured compilers will show up in the
|
||||||
|
list displayed by ``spack compilers``.
|
||||||
|
|
||||||
|
You can also add compiler flags to manually configured compilers. These
|
||||||
|
flags should be specified in the ``flags`` section of the compiler
|
||||||
|
specification. The valid flags are ``cflags``, ``cxxflags``, ``fflags``,
|
||||||
``cppflags``, ``ldflags``, and ``ldlibs``. For example:
|
``cppflags``, ``ldflags``, and ``ldlibs``. For example:
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
compilers:
|
||||||
gcc:
|
- compiler:
|
||||||
externals:
|
modules: []
|
||||||
- spec: gcc@10.5.0 languages='c,c++,fortran'
|
operating_system: centos6
|
||||||
prefix: /usr
|
paths:
|
||||||
extra_attributes:
|
cc: /usr/bin/gcc
|
||||||
compilers:
|
cxx: /usr/bin/g++
|
||||||
c: /usr/bin/gcc-10
|
f77: /usr/bin/gfortran
|
||||||
cxx: /usr/bin/g++-10
|
fc: /usr/bin/gfortran
|
||||||
fortran: /usr/bin/gfortran-10
|
flags:
|
||||||
flags:
|
cflags: -O3 -fPIC
|
||||||
cflags: -O3 -fPIC
|
cxxflags: -O3 -fPIC
|
||||||
cxxflags: -O3 -fPIC
|
cppflags: -O3 -fPIC
|
||||||
cppflags: -O3 -fPIC
|
spec: gcc@4.7.2
|
||||||
|
|
||||||
These flags will be treated by spack as if they were entered from
|
These flags will be treated by spack as if they were entered from
|
||||||
the command line each time this compiler is used. The compiler wrappers
|
the command line each time this compiler is used. The compiler wrappers
|
||||||
@@ -431,44 +440,95 @@ These variables should be specified in the ``environment`` section of the compil
|
|||||||
specification. The operations available to modify the environment are ``set``, ``unset``,
|
specification. The operations available to modify the environment are ``set``, ``unset``,
|
||||||
``prepend_path``, ``append_path``, and ``remove_path``. For example:
|
``prepend_path``, ``append_path``, and ``remove_path``. For example:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
compilers:
|
||||||
|
- compiler:
|
||||||
|
modules: []
|
||||||
|
operating_system: centos6
|
||||||
|
paths:
|
||||||
|
cc: /opt/intel/oneapi/compiler/latest/linux/bin/icx
|
||||||
|
cxx: /opt/intel/oneapi/compiler/latest/linux/bin/icpx
|
||||||
|
f77: /opt/intel/oneapi/compiler/latest/linux/bin/ifx
|
||||||
|
fc: /opt/intel/oneapi/compiler/latest/linux/bin/ifx
|
||||||
|
spec: oneapi@latest
|
||||||
|
environment:
|
||||||
|
set:
|
||||||
|
MKL_ROOT: "/path/to/mkl/root"
|
||||||
|
unset: # A list of environment variables to unset
|
||||||
|
- CC
|
||||||
|
prepend_path: # Similar for append|remove_path
|
||||||
|
LD_LIBRARY_PATH: /ld/paths/added/by/setvars/sh
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Spack is in the process of moving compilers from a separate
|
||||||
|
attribute to be handled like all other packages. As part of this
|
||||||
|
process, the ``compilers.yaml`` section will eventually be replaced
|
||||||
|
by configuration in the ``packages.yaml`` section. This new
|
||||||
|
configuration is now available, although it is not yet the default
|
||||||
|
behavior.
|
||||||
|
|
||||||
|
Compilers can also be configured as external packages in the
|
||||||
|
``packages.yaml`` config file. Any external package for a compiler
|
||||||
|
(e.g. ``gcc`` or ``llvm``) will be treated as a configured compiler
|
||||||
|
assuming the paths to the compiler executables are determinable from
|
||||||
|
the prefix.
|
||||||
|
|
||||||
|
If the paths to the compiler executable are not determinable from the
|
||||||
|
prefix, you can add them to the ``extra_attributes`` field. Similarly,
|
||||||
|
all other fields from the compilers config can be added to the
|
||||||
|
``extra_attributes`` field for an external representing a compiler.
|
||||||
|
|
||||||
|
Note that the format for the ``paths`` field in the
|
||||||
|
``extra_attributes`` section is different than in the ``compilers``
|
||||||
|
config. For compilers configured as external packages, the section is
|
||||||
|
named ``compilers`` and the dictionary maps language names (``c``,
|
||||||
|
``cxx``, ``fortran``) to paths, rather than using the names ``cc``,
|
||||||
|
``fc``, and ``f77``.
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
intel-oneapi-compilers:
|
gcc:
|
||||||
externals:
|
external:
|
||||||
- spec: intel-oneapi-compilers@2025.1.0
|
- spec: gcc@12.2.0 arch=linux-rhel8-skylake
|
||||||
prefix: /opt/intel/oneapi
|
prefix: /usr
|
||||||
extra_attributes:
|
extra_attributes:
|
||||||
compilers:
|
|
||||||
c: /opt/intel/oneapi/compiler/2025.1/bin/icx
|
|
||||||
cxx: /opt/intel/oneapi/compiler/2025.1/bin/icpx
|
|
||||||
fortran: /opt/intel/oneapi/compiler/2025.1/bin/ifx
|
|
||||||
environment:
|
environment:
|
||||||
set:
|
set:
|
||||||
MKL_ROOT: "/path/to/mkl/root"
|
GCC_ROOT: /usr
|
||||||
unset: # A list of environment variables to unset
|
external:
|
||||||
- CC
|
- spec: llvm+clang@15.0.0 arch=linux-rhel8-skylake
|
||||||
prepend_path: # Similar for append|remove_path
|
prefix: /usr
|
||||||
LD_LIBRARY_PATH: /ld/paths/added/by/setvars/sh
|
extra_attributes:
|
||||||
|
compilers:
|
||||||
|
c: /usr/bin/clang-with-suffix
|
||||||
|
cxx: /usr/bin/clang++-with-extra-info
|
||||||
|
fortran: /usr/bin/gfortran
|
||||||
|
extra_rpaths:
|
||||||
|
- /usr/lib/llvm/
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Build Your Own Compiler
|
Build Your Own Compiler
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
If you are particular about which compiler/version you use, you might wish to have Spack build it for you.
|
If you are particular about which compiler/version you use, you might
|
||||||
For example:
|
wish to have Spack build it for you. For example:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack install gcc@14+binutils
|
$ spack install gcc@4.9.3
|
||||||
|
|
||||||
Once the compiler is installed, you can start using it without additional configuration:
|
Once that has finished, you will need to add it to your
|
||||||
|
``compilers.yaml`` file. You can then set Spack to use it by default
|
||||||
|
by adding the following to your ``packages.yaml`` file:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: yaml
|
||||||
|
|
||||||
$ spack install hdf5~mpi %gcc@14
|
packages:
|
||||||
|
all:
|
||||||
The same holds true for compilers that are made available from buildcaches, when reusing them is allowed.
|
compiler: [gcc@4.9.3]
|
||||||
|
|
||||||
.. _compilers-requiring-modules:
|
.. _compilers-requiring-modules:
|
||||||
|
|
||||||
@@ -476,26 +536,30 @@ The same holds true for compilers that are made available from buildcaches, when
|
|||||||
Compilers Requiring Modules
|
Compilers Requiring Modules
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Many installed compilers will work regardless of the environment they are called with.
|
Many installed compilers will work regardless of the environment they
|
||||||
However, some installed compilers require environment variables to be set in order to run;
|
are called with. However, some installed compilers require
|
||||||
this is typical for Intel and other proprietary compilers.
|
``$LD_LIBRARY_PATH`` or other environment variables to be set in order
|
||||||
|
to run; this is typical for Intel and other proprietary compilers.
|
||||||
|
|
||||||
On typical HPC clusters, these environment modifications are usually delegated to some "module" system.
|
In such a case, you should tell Spack which module(s) to load in order
|
||||||
In such a case, you should tell Spack which module(s) to load in order to run the chosen compiler:
|
to run the chosen compiler (If the compiler does not come with a
|
||||||
|
module file, you might consider making one by hand). Spack will load
|
||||||
|
this module into the environment ONLY when the compiler is run, and
|
||||||
|
NOT in general for a package's ``install()`` method. See, for
|
||||||
|
example, this ``compilers.yaml`` file:
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
compilers:
|
||||||
gcc:
|
- compiler:
|
||||||
externals:
|
modules: [other/comp/gcc-5.3-sp3]
|
||||||
- spec: gcc@10.5.0 languages='c,c++,fortran'
|
operating_system: SuSE11
|
||||||
prefix: /opt/compilers
|
paths:
|
||||||
extra_attributes:
|
cc: /usr/local/other/SLES11.3/gcc/5.3.0/bin/gcc
|
||||||
compilers:
|
cxx: /usr/local/other/SLES11.3/gcc/5.3.0/bin/g++
|
||||||
c: /opt/compilers/bin/gcc-10
|
f77: /usr/local/other/SLES11.3/gcc/5.3.0/bin/gfortran
|
||||||
cxx: /opt/compilers/bin/g++-10
|
fc: /usr/local/other/SLES11.3/gcc/5.3.0/bin/gfortran
|
||||||
fortran: /opt/compilers/bin/gfortran-10
|
spec: gcc@5.3.0
|
||||||
modules: [gcc/10.5.0]
|
|
||||||
|
|
||||||
Some compilers require special environment settings to be loaded not just
|
Some compilers require special environment settings to be loaded not just
|
||||||
to run, but also to execute the code they build, breaking packages that
|
to run, but also to execute the code they build, breaking packages that
|
||||||
@@ -516,7 +580,7 @@ Licensed Compilers
|
|||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Some proprietary compilers require licensing to use. If you need to
|
Some proprietary compilers require licensing to use. If you need to
|
||||||
use a licensed compiler, the process is similar to a mix of
|
use a licensed compiler (eg, PGI), the process is similar to a mix of
|
||||||
build your own, plus modules:
|
build your own, plus modules:
|
||||||
|
|
||||||
#. Create a Spack package (if it doesn't exist already) to install
|
#. Create a Spack package (if it doesn't exist already) to install
|
||||||
@@ -526,21 +590,24 @@ build your own, plus modules:
|
|||||||
using Spack to load the module it just created, and running simple
|
using Spack to load the module it just created, and running simple
|
||||||
builds (eg: ``cc helloWorld.c && ./a.out``)
|
builds (eg: ``cc helloWorld.c && ./a.out``)
|
||||||
|
|
||||||
#. Add the newly-installed compiler to ``packages.yaml`` as shown above.
|
#. Add the newly-installed compiler to ``compilers.yaml`` as shown
|
||||||
|
above.
|
||||||
|
|
||||||
.. _mixed-toolchains:
|
.. _mixed-toolchains:
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
Fortran compilers on macOS
|
Mixed Toolchains
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Modern compilers typically come with related compilers for C, C++ and
|
Modern compilers typically come with related compilers for C, C++ and
|
||||||
Fortran bundled together. When possible, results are best if the same
|
Fortran bundled together. When possible, results are best if the same
|
||||||
compiler is used for all languages.
|
compiler is used for all languages.
|
||||||
|
|
||||||
In some cases, this is not possible. For example, XCode on macOS provides no Fortran compilers.
|
In some cases, this is not possible. For example, starting with macOS El
|
||||||
The user is therefore forced to use a mixed toolchain: XCode-provided Clang for C/C++ and e.g.
|
Capitan (10.11), many packages no longer build with GCC, but XCode
|
||||||
GNU ``gfortran`` for Fortran.
|
provides no Fortran compilers. The user is therefore forced to use a
|
||||||
|
mixed toolchain: XCode-provided Clang for C/C++ and GNU ``gfortran`` for
|
||||||
|
Fortran.
|
||||||
|
|
||||||
#. You need to make sure that Xcode is installed. Run the following command:
|
#. You need to make sure that Xcode is installed. Run the following command:
|
||||||
|
|
||||||
@@ -593,25 +660,45 @@ GNU ``gfortran`` for Fortran.
|
|||||||
|
|
||||||
Note: the flag is ``-license``, not ``--license``.
|
Note: the flag is ``-license``, not ``--license``.
|
||||||
|
|
||||||
|
#. Run ``spack compiler find`` to locate Clang.
|
||||||
|
|
||||||
#. There are different ways to get ``gfortran`` on macOS. For example, you can
|
#. There are different ways to get ``gfortran`` on macOS. For example, you can
|
||||||
install GCC with Spack (``spack install gcc``), with Homebrew (``brew install
|
install GCC with Spack (``spack install gcc``), with Homebrew (``brew install
|
||||||
gcc``), or from a `DMG installer
|
gcc``), or from a `DMG installer
|
||||||
<https://github.com/fxcoudert/gfortran-for-macOS/releases>`_.
|
<https://github.com/fxcoudert/gfortran-for-macOS/releases>`_.
|
||||||
|
|
||||||
#. Run ``spack compiler find`` to locate both Apple-Clang and GCC.
|
#. The only thing left to do is to edit ``~/.spack/darwin/compilers.yaml`` to provide
|
||||||
|
the path to ``gfortran``:
|
||||||
|
|
||||||
Since languages in Spack are modeled as virtual packages, ``apple-clang`` will be used to provide
|
.. code-block:: yaml
|
||||||
C and C++, while GCC will be used for Fortran.
|
|
||||||
|
compilers:
|
||||||
|
- compiler:
|
||||||
|
# ...
|
||||||
|
paths:
|
||||||
|
cc: /usr/bin/clang
|
||||||
|
cxx: /usr/bin/clang++
|
||||||
|
f77: /path/to/bin/gfortran
|
||||||
|
fc: /path/to/bin/gfortran
|
||||||
|
spec: apple-clang@11.0.0
|
||||||
|
|
||||||
|
|
||||||
|
If you used Spack to install GCC, you can get the installation prefix by
|
||||||
|
``spack location -i gcc`` (this will only work if you have a single version
|
||||||
|
of GCC installed). Whereas for Homebrew, GCC is installed in
|
||||||
|
``/usr/local/Cellar/gcc/x.y.z``. With the DMG installer, the correct path
|
||||||
|
will be ``/usr/local/gfortran``.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
Compiler Verification
|
Compiler Verification
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
You can verify that your compilers are configured properly by installing a simple package. For example:
|
You can verify that your compilers are configured properly by installing a
|
||||||
|
simple package. For example:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack install zlib-ng%gcc@5.3.0
|
$ spack install zlib%gcc@5.3.0
|
||||||
|
|
||||||
|
|
||||||
.. _vendor-specific-compiler-configuration:
|
.. _vendor-specific-compiler-configuration:
|
||||||
@@ -620,7 +707,9 @@ You can verify that your compilers are configured properly by installing a simpl
|
|||||||
Vendor-Specific Compiler Configuration
|
Vendor-Specific Compiler Configuration
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
This section provides details on how to get vendor-specific compilers working.
|
With Spack, things usually "just work" with GCC. Not so for other
|
||||||
|
compilers. This section provides details on how to get specific
|
||||||
|
compilers working.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
Intel Compilers
|
Intel Compilers
|
||||||
@@ -642,8 +731,8 @@ compilers:
|
|||||||
you have installed from the ``PATH`` environment variable.
|
you have installed from the ``PATH`` environment variable.
|
||||||
|
|
||||||
If you want use a version of ``gcc`` or ``g++`` other than the default
|
If you want use a version of ``gcc`` or ``g++`` other than the default
|
||||||
version on your system, you need to use either the ``--gcc-install-dir``
|
version on your system, you need to use either the ``-gcc-name``
|
||||||
or ``--gcc-toolchain`` compiler option to specify the path to the version of
|
or ``-gxx-name`` compiler option to specify the path to the version of
|
||||||
``gcc`` or ``g++`` that you want to use."
|
``gcc`` or ``g++`` that you want to use."
|
||||||
|
|
||||||
-- `Intel Reference Guide <https://software.intel.com/en-us/node/522750>`_
|
-- `Intel Reference Guide <https://software.intel.com/en-us/node/522750>`_
|
||||||
@@ -651,12 +740,76 @@ compilers:
|
|||||||
Intel compilers may therefore be configured in one of two ways with
|
Intel compilers may therefore be configured in one of two ways with
|
||||||
Spack: using modules, or using compiler flags.
|
Spack: using modules, or using compiler flags.
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
Configuration with Modules
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
One can control which GCC is seen by the Intel compiler with modules.
|
||||||
|
A module must be loaded both for the Intel Compiler (so it will run)
|
||||||
|
and GCC (so the compiler can find the intended GCC). The following
|
||||||
|
configuration in ``compilers.yaml`` illustrates this technique:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
compilers:
|
||||||
|
- compiler:
|
||||||
|
modules: [gcc-4.9.3, intel-15.0.24]
|
||||||
|
operating_system: centos7
|
||||||
|
paths:
|
||||||
|
cc: /opt/intel-15.0.24/bin/icc-15.0.24-beta
|
||||||
|
cxx: /opt/intel-15.0.24/bin/icpc-15.0.24-beta
|
||||||
|
f77: /opt/intel-15.0.24/bin/ifort-15.0.24-beta
|
||||||
|
fc: /opt/intel-15.0.24/bin/ifort-15.0.24-beta
|
||||||
|
spec: intel@15.0.24.4.9.3
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
The version number on the Intel compiler is a combination of
|
||||||
|
the "native" Intel version number and the GNU compiler it is
|
||||||
|
targeting.
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
Command Line Configuration
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
One can also control which GCC is seen by the Intel compiler by adding
|
||||||
|
flags to the ``icc`` command:
|
||||||
|
|
||||||
|
#. Identify the location of the compiler you just installed:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack location --install-dir gcc
|
||||||
|
~/spack/opt/spack/linux-centos7-x86_64/gcc-4.9.3-iy4rw...
|
||||||
|
|
||||||
|
#. Set up ``compilers.yaml``, for example:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
compilers:
|
||||||
|
- compiler:
|
||||||
|
modules: [intel-15.0.24]
|
||||||
|
operating_system: centos7
|
||||||
|
paths:
|
||||||
|
cc: /opt/intel-15.0.24/bin/icc-15.0.24-beta
|
||||||
|
cxx: /opt/intel-15.0.24/bin/icpc-15.0.24-beta
|
||||||
|
f77: /opt/intel-15.0.24/bin/ifort-15.0.24-beta
|
||||||
|
fc: /opt/intel-15.0.24/bin/ifort-15.0.24-beta
|
||||||
|
flags:
|
||||||
|
cflags: -gcc-name ~/spack/opt/spack/linux-centos7-x86_64/gcc-4.9.3-iy4rw.../bin/gcc
|
||||||
|
cxxflags: -gxx-name ~/spack/opt/spack/linux-centos7-x86_64/gcc-4.9.3-iy4rw.../bin/g++
|
||||||
|
fflags: -gcc-name ~/spack/opt/spack/linux-centos7-x86_64/gcc-4.9.3-iy4rw.../bin/gcc
|
||||||
|
spec: intel@15.0.24.4.9.3
|
||||||
|
|
||||||
|
|
||||||
^^^
|
^^^
|
||||||
NAG
|
NAG
|
||||||
^^^
|
^^^
|
||||||
|
|
||||||
The Numerical Algorithms Group provides a licensed Fortran compiler.
|
The Numerical Algorithms Group provides a licensed Fortran compiler. Like Clang,
|
||||||
It is recommended to use GCC for your C/C++ compilers.
|
this requires you to set up a :ref:`mixed-toolchains`. It is recommended to use
|
||||||
|
GCC for your C/C++ compilers.
|
||||||
|
|
||||||
The NAG Fortran compilers are a bit more strict than other compilers, and many
|
The NAG Fortran compilers are a bit more strict than other compilers, and many
|
||||||
packages will fail to install with error messages like:
|
packages will fail to install with error messages like:
|
||||||
@@ -673,40 +826,44 @@ the command line:
|
|||||||
|
|
||||||
$ spack install openmpi fflags="-mismatch"
|
$ spack install openmpi fflags="-mismatch"
|
||||||
|
|
||||||
Or it can be set permanently in your ``packages.yaml``:
|
Or it can be set permanently in your ``compilers.yaml``:
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
- compiler:
|
||||||
nag:
|
modules: []
|
||||||
externals:
|
operating_system: centos6
|
||||||
- spec: nag@6.1
|
paths:
|
||||||
prefix: /opt/nag/bin
|
cc: /soft/spack/opt/spack/linux-x86_64/gcc-5.3.0/gcc-6.1.0-q2zosj3igepi3pjnqt74bwazmptr5gpj/bin/gcc
|
||||||
extra_attributes:
|
cxx: /soft/spack/opt/spack/linux-x86_64/gcc-5.3.0/gcc-6.1.0-q2zosj3igepi3pjnqt74bwazmptr5gpj/bin/g++
|
||||||
compilers:
|
f77: /soft/spack/opt/spack/linux-x86_64/gcc-4.4.7/nag-6.1-jt3h5hwt5myezgqguhfsan52zcskqene/bin/nagfor
|
||||||
fortran: /opt/nag/bin/nagfor
|
fc: /soft/spack/opt/spack/linux-x86_64/gcc-4.4.7/nag-6.1-jt3h5hwt5myezgqguhfsan52zcskqene/bin/nagfor
|
||||||
flags:
|
flags:
|
||||||
fflags: -mismatch
|
fflags: -mismatch
|
||||||
|
spec: nag@6.1
|
||||||
|
|
||||||
|
|
||||||
---------------
|
---------------
|
||||||
System Packages
|
System Packages
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Once compilers are configured, one needs to determine which pre-installed system packages,
|
Once compilers are configured, one needs to determine which
|
||||||
if any, to use in builds. These are also configured in the ``~/.spack/packages.yaml`` file.
|
pre-installed system packages, if any, to use in builds. This is
|
||||||
For example, to use an OpenMPI installed in /opt/local, one would use:
|
configured in the file ``~/.spack/packages.yaml``. For example, to use
|
||||||
|
an OpenMPI installed in /opt/local, one would use:
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
openmpi:
|
openmpi:
|
||||||
buildable: False
|
externals:
|
||||||
externals:
|
- spec: openmpi@1.10.1
|
||||||
- spec: openmpi@1.10.1
|
prefix: /opt/local
|
||||||
prefix: /opt/local
|
buildable: False
|
||||||
|
|
||||||
In general, *Spack is easier to use and more reliable if it builds all of its own dependencies*.
|
In general, Spack is easier to use and more reliable if it builds all of
|
||||||
However, there are several packages for which one commonly needs to use system versions:
|
its own dependencies. However, there are several packages for which one
|
||||||
|
commonly needs to use system versions:
|
||||||
|
|
||||||
^^^
|
^^^
|
||||||
MPI
|
MPI
|
||||||
@@ -719,7 +876,8 @@ you are unlikely to get a working MPI from Spack. Instead, use an
|
|||||||
appropriate pre-installed MPI.
|
appropriate pre-installed MPI.
|
||||||
|
|
||||||
If you choose a pre-installed MPI, you should consider using the
|
If you choose a pre-installed MPI, you should consider using the
|
||||||
pre-installed compiler used to build that MPI.
|
pre-installed compiler used to build that MPI; see above on
|
||||||
|
``compilers.yaml``.
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
OpenSSL
|
OpenSSL
|
||||||
@@ -1283,9 +1441,9 @@ To configure Spack, first run the following command inside the Spack console:
|
|||||||
spack compiler find
|
spack compiler find
|
||||||
|
|
||||||
This creates a ``.staging`` directory in our Spack prefix, along with a ``windows`` subdirectory
|
This creates a ``.staging`` directory in our Spack prefix, along with a ``windows`` subdirectory
|
||||||
containing a ``packages.yaml`` file. On a fresh Windows install with the above packages
|
containing a ``compilers.yaml`` file. On a fresh Windows install with the above packages
|
||||||
installed, this command should only detect Microsoft Visual Studio and the Intel Fortran
|
installed, this command should only detect Microsoft Visual Studio and the Intel Fortran
|
||||||
compiler will be integrated within the first version of MSVC present in the ``packages.yaml``
|
compiler will be integrated within the first version of MSVC present in the ``compilers.yaml``
|
||||||
output.
|
output.
|
||||||
|
|
||||||
Spack provides a default ``config.yaml`` file for Windows that it will use unless overridden.
|
Spack provides a default ``config.yaml`` file for Windows that it will use unless overridden.
|
||||||
|
@@ -23,6 +23,7 @@ components for use by dependent packages:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
|
compiler: [rocmcc@=5.3.0]
|
||||||
variants: amdgpu_target=gfx90a
|
variants: amdgpu_target=gfx90a
|
||||||
hip:
|
hip:
|
||||||
buildable: false
|
buildable: false
|
||||||
@@ -69,15 +70,16 @@ This is in combination with the following compiler definition:
|
|||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
compilers:
|
||||||
llvm-amdgpu:
|
- compiler:
|
||||||
externals:
|
spec: rocmcc@=5.3.0
|
||||||
- spec: llvm-amdgpu@=5.3.0
|
paths:
|
||||||
prefix: /opt/rocm-5.3.0
|
cc: /opt/rocm-5.3.0/bin/amdclang
|
||||||
compilers:
|
cxx: /opt/rocm-5.3.0/bin/amdclang++
|
||||||
c: /opt/rocm-5.3.0/bin/amdclang
|
f77: null
|
||||||
cxx: /opt/rocm-5.3.0/bin/amdclang++
|
fc: /opt/rocm-5.3.0/bin/amdflang
|
||||||
fortran: null
|
operating_system: rhel8
|
||||||
|
target: x86_64
|
||||||
|
|
||||||
This includes the following considerations:
|
This includes the following considerations:
|
||||||
|
|
||||||
|
@@ -1,65 +0,0 @@
|
|||||||
.. Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
||||||
|
|
||||||
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
|
|
||||||
.. _include-yaml:
|
|
||||||
|
|
||||||
===============================
|
|
||||||
Include Settings (include.yaml)
|
|
||||||
===============================
|
|
||||||
|
|
||||||
Spack allows you to include configuration files through ``include.yaml``.
|
|
||||||
Using the ``include:`` heading results in pulling in external configuration
|
|
||||||
information to be used by any Spack command.
|
|
||||||
|
|
||||||
Included configuration files are required *unless* they are explicitly optional
|
|
||||||
or the entry's condition evaluates to ``false``. Optional includes are specified
|
|
||||||
with the ``optional`` clause and conditional with the ``when`` clause. For
|
|
||||||
example,
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
include:
|
|
||||||
- /path/to/a/required/config.yaml
|
|
||||||
- path: /path/to/$os/$target/config
|
|
||||||
optional: true
|
|
||||||
- path: /path/to/os-specific/config-dir
|
|
||||||
when: os == "ventura"
|
|
||||||
|
|
||||||
shows all three. The first entry, ``/path/to/a/required/config.yaml``,
|
|
||||||
indicates that included ``config.yaml`` file is required (so must exist).
|
|
||||||
Use of ``optional: true`` for ``/path/to/$os/$target/config`` means
|
|
||||||
the path is only included if it exists. The condition ``os == "ventura"``
|
|
||||||
in the ``when`` clause for ``/path/to/os-specific/config-dir`` means the
|
|
||||||
path is only included when the operating system (``os``) is ``ventura``.
|
|
||||||
|
|
||||||
The same conditions and variables in `Spec List References
|
|
||||||
<https://spack.readthedocs.io/en/latest/environments.html#spec-list-references>`_
|
|
||||||
can be used for conditional activation in the ``when`` clauses.
|
|
||||||
|
|
||||||
Included files can be specified by path or by their parent directory.
|
|
||||||
Paths may be absolute, relative (to the configuration file including the path),
|
|
||||||
or specified as URLs. Only the ``file``, ``ftp``, ``http`` and ``https`` protocols (or
|
|
||||||
schemes) are supported. Spack-specific, environment and user path variables
|
|
||||||
can be used. (See :ref:`config-file-variables` for more information.)
|
|
||||||
|
|
||||||
A ``sha256`` is required for remote file URLs and must be specified as follows:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
include:
|
|
||||||
- path: https://github.com/path/to/raw/config/compilers.yaml
|
|
||||||
sha256: 26e871804a92cd07bb3d611b31b4156ae93d35b6a6d6e0ef3a67871fcb1d258b
|
|
||||||
|
|
||||||
Additionally, remote file URLs must link to the **raw** form of the file's
|
|
||||||
contents (e.g., `GitHub
|
|
||||||
<https://docs.github.com/en/repositories/working-with-files/using-files/viewing-and-understanding-files#viewing-or-copying-the-raw-file-content>`_
|
|
||||||
or `GitLab
|
|
||||||
<https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository>`_).
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
Recursive includes are not currently processed in a breadth-first manner
|
|
||||||
so the value of a configuration option that is altered by multiple included
|
|
||||||
files may not be what you expect. This will be addressed in a future
|
|
||||||
update.
|
|
@@ -71,11 +71,9 @@ or refer to the full manual below.
|
|||||||
|
|
||||||
configuration
|
configuration
|
||||||
config_yaml
|
config_yaml
|
||||||
include_yaml
|
|
||||||
packages_yaml
|
packages_yaml
|
||||||
build_settings
|
build_settings
|
||||||
environments
|
environments
|
||||||
env_vars_yaml
|
|
||||||
containers
|
containers
|
||||||
mirrors
|
mirrors
|
||||||
module_file_support
|
module_file_support
|
||||||
|
@@ -128,7 +128,7 @@ depend on the spec:
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def setup_run_environment(self, env: EnvironmentModifications) -> None:
|
def setup_run_environment(self, env):
|
||||||
if self.spec.satisfies("+foo"):
|
if self.spec.satisfies("+foo"):
|
||||||
env.set("FOO", "bar")
|
env.set("FOO", "bar")
|
||||||
|
|
||||||
@@ -142,7 +142,7 @@ For example, a simplified version of the ``python`` package could look like this
|
|||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def setup_dependent_run_environment(self, env: EnvironmentModifications, dependent_spec: Spec) -> None:
|
def setup_dependent_run_environment(self, env, dependent_spec):
|
||||||
if dependent_spec.package.extends(self.spec):
|
if dependent_spec.package.extends(self.spec):
|
||||||
env.prepend_path("PYTHONPATH", dependent_spec.prefix.lib.python)
|
env.prepend_path("PYTHONPATH", dependent_spec.prefix.lib.python)
|
||||||
|
|
||||||
|
@@ -486,8 +486,6 @@ present. For instance with a configuration like:
|
|||||||
|
|
||||||
you will use ``mvapich2~cuda %gcc`` as an ``mpi`` provider.
|
you will use ``mvapich2~cuda %gcc`` as an ``mpi`` provider.
|
||||||
|
|
||||||
.. _package-strong-preferences:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Conflicts and strong preferences
|
Conflicts and strong preferences
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -557,13 +555,14 @@ preferences.
|
|||||||
FAQ: :ref:`Why does Spack pick particular versions and variants? <faq-concretizer-precedence>`
|
FAQ: :ref:`Why does Spack pick particular versions and variants? <faq-concretizer-precedence>`
|
||||||
|
|
||||||
|
|
||||||
The ``target`` and ``providers`` preferences
|
Most package preferences (``compilers``, ``target`` and ``providers``)
|
||||||
can only be set globally under the ``all`` section of ``packages.yaml``:
|
can only be set globally under the ``all`` section of ``packages.yaml``:
|
||||||
|
|
||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
all:
|
all:
|
||||||
|
compiler: [gcc@12.2.0, clang@12:, oneapi@2023:]
|
||||||
target: [x86_64_v3]
|
target: [x86_64_v3]
|
||||||
providers:
|
providers:
|
||||||
mpi: [mvapich2, mpich, openmpi]
|
mpi: [mvapich2, mpich, openmpi]
|
||||||
|
@@ -369,9 +369,9 @@ If you have a collection of software expected to work well together with
|
|||||||
no source code of its own, you can create a :ref:`BundlePackage <bundlepackage>`.
|
no source code of its own, you can create a :ref:`BundlePackage <bundlepackage>`.
|
||||||
Examples where bundle packages can be useful include defining suites of
|
Examples where bundle packages can be useful include defining suites of
|
||||||
applications (e.g, `EcpProxyApps
|
applications (e.g, `EcpProxyApps
|
||||||
<https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/ecp_proxy_apps/package.py>`_), commonly used libraries
|
<https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/ecp-proxy-apps/package.py>`_), commonly used libraries
|
||||||
(e.g., `AmdAocl <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/amd_aocl/package.py>`_),
|
(e.g., `AmdAocl <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/amd-aocl/package.py>`_),
|
||||||
and software development kits (e.g., `EcpDataVisSdk <https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/ecp_data_vis_sdk/package.py>`_).
|
and software development kits (e.g., `EcpDataVisSdk <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/ecp-data-vis-sdk/package.py>`_).
|
||||||
|
|
||||||
These versioned packages primarily consist of dependencies on the associated
|
These versioned packages primarily consist of dependencies on the associated
|
||||||
software packages. They can include :ref:`variants <variants>` to ensure
|
software packages. They can include :ref:`variants <variants>` to ensure
|
||||||
@@ -443,7 +443,7 @@ lives in:
|
|||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack location -p gmp
|
$ spack location -p gmp
|
||||||
${SPACK_ROOT}/var/spack/repos/spack_repo/builtin/packages/gmp/package.py
|
${SPACK_ROOT}/var/spack/repos/builtin/packages/gmp/package.py
|
||||||
|
|
||||||
but ``spack edit`` provides a much simpler shortcut and saves you the
|
but ``spack edit`` provides a much simpler shortcut and saves you the
|
||||||
trouble of typing the full path.
|
trouble of typing the full path.
|
||||||
@@ -457,19 +457,19 @@ live in Spack's directory structure. In general, :ref:`cmd-spack-create`
|
|||||||
handles creating package files for you, so you can skip most of the
|
handles creating package files for you, so you can skip most of the
|
||||||
details here.
|
details here.
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
``var/spack/repos/spack_repo/builtin/packages``
|
``var/spack/repos/builtin/packages``
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
A Spack installation directory is structured like a standard UNIX
|
A Spack installation directory is structured like a standard UNIX
|
||||||
install prefix (``bin``, ``lib``, ``include``, ``var``, ``opt``,
|
install prefix (``bin``, ``lib``, ``include``, ``var``, ``opt``,
|
||||||
etc.). Most of the code for Spack lives in ``$SPACK_ROOT/lib/spack``.
|
etc.). Most of the code for Spack lives in ``$SPACK_ROOT/lib/spack``.
|
||||||
Packages themselves live in ``$SPACK_ROOT/var/spack/repos/spack_repo/builtin/packages``.
|
Packages themselves live in ``$SPACK_ROOT/var/spack/repos/builtin/packages``.
|
||||||
|
|
||||||
If you ``cd`` to that directory, you will see directories for each
|
If you ``cd`` to that directory, you will see directories for each
|
||||||
package:
|
package:
|
||||||
|
|
||||||
.. command-output:: cd $SPACK_ROOT/var/spack/repos/spack_repo/builtin/packages && ls
|
.. command-output:: cd $SPACK_ROOT/var/spack/repos/builtin/packages && ls
|
||||||
:shell:
|
:shell:
|
||||||
:ellipsis: 10
|
:ellipsis: 10
|
||||||
|
|
||||||
@@ -479,7 +479,7 @@ package lives in:
|
|||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
$SPACK_ROOT/var/spack/repos/spack_repo/builtin/packages/libelf/package.py
|
$SPACK_ROOT/var/spack/repos/builtin/packages/libelf/package.py
|
||||||
|
|
||||||
Alongside the ``package.py`` file, a package may contain extra
|
Alongside the ``package.py`` file, a package may contain extra
|
||||||
directories or files (like patches) that it needs to build.
|
directories or files (like patches) that it needs to build.
|
||||||
@@ -492,7 +492,7 @@ Packages are named after the directory containing ``package.py``. So,
|
|||||||
``libelf``'s ``package.py`` lives in a directory called ``libelf``.
|
``libelf``'s ``package.py`` lives in a directory called ``libelf``.
|
||||||
The ``package.py`` file defines a class called ``Libelf``, which
|
The ``package.py`` file defines a class called ``Libelf``, which
|
||||||
extends Spack's ``Package`` class. For example, here is
|
extends Spack's ``Package`` class. For example, here is
|
||||||
``$SPACK_ROOT/var/spack/repos/spack_repo/builtin/packages/libelf/package.py``:
|
``$SPACK_ROOT/var/spack/repos/builtin/packages/libelf/package.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
:linenos:
|
:linenos:
|
||||||
@@ -520,7 +520,7 @@ these:
|
|||||||
$ spack install libelf@0.8.13
|
$ spack install libelf@0.8.13
|
||||||
|
|
||||||
Spack sees the package name in the spec and looks for
|
Spack sees the package name in the spec and looks for
|
||||||
``libelf/package.py`` in ``var/spack/repos/spack_repo/builtin/packages``.
|
``libelf/package.py`` in ``var/spack/repos/builtin/packages``.
|
||||||
Likewise, if you run ``spack install py-numpy``, Spack looks for
|
Likewise, if you run ``spack install py-numpy``, Spack looks for
|
||||||
``py-numpy/package.py``.
|
``py-numpy/package.py``.
|
||||||
|
|
||||||
@@ -686,7 +686,7 @@ https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.1.tar.bz2
|
|||||||
In order to handle this, you can define a ``url_for_version()`` function
|
In order to handle this, you can define a ``url_for_version()`` function
|
||||||
like so:
|
like so:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/openmpi/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/openmpi/package.py
|
||||||
:pyobject: Openmpi.url_for_version
|
:pyobject: Openmpi.url_for_version
|
||||||
|
|
||||||
With the use of this ``url_for_version()``, Spack knows to download OpenMPI ``2.1.1``
|
With the use of this ``url_for_version()``, Spack knows to download OpenMPI ``2.1.1``
|
||||||
@@ -787,7 +787,7 @@ of GNU. For that, Spack goes a step further and defines a mixin class that
|
|||||||
takes care of all of the plumbing and requires packagers to just define a proper
|
takes care of all of the plumbing and requires packagers to just define a proper
|
||||||
``gnu_mirror_path`` attribute:
|
``gnu_mirror_path`` attribute:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/autoconf/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/autoconf/package.py
|
||||||
:lines: 9-18
|
:lines: 9-18
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -1995,7 +1995,7 @@ structure like this:
|
|||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
$SPACK_ROOT/var/spack/repos/spack_repo/builtin/packages/
|
$SPACK_ROOT/var/spack/repos/builtin/packages/
|
||||||
mvapich2/
|
mvapich2/
|
||||||
package.py
|
package.py
|
||||||
ad_lustre_rwcontig_open_source.patch
|
ad_lustre_rwcontig_open_source.patch
|
||||||
@@ -2133,7 +2133,7 @@ handles ``RPATH``:
|
|||||||
|
|
||||||
.. _pyside-patch:
|
.. _pyside-patch:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/py_pyside/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/py-pyside/package.py
|
||||||
:pyobject: PyPyside.patch
|
:pyobject: PyPyside.patch
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
@@ -2201,7 +2201,7 @@ using the ``spack resource show`` command::
|
|||||||
|
|
||||||
$ spack resource show 3877ab54
|
$ spack resource show 3877ab54
|
||||||
3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00
|
3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00
|
||||||
path: /home/spackuser/src/spack/var/spack/repos/spack_repo/builtin/packages/m4/gnulib-pgi.patch
|
path: /home/spackuser/src/spack/var/spack/repos/builtin/packages/m4/gnulib-pgi.patch
|
||||||
applies to: builtin.m4
|
applies to: builtin.m4
|
||||||
|
|
||||||
``spack resource show`` looks up downloadable resources from package
|
``spack resource show`` looks up downloadable resources from package
|
||||||
@@ -2219,7 +2219,7 @@ wonder where the extra boost patches are coming from::
|
|||||||
^boost@1.68.0%apple-clang@9.0.0+atomic+chrono~clanglibcpp cxxstd=default +date_time~debug+exception+filesystem+graph~icu+iostreams+locale+log+math~mpi+multithreaded~numpy patches=2ab6c72d03dec6a4ae20220a9dfd5c8c572c5294252155b85c6874d97c323199,b37164268f34f7133cbc9a4066ae98fda08adf51e1172223f6a969909216870f ~pic+program_options~python+random+regex+serialization+shared+signals~singlethreaded+system~taggedlayout+test+thread+timer~versionedlayout+wave arch=darwin-highsierra-x86_64
|
^boost@1.68.0%apple-clang@9.0.0+atomic+chrono~clanglibcpp cxxstd=default +date_time~debug+exception+filesystem+graph~icu+iostreams+locale+log+math~mpi+multithreaded~numpy patches=2ab6c72d03dec6a4ae20220a9dfd5c8c572c5294252155b85c6874d97c323199,b37164268f34f7133cbc9a4066ae98fda08adf51e1172223f6a969909216870f ~pic+program_options~python+random+regex+serialization+shared+signals~singlethreaded+system~taggedlayout+test+thread+timer~versionedlayout+wave arch=darwin-highsierra-x86_64
|
||||||
$ spack resource show b37164268
|
$ spack resource show b37164268
|
||||||
b37164268f34f7133cbc9a4066ae98fda08adf51e1172223f6a969909216870f
|
b37164268f34f7133cbc9a4066ae98fda08adf51e1172223f6a969909216870f
|
||||||
path: /home/spackuser/src/spack/var/spack/repos/spack_repo/builtin/packages/dealii/boost_1.68.0.patch
|
path: /home/spackuser/src/spack/var/spack/repos/builtin/packages/dealii/boost_1.68.0.patch
|
||||||
applies to: builtin.boost
|
applies to: builtin.boost
|
||||||
patched by: builtin.dealii
|
patched by: builtin.dealii
|
||||||
|
|
||||||
@@ -2930,7 +2930,7 @@ this, Spack provides four different methods that can be overridden in a package:
|
|||||||
|
|
||||||
The Qt package, for instance, uses this call:
|
The Qt package, for instance, uses this call:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/qt/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/qt/package.py
|
||||||
:pyobject: Qt.setup_dependent_build_environment
|
:pyobject: Qt.setup_dependent_build_environment
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
@@ -2958,7 +2958,7 @@ variables to be used by the dependent. This is done by implementing
|
|||||||
:meth:`setup_dependent_package <spack.package_base.PackageBase.setup_dependent_package>`. An
|
:meth:`setup_dependent_package <spack.package_base.PackageBase.setup_dependent_package>`. An
|
||||||
example of this can be found in the ``Python`` package:
|
example of this can be found in the ``Python`` package:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/python/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/python/package.py
|
||||||
:pyobject: Python.setup_dependent_package
|
:pyobject: Python.setup_dependent_package
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
@@ -3785,7 +3785,7 @@ It is usually sufficient for a packager to override a few
|
|||||||
build system specific helper methods or attributes to provide, for instance,
|
build system specific helper methods or attributes to provide, for instance,
|
||||||
configure arguments:
|
configure arguments:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/m4/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/m4/package.py
|
||||||
:pyobject: M4.configure_args
|
:pyobject: M4.configure_args
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
@@ -4110,7 +4110,7 @@ Shell command functions
|
|||||||
|
|
||||||
Recall the install method from ``libelf``:
|
Recall the install method from ``libelf``:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/libelf/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/libelf/package.py
|
||||||
:pyobject: Libelf.install
|
:pyobject: Libelf.install
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
@@ -4901,7 +4901,7 @@ the one passed to install, only the MPI implementations all set some
|
|||||||
additional properties on it to help you out. E.g., in openmpi, you'll
|
additional properties on it to help you out. E.g., in openmpi, you'll
|
||||||
find this:
|
find this:
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/packages/openmpi/package.py
|
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/openmpi/package.py
|
||||||
:pyobject: Openmpi.setup_dependent_package
|
:pyobject: Openmpi.setup_dependent_package
|
||||||
|
|
||||||
That code allows the ``openmpi`` package to associate an ``mpicc`` property
|
That code allows the ``openmpi`` package to associate an ``mpicc`` property
|
||||||
@@ -6001,16 +6001,16 @@ with those implemented in the package itself.
|
|||||||
* - Parent/Provider Package
|
* - Parent/Provider Package
|
||||||
- Stand-alone Tests
|
- Stand-alone Tests
|
||||||
* - `C
|
* - `C
|
||||||
<https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/c>`_
|
<https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/c>`_
|
||||||
- Compiles ``hello.c`` and runs it
|
- Compiles ``hello.c`` and runs it
|
||||||
* - `Cxx
|
* - `Cxx
|
||||||
<https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/cxx>`_
|
<https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/cxx>`_
|
||||||
- Compiles and runs several ``hello`` programs
|
- Compiles and runs several ``hello`` programs
|
||||||
* - `Fortran
|
* - `Fortran
|
||||||
<https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/fortran>`_
|
<https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/fortran>`_
|
||||||
- Compiles and runs ``hello`` programs (``F`` and ``f90``)
|
- Compiles and runs ``hello`` programs (``F`` and ``f90``)
|
||||||
* - `Mpi
|
* - `Mpi
|
||||||
<https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/mpi>`_
|
<https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/mpi>`_
|
||||||
- Compiles and runs ``mpi_hello`` (``c``, ``fortran``)
|
- Compiles and runs ``mpi_hello`` (``c``, ``fortran``)
|
||||||
* - :ref:`PythonPackage <pythonpackage>`
|
* - :ref:`PythonPackage <pythonpackage>`
|
||||||
- Imports modules listed in the ``self.import_modules`` property with defaults derived from the tarball
|
- Imports modules listed in the ``self.import_modules`` property with defaults derived from the tarball
|
||||||
@@ -6031,7 +6031,7 @@ maintainers provide additional stand-alone tests customized to the package.
|
|||||||
One example of a package that adds its own stand-alone tests to those
|
One example of a package that adds its own stand-alone tests to those
|
||||||
"inherited" by the virtual package it provides an implementation for is
|
"inherited" by the virtual package it provides an implementation for is
|
||||||
the `Openmpi package
|
the `Openmpi package
|
||||||
<https://github.com/spack/spack/blob/develop/var/spack/repos/spack_repo/builtin/packages/openmpi/package.py>`_.
|
<https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/openmpi/package.py>`_.
|
||||||
|
|
||||||
Below are snippets from running and viewing the stand-alone test results
|
Below are snippets from running and viewing the stand-alone test results
|
||||||
for ``openmpi``:
|
for ``openmpi``:
|
||||||
|
@@ -330,7 +330,7 @@ that ``--tests`` is passed to ``spack ci rebuild`` as part of the
|
|||||||
- spack --version
|
- spack --version
|
||||||
- cd ${SPACK_CONCRETE_ENV_DIR}
|
- cd ${SPACK_CONCRETE_ENV_DIR}
|
||||||
- spack env activate --without-view .
|
- spack env activate --without-view .
|
||||||
- spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture.platform}-{architecture.target}/{name}-{version}-{hash}'"
|
- spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}'"
|
||||||
- mkdir -p ${SPACK_ARTIFACTS_ROOT}/user_data
|
- mkdir -p ${SPACK_ARTIFACTS_ROOT}/user_data
|
||||||
- if [[ -r /mnt/key/intermediate_ci_signing_key.gpg ]]; then spack gpg trust /mnt/key/intermediate_ci_signing_key.gpg; fi
|
- if [[ -r /mnt/key/intermediate_ci_signing_key.gpg ]]; then spack gpg trust /mnt/key/intermediate_ci_signing_key.gpg; fi
|
||||||
- if [[ -r /mnt/key/spack_public_key.gpg ]]; then spack gpg trust /mnt/key/spack_public_key.gpg; fi
|
- if [[ -r /mnt/key/spack_public_key.gpg ]]; then spack gpg trust /mnt/key/spack_public_key.gpg; fi
|
||||||
@@ -820,69 +820,6 @@ presence of a ``SPACK_CDASH_AUTH_TOKEN`` environment variable during the
|
|||||||
build group on CDash called "Release Testing" (that group will be created if
|
build group on CDash called "Release Testing" (that group will be created if
|
||||||
it didn't already exist).
|
it didn't already exist).
|
||||||
|
|
||||||
.. _ci_artifacts:
|
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
CI Artifacts Directory Layout
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
When running the CI build using the command ``spack ci rebuild`` a number of directories are created for
|
|
||||||
storing data generated during the CI job. The default root directory for artifacts is ``job_scratch_root``.
|
|
||||||
This can be overridden by passing the argument ``--artifacts-root`` to the ``spack ci generate`` command
|
|
||||||
or by setting the ``SPACK_ARTIFACTS_ROOT`` environment variable in the build job scripts.
|
|
||||||
|
|
||||||
The top level directories under the artifact root are ``concrete_environment``, ``logs``, ``reproduction``,
|
|
||||||
``tests``, and ``user_data``. Spack does not restrict what is written to any of these directories nor does
|
|
||||||
it require user specified files be written to any specific directory.
|
|
||||||
|
|
||||||
------------------------
|
|
||||||
``concrete_environment``
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
The directory ``concrete_environment`` is used to communicate the ci generate processed ``spack.yaml`` and
|
|
||||||
the concrete ``spack.lock`` for the CI environment.
|
|
||||||
|
|
||||||
--------
|
|
||||||
``logs``
|
|
||||||
--------
|
|
||||||
|
|
||||||
The directory ``logs`` contains the spack build log, ``spack-build-out.txt``, and the spack build environment
|
|
||||||
modification file, ``spack-build-mod-env.txt``. Additionally all files specified by the packages ``Builder``
|
|
||||||
property ``archive_files`` are also copied here (ie. ``CMakeCache.txt`` in ``CMakeBuilder``).
|
|
||||||
|
|
||||||
----------------
|
|
||||||
``reproduction``
|
|
||||||
----------------
|
|
||||||
|
|
||||||
The directory ``reproduction`` is used to store the files needed by the ``spack reproduce-build`` command.
|
|
||||||
This includes ``repro.json``, copies of all of the files in ``concrete_environment``, the concrete spec
|
|
||||||
JSON file for the current spec being built, and all of the files written in the artifacts root directory.
|
|
||||||
|
|
||||||
The ``repro.json`` file is not versioned and is only designed to work with the version of spack CI was run with.
|
|
||||||
An example of what a ``repro.json`` may look like is here.
|
|
||||||
|
|
||||||
.. code:: json
|
|
||||||
|
|
||||||
{
|
|
||||||
"job_name": "adios2@2.9.2 /feaevuj %gcc@11.4.0 arch=linux-ubuntu20.04-x86_64_v3 E4S ROCm External",
|
|
||||||
"job_spec_json": "adios2.json",
|
|
||||||
"ci_project_dir": "/builds/spack/spack"
|
|
||||||
}
|
|
||||||
|
|
||||||
---------
|
|
||||||
``tests``
|
|
||||||
---------
|
|
||||||
|
|
||||||
The directory ``tests`` is used to store output from running ``spack test <job spec>``. This may or may not have
|
|
||||||
data in it depending on the package that was built and the availability of tests.
|
|
||||||
|
|
||||||
-------------
|
|
||||||
``user_data``
|
|
||||||
-------------
|
|
||||||
|
|
||||||
The directory ``user_data`` is used to store everything else that shouldn't be copied to the ``reproduction`` direcotory.
|
|
||||||
Users may use this to store additional logs or metrics or other types of files generated by the build job.
|
|
||||||
|
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
Using a custom spack in your pipeline
|
Using a custom spack in your pipeline
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
@@ -9,7 +9,7 @@ Package Repositories (repos.yaml)
|
|||||||
=================================
|
=================================
|
||||||
|
|
||||||
Spack comes with thousands of built-in package recipes in
|
Spack comes with thousands of built-in package recipes in
|
||||||
``var/spack/repos/spack_repo/builtin/``. This is a **package repository** -- a
|
``var/spack/repos/builtin/``. This is a **package repository** -- a
|
||||||
directory that Spack searches when it needs to find a package by name.
|
directory that Spack searches when it needs to find a package by name.
|
||||||
You may need to maintain packages for restricted, proprietary or
|
You may need to maintain packages for restricted, proprietary or
|
||||||
experimental software separately from the built-in repository. Spack
|
experimental software separately from the built-in repository. Spack
|
||||||
@@ -69,7 +69,7 @@ The default ``etc/spack/defaults/repos.yaml`` file looks like this:
|
|||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- $spack/var/spack/repos/spack_repo/builtin
|
- $spack/var/spack/repos/builtin
|
||||||
|
|
||||||
The file starts with ``repos:`` and contains a single ordered list of
|
The file starts with ``repos:`` and contains a single ordered list of
|
||||||
paths to repositories. Each path is on a separate line starting with
|
paths to repositories. Each path is on a separate line starting with
|
||||||
@@ -78,16 +78,16 @@ paths to repositories. Each path is on a separate line starting with
|
|||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- /opt/repos/spack_repo/local_repo
|
- /opt/local-repo
|
||||||
- $spack/var/spack/repos/spack_repo/builtin
|
- $spack/var/spack/repos/builtin
|
||||||
|
|
||||||
When Spack interprets a spec, e.g., ``mpich`` in ``spack install mpich``,
|
When Spack interprets a spec, e.g., ``mpich`` in ``spack install mpich``,
|
||||||
it searches these repositories in order (first to last) to resolve each
|
it searches these repositories in order (first to last) to resolve each
|
||||||
package name. In this example, Spack will look for the following
|
package name. In this example, Spack will look for the following
|
||||||
packages and use the first valid file:
|
packages and use the first valid file:
|
||||||
|
|
||||||
1. ``/opt/repos/spack_repo/local_repo/packages/mpich/package.py``
|
1. ``/opt/local-repo/packages/mpich/package.py``
|
||||||
2. ``$spack/var/spack/repos/spack_repo/builtin/packages/mpich/package.py``
|
2. ``$spack/var/spack/repos/builtin/packages/mpich/package.py``
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@@ -101,15 +101,14 @@ Namespaces
|
|||||||
|
|
||||||
Every repository in Spack has an associated **namespace** defined in its
|
Every repository in Spack has an associated **namespace** defined in its
|
||||||
top-level ``repo.yaml`` file. If you look at
|
top-level ``repo.yaml`` file. If you look at
|
||||||
``var/spack/repos/spack_repo/builtin/repo.yaml`` in the built-in repository, you'll
|
``var/spack/repos/builtin/repo.yaml`` in the built-in repository, you'll
|
||||||
see that its namespace is ``builtin``:
|
see that its namespace is ``builtin``:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ cat var/spack/repos/spack_repo/builtin/repo.yaml
|
$ cat var/spack/repos/builtin/repo.yaml
|
||||||
repo:
|
repo:
|
||||||
namespace: builtin
|
namespace: builtin
|
||||||
api: v2.0
|
|
||||||
|
|
||||||
Spack records the repository namespace of each installed package. For
|
Spack records the repository namespace of each installed package. For
|
||||||
example, if you install the ``mpich`` package from the ``builtin`` repo,
|
example, if you install the ``mpich`` package from the ``builtin`` repo,
|
||||||
@@ -218,15 +217,15 @@ Suppose you have three repositories: the builtin Spack repo
|
|||||||
repo containing your own prototype packages (``proto``). Suppose they
|
repo containing your own prototype packages (``proto``). Suppose they
|
||||||
contain packages as follows:
|
contain packages as follows:
|
||||||
|
|
||||||
+--------------+-----------------------------------------------+-----------------------------+
|
+--------------+------------------------------------+-----------------------------+
|
||||||
| Namespace | Path to repo | Packages |
|
| Namespace | Path to repo | Packages |
|
||||||
+==============+===============================================+=============================+
|
+==============+====================================+=============================+
|
||||||
| ``proto`` | ``~/my_spack_repos/spack_repo/proto`` | ``mpich`` |
|
| ``proto`` | ``~/proto`` | ``mpich`` |
|
||||||
+--------------+-----------------------------------------------+-----------------------------+
|
+--------------+------------------------------------+-----------------------------+
|
||||||
| ``llnl`` | ``/usr/local/repos/spack_repo/llnl`` | ``hdf5`` |
|
| ``llnl`` | ``/usr/local/llnl`` | ``hdf5`` |
|
||||||
+--------------+-----------------------------------------------+-----------------------------+
|
+--------------+------------------------------------+-----------------------------+
|
||||||
| ``builtin`` | ``$spack/var/spack/repos/spack_repo/builtin`` | ``mpich``, ``hdf5``, others |
|
| ``builtin`` | ``$spack/var/spack/repos/builtin`` | ``mpich``, ``hdf5``, others |
|
||||||
+--------------+-----------------------------------------------+-----------------------------+
|
+--------------+------------------------------------+-----------------------------+
|
||||||
|
|
||||||
Suppose that ``hdf5`` depends on ``mpich``. You can override the
|
Suppose that ``hdf5`` depends on ``mpich``. You can override the
|
||||||
built-in ``hdf5`` by adding the ``llnl`` repo to ``repos.yaml``:
|
built-in ``hdf5`` by adding the ``llnl`` repo to ``repos.yaml``:
|
||||||
@@ -234,8 +233,8 @@ built-in ``hdf5`` by adding the ``llnl`` repo to ``repos.yaml``:
|
|||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- /usr/local/repos/spack_repo/llnl
|
- /usr/local/llnl
|
||||||
- $spack/var/spack/repos/spack_repo/builtin
|
- $spack/var/spack/repos/builtin
|
||||||
|
|
||||||
``spack install hdf5`` will install ``llnl.hdf5 ^builtin.mpich``.
|
``spack install hdf5`` will install ``llnl.hdf5 ^builtin.mpich``.
|
||||||
|
|
||||||
@@ -244,9 +243,9 @@ If, instead, ``repos.yaml`` looks like this:
|
|||||||
.. code-block:: yaml
|
.. code-block:: yaml
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- ~/my_spack_repos/spack_repo/proto
|
- ~/proto
|
||||||
- /usr/local/repos/spack_repo/llnl
|
- /usr/local/llnl
|
||||||
- $spack/var/spack/repos/spack_repo/builtin
|
- $spack/var/spack/repos/builtin
|
||||||
|
|
||||||
``spack install hdf5`` will install ``llnl.hdf5 ^proto.mpich``.
|
``spack install hdf5`` will install ``llnl.hdf5 ^proto.mpich``.
|
||||||
|
|
||||||
@@ -327,8 +326,8 @@ files, use ``spack repo list``.
|
|||||||
|
|
||||||
$ spack repo list
|
$ spack repo list
|
||||||
==> 2 package repositories.
|
==> 2 package repositories.
|
||||||
myrepo v2.0 ~/my_spack_repos/spack_repo/myrepo
|
myrepo ~/myrepo
|
||||||
builtin v2.0 ~/spack/var/spack/repos/spack_repo/builtin
|
builtin ~/spack/var/spack/repos/builtin
|
||||||
|
|
||||||
Each repository is listed with its associated namespace. To get the raw,
|
Each repository is listed with its associated namespace. To get the raw,
|
||||||
merged YAML from all configuration files, use ``spack config get repos``:
|
merged YAML from all configuration files, use ``spack config get repos``:
|
||||||
@@ -336,9 +335,9 @@ merged YAML from all configuration files, use ``spack config get repos``:
|
|||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack config get repos
|
$ spack config get repos
|
||||||
repos:
|
repos:srepos:
|
||||||
- ~/my_spack_repos/spack_repo/myrepo
|
- ~/myrepo
|
||||||
- $spack/var/spack/repos/spack_repo/builtin
|
- $spack/var/spack/repos/builtin
|
||||||
|
|
||||||
Note that, unlike ``spack repo list``, this does not include the
|
Note that, unlike ``spack repo list``, this does not include the
|
||||||
namespace, which is read from each repo's ``repo.yaml``.
|
namespace, which is read from each repo's ``repo.yaml``.
|
||||||
@@ -352,54 +351,66 @@ yourself; you can use the ``spack repo create`` command.
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack repo create ~/my_spack_repos myrepo
|
$ spack repo create myrepo
|
||||||
==> Created repo with namespace 'myrepo'.
|
==> Created repo with namespace 'myrepo'.
|
||||||
==> To register it with spack, run this command:
|
==> To register it with spack, run this command:
|
||||||
spack repo add ~/my_spack_repos/spack_repo/myrepo
|
spack repo add ~/myrepo
|
||||||
|
|
||||||
$ ls ~/my_spack_repos/spack_repo/myrepo
|
$ ls myrepo
|
||||||
packages/ repo.yaml
|
packages/ repo.yaml
|
||||||
|
|
||||||
$ cat ~/my_spack_repos/spack_repo/myrepo/repo.yaml
|
$ cat myrepo/repo.yaml
|
||||||
repo:
|
repo:
|
||||||
namespace: 'myrepo'
|
namespace: 'myrepo'
|
||||||
api: v2.0
|
|
||||||
|
|
||||||
Namespaces can also be nested, which can be useful if you have
|
By default, the namespace of a new repo matches its directory's name.
|
||||||
multiple package repositories for an organization. Spack will
|
You can supply a custom namespace with a second argument, e.g.:
|
||||||
create the corresponding directory structure for you:
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack repo create ~/my_spack_repos llnl.comp
|
$ spack repo create myrepo llnl.comp
|
||||||
==> Created repo with namespace 'llnl.comp'.
|
==> Created repo with namespace 'llnl.comp'.
|
||||||
==> To register it with spack, run this command:
|
==> To register it with spack, run this command:
|
||||||
spack repo add ~/my_spack_repos/spack_repo/llnl/comp
|
spack repo add ~/myrepo
|
||||||
|
|
||||||
|
$ cat myrepo/repo.yaml
|
||||||
$ cat ~/my_spack_repos/spack_repo/llnl/comp/repo.yaml
|
|
||||||
repo:
|
repo:
|
||||||
namespace: 'llnl.comp'
|
namespace: 'llnl.comp'
|
||||||
api: v2.0
|
|
||||||
|
You can also create repositories with custom structure with the ``-d/--subdirectory``
|
||||||
|
argument, e.g.:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack repo create -d applications myrepo apps
|
||||||
|
==> Created repo with namespace 'apps'.
|
||||||
|
==> To register it with Spack, run this command:
|
||||||
|
spack repo add ~/myrepo
|
||||||
|
|
||||||
|
$ ls myrepo
|
||||||
|
applications/ repo.yaml
|
||||||
|
|
||||||
|
$ cat myrepo/repo.yaml
|
||||||
|
repo:
|
||||||
|
namespace: apps
|
||||||
|
subdirectory: applications
|
||||||
|
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
``spack repo add``
|
``spack repo add``
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Once your repository is created, you can register it with Spack with
|
Once your repository is created, you can register it with Spack with
|
||||||
``spack repo add``. You nee to specify the path to the directory that
|
``spack repo add``:
|
||||||
contains the ``repo.yaml`` file.
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack repo add ~/my_spack_repos/spack_repo/llnl/comp
|
$ spack repo add ./myrepo
|
||||||
==> Added repo with namespace 'llnl.comp'.
|
==> Added repo with namespace 'llnl.comp'.
|
||||||
|
|
||||||
$ spack repo list
|
$ spack repo list
|
||||||
==> 2 package repositories.
|
==> 2 package repositories.
|
||||||
llnl.comp v2.0 ~/my_spack_repos/spack_repo/llnl/comp
|
llnl.comp ~/myrepo
|
||||||
builtin v2.0 ~/spack/var/spack/repos/spack_repo/builtin
|
builtin ~/spack/var/spack/repos/builtin
|
||||||
|
|
||||||
|
|
||||||
This simply adds the repo to your ``repos.yaml`` file.
|
This simply adds the repo to your ``repos.yaml`` file.
|
||||||
|
|
||||||
@@ -421,43 +432,46 @@ By namespace:
|
|||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack repo rm llnl.comp
|
$ spack repo rm llnl.comp
|
||||||
==> Removed repository ~/my_spack_repos/spack_repo/llnl/comp with namespace 'llnl.comp'.
|
==> Removed repository ~/myrepo with namespace 'llnl.comp'.
|
||||||
|
|
||||||
$ spack repo list
|
$ spack repo list
|
||||||
==> 1 package repository.
|
==> 1 package repository.
|
||||||
builtin ~/spack/var/spack/repos/spack_repo/builtin
|
builtin ~/spack/var/spack/repos/builtin
|
||||||
|
|
||||||
By path:
|
By path:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ spack repo rm ~/my_spack_repos/spack_repo/llnl/comp
|
$ spack repo rm ~/myrepo
|
||||||
==> Removed repository ~/my_spack_repos/spack_repo/llnl/comp
|
==> Removed repository ~/myrepo
|
||||||
|
|
||||||
$ spack repo list
|
$ spack repo list
|
||||||
==> 1 package repository.
|
==> 1 package repository.
|
||||||
builtin ~/spack/var/spack/repos/spack_repo/builtin
|
builtin ~/spack/var/spack/repos/builtin
|
||||||
|
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Repo namespaces and Python
|
Repo namespaces and Python
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
Package repositories are implemented as Python packages. To be precise,
|
You may have noticed that namespace notation for repositories is similar
|
||||||
they are `namespace packages
|
to the notation for namespaces in Python. As it turns out, you *can*
|
||||||
<https://packaging.python.org/en/latest/guides/packaging-namespace-packages/>`_
|
treat Spack repositories like Python packages; this is how they are
|
||||||
with ``spack_repo`` the top-level namespace, followed by the repository
|
implemented.
|
||||||
namespace as submodules. For example, the builtin repository corresponds
|
|
||||||
to the Python module ``spack_repo.builtin.packages``.
|
|
||||||
|
|
||||||
This structure allows you to extend a ``builtin`` package in your own
|
You could, for example, extend a ``builtin`` package in your own
|
||||||
repository:
|
repository:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
from spack_repo.builtin.packages.mpich.package import Mpich
|
from spack.pkg.builtin.mpich import Mpich
|
||||||
|
|
||||||
class MyPackage(Mpich):
|
class MyPackage(Mpich):
|
||||||
...
|
...
|
||||||
|
|
||||||
Spack populates ``sys.path`` at runtime with the path to the root of your
|
Spack repo namespaces are actually Python namespaces tacked on under
|
||||||
package repository's ``spack_repo`` directory.
|
``spack.pkg``. The search semantics of ``repos.yaml`` are actually
|
||||||
|
implemented using Python's built-in `sys.path
|
||||||
|
<https://docs.python.org/2/library/sys.html#sys.path>`_ search. The
|
||||||
|
:py:mod:`spack.repo` module implements a custom `Python importer
|
||||||
|
<https://docs.python.org/2/library/imp.html>`_.
|
||||||
|
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
sphinx==8.2.3
|
sphinx==8.1.3
|
||||||
sphinxcontrib-programoutput==0.18
|
sphinxcontrib-programoutput==0.18
|
||||||
sphinx_design==0.6.1
|
sphinx_design==0.6.1
|
||||||
sphinx-rtd-theme==3.0.2
|
sphinx-rtd-theme==3.0.2
|
||||||
python-levenshtein==0.27.1
|
python-levenshtein==0.26.1
|
||||||
docutils==0.21.2
|
docutils==0.21.2
|
||||||
pygments==2.19.1
|
pygments==2.19.1
|
||||||
urllib3==2.4.0
|
urllib3==2.3.0
|
||||||
pytest==8.3.5
|
pytest==8.3.4
|
||||||
isort==6.0.1
|
isort==5.13.2
|
||||||
black==25.1.0
|
black==24.10.0
|
||||||
flake8==7.2.0
|
flake8==7.1.1
|
||||||
mypy==1.11.1
|
mypy==1.11.1
|
||||||
|
1
lib/spack/env/aocc/clang
vendored
Symbolic link
1
lib/spack/env/aocc/clang
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/aocc/clang++
vendored
Symbolic link
1
lib/spack/env/aocc/clang++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cpp
|
1
lib/spack/env/aocc/flang
vendored
Symbolic link
1
lib/spack/env/aocc/flang
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../fc
|
1
lib/spack/env/arm/armclang
vendored
Symbolic link
1
lib/spack/env/arm/armclang
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/arm/armclang++
vendored
Symbolic link
1
lib/spack/env/arm/armclang++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/arm/armflang
vendored
Symbolic link
1
lib/spack/env/arm/armflang
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/c++
vendored
Symbolic link
1
lib/spack/env/c++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/c89
vendored
Symbolic link
1
lib/spack/env/c89
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/c99
vendored
Symbolic link
1
lib/spack/env/c99
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/case-insensitive/CC
vendored
Symbolic link
1
lib/spack/env/case-insensitive/CC
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
970
lib/spack/env/cc
vendored
Executable file
970
lib/spack/env/cc
vendored
Executable file
@@ -0,0 +1,970 @@
|
|||||||
|
#!/bin/sh -f
|
||||||
|
# shellcheck disable=SC2034 # evals in this script fool shellcheck
|
||||||
|
#
|
||||||
|
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Spack compiler wrapper script.
|
||||||
|
#
|
||||||
|
# Compiler commands go through this compiler wrapper in Spack builds.
|
||||||
|
# The compiler wrapper is a thin layer around the standard compilers.
|
||||||
|
# It enables several key pieces of functionality:
|
||||||
|
#
|
||||||
|
# 1. It allows Spack to swap compilers into and out of builds easily.
|
||||||
|
# 2. It adds several options to the compile line so that spack
|
||||||
|
# packages can find their dependencies at build time and run time:
|
||||||
|
# -I and/or -isystem arguments for dependency /include directories.
|
||||||
|
# -L arguments for dependency /lib directories.
|
||||||
|
# -Wl,-rpath arguments for dependency /lib directories.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Reset IFS to the default: whitespace-separated lists. When we use
|
||||||
|
# other separators, we set and reset it.
|
||||||
|
unset IFS
|
||||||
|
|
||||||
|
# Separator for lists whose names end with `_list`.
|
||||||
|
# We pick the alarm bell character, which is highly unlikely to
|
||||||
|
# conflict with anything. This is a literal bell character (which
|
||||||
|
# we have to use since POSIX sh does not convert escape sequences
|
||||||
|
# like '\a' outside of the format argument of `printf`).
|
||||||
|
# NOTE: Depending on your editor this may look empty, but it is not.
|
||||||
|
readonly lsep=''
|
||||||
|
|
||||||
|
# This is an array of environment variables that need to be set before
|
||||||
|
# the script runs. They are set by routines in spack.build_environment
|
||||||
|
# as part of the package installation process.
|
||||||
|
readonly params="\
|
||||||
|
SPACK_ENV_PATH
|
||||||
|
SPACK_DEBUG_LOG_DIR
|
||||||
|
SPACK_DEBUG_LOG_ID
|
||||||
|
SPACK_COMPILER_SPEC
|
||||||
|
SPACK_CC_RPATH_ARG
|
||||||
|
SPACK_CXX_RPATH_ARG
|
||||||
|
SPACK_F77_RPATH_ARG
|
||||||
|
SPACK_FC_RPATH_ARG
|
||||||
|
SPACK_LINKER_ARG
|
||||||
|
SPACK_SHORT_SPEC
|
||||||
|
SPACK_SYSTEM_DIRS
|
||||||
|
SPACK_MANAGED_DIRS"
|
||||||
|
|
||||||
|
# Optional parameters that aren't required to be set
|
||||||
|
|
||||||
|
# Boolean (true/false/custom) if we want to add debug flags
|
||||||
|
# SPACK_ADD_DEBUG_FLAGS
|
||||||
|
|
||||||
|
# If a custom flag is requested, it will be defined
|
||||||
|
# SPACK_DEBUG_FLAGS
|
||||||
|
|
||||||
|
# The compiler input variables are checked for sanity later:
|
||||||
|
# SPACK_CC, SPACK_CXX, SPACK_F77, SPACK_FC
|
||||||
|
# The default compiler flags are passed from these variables:
|
||||||
|
# SPACK_CFLAGS, SPACK_CXXFLAGS, SPACK_FFLAGS,
|
||||||
|
# SPACK_LDFLAGS, SPACK_LDLIBS
|
||||||
|
# Debug env var is optional; set to "TRUE" for debug logging:
|
||||||
|
# SPACK_DEBUG
|
||||||
|
# Test command is used to unit test the compiler script.
|
||||||
|
# SPACK_TEST_COMMAND
|
||||||
|
|
||||||
|
# die MESSAGE
|
||||||
|
# Print a message and exit with error code 1.
|
||||||
|
die() {
|
||||||
|
echo "[spack cc] ERROR: $*"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# empty VARNAME
|
||||||
|
# Return whether the variable VARNAME is unset or set to the empty string.
|
||||||
|
empty() {
|
||||||
|
eval "test -z \"\${$1}\""
|
||||||
|
}
|
||||||
|
|
||||||
|
# setsep LISTNAME
|
||||||
|
# Set the global variable 'sep' to the separator for a list with name LISTNAME.
|
||||||
|
# There are three types of lists:
|
||||||
|
# 1. regular lists end with _list and are separated by $lsep
|
||||||
|
# 2. directory lists end with _dirs/_DIRS/PATH(S) and are separated by ':'
|
||||||
|
# 3. any other list is assumed to be separated by spaces: " "
|
||||||
|
setsep() {
|
||||||
|
case "$1" in
|
||||||
|
*_dirs|*_DIRS|*PATH|*PATHS)
|
||||||
|
sep=':'
|
||||||
|
;;
|
||||||
|
*_list)
|
||||||
|
sep="$lsep"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
sep=" "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# prepend LISTNAME ELEMENT
|
||||||
|
#
|
||||||
|
# Prepend ELEMENT to the list stored in the variable LISTNAME.
|
||||||
|
# Handles empty lists and single-element lists.
|
||||||
|
prepend() {
|
||||||
|
varname="$1"
|
||||||
|
elt="$2"
|
||||||
|
|
||||||
|
if empty "$varname"; then
|
||||||
|
eval "$varname=\"\${elt}\""
|
||||||
|
else
|
||||||
|
# Get the appropriate separator for the list we're appending to.
|
||||||
|
setsep "$varname"
|
||||||
|
eval "$varname=\"\${elt}${sep}\${$varname}\""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# append LISTNAME ELEMENT [SEP]
|
||||||
|
#
|
||||||
|
# Append ELEMENT to the list stored in the variable LISTNAME,
|
||||||
|
# assuming the list is separated by SEP.
|
||||||
|
# Handles empty lists and single-element lists.
|
||||||
|
append() {
|
||||||
|
varname="$1"
|
||||||
|
elt="$2"
|
||||||
|
|
||||||
|
if empty "$varname"; then
|
||||||
|
eval "$varname=\"\${elt}\""
|
||||||
|
else
|
||||||
|
# Get the appropriate separator for the list we're appending to.
|
||||||
|
setsep "$varname"
|
||||||
|
eval "$varname=\"\${$varname}${sep}\${elt}\""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# extend LISTNAME1 LISTNAME2 [PREFIX]
|
||||||
|
#
|
||||||
|
# Append the elements stored in the variable LISTNAME2
|
||||||
|
# to the list stored in LISTNAME1.
|
||||||
|
# If PREFIX is provided, prepend it to each element.
|
||||||
|
extend() {
|
||||||
|
# Figure out the appropriate IFS for the list we're reading.
|
||||||
|
setsep "$2"
|
||||||
|
if [ "$sep" != " " ]; then
|
||||||
|
IFS="$sep"
|
||||||
|
fi
|
||||||
|
eval "for elt in \${$2}; do append $1 \"$3\${elt}\"; done"
|
||||||
|
unset IFS
|
||||||
|
}
|
||||||
|
|
||||||
|
# preextend LISTNAME1 LISTNAME2 [PREFIX]
|
||||||
|
#
|
||||||
|
# Prepend the elements stored in the list at LISTNAME2
|
||||||
|
# to the list at LISTNAME1, preserving order.
|
||||||
|
# If PREFIX is provided, prepend it to each element.
|
||||||
|
preextend() {
|
||||||
|
# Figure out the appropriate IFS for the list we're reading.
|
||||||
|
setsep "$2"
|
||||||
|
if [ "$sep" != " " ]; then
|
||||||
|
IFS="$sep"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# first, reverse the list to prepend
|
||||||
|
_reversed_list=""
|
||||||
|
eval "for elt in \${$2}; do prepend _reversed_list \"$3\${elt}\"; done"
|
||||||
|
|
||||||
|
# prepend reversed list to preextend in order
|
||||||
|
IFS="${lsep}"
|
||||||
|
for elt in $_reversed_list; do prepend "$1" "$3${elt}"; done
|
||||||
|
unset IFS
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
# dump the full command if the caller supplies SPACK_TEST_COMMAND=dump-args
|
||||||
|
if [ -n "${SPACK_TEST_COMMAND=}" ]; then
|
||||||
|
case "$SPACK_TEST_COMMAND" in
|
||||||
|
dump-args)
|
||||||
|
IFS="$lsep"
|
||||||
|
for arg in $full_command_list; do
|
||||||
|
echo "$arg"
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
dump-env-*)
|
||||||
|
var=${SPACK_TEST_COMMAND#dump-env-}
|
||||||
|
eval "printf '%s\n' \"\$0: \$var: \$$var\""
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
die "Unknown test command: '$SPACK_TEST_COMMAND'"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Write the input and output commands to debug logs if it's asked for.
|
||||||
|
#
|
||||||
|
if [ "$SPACK_DEBUG" = TRUE ]; then
|
||||||
|
input_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_DEBUG_LOG_ID.in.log"
|
||||||
|
output_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_DEBUG_LOG_ID.out.log"
|
||||||
|
echo "[$mode] $command $input_command" >> "$input_log"
|
||||||
|
IFS="$lsep"
|
||||||
|
echo "[$mode] "$full_command_list >> "$output_log"
|
||||||
|
unset IFS
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute the full command, preserving spaces with IFS set
|
||||||
|
# to the alarm bell separator.
|
||||||
|
IFS="$lsep"; exec $full_command_list
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail with a clear message if the input contains any bell characters.
|
||||||
|
if eval "[ \"\${*#*${lsep}}\" != \"\$*\" ]"; then
|
||||||
|
die "Compiler command line contains our separator ('${lsep}'). Cannot parse."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ensure required variables are set
|
||||||
|
for param in $params; do
|
||||||
|
if eval "test -z \"\${${param}:-}\""; then
|
||||||
|
die "Spack compiler must be run from Spack! Input '$param' is missing."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# eval this because SPACK_MANAGED_DIRS and SPACK_SYSTEM_DIRS are inputs we don't wanna loop over.
|
||||||
|
# moving the eval inside the function would eval it every call.
|
||||||
|
eval "\
|
||||||
|
path_order() {
|
||||||
|
case \"\$1\" in
|
||||||
|
$SPACK_MANAGED_DIRS) return 0 ;;
|
||||||
|
$SPACK_SYSTEM_DIRS) return 2 ;;
|
||||||
|
/*) return 1 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
"
|
||||||
|
|
||||||
|
# path_list functions. Path_lists have 3 parts: spack_store_<list>, <list> and system_<list>,
|
||||||
|
# which are used to prioritize paths when assembling the final command line.
|
||||||
|
|
||||||
|
# init_path_lists LISTNAME
|
||||||
|
# Set <LISTNAME>, spack_store_<LISTNAME>, and system_<LISTNAME> to "".
|
||||||
|
init_path_lists() {
|
||||||
|
eval "spack_store_$1=\"\""
|
||||||
|
eval "$1=\"\""
|
||||||
|
eval "system_$1=\"\""
|
||||||
|
}
|
||||||
|
|
||||||
|
# assign_path_lists LISTNAME1 LISTNAME2
|
||||||
|
# Copy contents of LISTNAME2 into LISTNAME1, for each path_list prefix.
|
||||||
|
assign_path_lists() {
|
||||||
|
eval "spack_store_$1=\"\${spack_store_$2}\""
|
||||||
|
eval "$1=\"\${$2}\""
|
||||||
|
eval "system_$1=\"\${system_$2}\""
|
||||||
|
}
|
||||||
|
|
||||||
|
# append_path_lists LISTNAME ELT
|
||||||
|
# Append the provided ELT to the appropriate list, based on the result of path_order().
|
||||||
|
append_path_lists() {
|
||||||
|
path_order "$2"
|
||||||
|
case $? in
|
||||||
|
0) eval "append spack_store_$1 \"\$2\"" ;;
|
||||||
|
1) eval "append $1 \"\$2\"" ;;
|
||||||
|
2) eval "append system_$1 \"\$2\"" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if optional parameters are defined
|
||||||
|
# If we aren't asking for debug flags, don't add them
|
||||||
|
if [ -z "${SPACK_ADD_DEBUG_FLAGS:-}" ]; then
|
||||||
|
SPACK_ADD_DEBUG_FLAGS="false"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# SPACK_ADD_DEBUG_FLAGS must be true/false/custom
|
||||||
|
is_valid="false"
|
||||||
|
for param in "true" "false" "custom"; do
|
||||||
|
if [ "$param" = "$SPACK_ADD_DEBUG_FLAGS" ]; then
|
||||||
|
is_valid="true"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Exit with error if we are given an incorrect value
|
||||||
|
if [ "$is_valid" = "false" ]; then
|
||||||
|
die "SPACK_ADD_DEBUG_FLAGS, if defined, must be one of 'true', 'false', or 'custom'."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Figure out the type of compiler, the language, and the mode so that
|
||||||
|
# the compiler script knows what to do.
|
||||||
|
#
|
||||||
|
# Possible languages are C, C++, Fortran 77, and Fortran 90.
|
||||||
|
# 'command' is set based on the input command to $SPACK_[CC|CXX|F77|F90]
|
||||||
|
#
|
||||||
|
# 'mode' is set to one of:
|
||||||
|
# vcheck version check
|
||||||
|
# cpp preprocess
|
||||||
|
# cc compile
|
||||||
|
# as assemble
|
||||||
|
# ld link
|
||||||
|
# ccld compile & link
|
||||||
|
|
||||||
|
# Note. SPACK_ALWAYS_XFLAGS are applied for all compiler invocations,
|
||||||
|
# including version checks (SPACK_XFLAGS variants are not applied
|
||||||
|
# for version checks).
|
||||||
|
command="${0##*/}"
|
||||||
|
comp="CC"
|
||||||
|
vcheck_flags=""
|
||||||
|
case "$command" in
|
||||||
|
cpp)
|
||||||
|
mode=cpp
|
||||||
|
debug_flags="-g"
|
||||||
|
vcheck_flags="${SPACK_ALWAYS_CPPFLAGS}"
|
||||||
|
;;
|
||||||
|
cc|c89|c99|gcc|clang|armclang|icc|icx|pgcc|nvc|xlc|xlc_r|fcc|amdclang|cl.exe|craycc)
|
||||||
|
command="$SPACK_CC"
|
||||||
|
language="C"
|
||||||
|
comp="CC"
|
||||||
|
lang_flags=C
|
||||||
|
debug_flags="-g"
|
||||||
|
vcheck_flags="${SPACK_ALWAYS_CFLAGS}"
|
||||||
|
;;
|
||||||
|
c++|CC|g++|clang++|armclang++|icpc|icpx|pgc++|nvc++|xlc++|xlc++_r|FCC|amdclang++|crayCC)
|
||||||
|
command="$SPACK_CXX"
|
||||||
|
language="C++"
|
||||||
|
comp="CXX"
|
||||||
|
lang_flags=CXX
|
||||||
|
debug_flags="-g"
|
||||||
|
vcheck_flags="${SPACK_ALWAYS_CXXFLAGS}"
|
||||||
|
;;
|
||||||
|
ftn|f90|fc|f95|gfortran|flang|armflang|ifort|ifx|pgfortran|nvfortran|xlf90|xlf90_r|nagfor|frt|amdflang|crayftn)
|
||||||
|
command="$SPACK_FC"
|
||||||
|
language="Fortran 90"
|
||||||
|
comp="FC"
|
||||||
|
lang_flags=F
|
||||||
|
debug_flags="-g"
|
||||||
|
vcheck_flags="${SPACK_ALWAYS_FFLAGS}"
|
||||||
|
;;
|
||||||
|
f77|xlf|xlf_r|pgf77)
|
||||||
|
command="$SPACK_F77"
|
||||||
|
language="Fortran 77"
|
||||||
|
comp="F77"
|
||||||
|
lang_flags=F
|
||||||
|
debug_flags="-g"
|
||||||
|
vcheck_flags="${SPACK_ALWAYS_FFLAGS}"
|
||||||
|
;;
|
||||||
|
ld|ld.gold|ld.lld)
|
||||||
|
mode=ld
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
die "Unknown compiler: $command"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If any of the arguments below are present, then the mode is vcheck.
|
||||||
|
# In vcheck mode, nothing is added in terms of extra search paths or
|
||||||
|
# libraries.
|
||||||
|
if [ -z "$mode" ] || [ "$mode" = ld ]; then
|
||||||
|
for arg in "$@"; do
|
||||||
|
case $arg in
|
||||||
|
-v|-V|--version|-dumpversion)
|
||||||
|
mode=vcheck
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Finish setting up the mode.
|
||||||
|
if [ -z "$mode" ]; then
|
||||||
|
mode=ccld
|
||||||
|
for arg in "$@"; do
|
||||||
|
if [ "$arg" = "-E" ]; then
|
||||||
|
mode=cpp
|
||||||
|
break
|
||||||
|
elif [ "$arg" = "-S" ]; then
|
||||||
|
mode=as
|
||||||
|
break
|
||||||
|
elif [ "$arg" = "-c" ]; then
|
||||||
|
mode=cc
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This is needed to ensure we set RPATH instead of RUNPATH
|
||||||
|
# (or the opposite, depending on the configuration in config.yaml)
|
||||||
|
#
|
||||||
|
# Documentation on this mechanism is lacking at best. A few sources
|
||||||
|
# of information are (note that some of them take explicitly the
|
||||||
|
# opposite stance that Spack does):
|
||||||
|
#
|
||||||
|
# http://blog.qt.io/blog/2011/10/28/rpath-and-runpath/
|
||||||
|
# https://wiki.debian.org/RpathIssue
|
||||||
|
#
|
||||||
|
# The only discussion I could find on enabling new dynamic tags by
|
||||||
|
# default on ld is the following:
|
||||||
|
#
|
||||||
|
# https://sourceware.org/ml/binutils/2013-01/msg00307.html
|
||||||
|
#
|
||||||
|
dtags_to_add="${SPACK_DTAGS_TO_ADD}"
|
||||||
|
dtags_to_strip="${SPACK_DTAGS_TO_STRIP}"
|
||||||
|
linker_arg="${SPACK_LINKER_ARG}"
|
||||||
|
|
||||||
|
# Set up rpath variable according to language.
|
||||||
|
rpath="ERROR: RPATH ARG WAS NOT SET"
|
||||||
|
eval "rpath=\${SPACK_${comp}_RPATH_ARG:?${rpath}}"
|
||||||
|
|
||||||
|
# Dump the mode and exit if the command is dump-mode.
|
||||||
|
if [ "$SPACK_TEST_COMMAND" = "dump-mode" ]; then
|
||||||
|
echo "$mode"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If, say, SPACK_CC is set but SPACK_FC is not, we want to know. Compilers do not
|
||||||
|
# *have* to set up Fortran executables, so we need to tell the user when a build is
|
||||||
|
# about to attempt to use them unsuccessfully.
|
||||||
|
if [ -z "$command" ]; then
|
||||||
|
die "Compiler '$SPACK_COMPILER_SPEC' does not have a $language compiler configured."
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Filter '.' and Spack environment directories out of PATH so that
|
||||||
|
# this script doesn't just call itself
|
||||||
|
#
|
||||||
|
new_dirs=""
|
||||||
|
IFS=':'
|
||||||
|
for dir in $PATH; do
|
||||||
|
addpath=true
|
||||||
|
for spack_env_dir in $SPACK_ENV_PATH; do
|
||||||
|
case "${dir%%/}" in
|
||||||
|
"$spack_env_dir"|'.'|'')
|
||||||
|
addpath=false
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if [ $addpath = true ]; then
|
||||||
|
append new_dirs "$dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
export PATH="$new_dirs"
|
||||||
|
|
||||||
|
if [ "$mode" = vcheck ]; then
|
||||||
|
full_command_list="$command"
|
||||||
|
args="$@"
|
||||||
|
extend full_command_list vcheck_flags
|
||||||
|
extend full_command_list args
|
||||||
|
execute
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Darwin's linker has a -r argument that merges object files together.
|
||||||
|
# It doesn't work with -rpath.
|
||||||
|
# This variable controls whether they are added.
|
||||||
|
add_rpaths=true
|
||||||
|
if [ "$mode" = ld ] || [ "$mode" = ccld ]; then
|
||||||
|
if [ "${SPACK_SHORT_SPEC#*darwin}" != "${SPACK_SHORT_SPEC}" ]; then
|
||||||
|
for arg in "$@"; do
|
||||||
|
if [ "$arg" = "-r" ]; then
|
||||||
|
if [ "$mode" = ld ] || [ "$mode" = ccld ]; then
|
||||||
|
add_rpaths=false
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
elif [ "$arg" = "-Wl,-r" ] && [ "$mode" = ccld ]; then
|
||||||
|
add_rpaths=false
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Save original command for debug logging
|
||||||
|
input_command="$*"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parse the command line arguments.
|
||||||
|
#
|
||||||
|
# We extract -L, -I, -isystem and -Wl,-rpath arguments from the
|
||||||
|
# command line and recombine them with Spack arguments later. We
|
||||||
|
# parse these out so that we can make sure that system paths come
|
||||||
|
# last, that package arguments come first, and that Spack arguments
|
||||||
|
# are injected properly.
|
||||||
|
#
|
||||||
|
# All other arguments, including -l arguments, are treated as
|
||||||
|
# 'other_args' and left in their original order. This ensures that
|
||||||
|
# --start-group, --end-group, and other order-sensitive flags continue to
|
||||||
|
# work as the caller expects.
|
||||||
|
#
|
||||||
|
# The libs variable is initialized here for completeness, and it is also
|
||||||
|
# used later to inject flags supplied via `ldlibs` on the command
|
||||||
|
# line. These come into the wrappers via SPACK_LDLIBS.
|
||||||
|
|
||||||
|
# The loop below breaks up the command line into these lists of components.
|
||||||
|
# The lists are all bell-separated to be as flexible as possible, as their
|
||||||
|
# contents may come from the command line, from ' '-separated lists,
|
||||||
|
# ':'-separated lists, etc.
|
||||||
|
|
||||||
|
parse_Wl() {
|
||||||
|
while [ $# -ne 0 ]; do
|
||||||
|
if [ "$wl_expect_rpath" = yes ]; then
|
||||||
|
append_path_lists return_rpath_dirs_list "$1"
|
||||||
|
wl_expect_rpath=no
|
||||||
|
else
|
||||||
|
case "$1" in
|
||||||
|
-rpath=*)
|
||||||
|
arg="${1#-rpath=}"
|
||||||
|
if [ -z "$arg" ]; then
|
||||||
|
shift; continue
|
||||||
|
fi
|
||||||
|
append_path_lists return_rpath_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
--rpath=*)
|
||||||
|
arg="${1#--rpath=}"
|
||||||
|
if [ -z "$arg" ]; then
|
||||||
|
shift; continue
|
||||||
|
fi
|
||||||
|
append_path_lists return_rpath_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
-rpath|--rpath)
|
||||||
|
wl_expect_rpath=yes
|
||||||
|
;;
|
||||||
|
"$dtags_to_strip")
|
||||||
|
;;
|
||||||
|
-Wl)
|
||||||
|
# Nested -Wl,-Wl means we're in NAG compiler territory. We don't support it.
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
append return_other_args_list "-Wl,$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
categorize_arguments() {
|
||||||
|
|
||||||
|
unset IFS
|
||||||
|
|
||||||
|
return_other_args_list=""
|
||||||
|
return_isystem_was_used=""
|
||||||
|
|
||||||
|
init_path_lists return_isystem_include_dirs_list
|
||||||
|
init_path_lists return_include_dirs_list
|
||||||
|
init_path_lists return_lib_dirs_list
|
||||||
|
init_path_lists return_rpath_dirs_list
|
||||||
|
|
||||||
|
# Global state for keeping track of -Wl,-rpath -Wl,/path
|
||||||
|
wl_expect_rpath=no
|
||||||
|
|
||||||
|
# Same, but for -Xlinker -rpath -Xlinker /path
|
||||||
|
xlinker_expect_rpath=no
|
||||||
|
|
||||||
|
while [ $# -ne 0 ]; do
|
||||||
|
|
||||||
|
# an RPATH to be added after the case statement.
|
||||||
|
rp=""
|
||||||
|
|
||||||
|
# Multiple consecutive spaces in the command line can
|
||||||
|
# result in blank arguments
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
shift
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${SPACK_COMPILER_FLAGS_KEEP}" ] ; then
|
||||||
|
# NOTE: the eval is required to allow `|` alternatives inside the variable
|
||||||
|
eval "\
|
||||||
|
case \"\$1\" in
|
||||||
|
$SPACK_COMPILER_FLAGS_KEEP)
|
||||||
|
append return_other_args_list \"\$1\"
|
||||||
|
shift
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
# the replace list is a space-separated list of pipe-separated pairs,
|
||||||
|
# the first in each pair is the original prefix to be matched, the
|
||||||
|
# second is the replacement prefix
|
||||||
|
if [ -n "${SPACK_COMPILER_FLAGS_REPLACE}" ] ; then
|
||||||
|
for rep in ${SPACK_COMPILER_FLAGS_REPLACE} ; do
|
||||||
|
before=${rep%|*}
|
||||||
|
after=${rep#*|}
|
||||||
|
eval "\
|
||||||
|
stripped=\"\${1##$before}\"
|
||||||
|
"
|
||||||
|
if [ "$stripped" = "$1" ] ; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
replaced="$after$stripped"
|
||||||
|
|
||||||
|
# it matched, remove it
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ -z "$replaced" ] ; then
|
||||||
|
# completely removed, continue OUTER loop
|
||||||
|
continue 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# re-build argument list with replacement
|
||||||
|
set -- "$replaced" "$@"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
-isystem*)
|
||||||
|
arg="${1#-isystem}"
|
||||||
|
return_isystem_was_used=true
|
||||||
|
if [ -z "$arg" ]; then shift; arg="$1"; fi
|
||||||
|
append_path_lists return_isystem_include_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
-I*)
|
||||||
|
arg="${1#-I}"
|
||||||
|
if [ -z "$arg" ]; then shift; arg="$1"; fi
|
||||||
|
append_path_lists return_include_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
-L*)
|
||||||
|
arg="${1#-L}"
|
||||||
|
if [ -z "$arg" ]; then shift; arg="$1"; fi
|
||||||
|
append_path_lists return_lib_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
-l*)
|
||||||
|
# -loopopt=0 is generated erroneously in autoconf <= 2.69,
|
||||||
|
# and passed by ifx to the linker, which confuses it with a
|
||||||
|
# library. Filter it out.
|
||||||
|
# TODO: generalize filtering of args with an env var, so that
|
||||||
|
# TODO: we do not have to special case this here.
|
||||||
|
if { [ "$mode" = "ccld" ] || [ $mode = "ld" ]; } \
|
||||||
|
&& [ "$1" != "${1#-loopopt}" ]; then
|
||||||
|
shift
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
arg="${1#-l}"
|
||||||
|
if [ -z "$arg" ]; then shift; arg="$1"; fi
|
||||||
|
append return_other_args_list "-l$arg"
|
||||||
|
;;
|
||||||
|
-Wl,*)
|
||||||
|
IFS=,
|
||||||
|
if ! parse_Wl ${1#-Wl,}; then
|
||||||
|
append return_other_args_list "$1"
|
||||||
|
fi
|
||||||
|
unset IFS
|
||||||
|
;;
|
||||||
|
-Xlinker)
|
||||||
|
shift
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
# -Xlinker without value: let the compiler error about it.
|
||||||
|
append return_other_args_list -Xlinker
|
||||||
|
xlinker_expect_rpath=no
|
||||||
|
break
|
||||||
|
elif [ "$xlinker_expect_rpath" = yes ]; then
|
||||||
|
# Register the path of -Xlinker -rpath <other args> -Xlinker <path>
|
||||||
|
append_path_lists return_rpath_dirs_list "$1"
|
||||||
|
xlinker_expect_rpath=no
|
||||||
|
else
|
||||||
|
case "$1" in
|
||||||
|
-rpath=*)
|
||||||
|
arg="${1#-rpath=}"
|
||||||
|
append_path_lists return_rpath_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
--rpath=*)
|
||||||
|
arg="${1#--rpath=}"
|
||||||
|
append_path_lists return_rpath_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
-rpath|--rpath)
|
||||||
|
xlinker_expect_rpath=yes
|
||||||
|
;;
|
||||||
|
"$dtags_to_strip")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
append return_other_args_list -Xlinker
|
||||||
|
append return_other_args_list "$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"$dtags_to_strip")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# if mode is not ld, we can just add to other args
|
||||||
|
if [ "$mode" != "ld" ]; then
|
||||||
|
append return_other_args_list "$1"
|
||||||
|
shift
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if we're in linker mode, we need to parse raw RPATH args
|
||||||
|
case "$1" in
|
||||||
|
-rpath=*)
|
||||||
|
arg="${1#-rpath=}"
|
||||||
|
append_path_lists return_rpath_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
--rpath=*)
|
||||||
|
arg="${1#--rpath=}"
|
||||||
|
append_path_lists return_rpath_dirs_list "$arg"
|
||||||
|
;;
|
||||||
|
-rpath|--rpath)
|
||||||
|
if [ $# -eq 1 ]; then
|
||||||
|
# -rpath without value: let the linker raise an error.
|
||||||
|
append return_other_args_list "$1"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
append_path_lists return_rpath_dirs_list "$1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
append return_other_args_list "$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# We found `-Xlinker -rpath` but no matching value `-Xlinker /path`. Just append
|
||||||
|
# `-Xlinker -rpath` again and let the compiler or linker handle the error during arg
|
||||||
|
# parsing.
|
||||||
|
if [ "$xlinker_expect_rpath" = yes ]; then
|
||||||
|
append return_other_args_list -Xlinker
|
||||||
|
append return_other_args_list -rpath
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Same, but for -Wl flags.
|
||||||
|
if [ "$wl_expect_rpath" = yes ]; then
|
||||||
|
append return_other_args_list -Wl,-rpath
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
categorize_arguments "$@"
|
||||||
|
|
||||||
|
assign_path_lists isystem_include_dirs_list return_isystem_include_dirs_list
|
||||||
|
assign_path_lists include_dirs_list return_include_dirs_list
|
||||||
|
assign_path_lists lib_dirs_list return_lib_dirs_list
|
||||||
|
assign_path_lists rpath_dirs_list return_rpath_dirs_list
|
||||||
|
|
||||||
|
isystem_was_used="$return_isystem_was_used"
|
||||||
|
other_args_list="$return_other_args_list"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add flags from Spack's cppflags, cflags, cxxflags, fcflags, fflags, and
|
||||||
|
# ldflags. We stick to the order that gmake puts the flags in by default.
|
||||||
|
#
|
||||||
|
# See the gmake manual on implicit rules for details:
|
||||||
|
# https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
|
||||||
|
#
|
||||||
|
flags_list=""
|
||||||
|
|
||||||
|
# Add debug flags
|
||||||
|
if [ "${SPACK_ADD_DEBUG_FLAGS}" = "true" ]; then
|
||||||
|
extend flags_list debug_flags
|
||||||
|
|
||||||
|
# If a custom flag is requested, derive from environment
|
||||||
|
elif [ "$SPACK_ADD_DEBUG_FLAGS" = "custom" ]; then
|
||||||
|
extend flags_list SPACK_DEBUG_FLAGS
|
||||||
|
fi
|
||||||
|
|
||||||
|
spack_flags_list=""
|
||||||
|
|
||||||
|
# Fortran flags come before CPPFLAGS
|
||||||
|
case "$mode" in
|
||||||
|
cc|ccld)
|
||||||
|
case $lang_flags in
|
||||||
|
F)
|
||||||
|
extend spack_flags_list SPACK_ALWAYS_FFLAGS
|
||||||
|
extend spack_flags_list SPACK_FFLAGS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# C preprocessor flags come before any C/CXX flags
|
||||||
|
case "$mode" in
|
||||||
|
cpp|as|cc|ccld)
|
||||||
|
extend spack_flags_list SPACK_ALWAYS_CPPFLAGS
|
||||||
|
extend spack_flags_list SPACK_CPPFLAGS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# Add C and C++ flags
|
||||||
|
case "$mode" in
|
||||||
|
cc|ccld)
|
||||||
|
case $lang_flags in
|
||||||
|
C)
|
||||||
|
extend spack_flags_list SPACK_ALWAYS_CFLAGS
|
||||||
|
extend spack_flags_list SPACK_CFLAGS
|
||||||
|
;;
|
||||||
|
CXX)
|
||||||
|
extend spack_flags_list SPACK_ALWAYS_CXXFLAGS
|
||||||
|
extend spack_flags_list SPACK_CXXFLAGS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# prepend target args
|
||||||
|
preextend flags_list SPACK_TARGET_ARGS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Linker flags
|
||||||
|
case "$mode" in
|
||||||
|
ccld)
|
||||||
|
extend spack_flags_list SPACK_LDFLAGS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
IFS="$lsep"
|
||||||
|
categorize_arguments $spack_flags_list
|
||||||
|
unset IFS
|
||||||
|
|
||||||
|
assign_path_lists spack_flags_isystem_include_dirs_list return_isystem_include_dirs_list
|
||||||
|
assign_path_lists spack_flags_include_dirs_list return_include_dirs_list
|
||||||
|
assign_path_lists spack_flags_lib_dirs_list return_lib_dirs_list
|
||||||
|
assign_path_lists spack_flags_rpath_dirs_list return_rpath_dirs_list
|
||||||
|
|
||||||
|
spack_flags_isystem_was_used="$return_isystem_was_used"
|
||||||
|
spack_flags_other_args_list="$return_other_args_list"
|
||||||
|
|
||||||
|
|
||||||
|
# On macOS insert headerpad_max_install_names linker flag
|
||||||
|
if [ "$mode" = ld ] || [ "$mode" = ccld ]; then
|
||||||
|
if [ "${SPACK_SHORT_SPEC#*darwin}" != "${SPACK_SHORT_SPEC}" ]; then
|
||||||
|
case "$mode" in
|
||||||
|
ld)
|
||||||
|
append flags_list "-headerpad_max_install_names" ;;
|
||||||
|
ccld)
|
||||||
|
append flags_list "-Wl,-headerpad_max_install_names" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$mode" = ccld ] || [ "$mode" = ld ]; then
|
||||||
|
if [ "$add_rpaths" != "false" ]; then
|
||||||
|
# Append RPATH directories. Note that in the case of the
|
||||||
|
# top-level package these directories may not exist yet. For dependencies
|
||||||
|
# it is assumed that paths have already been confirmed.
|
||||||
|
extend spack_store_rpath_dirs_list SPACK_STORE_RPATH_DIRS
|
||||||
|
extend rpath_dirs_list SPACK_RPATH_DIRS
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$mode" = ccld ] || [ "$mode" = ld ]; then
|
||||||
|
extend spack_store_lib_dirs_list SPACK_STORE_LINK_DIRS
|
||||||
|
extend lib_dirs_list SPACK_LINK_DIRS
|
||||||
|
fi
|
||||||
|
|
||||||
|
libs_list=""
|
||||||
|
|
||||||
|
# add RPATHs if we're in in any linking mode
|
||||||
|
case "$mode" in
|
||||||
|
ld|ccld)
|
||||||
|
# Set extra RPATHs
|
||||||
|
extend lib_dirs_list SPACK_COMPILER_EXTRA_RPATHS
|
||||||
|
if [ "$add_rpaths" != "false" ]; then
|
||||||
|
extend rpath_dirs_list SPACK_COMPILER_EXTRA_RPATHS
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set implicit RPATHs
|
||||||
|
if [ "$add_rpaths" != "false" ]; then
|
||||||
|
extend rpath_dirs_list SPACK_COMPILER_IMPLICIT_RPATHS
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add SPACK_LDLIBS to args
|
||||||
|
for lib in $SPACK_LDLIBS; do
|
||||||
|
append libs_list "${lib#-l}"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "$mode" in
|
||||||
|
cpp|cc|as|ccld)
|
||||||
|
if [ "$spack_flags_isystem_was_used" = "true" ] || [ "$isystem_was_used" = "true" ]; then
|
||||||
|
extend spack_store_isystem_include_dirs_list SPACK_STORE_INCLUDE_DIRS
|
||||||
|
extend isystem_include_dirs_list SPACK_INCLUDE_DIRS
|
||||||
|
else
|
||||||
|
extend spack_store_include_dirs_list SPACK_STORE_INCLUDE_DIRS
|
||||||
|
extend include_dirs_list SPACK_INCLUDE_DIRS
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#
|
||||||
|
# Finally, reassemble the command line.
|
||||||
|
#
|
||||||
|
args_list="$flags_list"
|
||||||
|
|
||||||
|
# Include search paths partitioned by (in store, non-sytem, system)
|
||||||
|
# NOTE: adding ${lsep} to the prefix here turns every added element into two
|
||||||
|
extend args_list spack_store_spack_flags_include_dirs_list -I
|
||||||
|
extend args_list spack_store_include_dirs_list -I
|
||||||
|
|
||||||
|
extend args_list spack_flags_include_dirs_list -I
|
||||||
|
extend args_list include_dirs_list -I
|
||||||
|
|
||||||
|
extend args_list spack_store_spack_flags_isystem_include_dirs_list "-isystem${lsep}"
|
||||||
|
extend args_list spack_store_isystem_include_dirs_list "-isystem${lsep}"
|
||||||
|
|
||||||
|
extend args_list spack_flags_isystem_include_dirs_list "-isystem${lsep}"
|
||||||
|
extend args_list isystem_include_dirs_list "-isystem${lsep}"
|
||||||
|
|
||||||
|
extend args_list system_spack_flags_include_dirs_list -I
|
||||||
|
extend args_list system_include_dirs_list -I
|
||||||
|
|
||||||
|
extend args_list system_spack_flags_isystem_include_dirs_list "-isystem${lsep}"
|
||||||
|
extend args_list system_isystem_include_dirs_list "-isystem${lsep}"
|
||||||
|
|
||||||
|
# Library search paths partitioned by (in store, non-sytem, system)
|
||||||
|
extend args_list spack_store_spack_flags_lib_dirs_list "-L"
|
||||||
|
extend args_list spack_store_lib_dirs_list "-L"
|
||||||
|
|
||||||
|
extend args_list spack_flags_lib_dirs_list "-L"
|
||||||
|
extend args_list lib_dirs_list "-L"
|
||||||
|
|
||||||
|
extend args_list system_spack_flags_lib_dirs_list "-L"
|
||||||
|
extend args_list system_lib_dirs_list "-L"
|
||||||
|
|
||||||
|
# RPATHs arguments
|
||||||
|
rpath_prefix=""
|
||||||
|
case "$mode" in
|
||||||
|
ccld)
|
||||||
|
if [ -n "$dtags_to_add" ] ; then
|
||||||
|
append args_list "$linker_arg$dtags_to_add"
|
||||||
|
fi
|
||||||
|
rpath_prefix="$rpath"
|
||||||
|
;;
|
||||||
|
ld)
|
||||||
|
if [ -n "$dtags_to_add" ] ; then
|
||||||
|
append args_list "$dtags_to_add"
|
||||||
|
fi
|
||||||
|
rpath_prefix="-rpath${lsep}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# if mode is ccld or ld, extend RPATH lists with the prefix determined above
|
||||||
|
if [ -n "$rpath_prefix" ]; then
|
||||||
|
extend args_list spack_store_spack_flags_rpath_dirs_list "$rpath_prefix"
|
||||||
|
extend args_list spack_store_rpath_dirs_list "$rpath_prefix"
|
||||||
|
|
||||||
|
extend args_list spack_flags_rpath_dirs_list "$rpath_prefix"
|
||||||
|
extend args_list rpath_dirs_list "$rpath_prefix"
|
||||||
|
|
||||||
|
extend args_list system_spack_flags_rpath_dirs_list "$rpath_prefix"
|
||||||
|
extend args_list system_rpath_dirs_list "$rpath_prefix"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Other arguments from the input command
|
||||||
|
extend args_list other_args_list
|
||||||
|
extend args_list spack_flags_other_args_list
|
||||||
|
|
||||||
|
# Inject SPACK_LDLIBS, if supplied
|
||||||
|
extend args_list libs_list "-l"
|
||||||
|
|
||||||
|
full_command_list="$command"
|
||||||
|
extend full_command_list args_list
|
||||||
|
|
||||||
|
# prepend the ccache binary if we're using ccache
|
||||||
|
if [ -n "$SPACK_CCACHE_BINARY" ]; then
|
||||||
|
case "$lang_flags" in
|
||||||
|
C|CXX) # ccache only supports C languages
|
||||||
|
prepend full_command_list "${SPACK_CCACHE_BINARY}"
|
||||||
|
# workaround for stage being a temp folder
|
||||||
|
# see #3761#issuecomment-294352232
|
||||||
|
export CCACHE_NOHASHDIR=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
execute
|
1
lib/spack/env/cce/case-insensitive/CC
vendored
Symbolic link
1
lib/spack/env/cce/case-insensitive/CC
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../cc
|
1
lib/spack/env/cce/case-insensitive/crayCC
vendored
Symbolic link
1
lib/spack/env/cce/case-insensitive/crayCC
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../cc
|
1
lib/spack/env/cce/cc
vendored
Symbolic link
1
lib/spack/env/cce/cc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/cce/craycc
vendored
Symbolic link
1
lib/spack/env/cce/craycc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/cce/crayftn
vendored
Symbolic link
1
lib/spack/env/cce/crayftn
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/cce/ftn
vendored
Symbolic link
1
lib/spack/env/cce/ftn
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/clang/clang
vendored
Symbolic link
1
lib/spack/env/clang/clang
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/clang/clang++
vendored
Symbolic link
1
lib/spack/env/clang/clang++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/clang/flang
vendored
Symbolic link
1
lib/spack/env/clang/flang
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/clang/gfortran
vendored
Symbolic link
1
lib/spack/env/clang/gfortran
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/cpp
vendored
Symbolic link
1
lib/spack/env/cpp
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/f77
vendored
Symbolic link
1
lib/spack/env/f77
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/f90
vendored
Symbolic link
1
lib/spack/env/f90
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/f95
vendored
Symbolic link
1
lib/spack/env/f95
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/fc
vendored
Symbolic link
1
lib/spack/env/fc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/fj/case-insensitive/FCC
vendored
Symbolic link
1
lib/spack/env/fj/case-insensitive/FCC
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../cc
|
1
lib/spack/env/fj/fcc
vendored
Symbolic link
1
lib/spack/env/fj/fcc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/fj/frt
vendored
Symbolic link
1
lib/spack/env/fj/frt
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/ftn
vendored
Symbolic link
1
lib/spack/env/ftn
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/gcc/g++
vendored
Symbolic link
1
lib/spack/env/gcc/g++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/gcc/gcc
vendored
Symbolic link
1
lib/spack/env/gcc/gcc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/gcc/gfortran
vendored
Symbolic link
1
lib/spack/env/gcc/gfortran
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/intel/icc
vendored
Symbolic link
1
lib/spack/env/intel/icc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/intel/icpc
vendored
Symbolic link
1
lib/spack/env/intel/icpc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/intel/ifort
vendored
Symbolic link
1
lib/spack/env/intel/ifort
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/ld
vendored
Symbolic link
1
lib/spack/env/ld
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/ld.gold
vendored
Symbolic link
1
lib/spack/env/ld.gold
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/ld.lld
vendored
Symbolic link
1
lib/spack/env/ld.lld
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
cc
|
1
lib/spack/env/nag/nagfor
vendored
Symbolic link
1
lib/spack/env/nag/nagfor
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/nvhpc/nvc
vendored
Symbolic link
1
lib/spack/env/nvhpc/nvc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/nvhpc/nvc++
vendored
Symbolic link
1
lib/spack/env/nvhpc/nvc++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/nvhpc/nvfortran
vendored
Symbolic link
1
lib/spack/env/nvhpc/nvfortran
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/oneapi/dpcpp
vendored
Symbolic link
1
lib/spack/env/oneapi/dpcpp
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/oneapi/icpx
vendored
Symbolic link
1
lib/spack/env/oneapi/icpx
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/oneapi/icx
vendored
Symbolic link
1
lib/spack/env/oneapi/icx
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/oneapi/ifx
vendored
Symbolic link
1
lib/spack/env/oneapi/ifx
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/pgi/pgc++
vendored
Symbolic link
1
lib/spack/env/pgi/pgc++
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/pgi/pgcc
vendored
Symbolic link
1
lib/spack/env/pgi/pgcc
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
1
lib/spack/env/pgi/pgfortran
vendored
Symbolic link
1
lib/spack/env/pgi/pgfortran
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../cc
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user